Start drafting up cert validator backend API

This commit is contained in:
UnknownShadow200 2025-06-24 07:55:49 +10:00
parent 7c5229096f
commit 89b6d8ec59
2 changed files with 49 additions and 13 deletions

28
src/Certs.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef CC_SSL_H
#define CC_SSL_H
#include "Platform.h"
CC_BEGIN_HEADER
/*
Validates an X509 certificate chain for verifying a SSL/TLS connection.
Copyright 2014-2025 ClassiCube | Licensed under BSD-3
*/
void CertsBackend_Init(void);
struct X509CertContext {
void* ctx;
void* chain;
void* cert;
};
cc_result Certs_BeginChain( struct X509CertContext* ctx);
cc_result Certs_FreeChain( struct X509CertContext* ctx);
cc_result Certs_VerifyChain(struct X509CertContext* ctx);
void Certs_BeginCert( struct X509CertContext* ctx, int size);
void Certs_AppendCert(struct X509CertContext* ctx, void* data, int len);
void Certs_FinishCert(struct X509CertContext* ctx);
CC_END_HEADER
#endif

View File

@ -408,13 +408,22 @@ cc_result SSL_Free(void* ctx_) {
#include "String.h"
#include "bearssl.h"
#include "../misc/certs/certs.h"
// https://github.com/unkaktus/bearssl/blob/master/samples/client_basic.c#L283
#define SSL_ERROR_SHIFT 0xB5510000
static br_x509_class cert_verifier_vtable;
typedef struct SSLContext {
br_x509_minimal_context xc;
br_ssl_client_context sc;
struct X509CertContext x509;
unsigned char iobuf[BR_SSL_BUFSIZE_BIDI];
br_sslio_context ioc;
cc_result readError, writeError;
cc_socket socket;
} SSLContext;
static cc_bool _verifyCerts;
static unsigned cert_verifier_end_chain(const br_x509_class** ctx) {
static unsigned x509_end_chain(const br_x509_class** ctx) {
unsigned r = br_x509_minimal_vtable.end_chain(ctx);
/* User selected to not care about certificate authenticity */
@ -434,20 +443,19 @@ static unsigned cert_verifier_end_chain(const br_x509_class** ctx) {
return r;
}
typedef struct SSLContext {
br_x509_minimal_context xc;
br_ssl_client_context sc;
unsigned char iobuf[BR_SSL_BUFSIZE_BIDI];
br_sslio_context ioc;
cc_result readError, writeError;
cc_socket socket;
} SSLContext;
static const br_x509_class cert_verifier_vtable = {
sizeof(br_x509_minimal_context),
x509_start_chain,
x509_start_cert,
x509_append,
x509_end_cert,
x509_end_chain,
x509_get_pkey
};
void SSLBackend_Init(cc_bool verifyCerts) {
_verifyCerts = verifyCerts;
cert_verifier_vtable = br_x509_minimal_vtable;
cert_verifier_vtable.end_chain = cert_verifier_end_chain;
CertsBackend_Init();
}
cc_bool SSLBackend_DescribeError(cc_result res, cc_string* dst) {