blob: c2d4e4eee4ad04eb05f61214a99406cb79f9b0c3 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Paul Bakker6d620502012-02-16 14:09:13 +00002#include <polarssl/x509write.h>
3#include <polarssl/x509.h>
4#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
9 * depends_on:POLARSSL_X509_WRITE_C:POLARSSL_BIGNUM_C
10 * END_DEPENDENCIES
11 */
Paul Bakker6d620502012-02-16 14:09:13 +000012
Paul Bakker33b43f12013-08-20 11:48:36 +020013/* BEGIN_CASE */
Paul Bakker82e29452013-08-25 11:01:31 +020014void x509_csr_check( char *key_file, int md_type,
Paul Bakker33b43f12013-08-20 11:48:36 +020015 char *cert_req_check_file )
Paul Bakker6d620502012-02-16 14:09:13 +000016{
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020017 pk_context key;
Paul Bakker6d620502012-02-16 14:09:13 +000018 pem_context pem;
Paul Bakkercd358032013-09-09 12:08:11 +020019 x509write_csr req;
Paul Bakker6d620502012-02-16 14:09:13 +000020 unsigned char *c;
21 unsigned char buf[4000];
22 unsigned char check_buf[4000];
23 int ret;
Manuel Pégourié-Gonnard27d87fa2013-09-11 17:33:28 +020024 size_t olen = sizeof( check_buf );
Paul Bakker6d620502012-02-16 14:09:13 +000025 FILE *f;
Paul Bakker21307962013-08-25 10:33:27 +020026 char *subject_name = "C=NL,O=PolarSSL,CN=PolarSSL Server 1";
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020027 rnd_pseudo_info rnd_info;
Paul Bakker6d620502012-02-16 14:09:13 +000028
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020029 memset( &rnd_info, 0x2a, sizeof( rnd_pseudo_info ) );
30
31 pk_init( &key );
32 TEST_ASSERT( x509parse_keyfile( &key, key_file, NULL ) == 0 );
Paul Bakker6d620502012-02-16 14:09:13 +000033
Paul Bakker82e29452013-08-25 11:01:31 +020034 x509write_csr_init( &req );
35 x509write_csr_set_md_alg( &req, md_type );
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020036 x509write_csr_set_key( &req, &key );
Paul Bakker82e29452013-08-25 11:01:31 +020037 TEST_ASSERT( x509write_csr_set_subject_name( &req, subject_name ) == 0 );
Paul Bakker8eabfc12013-08-25 10:18:25 +020038
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020039 ret = x509write_csr_der( &req, buf, sizeof( buf ),
40 rnd_pseudo_rand, &rnd_info );
Paul Bakker6d620502012-02-16 14:09:13 +000041 TEST_ASSERT( ret >= 0 );
42
Manuel Pégourié-Gonnard27d87fa2013-09-11 17:33:28 +020043 c = buf + sizeof( buf ) - ret;
Paul Bakker6d620502012-02-16 14:09:13 +000044
Paul Bakker33b43f12013-08-20 11:48:36 +020045 f = fopen( cert_req_check_file, "r" );
Paul Bakker6d620502012-02-16 14:09:13 +000046 TEST_ASSERT( f != NULL );
Manuel Pégourié-Gonnard27d87fa2013-09-11 17:33:28 +020047 fread( check_buf, 1, sizeof( check_buf ), f );
Paul Bakker6d620502012-02-16 14:09:13 +000048 fclose( f );
49
50 pem_init( &pem );
51 pem_read_buffer( &pem, "-----BEGIN CERTIFICATE REQUEST-----", "-----END CERTIFICATE REQUEST-----", check_buf, NULL, 0, &olen );
52
Paul Bakker6d620502012-02-16 14:09:13 +000053 TEST_ASSERT( pem.buflen == (size_t) ret );
Manuel Pégourié-Gonnard27d87fa2013-09-11 17:33:28 +020054 TEST_ASSERT( memcmp( c, pem.buf, pem.buflen ) == 0 );
Paul Bakker58ef6ec2013-01-03 11:33:48 +010055
Paul Bakker82e29452013-08-25 11:01:31 +020056 x509write_csr_free( &req );
Paul Bakker58ef6ec2013-01-03 11:33:48 +010057 pem_free( &pem );
Manuel Pégourié-Gonnardee731792013-09-11 22:48:40 +020058 pk_free( &key );
Paul Bakker6d620502012-02-16 14:09:13 +000059}
Paul Bakker33b43f12013-08-20 11:48:36 +020060/* END_CASE */
Paul Bakker2397cf32013-09-08 15:58:15 +020061
62/* BEGIN_CASE */
63void x509_crt_check( char *subject_key_file, char *subject_pwd,
64 char *subject_name, char *issuer_key_file,
65 char *issuer_pwd, char *issuer_name,
66 char *serial_str, char *not_before, char *not_after,
67 int md_type, char *cert_check_file )
68{
69 rsa_context subject_rsa, issuer_rsa;
70 pem_context pem;
71 x509write_cert crt;
72 unsigned char *c;
73 unsigned char buf[4000];
74 unsigned char check_buf[5000];
75 mpi serial;
76 int ret;
Manuel Pégourié-Gonnard27d87fa2013-09-11 17:33:28 +020077 size_t olen = sizeof( check_buf );
Paul Bakker2397cf32013-09-08 15:58:15 +020078 FILE *f;
79
80 mpi_init( &serial );
81 rsa_init( &subject_rsa, RSA_PKCS_V15, 0 );
82 rsa_init( &issuer_rsa, RSA_PKCS_V15, 0 );
83
84 TEST_ASSERT( x509parse_keyfile_rsa( &subject_rsa, subject_key_file,
85 subject_pwd ) == 0 );
86 TEST_ASSERT( x509parse_keyfile_rsa( &issuer_rsa, issuer_key_file,
87 issuer_pwd ) == 0 );
88 TEST_ASSERT( mpi_read_string( &serial, 10, serial_str ) == 0 );
89
90 x509write_crt_init( &crt );
91 x509write_crt_set_serial( &crt, &serial );
92 TEST_ASSERT( x509write_crt_set_validity( &crt, not_before,
93 not_after ) == 0 );
94 x509write_crt_set_md_alg( &crt, md_type );
95 TEST_ASSERT( x509write_crt_set_issuer_name( &crt, issuer_name ) == 0 );
96 TEST_ASSERT( x509write_crt_set_subject_name( &crt, subject_name ) == 0 );
97 x509write_crt_set_subject_key( &crt, &subject_rsa );
98 x509write_crt_set_issuer_key( &crt, &issuer_rsa );
99
100 TEST_ASSERT( x509write_crt_set_basic_constraints( &crt, 0, 0 ) == 0 );
101 TEST_ASSERT( x509write_crt_set_subject_key_identifier( &crt ) == 0 );
102 TEST_ASSERT( x509write_crt_set_authority_key_identifier( &crt ) == 0 );
103
104 ret = x509write_crt_der( &crt, buf, sizeof(buf) );
105 TEST_ASSERT( ret >= 0 );
106
Manuel Pégourié-Gonnard27d87fa2013-09-11 17:33:28 +0200107 c = buf + sizeof( buf ) - ret;
Paul Bakker2397cf32013-09-08 15:58:15 +0200108
109 f = fopen( cert_check_file, "r" );
110 TEST_ASSERT( f != NULL );
111 TEST_ASSERT( fread( check_buf, 1, sizeof(check_buf), f ) < sizeof(check_buf) );
112 fclose( f );
113
114 pem_init( &pem );
115 TEST_ASSERT( pem_read_buffer( &pem, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----", check_buf, NULL, 0, &olen ) >= 0 );
116
117 TEST_ASSERT( pem.buflen == (size_t) ret );
118 TEST_ASSERT( memcmp( c, pem.buf, pem.buflen ) == 0 );
119
120 x509write_crt_free( &crt );
121 rsa_free( &issuer_rsa );
122 rsa_free( &subject_rsa );
123 pem_free( &pem );
124 mpi_free( &serial );
125}
126/* END_CASE */
Manuel Pégourié-Gonnard33250b02013-09-11 23:46:51 +0200127
128/* BEGIN_CASE */
129void x509_pubkey_check( char *key_file )
130{
131 pk_context key;
132 unsigned char buf[5000];
133 unsigned char check_buf[5000];
134 int ret;
Manuel Pégourié-Gonnard33250b02013-09-11 23:46:51 +0200135 FILE *f;
136
137 memset( buf, 0, sizeof( buf ) );
138 memset( check_buf, 0, sizeof( check_buf ) );
139
140 pk_init( &key );
141 TEST_ASSERT( x509parse_public_keyfile( &key, key_file ) == 0 );
142
Manuel Pégourié-Gonnarde1f821a2013-09-12 00:59:40 +0200143 ret = x509write_pubkey_pem( &key, buf, sizeof( buf ) - 1);
Manuel Pégourié-Gonnard33250b02013-09-11 23:46:51 +0200144 TEST_ASSERT( ret >= 0 );
145
146 f = fopen( key_file, "r" );
147 TEST_ASSERT( f != NULL );
148 fread( check_buf, 1, sizeof( check_buf ) - 1, f );
149 fclose( f );
150
151 TEST_ASSERT( strncmp( (char *) buf, (char *) check_buf, sizeof( buf ) ) == 0 );
152
153 pk_free( &key );
154}
155/* END_CASE */
Manuel Pégourié-Gonnard7f1f0922013-09-12 03:31:34 +0200156
157/* BEGIN_CASE */
158void x509_key_check( char *key_file )
159{
160 pk_context key;
161 unsigned char buf[5000];
162 unsigned char check_buf[5000];
163 int ret;
164 FILE *f;
165
166 memset( buf, 0, sizeof( buf ) );
167 memset( check_buf, 0, sizeof( check_buf ) );
168
169 pk_init( &key );
170 TEST_ASSERT( x509parse_keyfile( &key, key_file, NULL ) == 0 );
171
Manuel Pégourié-Gonnard6de63e42013-09-12 04:59:34 +0200172 ret = x509write_key_pem( &key, buf, sizeof( buf ) - 1);
Manuel Pégourié-Gonnard7f1f0922013-09-12 03:31:34 +0200173 TEST_ASSERT( ret >= 0 );
174
175 f = fopen( key_file, "r" );
176 TEST_ASSERT( f != NULL );
177 fread( check_buf, 1, sizeof( check_buf ) - 1, f );
178 fclose( f );
179
180 TEST_ASSERT( strncmp( (char *) buf, (char *) check_buf, sizeof( buf ) ) == 0 );
181
182 pk_free( &key );
183}
184/* END_CASE */