/* Load CRL File of type, SSL_SUCCESS on ok */ int BufferLoadCRL(CYASSL_CRL* crl, const byte* buff, long sz, int type) { int ret = SSL_SUCCESS; const byte* myBuffer = buff; /* if DER ok, otherwise switch */ buffer der; DecodedCRL dcrl; der.buffer = NULL; CYASSL_ENTER("BufferLoadCRL"); if (crl == NULL || buff == NULL || sz == 0) return BAD_FUNC_ARG; if (type == SSL_FILETYPE_PEM) { int eccKey = 0; /* not used */ EncryptedInfo info; info.ctx = NULL; ret = PemToDer(buff, sz, CRL_TYPE, &der, NULL, &info, &eccKey); if (ret == 0) { myBuffer = der.buffer; sz = der.length; } else { CYASSL_MSG("Pem to Der failed"); return -1; } } InitDecodedCRL(&dcrl); ret = ParseCRL(&dcrl, myBuffer, (word32)sz, crl->cm); if (ret != 0) { CYASSL_MSG("ParseCRL error"); } else { ret = AddCRL(crl, &dcrl); if (ret != 0) { CYASSL_MSG("AddCRL error"); } } FreeDecodedCRL(&dcrl); if (der.buffer) XFREE(der.buffer, NULL, DYNAMIC_TYPE_CRL); if (ret == 0) return SSL_SUCCESS; /* convert */ return ret; }
X509* PEM_read_X509(FILE *fp, X509 *x, pem_password_cb cb, void *u) { if (fp == NULL) return NULL; // Get x509 handle and encryption information x509* ptr = PemToDer(fp, Cert); if (!ptr) return NULL; // Now decode x509 object. TaoCrypt::SignerList signers; TaoCrypt::Source source(ptr->get_buffer(), ptr->get_length()); TaoCrypt::CertDecoder cert(source, true, &signers, true, TaoCrypt::CertDecoder::CA); if (cert.GetError().What()) { ysDelete(ptr); return NULL; } // Ok. Now create X509 object. size_t iSz = strlen(cert.GetIssuer()) + 1; size_t sSz = strlen(cert.GetCommonName()) + 1; ASN1_STRING beforeDate, afterDate; beforeDate.data = (unsigned char *) cert.GetBeforeDate(); beforeDate.type = cert.GetBeforeDateType(); beforeDate.length = strlen((char *) beforeDate.data) + 1; afterDate.data = (unsigned char *) cert.GetAfterDate(); afterDate.type = cert.GetAfterDateType(); afterDate.length = strlen((char *) afterDate.data) + 1; X509 *thisX509 = NEW_YS X509(cert.GetIssuer(), iSz, cert.GetCommonName(), sSz, &beforeDate, &afterDate, cert.GetIssuerCnStart(), cert.GetIssuerCnLength(), cert.GetSubjectCnStart(), cert.GetSubjectCnLength()); ysDelete(ptr); return thisX509; }
/* Load CRL File of type, SSL_SUCCESS on ok */ int BufferLoadCRL(WOLFSSL_CRL* crl, const byte* buff, long sz, int type) { int ret = SSL_SUCCESS; const byte* myBuffer = buff; /* if DER ok, otherwise switch */ DerBuffer* der = NULL; #ifdef WOLFSSL_SMALL_STACK DecodedCRL* dcrl; #else DecodedCRL dcrl[1]; #endif WOLFSSL_ENTER("BufferLoadCRL"); if (crl == NULL || buff == NULL || sz == 0) return BAD_FUNC_ARG; if (type == SSL_FILETYPE_PEM) { int eccKey = 0; /* not used */ EncryptedInfo info; info.ctx = NULL; ret = PemToDer(buff, sz, CRL_TYPE, &der, NULL, &info, &eccKey); if (ret == 0) { myBuffer = der->buffer; sz = der->length; } else { WOLFSSL_MSG("Pem to Der failed"); FreeDer(&der); return -1; } } #ifdef WOLFSSL_SMALL_STACK dcrl = (DecodedCRL*)XMALLOC(sizeof(DecodedCRL), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (dcrl == NULL) { FreeDer(&der); return MEMORY_E; } #endif InitDecodedCRL(dcrl, crl->heap); ret = ParseCRL(dcrl, myBuffer, (word32)sz, crl->cm); if (ret != 0) { WOLFSSL_MSG("ParseCRL error"); } else { ret = AddCRL(crl, dcrl); if (ret != 0) { WOLFSSL_MSG("AddCRL error"); } } FreeDecodedCRL(dcrl); #ifdef WOLFSSL_SMALL_STACK XFREE(dcrl, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif FreeDer(&der); return ret ? ret : SSL_SUCCESS; /* convert 0 to SSL_SUCCESS */ }