blob: 2eb270f16c919bb2701b28fedada6834dca7c8b2 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Paul Bakker7c6b2c32013-09-16 13:49:26 +02002#include <polarssl/x509_crt.h>
3#include <polarssl/x509_csr.h>
Paul Bakker6d620502012-02-16 14:09:13 +00004#include <polarssl/pem.h>
Paul Bakkerc70b9822013-04-07 22:00:46 +02005#include <polarssl/oid.h>
Paul Bakker33b43f12013-08-20 11:48:36 +02006/* END_HEADER */
Paul Bakker6d620502012-02-16 14:09:13 +00007
Paul Bakker33b43f12013-08-20 11:48:36 +02008/* BEGIN_DEPENDENCIES
Paul Bakker7c6b2c32013-09-16 13:49:26 +02009 * depends_on:POLARSSL_BIGNUM_C:POLARSSL_FS_IO:POLARSSL_PK_PARSE_C
Paul Bakker33b43f12013-08-20 11:48:36 +020010 * END_DEPENDENCIES
11 */
Paul Bakker6d620502012-02-16 14:09:13 +000012
Paul Bakker7c6b2c32013-09-16 13:49:26 +020013/* BEGIN_CASE depends_on:POLARSSL_PEM_WRITE_C:POLARSSL_X509_CSR_WRITE_C */
Manuel Pégourié-Gonnardc5ce83a2014-03-28 12:46:44 +010014void x509_csr_check( char *key_file, char *cert_req_check_file,
15 int md_type, int key_usage, int cert_type )
Paul Bakker6d620502012-02-16 14:09:13 +000016{
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020017 pk_context key;
Paul Bakkercd358032013-09-09 12:08:11 +020018 x509write_csr req;
Paul Bakker6d620502012-02-16 14:09:13 +000019 unsigned char buf[4000];
20 unsigned char check_buf[4000];
21 int ret;
Paul Bakker77e23fb2013-09-15 20:03:26 +020022 size_t olen = 0, pem_len = 0;
Paul Bakker6d620502012-02-16 14:09:13 +000023 FILE *f;
Paul Bakker3a8cb6f2013-12-30 20:41:54 +010024 const char *subject_name = "C=NL,O=PolarSSL,CN=PolarSSL Server 1";
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020025 rnd_pseudo_info rnd_info;
Paul Bakker6d620502012-02-16 14:09:13 +000026
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020027 memset( &rnd_info, 0x2a, sizeof( rnd_pseudo_info ) );
28
29 pk_init( &key );
Paul Bakker1a7550a2013-09-15 13:01:22 +020030 TEST_ASSERT( pk_parse_keyfile( &key, key_file, NULL ) == 0 );
Paul Bakker6d620502012-02-16 14:09:13 +000031
Paul Bakker82e29452013-08-25 11:01:31 +020032 x509write_csr_init( &req );
33 x509write_csr_set_md_alg( &req, md_type );
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020034 x509write_csr_set_key( &req, &key );
Paul Bakker82e29452013-08-25 11:01:31 +020035 TEST_ASSERT( x509write_csr_set_subject_name( &req, subject_name ) == 0 );
Manuel Pégourié-Gonnardc5ce83a2014-03-28 12:46:44 +010036 if( key_usage != 0 )
37 TEST_ASSERT( x509write_csr_set_key_usage( &req, key_usage ) == 0 );
38 if( cert_type != 0 )
39 TEST_ASSERT( x509write_csr_set_ns_cert_type( &req, cert_type ) == 0 );
Paul Bakker8eabfc12013-08-25 10:18:25 +020040
Paul Bakker77e23fb2013-09-15 20:03:26 +020041 ret = x509write_csr_pem( &req, buf, sizeof(buf),
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020042 rnd_pseudo_rand, &rnd_info );
Paul Bakker77e23fb2013-09-15 20:03:26 +020043 TEST_ASSERT( ret == 0 );
Paul Bakker6d620502012-02-16 14:09:13 +000044
Paul Bakker77e23fb2013-09-15 20:03:26 +020045 pem_len = strlen( (char *) buf );
Paul Bakker6d620502012-02-16 14:09:13 +000046
Paul Bakker33b43f12013-08-20 11:48:36 +020047 f = fopen( cert_req_check_file, "r" );
Paul Bakker6d620502012-02-16 14:09:13 +000048 TEST_ASSERT( f != NULL );
Paul Bakker77e23fb2013-09-15 20:03:26 +020049 olen = fread( check_buf, 1, sizeof( check_buf ), f );
Paul Bakker6d620502012-02-16 14:09:13 +000050 fclose( f );
51
Paul Bakker77e23fb2013-09-15 20:03:26 +020052 TEST_ASSERT( olen >= pem_len - 1 );
53 TEST_ASSERT( memcmp( buf, check_buf, pem_len - 1 ) == 0 );
Paul Bakker58ef6ec2013-01-03 11:33:48 +010054
Paul Bakker82e29452013-08-25 11:01:31 +020055 x509write_csr_free( &req );
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020056 pk_free( &key );
Paul Bakker6d620502012-02-16 14:09:13 +000057}
Paul Bakker33b43f12013-08-20 11:48:36 +020058/* END_CASE */
Paul Bakker2397cf32013-09-08 15:58:15 +020059
Manuel Pégourié-Gonnard3daaf3d2013-10-27 14:22:02 +010060/* BEGIN_CASE depends_on:POLARSSL_PEM_WRITE_C:POLARSSL_X509_CRT_WRITE_C:POLARSSL_SHA1_C */
Paul Bakker2397cf32013-09-08 15:58:15 +020061void x509_crt_check( char *subject_key_file, char *subject_pwd,
62 char *subject_name, char *issuer_key_file,
63 char *issuer_pwd, char *issuer_name,
64 char *serial_str, char *not_before, char *not_after,
Manuel Pégourié-Gonnard6c1a73e2014-03-28 14:03:22 +010065 int md_type, int key_usage, int cert_type, int ver,
66 char *cert_check_file )
Paul Bakker2397cf32013-09-08 15:58:15 +020067{
Manuel Pégourié-Gonnardf38e71a2013-09-12 05:21:54 +020068 pk_context subject_key, issuer_key;
Paul Bakker2397cf32013-09-08 15:58:15 +020069 x509write_cert crt;
Paul Bakker2397cf32013-09-08 15:58:15 +020070 unsigned char buf[4000];
71 unsigned char check_buf[5000];
72 mpi serial;
73 int ret;
Paul Bakker77e23fb2013-09-15 20:03:26 +020074 size_t olen = 0, pem_len = 0;
Paul Bakker2397cf32013-09-08 15:58:15 +020075 FILE *f;
Manuel Pégourié-Gonnard31e59402013-09-12 05:59:05 +020076 rnd_pseudo_info rnd_info;
Paul Bakker2397cf32013-09-08 15:58:15 +020077
Manuel Pégourié-Gonnard31e59402013-09-12 05:59:05 +020078 memset( &rnd_info, 0x2a, sizeof( rnd_pseudo_info ) );
Paul Bakker2397cf32013-09-08 15:58:15 +020079 mpi_init( &serial );
Manuel Pégourié-Gonnardf38e71a2013-09-12 05:21:54 +020080 pk_init( &subject_key );
81 pk_init( &issuer_key );
Paul Bakker2397cf32013-09-08 15:58:15 +020082
Paul Bakker1a7550a2013-09-15 13:01:22 +020083 TEST_ASSERT( pk_parse_keyfile( &subject_key, subject_key_file,
Paul Bakker2397cf32013-09-08 15:58:15 +020084 subject_pwd ) == 0 );
Paul Bakker1a7550a2013-09-15 13:01:22 +020085 TEST_ASSERT( pk_parse_keyfile( &issuer_key, issuer_key_file,
Paul Bakker2397cf32013-09-08 15:58:15 +020086 issuer_pwd ) == 0 );
87 TEST_ASSERT( mpi_read_string( &serial, 10, serial_str ) == 0 );
88
89 x509write_crt_init( &crt );
Manuel Pégourié-Gonnard6c1a73e2014-03-28 14:03:22 +010090 if( ver != -1 )
91 x509write_crt_set_version( &crt, ver );
92 TEST_ASSERT( x509write_crt_set_serial( &crt, &serial ) == 0 );
Paul Bakker2397cf32013-09-08 15:58:15 +020093 TEST_ASSERT( x509write_crt_set_validity( &crt, not_before,
94 not_after ) == 0 );
95 x509write_crt_set_md_alg( &crt, md_type );
96 TEST_ASSERT( x509write_crt_set_issuer_name( &crt, issuer_name ) == 0 );
97 TEST_ASSERT( x509write_crt_set_subject_name( &crt, subject_name ) == 0 );
Manuel Pégourié-Gonnardf38e71a2013-09-12 05:21:54 +020098 x509write_crt_set_subject_key( &crt, &subject_key );
99 x509write_crt_set_issuer_key( &crt, &issuer_key );
Paul Bakker2397cf32013-09-08 15:58:15 +0200100
Manuel Pégourié-Gonnard6c1a73e2014-03-28 14:03:22 +0100101 if( crt.version >= X509_CRT_VERSION_3 )
102 {
103 TEST_ASSERT( x509write_crt_set_basic_constraints( &crt, 0, 0 ) == 0 );
104 TEST_ASSERT( x509write_crt_set_subject_key_identifier( &crt ) == 0 );
105 TEST_ASSERT( x509write_crt_set_authority_key_identifier( &crt ) == 0 );
106 if( key_usage != 0 )
107 TEST_ASSERT( x509write_crt_set_key_usage( &crt, key_usage ) == 0 );
108 if( cert_type != 0 )
109 TEST_ASSERT( x509write_crt_set_ns_cert_type( &crt, cert_type ) == 0 );
110 }
Paul Bakker2397cf32013-09-08 15:58:15 +0200111
Paul Bakker77e23fb2013-09-15 20:03:26 +0200112 ret = x509write_crt_pem( &crt, buf, sizeof(buf),
Manuel Pégourié-Gonnard31e59402013-09-12 05:59:05 +0200113 rnd_pseudo_rand, &rnd_info );
Paul Bakker77e23fb2013-09-15 20:03:26 +0200114 TEST_ASSERT( ret == 0 );
Paul Bakker2397cf32013-09-08 15:58:15 +0200115
Paul Bakker77e23fb2013-09-15 20:03:26 +0200116 pem_len = strlen( (char *) buf );
Paul Bakker2397cf32013-09-08 15:58:15 +0200117
118 f = fopen( cert_check_file, "r" );
119 TEST_ASSERT( f != NULL );
Paul Bakker94b916c2014-04-17 16:07:20 +0200120 olen = fread( check_buf, 1, sizeof(check_buf), f );
121 TEST_ASSERT( olen < sizeof(check_buf) );
Paul Bakker2397cf32013-09-08 15:58:15 +0200122 fclose( f );
123
Paul Bakker77e23fb2013-09-15 20:03:26 +0200124 TEST_ASSERT( olen >= pem_len - 1 );
125 TEST_ASSERT( memcmp( buf, check_buf, pem_len - 1 ) == 0 );
Paul Bakker2397cf32013-09-08 15:58:15 +0200126
127 x509write_crt_free( &crt );
Manuel Pégourié-Gonnardf38e71a2013-09-12 05:21:54 +0200128 pk_free( &issuer_key );
129 pk_free( &subject_key );
Paul Bakker2397cf32013-09-08 15:58:15 +0200130 mpi_free( &serial );
131}
132/* END_CASE */