1a8e1175bSopenharmony_ci/* 2a8e1175bSopenharmony_ci * X.509 Certificate Revocation List (CRL) parsing 3a8e1175bSopenharmony_ci * 4a8e1175bSopenharmony_ci * Copyright The Mbed TLS Contributors 5a8e1175bSopenharmony_ci * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 6a8e1175bSopenharmony_ci */ 7a8e1175bSopenharmony_ci/* 8a8e1175bSopenharmony_ci * The ITU-T X.509 standard defines a certificate format for PKI. 9a8e1175bSopenharmony_ci * 10a8e1175bSopenharmony_ci * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) 11a8e1175bSopenharmony_ci * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) 12a8e1175bSopenharmony_ci * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) 13a8e1175bSopenharmony_ci * 14a8e1175bSopenharmony_ci * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf 15a8e1175bSopenharmony_ci * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf 16a8e1175bSopenharmony_ci */ 17a8e1175bSopenharmony_ci 18a8e1175bSopenharmony_ci#include "common.h" 19a8e1175bSopenharmony_ci 20a8e1175bSopenharmony_ci#if defined(MBEDTLS_X509_CRL_PARSE_C) 21a8e1175bSopenharmony_ci 22a8e1175bSopenharmony_ci#include "mbedtls/x509_crl.h" 23a8e1175bSopenharmony_ci#include "x509_internal.h" 24a8e1175bSopenharmony_ci#include "mbedtls/error.h" 25a8e1175bSopenharmony_ci#include "mbedtls/oid.h" 26a8e1175bSopenharmony_ci#include "mbedtls/platform_util.h" 27a8e1175bSopenharmony_ci 28a8e1175bSopenharmony_ci#include <string.h> 29a8e1175bSopenharmony_ci 30a8e1175bSopenharmony_ci#if defined(MBEDTLS_PEM_PARSE_C) 31a8e1175bSopenharmony_ci#include "mbedtls/pem.h" 32a8e1175bSopenharmony_ci#endif 33a8e1175bSopenharmony_ci 34a8e1175bSopenharmony_ci#include "mbedtls/platform.h" 35a8e1175bSopenharmony_ci 36a8e1175bSopenharmony_ci#if defined(MBEDTLS_HAVE_TIME) 37a8e1175bSopenharmony_ci#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) 38a8e1175bSopenharmony_ci#include <windows.h> 39a8e1175bSopenharmony_ci#else 40a8e1175bSopenharmony_ci#include <time.h> 41a8e1175bSopenharmony_ci#endif 42a8e1175bSopenharmony_ci#endif 43a8e1175bSopenharmony_ci 44a8e1175bSopenharmony_ci#if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32) 45a8e1175bSopenharmony_ci#include <stdio.h> 46a8e1175bSopenharmony_ci#endif 47a8e1175bSopenharmony_ci 48a8e1175bSopenharmony_ci/* 49a8e1175bSopenharmony_ci * Version ::= INTEGER { v1(0), v2(1) } 50a8e1175bSopenharmony_ci */ 51a8e1175bSopenharmony_cistatic int x509_crl_get_version(unsigned char **p, 52a8e1175bSopenharmony_ci const unsigned char *end, 53a8e1175bSopenharmony_ci int *ver) 54a8e1175bSopenharmony_ci{ 55a8e1175bSopenharmony_ci int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 56a8e1175bSopenharmony_ci 57a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_int(p, end, ver)) != 0) { 58a8e1175bSopenharmony_ci if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { 59a8e1175bSopenharmony_ci *ver = 0; 60a8e1175bSopenharmony_ci return 0; 61a8e1175bSopenharmony_ci } 62a8e1175bSopenharmony_ci 63a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_VERSION, ret); 64a8e1175bSopenharmony_ci } 65a8e1175bSopenharmony_ci 66a8e1175bSopenharmony_ci return 0; 67a8e1175bSopenharmony_ci} 68a8e1175bSopenharmony_ci 69a8e1175bSopenharmony_ci/* 70a8e1175bSopenharmony_ci * X.509 CRL v2 extensions 71a8e1175bSopenharmony_ci * 72a8e1175bSopenharmony_ci * We currently don't parse any extension's content, but we do check that the 73a8e1175bSopenharmony_ci * list of extensions is well-formed and abort on critical extensions (that 74a8e1175bSopenharmony_ci * are unsupported as we don't support any extension so far) 75a8e1175bSopenharmony_ci */ 76a8e1175bSopenharmony_cistatic int x509_get_crl_ext(unsigned char **p, 77a8e1175bSopenharmony_ci const unsigned char *end, 78a8e1175bSopenharmony_ci mbedtls_x509_buf *ext) 79a8e1175bSopenharmony_ci{ 80a8e1175bSopenharmony_ci int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 81a8e1175bSopenharmony_ci 82a8e1175bSopenharmony_ci if (*p == end) { 83a8e1175bSopenharmony_ci return 0; 84a8e1175bSopenharmony_ci } 85a8e1175bSopenharmony_ci 86a8e1175bSopenharmony_ci /* 87a8e1175bSopenharmony_ci * crlExtensions [0] EXPLICIT Extensions OPTIONAL 88a8e1175bSopenharmony_ci * -- if present, version MUST be v2 89a8e1175bSopenharmony_ci */ 90a8e1175bSopenharmony_ci if ((ret = mbedtls_x509_get_ext(p, end, ext, 0)) != 0) { 91a8e1175bSopenharmony_ci return ret; 92a8e1175bSopenharmony_ci } 93a8e1175bSopenharmony_ci 94a8e1175bSopenharmony_ci end = ext->p + ext->len; 95a8e1175bSopenharmony_ci 96a8e1175bSopenharmony_ci while (*p < end) { 97a8e1175bSopenharmony_ci /* 98a8e1175bSopenharmony_ci * Extension ::= SEQUENCE { 99a8e1175bSopenharmony_ci * extnID OBJECT IDENTIFIER, 100a8e1175bSopenharmony_ci * critical BOOLEAN DEFAULT FALSE, 101a8e1175bSopenharmony_ci * extnValue OCTET STRING } 102a8e1175bSopenharmony_ci */ 103a8e1175bSopenharmony_ci int is_critical = 0; 104a8e1175bSopenharmony_ci const unsigned char *end_ext_data; 105a8e1175bSopenharmony_ci size_t len; 106a8e1175bSopenharmony_ci 107a8e1175bSopenharmony_ci /* Get enclosing sequence tag */ 108a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_tag(p, end, &len, 109a8e1175bSopenharmony_ci MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { 110a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); 111a8e1175bSopenharmony_ci } 112a8e1175bSopenharmony_ci 113a8e1175bSopenharmony_ci end_ext_data = *p + len; 114a8e1175bSopenharmony_ci 115a8e1175bSopenharmony_ci /* Get OID (currently ignored) */ 116a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_tag(p, end_ext_data, &len, 117a8e1175bSopenharmony_ci MBEDTLS_ASN1_OID)) != 0) { 118a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); 119a8e1175bSopenharmony_ci } 120a8e1175bSopenharmony_ci *p += len; 121a8e1175bSopenharmony_ci 122a8e1175bSopenharmony_ci /* Get optional critical */ 123a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_bool(p, end_ext_data, 124a8e1175bSopenharmony_ci &is_critical)) != 0 && 125a8e1175bSopenharmony_ci (ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG)) { 126a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); 127a8e1175bSopenharmony_ci } 128a8e1175bSopenharmony_ci 129a8e1175bSopenharmony_ci /* Data should be octet string type */ 130a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_tag(p, end_ext_data, &len, 131a8e1175bSopenharmony_ci MBEDTLS_ASN1_OCTET_STRING)) != 0) { 132a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); 133a8e1175bSopenharmony_ci } 134a8e1175bSopenharmony_ci 135a8e1175bSopenharmony_ci /* Ignore data so far and just check its length */ 136a8e1175bSopenharmony_ci *p += len; 137a8e1175bSopenharmony_ci if (*p != end_ext_data) { 138a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, 139a8e1175bSopenharmony_ci MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); 140a8e1175bSopenharmony_ci } 141a8e1175bSopenharmony_ci 142a8e1175bSopenharmony_ci /* Abort on (unsupported) critical extensions */ 143a8e1175bSopenharmony_ci if (is_critical) { 144a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, 145a8e1175bSopenharmony_ci MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); 146a8e1175bSopenharmony_ci } 147a8e1175bSopenharmony_ci } 148a8e1175bSopenharmony_ci 149a8e1175bSopenharmony_ci if (*p != end) { 150a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, 151a8e1175bSopenharmony_ci MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); 152a8e1175bSopenharmony_ci } 153a8e1175bSopenharmony_ci 154a8e1175bSopenharmony_ci return 0; 155a8e1175bSopenharmony_ci} 156a8e1175bSopenharmony_ci 157a8e1175bSopenharmony_ci/* 158a8e1175bSopenharmony_ci * X.509 CRL v2 entry extensions (no extensions parsed yet.) 159a8e1175bSopenharmony_ci */ 160a8e1175bSopenharmony_cistatic int x509_get_crl_entry_ext(unsigned char **p, 161a8e1175bSopenharmony_ci const unsigned char *end, 162a8e1175bSopenharmony_ci mbedtls_x509_buf *ext) 163a8e1175bSopenharmony_ci{ 164a8e1175bSopenharmony_ci int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 165a8e1175bSopenharmony_ci size_t len = 0; 166a8e1175bSopenharmony_ci 167a8e1175bSopenharmony_ci /* OPTIONAL */ 168a8e1175bSopenharmony_ci if (end <= *p) { 169a8e1175bSopenharmony_ci return 0; 170a8e1175bSopenharmony_ci } 171a8e1175bSopenharmony_ci 172a8e1175bSopenharmony_ci ext->tag = **p; 173a8e1175bSopenharmony_ci ext->p = *p; 174a8e1175bSopenharmony_ci 175a8e1175bSopenharmony_ci /* 176a8e1175bSopenharmony_ci * Get CRL-entry extension sequence header 177a8e1175bSopenharmony_ci * crlEntryExtensions Extensions OPTIONAL -- if present, MUST be v2 178a8e1175bSopenharmony_ci */ 179a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_tag(p, end, &ext->len, 180a8e1175bSopenharmony_ci MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { 181a8e1175bSopenharmony_ci if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { 182a8e1175bSopenharmony_ci ext->p = NULL; 183a8e1175bSopenharmony_ci return 0; 184a8e1175bSopenharmony_ci } 185a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); 186a8e1175bSopenharmony_ci } 187a8e1175bSopenharmony_ci 188a8e1175bSopenharmony_ci end = *p + ext->len; 189a8e1175bSopenharmony_ci 190a8e1175bSopenharmony_ci if (end != *p + ext->len) { 191a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, 192a8e1175bSopenharmony_ci MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); 193a8e1175bSopenharmony_ci } 194a8e1175bSopenharmony_ci 195a8e1175bSopenharmony_ci while (*p < end) { 196a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_tag(p, end, &len, 197a8e1175bSopenharmony_ci MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { 198a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); 199a8e1175bSopenharmony_ci } 200a8e1175bSopenharmony_ci 201a8e1175bSopenharmony_ci *p += len; 202a8e1175bSopenharmony_ci } 203a8e1175bSopenharmony_ci 204a8e1175bSopenharmony_ci if (*p != end) { 205a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, 206a8e1175bSopenharmony_ci MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); 207a8e1175bSopenharmony_ci } 208a8e1175bSopenharmony_ci 209a8e1175bSopenharmony_ci return 0; 210a8e1175bSopenharmony_ci} 211a8e1175bSopenharmony_ci 212a8e1175bSopenharmony_ci/* 213a8e1175bSopenharmony_ci * X.509 CRL Entries 214a8e1175bSopenharmony_ci */ 215a8e1175bSopenharmony_cistatic int x509_get_entries(unsigned char **p, 216a8e1175bSopenharmony_ci const unsigned char *end, 217a8e1175bSopenharmony_ci mbedtls_x509_crl_entry *entry) 218a8e1175bSopenharmony_ci{ 219a8e1175bSopenharmony_ci int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 220a8e1175bSopenharmony_ci size_t entry_len; 221a8e1175bSopenharmony_ci mbedtls_x509_crl_entry *cur_entry = entry; 222a8e1175bSopenharmony_ci 223a8e1175bSopenharmony_ci if (*p == end) { 224a8e1175bSopenharmony_ci return 0; 225a8e1175bSopenharmony_ci } 226a8e1175bSopenharmony_ci 227a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_tag(p, end, &entry_len, 228a8e1175bSopenharmony_ci MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) { 229a8e1175bSopenharmony_ci if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { 230a8e1175bSopenharmony_ci return 0; 231a8e1175bSopenharmony_ci } 232a8e1175bSopenharmony_ci 233a8e1175bSopenharmony_ci return ret; 234a8e1175bSopenharmony_ci } 235a8e1175bSopenharmony_ci 236a8e1175bSopenharmony_ci end = *p + entry_len; 237a8e1175bSopenharmony_ci 238a8e1175bSopenharmony_ci while (*p < end) { 239a8e1175bSopenharmony_ci size_t len2; 240a8e1175bSopenharmony_ci const unsigned char *end2; 241a8e1175bSopenharmony_ci 242a8e1175bSopenharmony_ci cur_entry->raw.tag = **p; 243a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_tag(p, end, &len2, 244a8e1175bSopenharmony_ci MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) { 245a8e1175bSopenharmony_ci return ret; 246a8e1175bSopenharmony_ci } 247a8e1175bSopenharmony_ci 248a8e1175bSopenharmony_ci cur_entry->raw.p = *p; 249a8e1175bSopenharmony_ci cur_entry->raw.len = len2; 250a8e1175bSopenharmony_ci end2 = *p + len2; 251a8e1175bSopenharmony_ci 252a8e1175bSopenharmony_ci if ((ret = mbedtls_x509_get_serial(p, end2, &cur_entry->serial)) != 0) { 253a8e1175bSopenharmony_ci return ret; 254a8e1175bSopenharmony_ci } 255a8e1175bSopenharmony_ci 256a8e1175bSopenharmony_ci if ((ret = mbedtls_x509_get_time(p, end2, 257a8e1175bSopenharmony_ci &cur_entry->revocation_date)) != 0) { 258a8e1175bSopenharmony_ci return ret; 259a8e1175bSopenharmony_ci } 260a8e1175bSopenharmony_ci 261a8e1175bSopenharmony_ci if ((ret = x509_get_crl_entry_ext(p, end2, 262a8e1175bSopenharmony_ci &cur_entry->entry_ext)) != 0) { 263a8e1175bSopenharmony_ci return ret; 264a8e1175bSopenharmony_ci } 265a8e1175bSopenharmony_ci 266a8e1175bSopenharmony_ci if (*p < end) { 267a8e1175bSopenharmony_ci cur_entry->next = mbedtls_calloc(1, sizeof(mbedtls_x509_crl_entry)); 268a8e1175bSopenharmony_ci 269a8e1175bSopenharmony_ci if (cur_entry->next == NULL) { 270a8e1175bSopenharmony_ci return MBEDTLS_ERR_X509_ALLOC_FAILED; 271a8e1175bSopenharmony_ci } 272a8e1175bSopenharmony_ci 273a8e1175bSopenharmony_ci cur_entry = cur_entry->next; 274a8e1175bSopenharmony_ci } 275a8e1175bSopenharmony_ci } 276a8e1175bSopenharmony_ci 277a8e1175bSopenharmony_ci return 0; 278a8e1175bSopenharmony_ci} 279a8e1175bSopenharmony_ci 280a8e1175bSopenharmony_ci/* 281a8e1175bSopenharmony_ci * Parse one CRLs in DER format and append it to the chained list 282a8e1175bSopenharmony_ci */ 283a8e1175bSopenharmony_ciint mbedtls_x509_crl_parse_der(mbedtls_x509_crl *chain, 284a8e1175bSopenharmony_ci const unsigned char *buf, size_t buflen) 285a8e1175bSopenharmony_ci{ 286a8e1175bSopenharmony_ci int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 287a8e1175bSopenharmony_ci size_t len; 288a8e1175bSopenharmony_ci unsigned char *p = NULL, *end = NULL; 289a8e1175bSopenharmony_ci mbedtls_x509_buf sig_params1, sig_params2, sig_oid2; 290a8e1175bSopenharmony_ci mbedtls_x509_crl *crl = chain; 291a8e1175bSopenharmony_ci 292a8e1175bSopenharmony_ci /* 293a8e1175bSopenharmony_ci * Check for valid input 294a8e1175bSopenharmony_ci */ 295a8e1175bSopenharmony_ci if (crl == NULL || buf == NULL) { 296a8e1175bSopenharmony_ci return MBEDTLS_ERR_X509_BAD_INPUT_DATA; 297a8e1175bSopenharmony_ci } 298a8e1175bSopenharmony_ci 299a8e1175bSopenharmony_ci memset(&sig_params1, 0, sizeof(mbedtls_x509_buf)); 300a8e1175bSopenharmony_ci memset(&sig_params2, 0, sizeof(mbedtls_x509_buf)); 301a8e1175bSopenharmony_ci memset(&sig_oid2, 0, sizeof(mbedtls_x509_buf)); 302a8e1175bSopenharmony_ci 303a8e1175bSopenharmony_ci /* 304a8e1175bSopenharmony_ci * Add new CRL on the end of the chain if needed. 305a8e1175bSopenharmony_ci */ 306a8e1175bSopenharmony_ci while (crl->version != 0 && crl->next != NULL) { 307a8e1175bSopenharmony_ci crl = crl->next; 308a8e1175bSopenharmony_ci } 309a8e1175bSopenharmony_ci 310a8e1175bSopenharmony_ci if (crl->version != 0 && crl->next == NULL) { 311a8e1175bSopenharmony_ci crl->next = mbedtls_calloc(1, sizeof(mbedtls_x509_crl)); 312a8e1175bSopenharmony_ci 313a8e1175bSopenharmony_ci if (crl->next == NULL) { 314a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 315a8e1175bSopenharmony_ci return MBEDTLS_ERR_X509_ALLOC_FAILED; 316a8e1175bSopenharmony_ci } 317a8e1175bSopenharmony_ci 318a8e1175bSopenharmony_ci mbedtls_x509_crl_init(crl->next); 319a8e1175bSopenharmony_ci crl = crl->next; 320a8e1175bSopenharmony_ci } 321a8e1175bSopenharmony_ci 322a8e1175bSopenharmony_ci /* 323a8e1175bSopenharmony_ci * Copy raw DER-encoded CRL 324a8e1175bSopenharmony_ci */ 325a8e1175bSopenharmony_ci if (buflen == 0) { 326a8e1175bSopenharmony_ci return MBEDTLS_ERR_X509_INVALID_FORMAT; 327a8e1175bSopenharmony_ci } 328a8e1175bSopenharmony_ci 329a8e1175bSopenharmony_ci p = mbedtls_calloc(1, buflen); 330a8e1175bSopenharmony_ci if (p == NULL) { 331a8e1175bSopenharmony_ci return MBEDTLS_ERR_X509_ALLOC_FAILED; 332a8e1175bSopenharmony_ci } 333a8e1175bSopenharmony_ci 334a8e1175bSopenharmony_ci memcpy(p, buf, buflen); 335a8e1175bSopenharmony_ci 336a8e1175bSopenharmony_ci crl->raw.p = p; 337a8e1175bSopenharmony_ci crl->raw.len = buflen; 338a8e1175bSopenharmony_ci 339a8e1175bSopenharmony_ci end = p + buflen; 340a8e1175bSopenharmony_ci 341a8e1175bSopenharmony_ci /* 342a8e1175bSopenharmony_ci * CertificateList ::= SEQUENCE { 343a8e1175bSopenharmony_ci * tbsCertList TBSCertList, 344a8e1175bSopenharmony_ci * signatureAlgorithm AlgorithmIdentifier, 345a8e1175bSopenharmony_ci * signatureValue BIT STRING } 346a8e1175bSopenharmony_ci */ 347a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_tag(&p, end, &len, 348a8e1175bSopenharmony_ci MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { 349a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 350a8e1175bSopenharmony_ci return MBEDTLS_ERR_X509_INVALID_FORMAT; 351a8e1175bSopenharmony_ci } 352a8e1175bSopenharmony_ci 353a8e1175bSopenharmony_ci if (len != (size_t) (end - p)) { 354a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 355a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, 356a8e1175bSopenharmony_ci MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); 357a8e1175bSopenharmony_ci } 358a8e1175bSopenharmony_ci 359a8e1175bSopenharmony_ci /* 360a8e1175bSopenharmony_ci * TBSCertList ::= SEQUENCE { 361a8e1175bSopenharmony_ci */ 362a8e1175bSopenharmony_ci crl->tbs.p = p; 363a8e1175bSopenharmony_ci 364a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_tag(&p, end, &len, 365a8e1175bSopenharmony_ci MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { 366a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 367a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); 368a8e1175bSopenharmony_ci } 369a8e1175bSopenharmony_ci 370a8e1175bSopenharmony_ci end = p + len; 371a8e1175bSopenharmony_ci crl->tbs.len = (size_t) (end - crl->tbs.p); 372a8e1175bSopenharmony_ci 373a8e1175bSopenharmony_ci /* 374a8e1175bSopenharmony_ci * Version ::= INTEGER OPTIONAL { v1(0), v2(1) } 375a8e1175bSopenharmony_ci * -- if present, MUST be v2 376a8e1175bSopenharmony_ci * 377a8e1175bSopenharmony_ci * signature AlgorithmIdentifier 378a8e1175bSopenharmony_ci */ 379a8e1175bSopenharmony_ci if ((ret = x509_crl_get_version(&p, end, &crl->version)) != 0 || 380a8e1175bSopenharmony_ci (ret = mbedtls_x509_get_alg(&p, end, &crl->sig_oid, &sig_params1)) != 0) { 381a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 382a8e1175bSopenharmony_ci return ret; 383a8e1175bSopenharmony_ci } 384a8e1175bSopenharmony_ci 385a8e1175bSopenharmony_ci if (crl->version < 0 || crl->version > 1) { 386a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 387a8e1175bSopenharmony_ci return MBEDTLS_ERR_X509_UNKNOWN_VERSION; 388a8e1175bSopenharmony_ci } 389a8e1175bSopenharmony_ci 390a8e1175bSopenharmony_ci crl->version++; 391a8e1175bSopenharmony_ci 392a8e1175bSopenharmony_ci if ((ret = mbedtls_x509_get_sig_alg(&crl->sig_oid, &sig_params1, 393a8e1175bSopenharmony_ci &crl->sig_md, &crl->sig_pk, 394a8e1175bSopenharmony_ci &crl->sig_opts)) != 0) { 395a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 396a8e1175bSopenharmony_ci return MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG; 397a8e1175bSopenharmony_ci } 398a8e1175bSopenharmony_ci 399a8e1175bSopenharmony_ci /* 400a8e1175bSopenharmony_ci * issuer Name 401a8e1175bSopenharmony_ci */ 402a8e1175bSopenharmony_ci crl->issuer_raw.p = p; 403a8e1175bSopenharmony_ci 404a8e1175bSopenharmony_ci if ((ret = mbedtls_asn1_get_tag(&p, end, &len, 405a8e1175bSopenharmony_ci MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { 406a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 407a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); 408a8e1175bSopenharmony_ci } 409a8e1175bSopenharmony_ci 410a8e1175bSopenharmony_ci if ((ret = mbedtls_x509_get_name(&p, p + len, &crl->issuer)) != 0) { 411a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 412a8e1175bSopenharmony_ci return ret; 413a8e1175bSopenharmony_ci } 414a8e1175bSopenharmony_ci 415a8e1175bSopenharmony_ci crl->issuer_raw.len = (size_t) (p - crl->issuer_raw.p); 416a8e1175bSopenharmony_ci 417a8e1175bSopenharmony_ci /* 418a8e1175bSopenharmony_ci * thisUpdate Time 419a8e1175bSopenharmony_ci * nextUpdate Time OPTIONAL 420a8e1175bSopenharmony_ci */ 421a8e1175bSopenharmony_ci if ((ret = mbedtls_x509_get_time(&p, end, &crl->this_update)) != 0) { 422a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 423a8e1175bSopenharmony_ci return ret; 424a8e1175bSopenharmony_ci } 425a8e1175bSopenharmony_ci 426a8e1175bSopenharmony_ci if ((ret = mbedtls_x509_get_time(&p, end, &crl->next_update)) != 0) { 427a8e1175bSopenharmony_ci if (ret != (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_DATE, 428a8e1175bSopenharmony_ci MBEDTLS_ERR_ASN1_UNEXPECTED_TAG)) && 429a8e1175bSopenharmony_ci ret != (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_DATE, 430a8e1175bSopenharmony_ci MBEDTLS_ERR_ASN1_OUT_OF_DATA))) { 431a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 432a8e1175bSopenharmony_ci return ret; 433a8e1175bSopenharmony_ci } 434a8e1175bSopenharmony_ci } 435a8e1175bSopenharmony_ci 436a8e1175bSopenharmony_ci /* 437a8e1175bSopenharmony_ci * revokedCertificates SEQUENCE OF SEQUENCE { 438a8e1175bSopenharmony_ci * userCertificate CertificateSerialNumber, 439a8e1175bSopenharmony_ci * revocationDate Time, 440a8e1175bSopenharmony_ci * crlEntryExtensions Extensions OPTIONAL 441a8e1175bSopenharmony_ci * -- if present, MUST be v2 442a8e1175bSopenharmony_ci * } OPTIONAL 443a8e1175bSopenharmony_ci */ 444a8e1175bSopenharmony_ci if ((ret = x509_get_entries(&p, end, &crl->entry)) != 0) { 445a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 446a8e1175bSopenharmony_ci return ret; 447a8e1175bSopenharmony_ci } 448a8e1175bSopenharmony_ci 449a8e1175bSopenharmony_ci /* 450a8e1175bSopenharmony_ci * crlExtensions EXPLICIT Extensions OPTIONAL 451a8e1175bSopenharmony_ci * -- if present, MUST be v2 452a8e1175bSopenharmony_ci */ 453a8e1175bSopenharmony_ci if (crl->version == 2) { 454a8e1175bSopenharmony_ci ret = x509_get_crl_ext(&p, end, &crl->crl_ext); 455a8e1175bSopenharmony_ci 456a8e1175bSopenharmony_ci if (ret != 0) { 457a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 458a8e1175bSopenharmony_ci return ret; 459a8e1175bSopenharmony_ci } 460a8e1175bSopenharmony_ci } 461a8e1175bSopenharmony_ci 462a8e1175bSopenharmony_ci if (p != end) { 463a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 464a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, 465a8e1175bSopenharmony_ci MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); 466a8e1175bSopenharmony_ci } 467a8e1175bSopenharmony_ci 468a8e1175bSopenharmony_ci end = crl->raw.p + crl->raw.len; 469a8e1175bSopenharmony_ci 470a8e1175bSopenharmony_ci /* 471a8e1175bSopenharmony_ci * signatureAlgorithm AlgorithmIdentifier, 472a8e1175bSopenharmony_ci * signatureValue BIT STRING 473a8e1175bSopenharmony_ci */ 474a8e1175bSopenharmony_ci if ((ret = mbedtls_x509_get_alg(&p, end, &sig_oid2, &sig_params2)) != 0) { 475a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 476a8e1175bSopenharmony_ci return ret; 477a8e1175bSopenharmony_ci } 478a8e1175bSopenharmony_ci 479a8e1175bSopenharmony_ci if (crl->sig_oid.len != sig_oid2.len || 480a8e1175bSopenharmony_ci memcmp(crl->sig_oid.p, sig_oid2.p, crl->sig_oid.len) != 0 || 481a8e1175bSopenharmony_ci sig_params1.len != sig_params2.len || 482a8e1175bSopenharmony_ci (sig_params1.len != 0 && 483a8e1175bSopenharmony_ci memcmp(sig_params1.p, sig_params2.p, sig_params1.len) != 0)) { 484a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 485a8e1175bSopenharmony_ci return MBEDTLS_ERR_X509_SIG_MISMATCH; 486a8e1175bSopenharmony_ci } 487a8e1175bSopenharmony_ci 488a8e1175bSopenharmony_ci if ((ret = mbedtls_x509_get_sig(&p, end, &crl->sig)) != 0) { 489a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 490a8e1175bSopenharmony_ci return ret; 491a8e1175bSopenharmony_ci } 492a8e1175bSopenharmony_ci 493a8e1175bSopenharmony_ci if (p != end) { 494a8e1175bSopenharmony_ci mbedtls_x509_crl_free(crl); 495a8e1175bSopenharmony_ci return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, 496a8e1175bSopenharmony_ci MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); 497a8e1175bSopenharmony_ci } 498a8e1175bSopenharmony_ci 499a8e1175bSopenharmony_ci return 0; 500a8e1175bSopenharmony_ci} 501a8e1175bSopenharmony_ci 502a8e1175bSopenharmony_ci/* 503a8e1175bSopenharmony_ci * Parse one or more CRLs and add them to the chained list 504a8e1175bSopenharmony_ci */ 505a8e1175bSopenharmony_ciint mbedtls_x509_crl_parse(mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen) 506a8e1175bSopenharmony_ci{ 507a8e1175bSopenharmony_ci#if defined(MBEDTLS_PEM_PARSE_C) 508a8e1175bSopenharmony_ci int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 509a8e1175bSopenharmony_ci size_t use_len = 0; 510a8e1175bSopenharmony_ci mbedtls_pem_context pem; 511a8e1175bSopenharmony_ci int is_pem = 0; 512a8e1175bSopenharmony_ci 513a8e1175bSopenharmony_ci if (chain == NULL || buf == NULL) { 514a8e1175bSopenharmony_ci return MBEDTLS_ERR_X509_BAD_INPUT_DATA; 515a8e1175bSopenharmony_ci } 516a8e1175bSopenharmony_ci 517a8e1175bSopenharmony_ci do { 518a8e1175bSopenharmony_ci mbedtls_pem_init(&pem); 519a8e1175bSopenharmony_ci 520a8e1175bSopenharmony_ci // Avoid calling mbedtls_pem_read_buffer() on non-null-terminated 521a8e1175bSopenharmony_ci // string 522a8e1175bSopenharmony_ci if (buflen == 0 || buf[buflen - 1] != '\0') { 523a8e1175bSopenharmony_ci ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; 524a8e1175bSopenharmony_ci } else { 525a8e1175bSopenharmony_ci ret = mbedtls_pem_read_buffer(&pem, 526a8e1175bSopenharmony_ci "-----BEGIN X509 CRL-----", 527a8e1175bSopenharmony_ci "-----END X509 CRL-----", 528a8e1175bSopenharmony_ci buf, NULL, 0, &use_len); 529a8e1175bSopenharmony_ci } 530a8e1175bSopenharmony_ci 531a8e1175bSopenharmony_ci if (ret == 0) { 532a8e1175bSopenharmony_ci /* 533a8e1175bSopenharmony_ci * Was PEM encoded 534a8e1175bSopenharmony_ci */ 535a8e1175bSopenharmony_ci is_pem = 1; 536a8e1175bSopenharmony_ci 537a8e1175bSopenharmony_ci buflen -= use_len; 538a8e1175bSopenharmony_ci buf += use_len; 539a8e1175bSopenharmony_ci 540a8e1175bSopenharmony_ci if ((ret = mbedtls_x509_crl_parse_der(chain, 541a8e1175bSopenharmony_ci pem.buf, pem.buflen)) != 0) { 542a8e1175bSopenharmony_ci mbedtls_pem_free(&pem); 543a8e1175bSopenharmony_ci return ret; 544a8e1175bSopenharmony_ci } 545a8e1175bSopenharmony_ci } else if (is_pem) { 546a8e1175bSopenharmony_ci mbedtls_pem_free(&pem); 547a8e1175bSopenharmony_ci return ret; 548a8e1175bSopenharmony_ci } 549a8e1175bSopenharmony_ci 550a8e1175bSopenharmony_ci mbedtls_pem_free(&pem); 551a8e1175bSopenharmony_ci } 552a8e1175bSopenharmony_ci /* In the PEM case, buflen is 1 at the end, for the terminated NULL byte. 553a8e1175bSopenharmony_ci * And a valid CRL cannot be less than 1 byte anyway. */ 554a8e1175bSopenharmony_ci while (is_pem && buflen > 1); 555a8e1175bSopenharmony_ci 556a8e1175bSopenharmony_ci if (is_pem) { 557a8e1175bSopenharmony_ci return 0; 558a8e1175bSopenharmony_ci } else 559a8e1175bSopenharmony_ci#endif /* MBEDTLS_PEM_PARSE_C */ 560a8e1175bSopenharmony_ci return mbedtls_x509_crl_parse_der(chain, buf, buflen); 561a8e1175bSopenharmony_ci} 562a8e1175bSopenharmony_ci 563a8e1175bSopenharmony_ci#if defined(MBEDTLS_FS_IO) 564a8e1175bSopenharmony_ci/* 565a8e1175bSopenharmony_ci * Load one or more CRLs and add them to the chained list 566a8e1175bSopenharmony_ci */ 567a8e1175bSopenharmony_ciint mbedtls_x509_crl_parse_file(mbedtls_x509_crl *chain, const char *path) 568a8e1175bSopenharmony_ci{ 569a8e1175bSopenharmony_ci int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 570a8e1175bSopenharmony_ci size_t n; 571a8e1175bSopenharmony_ci unsigned char *buf; 572a8e1175bSopenharmony_ci 573a8e1175bSopenharmony_ci if ((ret = mbedtls_pk_load_file(path, &buf, &n)) != 0) { 574a8e1175bSopenharmony_ci return ret; 575a8e1175bSopenharmony_ci } 576a8e1175bSopenharmony_ci 577a8e1175bSopenharmony_ci ret = mbedtls_x509_crl_parse(chain, buf, n); 578a8e1175bSopenharmony_ci 579a8e1175bSopenharmony_ci mbedtls_zeroize_and_free(buf, n); 580a8e1175bSopenharmony_ci 581a8e1175bSopenharmony_ci return ret; 582a8e1175bSopenharmony_ci} 583a8e1175bSopenharmony_ci#endif /* MBEDTLS_FS_IO */ 584a8e1175bSopenharmony_ci 585a8e1175bSopenharmony_ci#if !defined(MBEDTLS_X509_REMOVE_INFO) 586a8e1175bSopenharmony_ci/* 587a8e1175bSopenharmony_ci * Return an informational string about the certificate. 588a8e1175bSopenharmony_ci */ 589a8e1175bSopenharmony_ci#define BEFORE_COLON 14 590a8e1175bSopenharmony_ci#define BC "14" 591a8e1175bSopenharmony_ci/* 592a8e1175bSopenharmony_ci * Return an informational string about the CRL. 593a8e1175bSopenharmony_ci */ 594a8e1175bSopenharmony_ciint mbedtls_x509_crl_info(char *buf, size_t size, const char *prefix, 595a8e1175bSopenharmony_ci const mbedtls_x509_crl *crl) 596a8e1175bSopenharmony_ci{ 597a8e1175bSopenharmony_ci int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 598a8e1175bSopenharmony_ci size_t n; 599a8e1175bSopenharmony_ci char *p; 600a8e1175bSopenharmony_ci const mbedtls_x509_crl_entry *entry; 601a8e1175bSopenharmony_ci 602a8e1175bSopenharmony_ci p = buf; 603a8e1175bSopenharmony_ci n = size; 604a8e1175bSopenharmony_ci 605a8e1175bSopenharmony_ci ret = mbedtls_snprintf(p, n, "%sCRL version : %d", 606a8e1175bSopenharmony_ci prefix, crl->version); 607a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 608a8e1175bSopenharmony_ci 609a8e1175bSopenharmony_ci ret = mbedtls_snprintf(p, n, "\n%sissuer name : ", prefix); 610a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 611a8e1175bSopenharmony_ci ret = mbedtls_x509_dn_gets(p, n, &crl->issuer); 612a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 613a8e1175bSopenharmony_ci 614a8e1175bSopenharmony_ci ret = mbedtls_snprintf(p, n, "\n%sthis update : " \ 615a8e1175bSopenharmony_ci "%04d-%02d-%02d %02d:%02d:%02d", prefix, 616a8e1175bSopenharmony_ci crl->this_update.year, crl->this_update.mon, 617a8e1175bSopenharmony_ci crl->this_update.day, crl->this_update.hour, 618a8e1175bSopenharmony_ci crl->this_update.min, crl->this_update.sec); 619a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 620a8e1175bSopenharmony_ci 621a8e1175bSopenharmony_ci ret = mbedtls_snprintf(p, n, "\n%snext update : " \ 622a8e1175bSopenharmony_ci "%04d-%02d-%02d %02d:%02d:%02d", prefix, 623a8e1175bSopenharmony_ci crl->next_update.year, crl->next_update.mon, 624a8e1175bSopenharmony_ci crl->next_update.day, crl->next_update.hour, 625a8e1175bSopenharmony_ci crl->next_update.min, crl->next_update.sec); 626a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 627a8e1175bSopenharmony_ci 628a8e1175bSopenharmony_ci entry = &crl->entry; 629a8e1175bSopenharmony_ci 630a8e1175bSopenharmony_ci ret = mbedtls_snprintf(p, n, "\n%sRevoked certificates:", 631a8e1175bSopenharmony_ci prefix); 632a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 633a8e1175bSopenharmony_ci 634a8e1175bSopenharmony_ci while (entry != NULL && entry->raw.len != 0) { 635a8e1175bSopenharmony_ci ret = mbedtls_snprintf(p, n, "\n%sserial number: ", 636a8e1175bSopenharmony_ci prefix); 637a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 638a8e1175bSopenharmony_ci 639a8e1175bSopenharmony_ci ret = mbedtls_x509_serial_gets(p, n, &entry->serial); 640a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 641a8e1175bSopenharmony_ci 642a8e1175bSopenharmony_ci ret = mbedtls_snprintf(p, n, " revocation date: " \ 643a8e1175bSopenharmony_ci "%04d-%02d-%02d %02d:%02d:%02d", 644a8e1175bSopenharmony_ci entry->revocation_date.year, entry->revocation_date.mon, 645a8e1175bSopenharmony_ci entry->revocation_date.day, entry->revocation_date.hour, 646a8e1175bSopenharmony_ci entry->revocation_date.min, entry->revocation_date.sec); 647a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 648a8e1175bSopenharmony_ci 649a8e1175bSopenharmony_ci entry = entry->next; 650a8e1175bSopenharmony_ci } 651a8e1175bSopenharmony_ci 652a8e1175bSopenharmony_ci ret = mbedtls_snprintf(p, n, "\n%ssigned using : ", prefix); 653a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 654a8e1175bSopenharmony_ci 655a8e1175bSopenharmony_ci ret = mbedtls_x509_sig_alg_gets(p, n, &crl->sig_oid, crl->sig_pk, crl->sig_md, 656a8e1175bSopenharmony_ci crl->sig_opts); 657a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 658a8e1175bSopenharmony_ci 659a8e1175bSopenharmony_ci ret = mbedtls_snprintf(p, n, "\n"); 660a8e1175bSopenharmony_ci MBEDTLS_X509_SAFE_SNPRINTF; 661a8e1175bSopenharmony_ci 662a8e1175bSopenharmony_ci return (int) (size - n); 663a8e1175bSopenharmony_ci} 664a8e1175bSopenharmony_ci#endif /* MBEDTLS_X509_REMOVE_INFO */ 665a8e1175bSopenharmony_ci 666a8e1175bSopenharmony_ci/* 667a8e1175bSopenharmony_ci * Initialize a CRL chain 668a8e1175bSopenharmony_ci */ 669a8e1175bSopenharmony_civoid mbedtls_x509_crl_init(mbedtls_x509_crl *crl) 670a8e1175bSopenharmony_ci{ 671a8e1175bSopenharmony_ci memset(crl, 0, sizeof(mbedtls_x509_crl)); 672a8e1175bSopenharmony_ci} 673a8e1175bSopenharmony_ci 674a8e1175bSopenharmony_ci/* 675a8e1175bSopenharmony_ci * Unallocate all CRL data 676a8e1175bSopenharmony_ci */ 677a8e1175bSopenharmony_civoid mbedtls_x509_crl_free(mbedtls_x509_crl *crl) 678a8e1175bSopenharmony_ci{ 679a8e1175bSopenharmony_ci mbedtls_x509_crl *crl_cur = crl; 680a8e1175bSopenharmony_ci mbedtls_x509_crl *crl_prv; 681a8e1175bSopenharmony_ci mbedtls_x509_crl_entry *entry_cur; 682a8e1175bSopenharmony_ci mbedtls_x509_crl_entry *entry_prv; 683a8e1175bSopenharmony_ci 684a8e1175bSopenharmony_ci while (crl_cur != NULL) { 685a8e1175bSopenharmony_ci#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) 686a8e1175bSopenharmony_ci mbedtls_free(crl_cur->sig_opts); 687a8e1175bSopenharmony_ci#endif 688a8e1175bSopenharmony_ci 689a8e1175bSopenharmony_ci mbedtls_asn1_free_named_data_list_shallow(crl_cur->issuer.next); 690a8e1175bSopenharmony_ci 691a8e1175bSopenharmony_ci entry_cur = crl_cur->entry.next; 692a8e1175bSopenharmony_ci while (entry_cur != NULL) { 693a8e1175bSopenharmony_ci entry_prv = entry_cur; 694a8e1175bSopenharmony_ci entry_cur = entry_cur->next; 695a8e1175bSopenharmony_ci mbedtls_zeroize_and_free(entry_prv, 696a8e1175bSopenharmony_ci sizeof(mbedtls_x509_crl_entry)); 697a8e1175bSopenharmony_ci } 698a8e1175bSopenharmony_ci 699a8e1175bSopenharmony_ci if (crl_cur->raw.p != NULL) { 700a8e1175bSopenharmony_ci mbedtls_zeroize_and_free(crl_cur->raw.p, crl_cur->raw.len); 701a8e1175bSopenharmony_ci } 702a8e1175bSopenharmony_ci 703a8e1175bSopenharmony_ci crl_prv = crl_cur; 704a8e1175bSopenharmony_ci crl_cur = crl_cur->next; 705a8e1175bSopenharmony_ci 706a8e1175bSopenharmony_ci mbedtls_platform_zeroize(crl_prv, sizeof(mbedtls_x509_crl)); 707a8e1175bSopenharmony_ci if (crl_prv != crl) { 708a8e1175bSopenharmony_ci mbedtls_free(crl_prv); 709a8e1175bSopenharmony_ci } 710a8e1175bSopenharmony_ci } 711a8e1175bSopenharmony_ci} 712a8e1175bSopenharmony_ci 713a8e1175bSopenharmony_ci#endif /* MBEDTLS_X509_CRL_PARSE_C */ 714