forked from wolfSSL/wolfssl
Merge pull request #2557 from tmael/cert_store_ls_x509
Retrieve a stack of X509 certs
This commit is contained in:
@@ -9506,6 +9506,7 @@ static int DoVerifyCallback(WOLFSSL* ssl, int ret, ProcPeerCertArgs* args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(OPENSSL_EXTRA)
|
#if defined(OPENSSL_EXTRA)
|
||||||
|
store->depth = args->count;
|
||||||
store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
|
store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
|
||||||
sizeof(WOLFSSL_X509_VERIFY_PARAM),
|
sizeof(WOLFSSL_X509_VERIFY_PARAM),
|
||||||
ssl->heap, DYNAMIC_TYPE_OPENSSL);
|
ssl->heap, DYNAMIC_TYPE_OPENSSL);
|
||||||
|
225
src/ssl.c
225
src/ssl.c
@@ -3472,6 +3472,204 @@ void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM)
|
||||||
|
#if defined(WOLFSSL_SIGNER_DER_CERT)
|
||||||
|
/******************************************************************************
|
||||||
|
* wolfSSL_CertManagerGetCerts - retrieve stack of X509 certificates in a
|
||||||
|
* certificate manager (CM).
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* returns stack of X509 certs on success, otherwise returns a NULL.
|
||||||
|
*/
|
||||||
|
WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm)
|
||||||
|
{
|
||||||
|
WOLFSSL_STACK* sk = NULL;
|
||||||
|
Signer* signers = NULL;
|
||||||
|
word32 row = 0;
|
||||||
|
DecodedCert* dCert = NULL;
|
||||||
|
WOLFSSL_X509* x509 = NULL;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
if (cm == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
sk = wolfSSL_sk_X509_new();
|
||||||
|
|
||||||
|
if (sk == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wc_LockMutex(&cm->caLock) != 0) {
|
||||||
|
goto error_init;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (row = 0; row < CA_TABLE_SIZE; row++) {
|
||||||
|
signers = cm->caTable[row];
|
||||||
|
while (signers && signers->derCert && signers->derCert->buffer) {
|
||||||
|
|
||||||
|
dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
|
||||||
|
DYNAMIC_TYPE_DCERT);
|
||||||
|
if (dCert == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMEMSET(dCert, 0, sizeof(DecodedCert));
|
||||||
|
|
||||||
|
InitDecodedCert(dCert, signers->derCert->buffer,
|
||||||
|
signers->derCert->length, cm->heap);
|
||||||
|
|
||||||
|
/* Parse Certificate */
|
||||||
|
if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, cm)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), cm->heap,
|
||||||
|
DYNAMIC_TYPE_X509);
|
||||||
|
|
||||||
|
if (x509 == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
InitX509(x509, 1, NULL);
|
||||||
|
|
||||||
|
if (CopyDecodedToX509(x509, dCert) == 0) {
|
||||||
|
|
||||||
|
if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
|
||||||
|
WOLFSSL_MSG("Unable to load x509 into stack");
|
||||||
|
FreeX509(x509);
|
||||||
|
XFREE(x509, cm->heap, DYNAMIC_TYPE_X509);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
found = 1;
|
||||||
|
|
||||||
|
signers = signers->next;
|
||||||
|
|
||||||
|
FreeDecodedCert(dCert);
|
||||||
|
XFREE(dCert, cm->heap, DYNAMIC_TYPE_DCERT);
|
||||||
|
dCert = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wc_UnLockMutex(&cm->caLock);
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
goto error_init;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sk;
|
||||||
|
|
||||||
|
error:
|
||||||
|
wc_UnLockMutex(&cm->caLock);
|
||||||
|
|
||||||
|
error_init:
|
||||||
|
|
||||||
|
if (dCert) {
|
||||||
|
FreeDecodedCert(dCert);
|
||||||
|
XFREE(dCert, cm->heap, DYNAMIC_TYPE_DCERT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sk)
|
||||||
|
wolfSSL_sk_X509_free(sk);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SIGNER_DER_CERT */
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* wolfSSL_X509_STORE_GetCerts - retrieve stack of X509 in a certificate store ctx
|
||||||
|
*
|
||||||
|
* This API can be used in SSL verify callback function to view cert chain
|
||||||
|
* See examples/client/client.c and myVerify() function in test.h
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* returns stack of X509 certs on success, otherwise returns a NULL.
|
||||||
|
*/
|
||||||
|
WOLFSSL_STACK* wolfSSL_X509_STORE_GetCerts(WOLFSSL_X509_STORE_CTX* s)
|
||||||
|
{
|
||||||
|
int certIdx = 0;
|
||||||
|
WOLFSSL_BUFFER_INFO* cert = NULL;
|
||||||
|
DecodedCert* dCert = NULL;
|
||||||
|
WOLFSSL_X509* x509 = NULL;
|
||||||
|
WOLFSSL_STACK* sk = NULL;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
if (s == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sk = wolfSSL_sk_X509_new();
|
||||||
|
|
||||||
|
if (sk == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (certIdx = s->totalCerts - 1; certIdx >= 0; certIdx--) {
|
||||||
|
/* get certificate buffer */
|
||||||
|
cert = &s->certs[certIdx];
|
||||||
|
|
||||||
|
if (cert == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
|
||||||
|
|
||||||
|
if (dCert == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
XMEMSET(dCert, 0, sizeof(DecodedCert));
|
||||||
|
|
||||||
|
InitDecodedCert(dCert, cert->buffer, cert->length, NULL);
|
||||||
|
|
||||||
|
/* Parse Certificate */
|
||||||
|
if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, NULL)){
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
x509 = wolfSSL_X509_new();
|
||||||
|
|
||||||
|
if (x509 == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
InitX509(x509, 1, NULL);
|
||||||
|
|
||||||
|
if (CopyDecodedToX509(x509, dCert) == 0) {
|
||||||
|
|
||||||
|
if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
|
||||||
|
WOLFSSL_MSG("Unable to load x509 into stack");
|
||||||
|
wolfSSL_X509_free(x509);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
found = 1;
|
||||||
|
|
||||||
|
FreeDecodedCert(dCert);
|
||||||
|
XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
|
||||||
|
dCert = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
wolfSSL_sk_X509_free(sk);
|
||||||
|
sk = NULL;
|
||||||
|
}
|
||||||
|
return sk;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (dCert) {
|
||||||
|
FreeDecodedCert(dCert);
|
||||||
|
XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sk)
|
||||||
|
wolfSSL_sk_X509_free(sk);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */
|
||||||
|
|
||||||
/* Unload the CA signer list */
|
/* Unload the CA signer list */
|
||||||
int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm)
|
int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm)
|
||||||
@@ -14315,10 +14513,8 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
|
|||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef NO_CERTS
|
#ifndef NO_CERTS
|
||||||
|
|
||||||
WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
|
WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
|
||||||
{
|
{
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
@@ -38781,15 +38977,6 @@ int wolfSSL_CIPHER_get_bits(const WOLFSSL_CIPHER *c, int *alg_bits)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s)
|
|
||||||
{
|
|
||||||
WOLFSSL_ENTER("wolfSSL_sk_X509_num");
|
|
||||||
|
|
||||||
if (s == NULL)
|
|
||||||
return -1;
|
|
||||||
return (int)s->num;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(OPENSSL_ALL)
|
#if defined(OPENSSL_ALL)
|
||||||
WOLFSSL_X509_INFO* wolfSSL_X509_INFO_new(void)
|
WOLFSSL_X509_INFO* wolfSSL_X509_INFO_new(void)
|
||||||
{
|
{
|
||||||
@@ -39574,6 +39761,16 @@ void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *a)
|
|||||||
|
|
||||||
|
|
||||||
#if defined(OPENSSL_EXTRA)
|
#if defined(OPENSSL_EXTRA)
|
||||||
|
|
||||||
|
int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s)
|
||||||
|
{
|
||||||
|
WOLFSSL_ENTER("wolfSSL_sk_X509_num");
|
||||||
|
|
||||||
|
if (s == NULL)
|
||||||
|
return -1;
|
||||||
|
return (int)s->num;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long wolfSSL_ERR_peek_last_error(void)
|
unsigned long wolfSSL_ERR_peek_last_error(void)
|
||||||
{
|
{
|
||||||
WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
|
WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
|
||||||
@@ -44262,9 +44459,9 @@ error:
|
|||||||
}
|
}
|
||||||
return WOLFSSL_FAILURE;
|
return WOLFSSL_FAILURE;
|
||||||
}
|
}
|
||||||
#endif /* defined(OPENSSL_ALL) && defined(HAVE_PKCS7) */
|
#endif /* OPENSSL_ALL && HAVE_PKCS7 */
|
||||||
|
|
||||||
#ifdef OPENSSL_ALL
|
#if defined(OPENSSL_EXTRA)
|
||||||
WOLFSSL_STACK* wolfSSL_sk_X509_new(void)
|
WOLFSSL_STACK* wolfSSL_sk_X509_new(void)
|
||||||
{
|
{
|
||||||
WOLFSSL_STACK* s = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
|
WOLFSSL_STACK* s = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
|
||||||
|
51
tests/api.c
51
tests/api.c
@@ -1093,6 +1093,56 @@ static int test_wolfSSL_CertManagerLoadCABuffer(void)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_wolfSSL_CertManagerGetCerts(void)
|
||||||
|
{
|
||||||
|
#if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \
|
||||||
|
!defined(NO_FILESYSTEM) && !defined(NO_RSA) && \
|
||||||
|
defined(WOLFSSL_SIGNER_DER_CERT)
|
||||||
|
|
||||||
|
WOLFSSL_CERT_MANAGER* cm = NULL;
|
||||||
|
WOLFSSL_STACK* sk = NULL;
|
||||||
|
X509* x509 = NULL;
|
||||||
|
X509* cert1 = NULL;
|
||||||
|
FILE* file1 = NULL;
|
||||||
|
#ifdef DEBUG_WOLFSSL_VERBOSE
|
||||||
|
WOLFSSL_BIO* bio = NULL;
|
||||||
|
#endif
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
printf(testingFmt, "wolfSSL_CertManagerGetCerts()");
|
||||||
|
AssertNotNull(file1=fopen("./certs/ca-cert.pem", "rb"));
|
||||||
|
|
||||||
|
AssertNotNull(cert1 = wolfSSL_PEM_read_X509(file1, NULL, NULL, NULL));
|
||||||
|
fclose(file1);
|
||||||
|
|
||||||
|
AssertNotNull(cm = wolfSSL_CertManagerNew_ex(NULL));
|
||||||
|
AssertNull(sk = wolfSSL_CertManagerGetCerts(cm));
|
||||||
|
AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCA(cm,
|
||||||
|
"./certs/ca-cert.pem", NULL));
|
||||||
|
|
||||||
|
AssertNotNull(sk = wolfSSL_CertManagerGetCerts(cm));
|
||||||
|
|
||||||
|
for (i = 0; i < sk_X509_num(sk); i++) {
|
||||||
|
x509 = sk_X509_value(sk, i);
|
||||||
|
AssertIntEQ(0, wolfSSL_X509_cmp(x509, cert1));
|
||||||
|
|
||||||
|
#ifdef DEBUG_WOLFSSL_VERBOSE
|
||||||
|
bio = BIO_new(wolfSSL_BIO_s_file());
|
||||||
|
if (bio != NULL) {
|
||||||
|
BIO_set_fp(bio, stdout, BIO_NOCLOSE);
|
||||||
|
X509_print(bio, x509);
|
||||||
|
BIO_free(bio);
|
||||||
|
}
|
||||||
|
#endif /* DEBUG_WOLFSSL_VERBOSE */
|
||||||
|
}
|
||||||
|
wolfSSL_X509_free(cert1);
|
||||||
|
sk_X509_free(sk);
|
||||||
|
wolfSSL_CertManagerFree(cm);
|
||||||
|
printf(resultFmt, passed);
|
||||||
|
#endif /* defined(OPENSSL_ALL) && !defined(NO_CERTS) && \
|
||||||
|
!defined(NO_FILESYSTEM) && !defined(NO_RSA) && \
|
||||||
|
defined(WOLFSSL_SIGNER_DER_CERT) */
|
||||||
|
}
|
||||||
static void test_wolfSSL_CertManagerCRL(void)
|
static void test_wolfSSL_CertManagerCRL(void)
|
||||||
{
|
{
|
||||||
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && defined(HAVE_CRL) && \
|
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && defined(HAVE_CRL) && \
|
||||||
@@ -28576,6 +28626,7 @@ void ApiTest(void)
|
|||||||
test_wolfSSL_CTX_use_PrivateKey_file();
|
test_wolfSSL_CTX_use_PrivateKey_file();
|
||||||
test_wolfSSL_CTX_load_verify_locations();
|
test_wolfSSL_CTX_load_verify_locations();
|
||||||
test_wolfSSL_CertManagerLoadCABuffer();
|
test_wolfSSL_CertManagerLoadCABuffer();
|
||||||
|
test_wolfSSL_CertManagerGetCerts();
|
||||||
test_wolfSSL_CertManagerCRL();
|
test_wolfSSL_CertManagerCRL();
|
||||||
test_wolfSSL_CTX_load_verify_locations_ex();
|
test_wolfSSL_CTX_load_verify_locations_ex();
|
||||||
test_wolfSSL_CTX_load_verify_buffer_ex();
|
test_wolfSSL_CTX_load_verify_buffer_ex();
|
||||||
|
@@ -561,7 +561,7 @@ typedef struct WOLFSSL_X509_STORE_CTX {
|
|||||||
#if defined(HAVE_EX_DATA) || defined(FORTRESS)
|
#if defined(HAVE_EX_DATA) || defined(FORTRESS)
|
||||||
void* ex_data[MAX_EX_DATA]; /* external data */
|
void* ex_data[MAX_EX_DATA]; /* external data */
|
||||||
#endif
|
#endif
|
||||||
#if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL)
|
#if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_EXTRA)
|
||||||
int depth; /* used in X509_STORE_CTX_*_depth */
|
int depth; /* used in X509_STORE_CTX_*_depth */
|
||||||
#endif
|
#endif
|
||||||
void* userCtx; /* user ctx */
|
void* userCtx; /* user ctx */
|
||||||
@@ -2596,7 +2596,9 @@ WOLFSSL_API void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl);
|
|||||||
WOLFSSL_CERT_MANAGER* cm);
|
WOLFSSL_CERT_MANAGER* cm);
|
||||||
WOLFSSL_API int wolfSSL_CertManagerDisableOCSPStapling(
|
WOLFSSL_API int wolfSSL_CertManagerDisableOCSPStapling(
|
||||||
WOLFSSL_CERT_MANAGER* cm);
|
WOLFSSL_CERT_MANAGER* cm);
|
||||||
|
#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SIGNER_DER_CERT) && !defined(NO_FILESYSTEM)
|
||||||
|
WOLFSSL_API WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm);
|
||||||
|
#endif
|
||||||
WOLFSSL_API int wolfSSL_EnableCRL(WOLFSSL* ssl, int options);
|
WOLFSSL_API int wolfSSL_EnableCRL(WOLFSSL* ssl, int options);
|
||||||
WOLFSSL_API int wolfSSL_DisableCRL(WOLFSSL* ssl);
|
WOLFSSL_API int wolfSSL_DisableCRL(WOLFSSL* ssl);
|
||||||
WOLFSSL_API int wolfSSL_LoadCRL(WOLFSSL*, const char*, int, int);
|
WOLFSSL_API int wolfSSL_LoadCRL(WOLFSSL*, const char*, int, int);
|
||||||
@@ -3188,6 +3190,7 @@ WOLFSSL_API int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509);
|
|||||||
#if !defined(NO_FILESYSTEM)
|
#if !defined(NO_FILESYSTEM)
|
||||||
WOLFSSL_API WOLFSSL_X509* wolfSSL_d2i_X509_fp(XFILE fp,
|
WOLFSSL_API WOLFSSL_X509* wolfSSL_d2i_X509_fp(XFILE fp,
|
||||||
WOLFSSL_X509** x509);
|
WOLFSSL_X509** x509);
|
||||||
|
WOLFSSL_API WOLFSSL_STACK* wolfSSL_X509_STORE_GetCerts(WOLFSSL_X509_STORE_CTX* s);
|
||||||
#endif
|
#endif
|
||||||
WOLFSSL_API WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio,
|
WOLFSSL_API WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio,
|
||||||
WOLFSSL_X509** x509);
|
WOLFSSL_X509** x509);
|
||||||
|
@@ -1649,11 +1649,25 @@ static WC_INLINE void OCSPRespFreeCb(void* ioCtx, unsigned char* response)
|
|||||||
#endif /* !NO_CERTS */
|
#endif /* !NO_CERTS */
|
||||||
|
|
||||||
static int myVerifyFail = 0;
|
static int myVerifyFail = 0;
|
||||||
|
|
||||||
|
/* The verify callback is called for every certificate only when
|
||||||
|
* --enable-opensslextra is defined because it sets WOLFSSL_ALWAYS_VERIFY_CB and
|
||||||
|
* WOLFSSL_VERIFY_CB_ALL_CERTS.
|
||||||
|
* Normal cases of the verify callback only occur on certificate failures when the
|
||||||
|
* wolfSSL_set_verify(ssl, SSL_VERIFY_PEER, myVerifyCb); is called
|
||||||
|
*/
|
||||||
|
|
||||||
static WC_INLINE int myVerify(int preverify, WOLFSSL_X509_STORE_CTX* store)
|
static WC_INLINE int myVerify(int preverify, WOLFSSL_X509_STORE_CTX* store)
|
||||||
{
|
{
|
||||||
char buffer[WOLFSSL_MAX_ERROR_SZ];
|
char buffer[WOLFSSL_MAX_ERROR_SZ];
|
||||||
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
|
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
|
||||||
WOLFSSL_X509* peer;
|
WOLFSSL_X509* peer;
|
||||||
|
#if defined(SHOW_CERTS) && !defined(NO_FILESYSTEM)
|
||||||
|
WOLFSSL_BIO* bio = NULL;
|
||||||
|
WOLFSSL_STACK* sk = NULL;
|
||||||
|
X509* x509 = NULL;
|
||||||
|
int i = 0;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
(void)preverify;
|
(void)preverify;
|
||||||
|
|
||||||
@@ -1685,6 +1699,24 @@ static WC_INLINE int myVerify(int preverify, WOLFSSL_X509_STORE_CTX* store)
|
|||||||
subject);
|
subject);
|
||||||
XFREE(subject, 0, DYNAMIC_TYPE_OPENSSL);
|
XFREE(subject, 0, DYNAMIC_TYPE_OPENSSL);
|
||||||
XFREE(issuer, 0, DYNAMIC_TYPE_OPENSSL);
|
XFREE(issuer, 0, DYNAMIC_TYPE_OPENSSL);
|
||||||
|
#if defined(SHOW_CERTS) && !defined(NO_FILESYSTEM)
|
||||||
|
/* avoid printing duplicate certs */
|
||||||
|
if (store->depth == 1) {
|
||||||
|
/* retrieve x509 certs and display them on stdout */
|
||||||
|
sk = wolfSSL_X509_STORE_GetCerts(store);
|
||||||
|
|
||||||
|
for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
|
||||||
|
x509 = wolfSSL_sk_X509_value(sk, i);
|
||||||
|
bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
|
||||||
|
if (bio != NULL) {
|
||||||
|
wolfSSL_BIO_set_fp(bio, stdout, BIO_NOCLOSE);
|
||||||
|
wolfSSL_X509_print(bio, x509);
|
||||||
|
wolfSSL_BIO_free(bio);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wolfSSL_sk_X509_free(sk);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
printf("\tPeer has no cert!\n");
|
printf("\tPeer has no cert!\n");
|
||||||
|
Reference in New Issue
Block a user