blob: 7cd4eb6fa17b909301552151556fd3ee63cb530c [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/x509_crt.h"
3#include "mbedtls/x509_crl.h"
4#include "mbedtls/x509_csr.h"
5#include "mbedtls/pem.h"
6#include "mbedtls/oid.h"
7#include "mbedtls/base64.h"
Paul Bakkerb63b0af2011-01-13 17:54:59 +00008
Manuel Pégourié-Gonnard65eefc82015-10-23 14:08:48 +02009const mbedtls_x509_crt_profile compat_profile =
10{
11 MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA1 ) |
12 MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_RIPEMD160 ) |
13 MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA224 ) |
14 MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) |
15 MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ) |
16 MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA512 ),
17 0xFFFFFFF, /* Any PK alg */
18 0xFFFFFFF, /* Any curve */
19 1024,
20};
21
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +020022int verify_none( void *data, mbedtls_x509_crt *crt, int certificate_depth, uint32_t *flags )
Paul Bakkerb63b0af2011-01-13 17:54:59 +000023{
Paul Bakker5a624082011-01-18 16:31:52 +000024 ((void) data);
25 ((void) crt);
26 ((void) certificate_depth);
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +010027 *flags |= MBEDTLS_X509_BADCERT_OTHER;
Paul Bakkerddf26b42013-09-18 13:46:23 +020028
Paul Bakker915275b2012-09-28 07:10:55 +000029 return 0;
Paul Bakkerb63b0af2011-01-13 17:54:59 +000030}
31
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +020032int verify_all( void *data, mbedtls_x509_crt *crt, int certificate_depth, uint32_t *flags )
Paul Bakkerb63b0af2011-01-13 17:54:59 +000033{
Paul Bakker5a624082011-01-18 16:31:52 +000034 ((void) data);
35 ((void) crt);
36 ((void) certificate_depth);
Paul Bakker915275b2012-09-28 07:10:55 +000037 *flags = 0;
Paul Bakker5a624082011-01-18 16:31:52 +000038
Paul Bakkerb63b0af2011-01-13 17:54:59 +000039 return 0;
40}
41
Manuel Pégourié-Gonnard560fea32015-09-01 11:59:24 +020042#if defined(MBEDTLS_X509_CRT_PARSE_C)
43typedef struct {
44 char buf[512];
45 char *p;
46} verify_print_context;
47
48void verify_print_init( verify_print_context *ctx )
49{
50 memset( ctx, 0, sizeof( verify_print_context ) );
51 ctx->p = ctx->buf;
52}
53
54int verify_print( void *data, mbedtls_x509_crt *crt, int certificate_depth, uint32_t *flags )
55{
56 int ret;
57 verify_print_context *ctx = (verify_print_context *) data;
58 char *p = ctx->p;
59 size_t n = ctx->buf + sizeof( ctx->buf ) - ctx->p;
60 ((void) flags);
61
62 ret = mbedtls_snprintf( p, n, "depth %d - serial ", certificate_depth );
63 MBEDTLS_X509_SAFE_SNPRINTF;
64
65 ret = mbedtls_x509_serial_gets( p, n, &crt->serial );
66 MBEDTLS_X509_SAFE_SNPRINTF;
67
68 ret = mbedtls_snprintf( p, n, " - subject " );
69 MBEDTLS_X509_SAFE_SNPRINTF;
70
71 ret = mbedtls_x509_dn_gets( p, n, &crt->subject );
72 MBEDTLS_X509_SAFE_SNPRINTF;
73
74 ret = mbedtls_snprintf( p, n, "\n" );
75 MBEDTLS_X509_SAFE_SNPRINTF;
76
77 ctx->p = p;
78
79 return( 0 );
80}
81#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker33b43f12013-08-20 11:48:36 +020082/* END_HEADER */
Paul Bakker37940d9f2009-07-10 22:38:58 +000083
Paul Bakker33b43f12013-08-20 11:48:36 +020084/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020085 * depends_on:MBEDTLS_BIGNUM_C
Paul Bakker33b43f12013-08-20 11:48:36 +020086 * END_DEPENDENCIES
87 */
Paul Bakker5690efc2011-05-26 13:16:06 +000088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker33b43f12013-08-20 11:48:36 +020090void x509_cert_info( char *crt_file, char *result_str )
Paul Bakker37940d9f2009-07-10 22:38:58 +000091{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020092 mbedtls_x509_crt crt;
Paul Bakker37940d9f2009-07-10 22:38:58 +000093 char buf[2000];
Paul Bakker69998dd2009-07-11 19:15:20 +000094 int res;
Paul Bakker37940d9f2009-07-10 22:38:58 +000095
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020096 mbedtls_x509_crt_init( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +000097 memset( buf, 0, 2000 );
98
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020099 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
100 res = mbedtls_x509_crt_info( buf, 2000, "", &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000101
102 TEST_ASSERT( res != -1 );
103 TEST_ASSERT( res != -2 );
104
Paul Bakker33b43f12013-08-20 11:48:36 +0200105 TEST_ASSERT( strcmp( buf, result_str ) == 0 );
Paul Bakkerbd51b262014-07-10 15:26:12 +0200106
107exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108 mbedtls_x509_crt_free( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000109}
Paul Bakker33b43f12013-08-20 11:48:36 +0200110/* END_CASE */
Paul Bakker37940d9f2009-07-10 22:38:58 +0000111
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200112/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRL_PARSE_C */
113void mbedtls_x509_crl_info( char *crl_file, char *result_str )
Paul Bakker37940d9f2009-07-10 22:38:58 +0000114{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200115 mbedtls_x509_crl crl;
Paul Bakker37940d9f2009-07-10 22:38:58 +0000116 char buf[2000];
Paul Bakker69998dd2009-07-11 19:15:20 +0000117 int res;
Paul Bakker37940d9f2009-07-10 22:38:58 +0000118
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200119 mbedtls_x509_crl_init( &crl );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000120 memset( buf, 0, 2000 );
121
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200122 TEST_ASSERT( mbedtls_x509_crl_parse_file( &crl, crl_file ) == 0 );
123 res = mbedtls_x509_crl_info( buf, 2000, "", &crl );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000124
125 TEST_ASSERT( res != -1 );
126 TEST_ASSERT( res != -2 );
127
Paul Bakker33b43f12013-08-20 11:48:36 +0200128 TEST_ASSERT( strcmp( buf, result_str ) == 0 );
Paul Bakkerbd51b262014-07-10 15:26:12 +0200129
130exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200131 mbedtls_x509_crl_free( &crl );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000132}
Paul Bakker33b43f12013-08-20 11:48:36 +0200133/* END_CASE */
Paul Bakker37940d9f2009-07-10 22:38:58 +0000134
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200135/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CSR_PARSE_C */
136void mbedtls_x509_csr_info( char *csr_file, char *result_str )
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +0100137{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200138 mbedtls_x509_csr csr;
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +0100139 char buf[2000];
140 int res;
141
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200142 mbedtls_x509_csr_init( &csr );
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +0100143 memset( buf, 0, 2000 );
144
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200145 TEST_ASSERT( mbedtls_x509_csr_parse_file( &csr, csr_file ) == 0 );
146 res = mbedtls_x509_csr_info( buf, 2000, "", &csr );
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +0100147
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +0100148 TEST_ASSERT( res != -1 );
149 TEST_ASSERT( res != -2 );
150
151 TEST_ASSERT( strcmp( buf, result_str ) == 0 );
Paul Bakkerbd51b262014-07-10 15:26:12 +0200152
153exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200154 mbedtls_x509_csr_free( &csr );
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +0100155}
156/* END_CASE */
157
Manuel Pégourié-Gonnardb5f48ad2015-04-20 10:38:13 +0100158/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C */
159void x509_verify_info( int flags, char *prefix, char *result_str )
160{
161 char buf[2000];
162 int res;
163
164 memset( buf, 0, sizeof( buf ) );
165
166 res = mbedtls_x509_crt_verify_info( buf, sizeof( buf ), prefix, flags );
167
168 TEST_ASSERT( res >= 0 );
169
170 TEST_ASSERT( strcmp( buf, result_str ) == 0 );
171}
172/* END_CASE */
173
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200174/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_X509_CRL_PARSE_C */
Paul Bakker33b43f12013-08-20 11:48:36 +0200175void x509_verify( char *crt_file, char *ca_file, char *crl_file,
176 char *cn_name_str, int result, int flags_result,
177 char *verify_callback )
Paul Bakker37940d9f2009-07-10 22:38:58 +0000178{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200179 mbedtls_x509_crt crt;
180 mbedtls_x509_crt ca;
181 mbedtls_x509_crl crl;
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200182 uint32_t flags = 0;
Paul Bakker69998dd2009-07-11 19:15:20 +0000183 int res;
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200184 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *) = NULL;
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200185 char * cn_name = NULL;
Paul Bakker37940d9f2009-07-10 22:38:58 +0000186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187 mbedtls_x509_crt_init( &crt );
188 mbedtls_x509_crt_init( &ca );
189 mbedtls_x509_crl_init( &crl );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000190
Paul Bakker33b43f12013-08-20 11:48:36 +0200191 if( strcmp( cn_name_str, "NULL" ) != 0 )
192 cn_name = cn_name_str;
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200193
Paul Bakker33b43f12013-08-20 11:48:36 +0200194 if( strcmp( verify_callback, "NULL" ) == 0 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200195 f_vrfy = NULL;
Paul Bakker33b43f12013-08-20 11:48:36 +0200196 else if( strcmp( verify_callback, "verify_none" ) == 0 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200197 f_vrfy = verify_none;
Paul Bakker33b43f12013-08-20 11:48:36 +0200198 else if( strcmp( verify_callback, "verify_all" ) == 0 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200199 f_vrfy = verify_all;
200 else
201 TEST_ASSERT( "No known verify callback selected" == 0 );
202
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200203 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
204 TEST_ASSERT( mbedtls_x509_crt_parse_file( &ca, ca_file ) == 0 );
205 TEST_ASSERT( mbedtls_x509_crl_parse_file( &crl, crl_file ) == 0 );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000206
Manuel Pégourié-Gonnard65eefc82015-10-23 14:08:48 +0200207 //puts( "" );
208 res = mbedtls_x509_crt_verify_with_profile( &crt, &ca, &crl, &compat_profile, cn_name, &flags, f_vrfy, NULL );
209
210 //printf( "exp: -%04x, %08x\n", result, flags_result );
211 //printf( "got: -%04x, %08x\n", res, flags );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000212
Paul Bakkerbd51b262014-07-10 15:26:12 +0200213 TEST_ASSERT( res == ( result ) );
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200214 TEST_ASSERT( flags == (uint32_t)( flags_result ) );
Paul Bakkerbd51b262014-07-10 15:26:12 +0200215
216exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200217 mbedtls_x509_crt_free( &crt );
218 mbedtls_x509_crt_free( &ca );
219 mbedtls_x509_crl_free( &crl );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000220}
Paul Bakker33b43f12013-08-20 11:48:36 +0200221/* END_CASE */
Paul Bakker37940d9f2009-07-10 22:38:58 +0000222
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200223/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard560fea32015-09-01 11:59:24 +0200224void x509_verify_callback( char *crt_file, char *ca_file,
225 int exp_ret, char *exp_vrfy_out )
226{
227 int ret;
228 mbedtls_x509_crt crt;
229 mbedtls_x509_crt ca;
230 uint32_t flags = 0;
231 verify_print_context vrfy_ctx;
232
233 mbedtls_x509_crt_init( &crt );
234 mbedtls_x509_crt_init( &ca );
235 verify_print_init( &vrfy_ctx );
236
237 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
238 TEST_ASSERT( mbedtls_x509_crt_parse_file( &ca, ca_file ) == 0 );
239
240 ret = mbedtls_x509_crt_verify( &crt, &ca, NULL, NULL, &flags,
241 verify_print, &vrfy_ctx );
242
243 TEST_ASSERT( ret == exp_ret );
244 TEST_ASSERT( strcmp( vrfy_ctx.buf, exp_vrfy_out ) == 0 );
245
246exit:
247 mbedtls_x509_crt_free( &crt );
248 mbedtls_x509_crt_free( &ca );
249}
250/* END_CASE */
251
252/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200253void mbedtls_x509_dn_gets( char *crt_file, char *entity, char *result_str )
Paul Bakker37940d9f2009-07-10 22:38:58 +0000254{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200255 mbedtls_x509_crt crt;
Paul Bakker37940d9f2009-07-10 22:38:58 +0000256 char buf[2000];
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200257 int res = 0;
Paul Bakker37940d9f2009-07-10 22:38:58 +0000258
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259 mbedtls_x509_crt_init( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000260 memset( buf, 0, 2000 );
261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200262 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +0200263 if( strcmp( entity, "subject" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200264 res = mbedtls_x509_dn_gets( buf, 2000, &crt.subject );
Paul Bakker33b43f12013-08-20 11:48:36 +0200265 else if( strcmp( entity, "issuer" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200266 res = mbedtls_x509_dn_gets( buf, 2000, &crt.issuer );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200267 else
268 TEST_ASSERT( "Unknown entity" == 0 );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000269
270 TEST_ASSERT( res != -1 );
271 TEST_ASSERT( res != -2 );
272
Paul Bakker33b43f12013-08-20 11:48:36 +0200273 TEST_ASSERT( strcmp( buf, result_str ) == 0 );
Paul Bakkerbd51b262014-07-10 15:26:12 +0200274
275exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200276 mbedtls_x509_crt_free( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000277}
Paul Bakker33b43f12013-08-20 11:48:36 +0200278/* END_CASE */
Paul Bakker37940d9f2009-07-10 22:38:58 +0000279
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100281void mbedtls_x509_time_is_past( char *crt_file, char *entity, int result )
Paul Bakker37940d9f2009-07-10 22:38:58 +0000282{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200283 mbedtls_x509_crt crt;
Paul Bakker37940d9f2009-07-10 22:38:58 +0000284
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200285 mbedtls_x509_crt_init( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000286
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200287 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200288
Paul Bakker33b43f12013-08-20 11:48:36 +0200289 if( strcmp( entity, "valid_from" ) == 0 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100290 TEST_ASSERT( mbedtls_x509_time_is_past( &crt.valid_from ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +0200291 else if( strcmp( entity, "valid_to" ) == 0 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100292 TEST_ASSERT( mbedtls_x509_time_is_past( &crt.valid_to ) == result );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200293 else
294 TEST_ASSERT( "Unknown entity" == 0 );
Paul Bakkerb08e6842012-02-11 18:43:20 +0000295
Paul Bakkerbd51b262014-07-10 15:26:12 +0200296exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297 mbedtls_x509_crt_free( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000298}
Paul Bakker33b43f12013-08-20 11:48:36 +0200299/* END_CASE */
Paul Bakker37940d9f2009-07-10 22:38:58 +0000300
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200301/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100302void mbedtls_x509_time_is_future( char *crt_file, char *entity, int result )
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100303{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200304 mbedtls_x509_crt crt;
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100305
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200306 mbedtls_x509_crt_init( &crt );
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100307
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200308 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100309
310 if( strcmp( entity, "valid_from" ) == 0 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100311 TEST_ASSERT( mbedtls_x509_time_is_future( &crt.valid_from ) == result );
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100312 else if( strcmp( entity, "valid_to" ) == 0 )
Manuel Pégourié-Gonnardc730ed32015-06-02 10:38:50 +0100313 TEST_ASSERT( mbedtls_x509_time_is_future( &crt.valid_to ) == result );
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100314 else
315 TEST_ASSERT( "Unknown entity" == 0 );
316
Paul Bakkerbd51b262014-07-10 15:26:12 +0200317exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200318 mbedtls_x509_crt_free( &crt );
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100319}
320/* END_CASE */
321
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200322/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_FS_IO */
Paul Bakker5a5fa922014-09-26 14:53:04 +0200323void x509parse_crt_file( char *crt_file, int result )
324{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200325 mbedtls_x509_crt crt;
Paul Bakker5a5fa922014-09-26 14:53:04 +0200326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327 mbedtls_x509_crt_init( &crt );
Paul Bakker5a5fa922014-09-26 14:53:04 +0200328
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == result );
Paul Bakker5a5fa922014-09-26 14:53:04 +0200330
331exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200332 mbedtls_x509_crt_free( &crt );
Paul Bakker5a5fa922014-09-26 14:53:04 +0200333}
334/* END_CASE */
335
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200336/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker33b43f12013-08-20 11:48:36 +0200337void x509parse_crt( char *crt_data, char *result_str, int result )
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000338{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339 mbedtls_x509_crt crt;
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000340 unsigned char buf[2000];
341 unsigned char output[2000];
342 int data_len, res;
343
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200344 mbedtls_x509_crt_init( &crt );
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000345 memset( buf, 0, 2000 );
346 memset( output, 0, 2000 );
347
Paul Bakker33b43f12013-08-20 11:48:36 +0200348 data_len = unhexify( buf, crt_data );
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200350 TEST_ASSERT( mbedtls_x509_crt_parse( &crt, buf, data_len ) == ( result ) );
Paul Bakker33b43f12013-08-20 11:48:36 +0200351 if( ( result ) == 0 )
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000352 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200353 res = mbedtls_x509_crt_info( (char *) output, 2000, "", &crt );
Paul Bakker33b43f12013-08-20 11:48:36 +0200354
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000355 TEST_ASSERT( res != -1 );
356 TEST_ASSERT( res != -2 );
357
Paul Bakker33b43f12013-08-20 11:48:36 +0200358 TEST_ASSERT( strcmp( (char *) output, result_str ) == 0 );
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000359 }
Paul Bakkerb08e6842012-02-11 18:43:20 +0000360
Paul Bakkerbd51b262014-07-10 15:26:12 +0200361exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200362 mbedtls_x509_crt_free( &crt );
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000363}
Paul Bakker33b43f12013-08-20 11:48:36 +0200364/* END_CASE */
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000365
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200366/* BEGIN_CASE depends_on:MBEDTLS_X509_CRL_PARSE_C */
Paul Bakker33b43f12013-08-20 11:48:36 +0200367void x509parse_crl( char *crl_data, char *result_str, int result )
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000368{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200369 mbedtls_x509_crl crl;
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000370 unsigned char buf[2000];
371 unsigned char output[2000];
372 int data_len, res;
373
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200374 mbedtls_x509_crl_init( &crl );
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000375 memset( buf, 0, 2000 );
376 memset( output, 0, 2000 );
377
Paul Bakker33b43f12013-08-20 11:48:36 +0200378 data_len = unhexify( buf, crl_data );
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000379
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200380 TEST_ASSERT( mbedtls_x509_crl_parse( &crl, buf, data_len ) == ( result ) );
Paul Bakker33b43f12013-08-20 11:48:36 +0200381 if( ( result ) == 0 )
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000382 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383 res = mbedtls_x509_crl_info( (char *) output, 2000, "", &crl );
Paul Bakker33b43f12013-08-20 11:48:36 +0200384
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000385 TEST_ASSERT( res != -1 );
386 TEST_ASSERT( res != -2 );
387
Paul Bakker33b43f12013-08-20 11:48:36 +0200388 TEST_ASSERT( strcmp( (char *) output, result_str ) == 0 );
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000389 }
Paul Bakkerb08e6842012-02-11 18:43:20 +0000390
Paul Bakkerbd51b262014-07-10 15:26:12 +0200391exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200392 mbedtls_x509_crl_free( &crl );
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000393}
Paul Bakker33b43f12013-08-20 11:48:36 +0200394/* END_CASE */
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200396/* BEGIN_CASE depends_on:MBEDTLS_X509_CSR_PARSE_C */
397void mbedtls_x509_csr_parse( char *csr_der_hex, char *ref_out, int ref_ret )
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200398{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200399 mbedtls_x509_csr csr;
Paul Bakkerbd51b262014-07-10 15:26:12 +0200400 unsigned char *csr_der = NULL;
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200401 char my_out[1000];
402 size_t csr_der_len;
403 int my_ret;
404
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200405 mbedtls_x509_csr_init( &csr );
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200406 memset( my_out, 0, sizeof( my_out ) );
407 csr_der = unhexify_alloc( csr_der_hex, &csr_der_len );
408
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 my_ret = mbedtls_x509_csr_parse_der( &csr, csr_der, csr_der_len );
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200410 TEST_ASSERT( my_ret == ref_ret );
411
412 if( ref_ret == 0 )
413 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414 size_t my_out_len = mbedtls_x509_csr_info( my_out, sizeof( my_out ), "", &csr );
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200415 TEST_ASSERT( my_out_len == strlen( ref_out ) );
416 TEST_ASSERT( strcmp( my_out, ref_out ) == 0 );
417 }
418
Paul Bakkerbd51b262014-07-10 15:26:12 +0200419exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200420 mbedtls_x509_csr_free( &csr );
421 mbedtls_free( csr_der );
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200422}
423/* END_CASE */
424
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200425/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
426void mbedtls_x509_crt_parse_path( char *crt_path, int ret, int nb_crt )
Manuel Pégourié-Gonnardfbae2a12013-11-26 16:43:39 +0100427{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200428 mbedtls_x509_crt chain, *cur;
Manuel Pégourié-Gonnardfbae2a12013-11-26 16:43:39 +0100429 int i;
430
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 mbedtls_x509_crt_init( &chain );
Manuel Pégourié-Gonnardfbae2a12013-11-26 16:43:39 +0100432
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200433 TEST_ASSERT( mbedtls_x509_crt_parse_path( &chain, crt_path ) == ret );
Manuel Pégourié-Gonnardfbae2a12013-11-26 16:43:39 +0100434
435 /* Check how many certs we got */
436 for( i = 0, cur = &chain; cur != NULL; cur = cur->next )
437 if( cur->raw.p != NULL )
438 i++;
439
440 TEST_ASSERT( i == nb_crt );
441
Paul Bakkerbd51b262014-07-10 15:26:12 +0200442exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443 mbedtls_x509_crt_free( &chain );
Manuel Pégourié-Gonnardfbae2a12013-11-26 16:43:39 +0100444}
445/* END_CASE */
446
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200447/* BEGIN_CASE depends_on:MBEDTLS_X509_USE_C */
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100448void x509_oid_desc( char *oid_str, char *ref_desc )
449{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200450 mbedtls_x509_buf oid;
Manuel Pégourié-Gonnard48d3cef2015-03-20 18:14:26 +0000451 const char *desc = NULL;
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100452 unsigned char buf[20];
Manuel Pégourié-Gonnard48d3cef2015-03-20 18:14:26 +0000453 int ret;
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100454
455 memset( buf, 0, sizeof buf );
456
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200457 oid.tag = MBEDTLS_ASN1_OID;
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100458 oid.len = unhexify( buf, oid_str );
459 oid.p = buf;
460
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200461 ret = mbedtls_oid_get_extended_key_usage( &oid, &desc );
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100462
463 if( strcmp( ref_desc, "notfound" ) == 0 )
Manuel Pégourié-Gonnard48d3cef2015-03-20 18:14:26 +0000464 {
465 TEST_ASSERT( ret != 0 );
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100466 TEST_ASSERT( desc == NULL );
Manuel Pégourié-Gonnard48d3cef2015-03-20 18:14:26 +0000467 }
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100468 else
469 {
Manuel Pégourié-Gonnard48d3cef2015-03-20 18:14:26 +0000470 TEST_ASSERT( ret == 0 );
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100471 TEST_ASSERT( desc != NULL );
472 TEST_ASSERT( strcmp( desc, ref_desc ) == 0 );
473 }
474}
475/* END_CASE */
476
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200477/* BEGIN_CASE depends_on:MBEDTLS_X509_USE_C */
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100478void x509_oid_numstr( char *oid_str, char *numstr, int blen, int ret )
479{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200480 mbedtls_x509_buf oid;
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100481 unsigned char oid_buf[20];
482 char num_buf[100];
483
484 memset( oid_buf, 0x00, sizeof oid_buf );
485 memset( num_buf, 0x2a, sizeof num_buf );
486
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200487 oid.tag = MBEDTLS_ASN1_OID;
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100488 oid.len = unhexify( oid_buf, oid_str );
489 oid.p = oid_buf;
490
491 TEST_ASSERT( (size_t) blen <= sizeof num_buf );
492
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493 TEST_ASSERT( mbedtls_oid_get_numeric_string( num_buf, blen, &oid ) == ret );
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100494
495 if( ret >= 0 )
496 {
497 TEST_ASSERT( num_buf[ret] == 0 );
498 TEST_ASSERT( strcmp( num_buf, numstr ) == 0 );
499 }
500}
501/* END_CASE */
502
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200503/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_X509_CHECK_KEY_USAGE */
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200504void x509_check_key_usage( char *crt_file, int usage, int ret )
505{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200506 mbedtls_x509_crt crt;
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200507
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200508 mbedtls_x509_crt_init( &crt );
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200509
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200510 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200511
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200512 TEST_ASSERT( mbedtls_x509_crt_check_key_usage( &crt, usage ) == ret );
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200513
Paul Bakkerbd51b262014-07-10 15:26:12 +0200514exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200515 mbedtls_x509_crt_free( &crt );
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200516}
517/* END_CASE */
518
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200519/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200520void x509_check_extended_key_usage( char *crt_file, char *usage_hex, int ret )
521{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200522 mbedtls_x509_crt crt;
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200523 char oid[50];
524 size_t len;
525
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200526 mbedtls_x509_crt_init( &crt );
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200527
528 len = unhexify( (unsigned char *) oid, usage_hex );
529
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200530 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200531
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200532 TEST_ASSERT( mbedtls_x509_crt_check_extended_key_usage( &crt, oid, len ) == ret );
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200533
Paul Bakkerbd51b262014-07-10 15:26:12 +0200534exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200535 mbedtls_x509_crt_free( &crt );
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200536}
537/* END_CASE */
538
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200539/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_X509_RSASSA_PSS_SUPPORT */
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200540void x509_parse_rsassa_pss_params( char *hex_params, int params_tag,
541 int ref_msg_md, int ref_mgf_md,
542 int ref_salt_len, int ref_ret )
543{
544 int my_ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200545 mbedtls_x509_buf params;
546 mbedtls_md_type_t my_msg_md, my_mgf_md;
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200547 int my_salt_len;
548
549 params.p = unhexify_alloc( hex_params, &params.len );
550 params.tag = params_tag;
551
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200552 my_ret = mbedtls_x509_get_rsassa_pss_params( &params, &my_msg_md, &my_mgf_md,
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200553 &my_salt_len );
554
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200555 TEST_ASSERT( my_ret == ref_ret );
556
557 if( ref_ret == 0 )
558 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200559 TEST_ASSERT( my_msg_md == (mbedtls_md_type_t) ref_msg_md );
560 TEST_ASSERT( my_mgf_md == (mbedtls_md_type_t) ref_mgf_md );
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200561 TEST_ASSERT( my_salt_len == ref_salt_len );
562 }
563
Paul Bakkerbd51b262014-07-10 15:26:12 +0200564exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200565 mbedtls_free( params.p );
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200566}
567/* END_CASE */
568
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200569/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200570void x509_selftest()
Paul Bakker37940d9f2009-07-10 22:38:58 +0000571{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200572 TEST_ASSERT( mbedtls_x509_self_test( 0 ) == 0 );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000573}
Paul Bakker33b43f12013-08-20 11:48:36 +0200574/* END_CASE */