blob: f955e3d6c11fc539630ae714e7a71e7af8fbe6c0 [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é-Gonnarde6ef16f2015-05-11 19:54:43 +02009int verify_none( void *data, mbedtls_x509_crt *crt, int certificate_depth, uint32_t *flags )
Paul Bakkerb63b0af2011-01-13 17:54:59 +000010{
Paul Bakker5a624082011-01-18 16:31:52 +000011 ((void) data);
12 ((void) crt);
13 ((void) certificate_depth);
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +010014 *flags |= MBEDTLS_X509_BADCERT_OTHER;
Paul Bakkerddf26b42013-09-18 13:46:23 +020015
Paul Bakker915275b2012-09-28 07:10:55 +000016 return 0;
Paul Bakkerb63b0af2011-01-13 17:54:59 +000017}
18
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +020019int verify_all( void *data, mbedtls_x509_crt *crt, int certificate_depth, uint32_t *flags )
Paul Bakkerb63b0af2011-01-13 17:54:59 +000020{
Paul Bakker5a624082011-01-18 16:31:52 +000021 ((void) data);
22 ((void) crt);
23 ((void) certificate_depth);
Paul Bakker915275b2012-09-28 07:10:55 +000024 *flags = 0;
Paul Bakker5a624082011-01-18 16:31:52 +000025
Paul Bakkerb63b0af2011-01-13 17:54:59 +000026 return 0;
27}
28
Paul Bakker33b43f12013-08-20 11:48:36 +020029/* END_HEADER */
Paul Bakker37940d9f2009-07-10 22:38:58 +000030
Paul Bakker33b43f12013-08-20 11:48:36 +020031/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020032 * depends_on:MBEDTLS_BIGNUM_C
Paul Bakker33b43f12013-08-20 11:48:36 +020033 * END_DEPENDENCIES
34 */
Paul Bakker5690efc2011-05-26 13:16:06 +000035
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker33b43f12013-08-20 11:48:36 +020037void x509_cert_info( char *crt_file, char *result_str )
Paul Bakker37940d9f2009-07-10 22:38:58 +000038{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039 mbedtls_x509_crt crt;
Paul Bakker37940d9f2009-07-10 22:38:58 +000040 char buf[2000];
Paul Bakker69998dd2009-07-11 19:15:20 +000041 int res;
Paul Bakker37940d9f2009-07-10 22:38:58 +000042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043 mbedtls_x509_crt_init( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +000044 memset( buf, 0, 2000 );
45
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
47 res = mbedtls_x509_crt_info( buf, 2000, "", &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +000048
49 TEST_ASSERT( res != -1 );
50 TEST_ASSERT( res != -2 );
51
Paul Bakker33b43f12013-08-20 11:48:36 +020052 TEST_ASSERT( strcmp( buf, result_str ) == 0 );
Paul Bakkerbd51b262014-07-10 15:26:12 +020053
54exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055 mbedtls_x509_crt_free( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +000056}
Paul Bakker33b43f12013-08-20 11:48:36 +020057/* END_CASE */
Paul Bakker37940d9f2009-07-10 22:38:58 +000058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020059/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRL_PARSE_C */
60void mbedtls_x509_crl_info( char *crl_file, char *result_str )
Paul Bakker37940d9f2009-07-10 22:38:58 +000061{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020062 mbedtls_x509_crl crl;
Paul Bakker37940d9f2009-07-10 22:38:58 +000063 char buf[2000];
Paul Bakker69998dd2009-07-11 19:15:20 +000064 int res;
Paul Bakker37940d9f2009-07-10 22:38:58 +000065
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020066 mbedtls_x509_crl_init( &crl );
Paul Bakker37940d9f2009-07-10 22:38:58 +000067 memset( buf, 0, 2000 );
68
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020069 TEST_ASSERT( mbedtls_x509_crl_parse_file( &crl, crl_file ) == 0 );
70 res = mbedtls_x509_crl_info( buf, 2000, "", &crl );
Paul Bakker37940d9f2009-07-10 22:38:58 +000071
72 TEST_ASSERT( res != -1 );
73 TEST_ASSERT( res != -2 );
74
Paul Bakker33b43f12013-08-20 11:48:36 +020075 TEST_ASSERT( strcmp( buf, result_str ) == 0 );
Paul Bakkerbd51b262014-07-10 15:26:12 +020076
77exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020078 mbedtls_x509_crl_free( &crl );
Paul Bakker37940d9f2009-07-10 22:38:58 +000079}
Paul Bakker33b43f12013-08-20 11:48:36 +020080/* END_CASE */
Paul Bakker37940d9f2009-07-10 22:38:58 +000081
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020082/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CSR_PARSE_C */
83void mbedtls_x509_csr_info( char *csr_file, char *result_str )
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +010084{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020085 mbedtls_x509_csr csr;
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +010086 char buf[2000];
87 int res;
88
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089 mbedtls_x509_csr_init( &csr );
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +010090 memset( buf, 0, 2000 );
91
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020092 TEST_ASSERT( mbedtls_x509_csr_parse_file( &csr, csr_file ) == 0 );
93 res = mbedtls_x509_csr_info( buf, 2000, "", &csr );
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +010094
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +010095 TEST_ASSERT( res != -1 );
96 TEST_ASSERT( res != -2 );
97
98 TEST_ASSERT( strcmp( buf, result_str ) == 0 );
Paul Bakkerbd51b262014-07-10 15:26:12 +020099
100exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200101 mbedtls_x509_csr_free( &csr );
Manuel Pégourié-Gonnard2a8d7fd2014-01-24 17:34:26 +0100102}
103/* END_CASE */
104
Manuel Pégourié-Gonnardb5f48ad2015-04-20 10:38:13 +0100105/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C */
106void x509_verify_info( int flags, char *prefix, char *result_str )
107{
108 char buf[2000];
109 int res;
110
111 memset( buf, 0, sizeof( buf ) );
112
113 res = mbedtls_x509_crt_verify_info( buf, sizeof( buf ), prefix, flags );
114
115 TEST_ASSERT( res >= 0 );
116
117 TEST_ASSERT( strcmp( buf, result_str ) == 0 );
118}
119/* END_CASE */
120
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200121/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_X509_CRL_PARSE_C */
Paul Bakker33b43f12013-08-20 11:48:36 +0200122void x509_verify( char *crt_file, char *ca_file, char *crl_file,
123 char *cn_name_str, int result, int flags_result,
124 char *verify_callback )
Paul Bakker37940d9f2009-07-10 22:38:58 +0000125{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200126 mbedtls_x509_crt crt;
127 mbedtls_x509_crt ca;
128 mbedtls_x509_crl crl;
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200129 uint32_t flags = 0;
Paul Bakker69998dd2009-07-11 19:15:20 +0000130 int res;
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200131 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *) = NULL;
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200132 char * cn_name = NULL;
Paul Bakker37940d9f2009-07-10 22:38:58 +0000133
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200134 mbedtls_x509_crt_init( &crt );
135 mbedtls_x509_crt_init( &ca );
136 mbedtls_x509_crl_init( &crl );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000137
Paul Bakker33b43f12013-08-20 11:48:36 +0200138 if( strcmp( cn_name_str, "NULL" ) != 0 )
139 cn_name = cn_name_str;
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200140
Paul Bakker33b43f12013-08-20 11:48:36 +0200141 if( strcmp( verify_callback, "NULL" ) == 0 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200142 f_vrfy = NULL;
Paul Bakker33b43f12013-08-20 11:48:36 +0200143 else if( strcmp( verify_callback, "verify_none" ) == 0 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200144 f_vrfy = verify_none;
Paul Bakker33b43f12013-08-20 11:48:36 +0200145 else if( strcmp( verify_callback, "verify_all" ) == 0 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200146 f_vrfy = verify_all;
147 else
148 TEST_ASSERT( "No known verify callback selected" == 0 );
149
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200150 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
151 TEST_ASSERT( mbedtls_x509_crt_parse_file( &ca, ca_file ) == 0 );
152 TEST_ASSERT( mbedtls_x509_crl_parse_file( &crl, crl_file ) == 0 );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000153
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200154 res = mbedtls_x509_crt_verify( &crt, &ca, &crl, cn_name, &flags, f_vrfy, NULL );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000155
Paul Bakkerbd51b262014-07-10 15:26:12 +0200156 TEST_ASSERT( res == ( result ) );
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200157 TEST_ASSERT( flags == (uint32_t)( flags_result ) );
Paul Bakkerbd51b262014-07-10 15:26:12 +0200158
159exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200160 mbedtls_x509_crt_free( &crt );
161 mbedtls_x509_crt_free( &ca );
162 mbedtls_x509_crl_free( &crl );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000163}
Paul Bakker33b43f12013-08-20 11:48:36 +0200164/* END_CASE */
Paul Bakker37940d9f2009-07-10 22:38:58 +0000165
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200166/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
167void mbedtls_x509_dn_gets( char *crt_file, char *entity, char *result_str )
Paul Bakker37940d9f2009-07-10 22:38:58 +0000168{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200169 mbedtls_x509_crt crt;
Paul Bakker37940d9f2009-07-10 22:38:58 +0000170 char buf[2000];
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200171 int res = 0;
Paul Bakker37940d9f2009-07-10 22:38:58 +0000172
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200173 mbedtls_x509_crt_init( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000174 memset( buf, 0, 2000 );
175
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200176 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
Paul Bakker33b43f12013-08-20 11:48:36 +0200177 if( strcmp( entity, "subject" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200178 res = mbedtls_x509_dn_gets( buf, 2000, &crt.subject );
Paul Bakker33b43f12013-08-20 11:48:36 +0200179 else if( strcmp( entity, "issuer" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200180 res = mbedtls_x509_dn_gets( buf, 2000, &crt.issuer );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200181 else
182 TEST_ASSERT( "Unknown entity" == 0 );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000183
184 TEST_ASSERT( res != -1 );
185 TEST_ASSERT( res != -2 );
186
Paul Bakker33b43f12013-08-20 11:48:36 +0200187 TEST_ASSERT( strcmp( buf, result_str ) == 0 );
Paul Bakkerbd51b262014-07-10 15:26:12 +0200188
189exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200190 mbedtls_x509_crt_free( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000191}
Paul Bakker33b43f12013-08-20 11:48:36 +0200192/* END_CASE */
Paul Bakker37940d9f2009-07-10 22:38:58 +0000193
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200194/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
195void mbedtls_x509_time_expired( char *crt_file, char *entity, int result )
Paul Bakker37940d9f2009-07-10 22:38:58 +0000196{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200197 mbedtls_x509_crt crt;
Paul Bakker37940d9f2009-07-10 22:38:58 +0000198
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200199 mbedtls_x509_crt_init( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200201 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200202
Paul Bakker33b43f12013-08-20 11:48:36 +0200203 if( strcmp( entity, "valid_from" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200204 TEST_ASSERT( mbedtls_x509_time_expired( &crt.valid_from ) == result );
Paul Bakker33b43f12013-08-20 11:48:36 +0200205 else if( strcmp( entity, "valid_to" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200206 TEST_ASSERT( mbedtls_x509_time_expired( &crt.valid_to ) == result );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200207 else
208 TEST_ASSERT( "Unknown entity" == 0 );
Paul Bakkerb08e6842012-02-11 18:43:20 +0000209
Paul Bakkerbd51b262014-07-10 15:26:12 +0200210exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200211 mbedtls_x509_crt_free( &crt );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000212}
Paul Bakker33b43f12013-08-20 11:48:36 +0200213/* END_CASE */
Paul Bakker37940d9f2009-07-10 22:38:58 +0000214
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200215/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
216void mbedtls_x509_time_future( char *crt_file, char *entity, int result )
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100217{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200218 mbedtls_x509_crt crt;
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100219
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200220 mbedtls_x509_crt_init( &crt );
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100221
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200222 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100223
224 if( strcmp( entity, "valid_from" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200225 TEST_ASSERT( mbedtls_x509_time_future( &crt.valid_from ) == result );
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100226 else if( strcmp( entity, "valid_to" ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200227 TEST_ASSERT( mbedtls_x509_time_future( &crt.valid_to ) == result );
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100228 else
229 TEST_ASSERT( "Unknown entity" == 0 );
230
Paul Bakkerbd51b262014-07-10 15:26:12 +0200231exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200232 mbedtls_x509_crt_free( &crt );
Manuel Pégourié-Gonnard6304f782014-03-10 12:26:11 +0100233}
234/* END_CASE */
235
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200236/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_FS_IO */
Paul Bakker5a5fa922014-09-26 14:53:04 +0200237void x509parse_crt_file( char *crt_file, int result )
238{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200239 mbedtls_x509_crt crt;
Paul Bakker5a5fa922014-09-26 14:53:04 +0200240
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200241 mbedtls_x509_crt_init( &crt );
Paul Bakker5a5fa922014-09-26 14:53:04 +0200242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200243 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == result );
Paul Bakker5a5fa922014-09-26 14:53:04 +0200244
245exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200246 mbedtls_x509_crt_free( &crt );
Paul Bakker5a5fa922014-09-26 14:53:04 +0200247}
248/* END_CASE */
249
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200250/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker33b43f12013-08-20 11:48:36 +0200251void x509parse_crt( char *crt_data, char *result_str, int result )
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000252{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200253 mbedtls_x509_crt crt;
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000254 unsigned char buf[2000];
255 unsigned char output[2000];
256 int data_len, res;
257
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200258 mbedtls_x509_crt_init( &crt );
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000259 memset( buf, 0, 2000 );
260 memset( output, 0, 2000 );
261
Paul Bakker33b43f12013-08-20 11:48:36 +0200262 data_len = unhexify( buf, crt_data );
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000263
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200264 TEST_ASSERT( mbedtls_x509_crt_parse( &crt, buf, data_len ) == ( result ) );
Paul Bakker33b43f12013-08-20 11:48:36 +0200265 if( ( result ) == 0 )
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000266 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200267 res = mbedtls_x509_crt_info( (char *) output, 2000, "", &crt );
Paul Bakker33b43f12013-08-20 11:48:36 +0200268
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000269 TEST_ASSERT( res != -1 );
270 TEST_ASSERT( res != -2 );
271
Paul Bakker33b43f12013-08-20 11:48:36 +0200272 TEST_ASSERT( strcmp( (char *) output, result_str ) == 0 );
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000273 }
Paul Bakkerb08e6842012-02-11 18:43:20 +0000274
Paul Bakkerbd51b262014-07-10 15:26:12 +0200275exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200276 mbedtls_x509_crt_free( &crt );
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000277}
Paul Bakker33b43f12013-08-20 11:48:36 +0200278/* END_CASE */
Paul Bakkerb2c38f52009-07-19 19:36:15 +0000279
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280/* BEGIN_CASE depends_on:MBEDTLS_X509_CRL_PARSE_C */
Paul Bakker33b43f12013-08-20 11:48:36 +0200281void x509parse_crl( char *crl_data, char *result_str, int result )
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000282{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200283 mbedtls_x509_crl crl;
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000284 unsigned char buf[2000];
285 unsigned char output[2000];
286 int data_len, res;
287
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200288 mbedtls_x509_crl_init( &crl );
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000289 memset( buf, 0, 2000 );
290 memset( output, 0, 2000 );
291
Paul Bakker33b43f12013-08-20 11:48:36 +0200292 data_len = unhexify( buf, crl_data );
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000293
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200294 TEST_ASSERT( mbedtls_x509_crl_parse( &crl, buf, data_len ) == ( result ) );
Paul Bakker33b43f12013-08-20 11:48:36 +0200295 if( ( result ) == 0 )
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000296 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297 res = mbedtls_x509_crl_info( (char *) output, 2000, "", &crl );
Paul Bakker33b43f12013-08-20 11:48:36 +0200298
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000299 TEST_ASSERT( res != -1 );
300 TEST_ASSERT( res != -2 );
301
Paul Bakker33b43f12013-08-20 11:48:36 +0200302 TEST_ASSERT( strcmp( (char *) output, result_str ) == 0 );
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000303 }
Paul Bakkerb08e6842012-02-11 18:43:20 +0000304
Paul Bakkerbd51b262014-07-10 15:26:12 +0200305exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200306 mbedtls_x509_crl_free( &crl );
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000307}
Paul Bakker33b43f12013-08-20 11:48:36 +0200308/* END_CASE */
Paul Bakker6b0fa4f2009-07-20 20:35:41 +0000309
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200310/* BEGIN_CASE depends_on:MBEDTLS_X509_CSR_PARSE_C */
311void mbedtls_x509_csr_parse( char *csr_der_hex, char *ref_out, int ref_ret )
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200312{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200313 mbedtls_x509_csr csr;
Paul Bakkerbd51b262014-07-10 15:26:12 +0200314 unsigned char *csr_der = NULL;
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200315 char my_out[1000];
316 size_t csr_der_len;
317 int my_ret;
318
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200319 mbedtls_x509_csr_init( &csr );
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200320 memset( my_out, 0, sizeof( my_out ) );
321 csr_der = unhexify_alloc( csr_der_hex, &csr_der_len );
322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200323 my_ret = mbedtls_x509_csr_parse_der( &csr, csr_der, csr_der_len );
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200324 TEST_ASSERT( my_ret == ref_ret );
325
326 if( ref_ret == 0 )
327 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200328 size_t my_out_len = mbedtls_x509_csr_info( my_out, sizeof( my_out ), "", &csr );
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200329 TEST_ASSERT( my_out_len == strlen( ref_out ) );
330 TEST_ASSERT( strcmp( my_out, ref_out ) == 0 );
331 }
332
Paul Bakkerbd51b262014-07-10 15:26:12 +0200333exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200334 mbedtls_x509_csr_free( &csr );
335 mbedtls_free( csr_der );
Manuel Pégourié-Gonnardd77cd5d2014-06-13 11:13:15 +0200336}
337/* END_CASE */
338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
340void mbedtls_x509_crt_parse_path( char *crt_path, int ret, int nb_crt )
Manuel Pégourié-Gonnardfbae2a12013-11-26 16:43:39 +0100341{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200342 mbedtls_x509_crt chain, *cur;
Manuel Pégourié-Gonnardfbae2a12013-11-26 16:43:39 +0100343 int i;
344
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200345 mbedtls_x509_crt_init( &chain );
Manuel Pégourié-Gonnardfbae2a12013-11-26 16:43:39 +0100346
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347 TEST_ASSERT( mbedtls_x509_crt_parse_path( &chain, crt_path ) == ret );
Manuel Pégourié-Gonnardfbae2a12013-11-26 16:43:39 +0100348
349 /* Check how many certs we got */
350 for( i = 0, cur = &chain; cur != NULL; cur = cur->next )
351 if( cur->raw.p != NULL )
352 i++;
353
354 TEST_ASSERT( i == nb_crt );
355
Paul Bakkerbd51b262014-07-10 15:26:12 +0200356exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200357 mbedtls_x509_crt_free( &chain );
Manuel Pégourié-Gonnardfbae2a12013-11-26 16:43:39 +0100358}
359/* END_CASE */
360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361/* BEGIN_CASE depends_on:MBEDTLS_X509_USE_C */
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100362void x509_oid_desc( char *oid_str, char *ref_desc )
363{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200364 mbedtls_x509_buf oid;
Manuel Pégourié-Gonnard48d3cef2015-03-20 18:14:26 +0000365 const char *desc = NULL;
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100366 unsigned char buf[20];
Manuel Pégourié-Gonnard48d3cef2015-03-20 18:14:26 +0000367 int ret;
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100368
369 memset( buf, 0, sizeof buf );
370
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200371 oid.tag = MBEDTLS_ASN1_OID;
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100372 oid.len = unhexify( buf, oid_str );
373 oid.p = buf;
374
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 ret = mbedtls_oid_get_extended_key_usage( &oid, &desc );
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100376
377 if( strcmp( ref_desc, "notfound" ) == 0 )
Manuel Pégourié-Gonnard48d3cef2015-03-20 18:14:26 +0000378 {
379 TEST_ASSERT( ret != 0 );
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100380 TEST_ASSERT( desc == NULL );
Manuel Pégourié-Gonnard48d3cef2015-03-20 18:14:26 +0000381 }
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100382 else
383 {
Manuel Pégourié-Gonnard48d3cef2015-03-20 18:14:26 +0000384 TEST_ASSERT( ret == 0 );
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100385 TEST_ASSERT( desc != NULL );
386 TEST_ASSERT( strcmp( desc, ref_desc ) == 0 );
387 }
388}
389/* END_CASE */
390
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200391/* BEGIN_CASE depends_on:MBEDTLS_X509_USE_C */
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100392void x509_oid_numstr( char *oid_str, char *numstr, int blen, int ret )
393{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200394 mbedtls_x509_buf oid;
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100395 unsigned char oid_buf[20];
396 char num_buf[100];
397
398 memset( oid_buf, 0x00, sizeof oid_buf );
399 memset( num_buf, 0x2a, sizeof num_buf );
400
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200401 oid.tag = MBEDTLS_ASN1_OID;
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100402 oid.len = unhexify( oid_buf, oid_str );
403 oid.p = oid_buf;
404
405 TEST_ASSERT( (size_t) blen <= sizeof num_buf );
406
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407 TEST_ASSERT( mbedtls_oid_get_numeric_string( num_buf, blen, &oid ) == ret );
Manuel Pégourié-Gonnard7afdb882014-03-28 16:06:35 +0100408
409 if( ret >= 0 )
410 {
411 TEST_ASSERT( num_buf[ret] == 0 );
412 TEST_ASSERT( strcmp( num_buf, numstr ) == 0 );
413 }
414}
415/* END_CASE */
416
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200417/* 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 +0200418void x509_check_key_usage( char *crt_file, int usage, int ret )
419{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200420 mbedtls_x509_crt crt;
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200421
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200422 mbedtls_x509_crt_init( &crt );
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200423
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200424 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200425
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200426 TEST_ASSERT( mbedtls_x509_crt_check_key_usage( &crt, usage ) == ret );
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200427
Paul Bakkerbd51b262014-07-10 15:26:12 +0200428exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200429 mbedtls_x509_crt_free( &crt );
Manuel Pégourié-Gonnard603116c2014-04-09 09:50:03 +0200430}
431/* END_CASE */
432
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200433/* 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 +0200434void x509_check_extended_key_usage( char *crt_file, char *usage_hex, int ret )
435{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200436 mbedtls_x509_crt crt;
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200437 char oid[50];
438 size_t len;
439
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200440 mbedtls_x509_crt_init( &crt );
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200441
442 len = unhexify( (unsigned char *) oid, usage_hex );
443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200444 TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200445
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200446 TEST_ASSERT( mbedtls_x509_crt_check_extended_key_usage( &crt, oid, len ) == ret );
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200447
Paul Bakkerbd51b262014-07-10 15:26:12 +0200448exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200449 mbedtls_x509_crt_free( &crt );
Manuel Pégourié-Gonnard7afb8a02014-04-10 17:53:56 +0200450}
451/* END_CASE */
452
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200453/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_X509_RSASSA_PSS_SUPPORT */
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200454void x509_parse_rsassa_pss_params( char *hex_params, int params_tag,
455 int ref_msg_md, int ref_mgf_md,
456 int ref_salt_len, int ref_ret )
457{
458 int my_ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200459 mbedtls_x509_buf params;
460 mbedtls_md_type_t my_msg_md, my_mgf_md;
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200461 int my_salt_len;
462
463 params.p = unhexify_alloc( hex_params, &params.len );
464 params.tag = params_tag;
465
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200466 my_ret = mbedtls_x509_get_rsassa_pss_params( &params, &my_msg_md, &my_mgf_md,
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200467 &my_salt_len );
468
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200469 TEST_ASSERT( my_ret == ref_ret );
470
471 if( ref_ret == 0 )
472 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200473 TEST_ASSERT( my_msg_md == (mbedtls_md_type_t) ref_msg_md );
474 TEST_ASSERT( my_mgf_md == (mbedtls_md_type_t) ref_mgf_md );
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200475 TEST_ASSERT( my_salt_len == ref_salt_len );
476 }
477
Paul Bakkerbd51b262014-07-10 15:26:12 +0200478exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200479 mbedtls_free( params.p );
Manuel Pégourié-Gonnard85403692014-06-06 14:48:38 +0200480}
481/* END_CASE */
482
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_SELF_TEST */
Paul Bakker33b43f12013-08-20 11:48:36 +0200484void x509_selftest()
Paul Bakker37940d9f2009-07-10 22:38:58 +0000485{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200486 TEST_ASSERT( mbedtls_x509_self_test( 0 ) == 0 );
Paul Bakker37940d9f2009-07-10 22:38:58 +0000487}
Paul Bakker33b43f12013-08-20 11:48:36 +0200488/* END_CASE */