BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:47:08 2018 +0000
Revision:
1:9c5af431a1f1
sdf

Who changed what in which revision?

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