/* * Parse one or more CRLs and add them to the chained list */ int mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ) { #if defined(MBEDTLS_PEM_PARSE_C) int ret; size_t use_len; mbedtls_pem_context pem; int is_pem = 0; if( chain == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); do { mbedtls_pem_init( &pem ); // Avoid calling mbedtls_pem_read_buffer() on non-null-terminated // string if( buflen == 0 || buf[buflen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN X509 CRL-----", "-----END X509 CRL-----", buf, NULL, 0, &use_len ); if( ret == 0 ) { /* * Was PEM encoded */ is_pem = 1; buflen -= use_len; buf += use_len; if( ( ret = mbedtls_x509_crl_parse_der( chain, pem.buf, pem.buflen ) ) != 0 ) { return( ret ); } mbedtls_pem_free( &pem ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) { mbedtls_pem_free( &pem ); return( ret ); } } /* In the PEM case, buflen is 1 at the end, for the terminated NULL byte. * And a valid CRL cannot be less than 1 byte anyway. */ while( is_pem && buflen > 1 ); if( is_pem ) return( 0 ); else #endif /* MBEDTLS_PEM_PARSE_C */ return( mbedtls_x509_crl_parse_der( chain, buf, buflen ) ); }
int x509crl::parseDER(State & state, mbedtls_x509_crl * certificate){ Stack * stack = state.stack; if (stack->is<LUA_TSTRING>(1)){ const std::string data = stack->toLString(1); stack->push<int>(mbedtls_x509_crl_parse_der(certificate, reinterpret_cast<const unsigned char*>(data.c_str()), data.length())); return 1; } return 0; }