blob: 7f8b1c82ef6a416e30a06658d9bf4735fed2535a [file] [log] [blame]
Janos Follath8a49a012016-02-12 13:18:20 +00001/* BEGIN_HEADER */
2#include "mbedtls/rsa.h"
3#include "mbedtls/md.h"
4/* END_HEADER */
5
6/* BEGIN_DEPENDENCIES
7 * depends_on:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_SHA1_C
8 * END_DEPENDENCIES
9 */
10
11/* BEGIN_CASE */
12void pkcs1_rsaes_v15_encrypt( int mod, int radix_N, char *input_N, int radix_E,
13 char *input_E, int hash,
14 char *message_hex_string, char *seed,
15 char *result_hex_str, int result )
16{
17 unsigned char message_str[1000];
18 unsigned char output[1000];
19 unsigned char output_str[1000];
20 unsigned char rnd_buf[1000];
21 mbedtls_rsa_context ctx;
22 size_t msg_len;
23 rnd_buf_info info;
Hanno Becker6d43f9e2017-08-23 06:35:17 +010024 mbedtls_mpi N, E;
Janos Follath8a49a012016-02-12 13:18:20 +000025
26 info.length = unhexify( rnd_buf, seed );
27 info.buf = rnd_buf;
28
Hanno Becker6d43f9e2017-08-23 06:35:17 +010029 mbedtls_mpi_init( &N ); mbedtls_mpi_init( &E );
Janos Follath8a49a012016-02-12 13:18:20 +000030 mbedtls_rsa_init( &ctx, MBEDTLS_RSA_PKCS_V15, hash );
31 memset( message_str, 0x00, 1000 );
32 memset( output, 0x00, 1000 );
33 memset( output_str, 0x00, 1000 );
34
Hanno Becker6d43f9e2017-08-23 06:35:17 +010035 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
36 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
37 TEST_ASSERT( mbedtls_rsa_import( &ctx, &N, NULL, NULL, NULL, &E ) == 0 );
38 TEST_ASSERT( mbedtls_rsa_get_len( &ctx ) == (size_t) ( ( mod + 7 ) / 8 ) );
Janos Follath8a49a012016-02-12 13:18:20 +000039 TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == 0 );
40
41 msg_len = unhexify( message_str, message_hex_string );
42
43 TEST_ASSERT( mbedtls_rsa_pkcs1_encrypt( &ctx, &rnd_buffer_rand, &info, MBEDTLS_RSA_PUBLIC, msg_len, message_str, output ) == result );
44 if( result == 0 )
45 {
46 hexify( output_str, output, ctx.len );
47
48 TEST_ASSERT( strcasecmp( (char *) output_str, result_hex_str ) == 0 );
49 }
50
51exit:
Hanno Becker6d43f9e2017-08-23 06:35:17 +010052 mbedtls_mpi_free( &N ); mbedtls_mpi_free( &E );
Janos Follath8a49a012016-02-12 13:18:20 +000053 mbedtls_rsa_free( &ctx );
54}
55/* END_CASE */
56
57/* BEGIN_CASE */
58void pkcs1_rsaes_v15_decrypt( int mod, int radix_P, char *input_P,
59 int radix_Q, char *input_Q, int radix_N,
60 char *input_N, int radix_E, char *input_E,
61 int hash, char *result_hex_str, char *seed,
62 char *message_hex_string, int result )
63{
64 unsigned char message_str[1000];
65 unsigned char output[1000];
66 unsigned char output_str[1000];
67 mbedtls_rsa_context ctx;
Janos Follath8a49a012016-02-12 13:18:20 +000068 size_t output_len;
69 rnd_pseudo_info rnd_info;
Hanno Becker6d43f9e2017-08-23 06:35:17 +010070 mbedtls_mpi N, P, Q, E;
Janos Follath8a49a012016-02-12 13:18:20 +000071 ((void) seed);
72
Hanno Becker6d43f9e2017-08-23 06:35:17 +010073 mbedtls_mpi_init( &N ); mbedtls_mpi_init( &P );
74 mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &E );
Janos Follath8a49a012016-02-12 13:18:20 +000075 mbedtls_rsa_init( &ctx, MBEDTLS_RSA_PKCS_V15, hash );
76
77 memset( message_str, 0x00, 1000 );
78 memset( output, 0x00, 1000 );
79 memset( output_str, 0x00, 1000 );
80 memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
81
Hanno Becker6d43f9e2017-08-23 06:35:17 +010082 TEST_ASSERT( mbedtls_mpi_read_string( &P, radix_P, input_P ) == 0 );
83 TEST_ASSERT( mbedtls_mpi_read_string( &Q, radix_Q, input_Q ) == 0 );
84 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
85 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
Janos Follath8a49a012016-02-12 13:18:20 +000086
Hanno Becker6d43f9e2017-08-23 06:35:17 +010087 TEST_ASSERT( mbedtls_rsa_import( &ctx, &N, &P, &Q, NULL, &E ) == 0 );
88 TEST_ASSERT( mbedtls_rsa_get_len( &ctx ) == (size_t) ( ( mod + 7 ) / 8 ) );
Hanno Becker7f25f852017-10-10 16:56:22 +010089 TEST_ASSERT( mbedtls_rsa_complete( &ctx ) == 0 );
Janos Follath8a49a012016-02-12 13:18:20 +000090 TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == 0 );
91
92 unhexify( message_str, message_hex_string );
93
94 TEST_ASSERT( mbedtls_rsa_pkcs1_decrypt( &ctx, &rnd_pseudo_rand, &rnd_info, MBEDTLS_RSA_PRIVATE, &output_len, message_str, output, 1000 ) == result );
95 if( result == 0 )
96 {
97 hexify( output_str, output, ctx.len );
98
99 TEST_ASSERT( strncasecmp( (char *) output_str, result_hex_str, strlen( result_hex_str ) ) == 0 );
100 }
101
102exit:
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100103 mbedtls_mpi_free( &N ); mbedtls_mpi_free( &P );
104 mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &E );
Janos Follath8a49a012016-02-12 13:18:20 +0000105 mbedtls_rsa_free( &ctx );
106}
107/* END_CASE */
108
Janos Follathe6aef9f2016-03-16 16:39:41 +0000109/* BEGIN_CASE */
110void pkcs1_rsassa_v15_sign( int mod, int radix_P, char *input_P, int radix_Q,
111 char *input_Q, int radix_N, char *input_N,
112 int radix_E, char *input_E, int digest, int hash,
113 char *message_hex_string, char *salt,
114 char *result_hex_str, int result )
115{
116 unsigned char message_str[1000];
117 unsigned char hash_result[1000];
118 unsigned char output[1000];
119 unsigned char output_str[1000];
120 unsigned char rnd_buf[1000];
121 mbedtls_rsa_context ctx;
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100122 mbedtls_mpi N, P, Q, E;
Janos Follathe6aef9f2016-03-16 16:39:41 +0000123 size_t msg_len;
124 rnd_buf_info info;
125
126 info.length = unhexify( rnd_buf, salt );
127 info.buf = rnd_buf;
128
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100129 mbedtls_mpi_init( &N ); mbedtls_mpi_init( &P );
130 mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &E );
Janos Follathe6aef9f2016-03-16 16:39:41 +0000131 mbedtls_rsa_init( &ctx, MBEDTLS_RSA_PKCS_V15, hash );
132
133 memset( message_str, 0x00, 1000 );
134 memset( hash_result, 0x00, 1000 );
135 memset( output, 0x00, 1000 );
136 memset( output_str, 0x00, 1000 );
137
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100138 TEST_ASSERT( mbedtls_mpi_read_string( &P, radix_P, input_P ) == 0 );
139 TEST_ASSERT( mbedtls_mpi_read_string( &Q, radix_Q, input_Q ) == 0 );
140 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
141 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
Janos Follathe6aef9f2016-03-16 16:39:41 +0000142
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100143 TEST_ASSERT( mbedtls_rsa_import( &ctx, &N, &P, &Q, NULL, &E ) == 0 );
144 TEST_ASSERT( mbedtls_rsa_get_len( &ctx ) == (size_t) ( ( mod + 7 ) / 8 ) );
Hanno Becker7f25f852017-10-10 16:56:22 +0100145 TEST_ASSERT( mbedtls_rsa_complete( &ctx ) == 0 );
Janos Follathe6aef9f2016-03-16 16:39:41 +0000146 TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == 0 );
147
148 msg_len = unhexify( message_str, message_hex_string );
149
150 if( mbedtls_md_info_from_type( digest ) != NULL )
151 TEST_ASSERT( mbedtls_md( mbedtls_md_info_from_type( digest ), message_str, msg_len, hash_result ) == 0 );
152
153 TEST_ASSERT( mbedtls_rsa_pkcs1_sign( &ctx, &rnd_buffer_rand, &info, MBEDTLS_RSA_PRIVATE, digest, 0, hash_result, output ) == result );
154 if( result == 0 )
155 {
156 hexify( output_str, output, ctx.len);
157
158 TEST_ASSERT( strcasecmp( (char *) output_str, result_hex_str ) == 0 );
159 }
160
161exit:
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100162 mbedtls_mpi_free( &N ); mbedtls_mpi_free( &P );
163 mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &E );
Janos Follathe6aef9f2016-03-16 16:39:41 +0000164 mbedtls_rsa_free( &ctx );
165}
166/* END_CASE */
167
168/* BEGIN_CASE */
169void pkcs1_rsassa_v15_verify( int mod, int radix_N, char *input_N, int radix_E,
170 char *input_E, int digest, int hash,
171 char *message_hex_string, char *salt,
172 char *result_hex_str, int result )
173{
174 unsigned char message_str[1000];
175 unsigned char hash_result[1000];
176 unsigned char result_str[1000];
177 mbedtls_rsa_context ctx;
178 size_t msg_len;
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100179 mbedtls_mpi N, E;
Janos Follathe6aef9f2016-03-16 16:39:41 +0000180 ((void) salt);
181
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100182 mbedtls_mpi_init( &N ); mbedtls_mpi_init( &E );
Janos Follathe6aef9f2016-03-16 16:39:41 +0000183 mbedtls_rsa_init( &ctx, MBEDTLS_RSA_PKCS_V15, hash );
184 memset( message_str, 0x00, 1000 );
185 memset( hash_result, 0x00, 1000 );
186 memset( result_str, 0x00, 1000 );
187
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100188 TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
189 TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
190 TEST_ASSERT( mbedtls_rsa_import( &ctx, &N, NULL, NULL, NULL, &E ) == 0 );
191 TEST_ASSERT( mbedtls_rsa_get_len( &ctx ) == (size_t) ( ( mod + 7 ) / 8 ) );
Janos Follathe6aef9f2016-03-16 16:39:41 +0000192 TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == 0 );
193
194 msg_len = unhexify( message_str, message_hex_string );
195 unhexify( result_str, result_hex_str );
196
197 if( mbedtls_md_info_from_type( digest ) != NULL )
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100198 TEST_ASSERT( mbedtls_md( mbedtls_md_info_from_type( digest ),
199 message_str, msg_len, hash_result ) == 0 );
Janos Follathe6aef9f2016-03-16 16:39:41 +0000200
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100201 TEST_ASSERT( mbedtls_rsa_pkcs1_verify( &ctx, NULL, NULL, MBEDTLS_RSA_PUBLIC,
202 digest, 0, hash_result,
203 result_str ) == result );
Janos Follathe6aef9f2016-03-16 16:39:41 +0000204
205exit:
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100206 mbedtls_mpi_free( &N ); mbedtls_mpi_free( &E );
Janos Follathe6aef9f2016-03-16 16:39:41 +0000207 mbedtls_rsa_free( &ctx );
208}
209/* END_CASE */