blob: 3b2d70bdcc8f73bd53f541d06f9004fe269d8caf [file] [log] [blame]
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +01001BEGIN_HEADER
2#include <polarssl/ecp.h>
Paul Bakkerdbd443d2013-08-16 13:38:47 +02003
4#define POLARSSL_ECP_PF_UNKNOWN -1
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +01005END_HEADER
6
7BEGIN_DEPENDENCIES
8depends_on:POLARSSL_ECP_C:POLARSSL_BIGNUM_C
9END_DEPENDENCIES
10
11BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +020012ecp_small_add:#a_zero:x_a:y_a:#b_zero:x_b:y_b:#c_zero:#x_c:#y_c
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +010013{
14 ecp_group grp;
15 ecp_point A, B, C;
16
17 ecp_group_init( &grp );
18 ecp_point_init( &A ); ecp_point_init( &B ); ecp_point_init( &C );
19
20 TEST_ASSERT( ecp_group_read_string( &grp, 10,
21 "47", "4", "17", "42", "13" ) == 0 );
22
23 if( {a_zero} )
24 ecp_set_zero( &A );
25 else
26 TEST_ASSERT( ecp_point_read_string( &A, 10, {x_a}, {y_a} ) == 0 );
27
28 if( {b_zero} )
29 ecp_set_zero( &B );
30 else
31 TEST_ASSERT( ecp_point_read_string( &B, 10, {x_b}, {y_b} ) == 0 );
32
33 TEST_ASSERT( ecp_add( &grp, &C, &A, &B ) == 0 );
34
35 if( {c_zero} )
Manuel Pégourié-Gonnard1c2782c2012-11-19 20:16:28 +010036 TEST_ASSERT( mpi_cmp_int( &C.Z, 0 ) == 0 );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +010037 else
38 {
39 TEST_ASSERT( mpi_cmp_int( &C.X, {x_c} ) == 0 );
40 TEST_ASSERT( mpi_cmp_int( &C.Y, {y_c} ) == 0 );
41 }
42
43 TEST_ASSERT( ecp_add( &grp, &C, &B, &A ) == 0 );
44
45 if( {c_zero} )
Manuel Pégourié-Gonnard1c2782c2012-11-19 20:16:28 +010046 TEST_ASSERT( mpi_cmp_int( &C.Z, 0 ) == 0 );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +010047 else
48 {
49 TEST_ASSERT( mpi_cmp_int( &C.X, {x_c} ) == 0 );
50 TEST_ASSERT( mpi_cmp_int( &C.Y, {y_c} ) == 0 );
51 }
52
53 ecp_group_free( &grp );
54 ecp_point_free( &A ); ecp_point_free( &B ); ecp_point_free( &C );
55}
56END_CASE
57
58BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +020059ecp_small_sub:#a_zero:x_a:y_a:#b_zero:x_b:y_b:#c_zero:#x_c:#y_c
Manuel Pégourié-Gonnard9674fd02012-11-19 21:23:27 +010060{
61 ecp_group grp;
62 ecp_point A, B, C;
63
64 ecp_group_init( &grp );
65 ecp_point_init( &A ); ecp_point_init( &B ); ecp_point_init( &C );
66
67 TEST_ASSERT( ecp_group_read_string( &grp, 10,
68 "47", "4", "17", "42", "13" ) == 0 );
69
70 if( {a_zero} )
71 ecp_set_zero( &A );
72 else
73 TEST_ASSERT( ecp_point_read_string( &A, 10, {x_a}, {y_a} ) == 0 );
74
75 if( {b_zero} )
76 ecp_set_zero( &B );
77 else
78 TEST_ASSERT( ecp_point_read_string( &B, 10, {x_b}, {y_b} ) == 0 );
79
80 TEST_ASSERT( ecp_sub( &grp, &C, &A, &B ) == 0 );
81
82 if( {c_zero} )
83 TEST_ASSERT( mpi_cmp_int( &C.Z, 0 ) == 0 );
84 else
85 {
86 TEST_ASSERT( mpi_cmp_int( &C.X, {x_c} ) == 0 );
87 TEST_ASSERT( mpi_cmp_int( &C.Y, {y_c} ) == 0 );
88 }
89
90 ecp_group_free( &grp );
91 ecp_point_free( &A ); ecp_point_free( &B ); ecp_point_free( &C );
92}
93END_CASE
94
95BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +020096ecp_small_mul:#m_str:#r_zero:#x_r:#y_r:#ret
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +010097{
98 ecp_group grp;
99 ecp_point R;
100 mpi m;
101
102 ecp_group_init( &grp );
103 ecp_point_init( &R );
104 mpi_init( &m );
105
106 TEST_ASSERT( ecp_group_read_string( &grp, 10,
107 "47", "4", "17", "42", "13" ) == 0 );
108
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200109 TEST_ASSERT( mpi_lset( &m, {m_str} ) == 0 );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100110
Manuel Pégourié-Gonnard4bdd47d2012-11-11 14:33:59 +0100111 TEST_ASSERT( ecp_mul( &grp, &R, &m, &grp.G ) == {ret} );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100112
113 if( {r_zero} )
Manuel Pégourié-Gonnard1c2782c2012-11-19 20:16:28 +0100114 TEST_ASSERT( mpi_cmp_int( &R.Z, 0 ) == 0 );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100115 else
116 {
117 TEST_ASSERT( mpi_cmp_int( &R.X, {x_r} ) == 0 );
118 TEST_ASSERT( mpi_cmp_int( &R.Y, {y_r} ) == 0 );
119 }
120
121 ecp_group_free( &grp );
122 ecp_point_free( &R );
123 mpi_free( &m );
124}
125END_CASE
126
127BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200128ecp_small_check_pub:#x:#y:#z:#ret
Manuel Pégourié-Gonnard1c330572012-11-24 12:05:44 +0100129{
130 ecp_group grp;
131 ecp_point P;
132
133 ecp_group_init( &grp );
134 ecp_point_init( &P );
135
136 TEST_ASSERT( ecp_group_read_string( &grp, 10,
137 "47", "4", "17", "42", "13" ) == 0 );
138
139 TEST_ASSERT( mpi_lset( &P.X, {x} ) == 0 );
140 TEST_ASSERT( mpi_lset( &P.Y, {y} ) == 0 );
141 TEST_ASSERT( mpi_lset( &P.Z, {z} ) == 0 );
142
143 TEST_ASSERT( ecp_check_pubkey( &grp, &P ) == {ret} );
144
145 ecp_group_free( &grp );
146 ecp_point_free( &P );
147}
148END_CASE
149
150BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200151ecp_test_vect:#id:dA_str:xA_str:yA_str:dB_str:xB_str:yB_str:xZ_str:yZ_str
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100152{
153 ecp_group grp;
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100154 ecp_point R;
155 mpi dA, xA, yA, dB, xB, yB, xZ, yZ;
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100156
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100157 ecp_group_init( &grp ); ecp_point_init( &R );
158 mpi_init( &dA ); mpi_init( &xA ); mpi_init( &yA ); mpi_init( &dB );
159 mpi_init( &xB ); mpi_init( &yB ); mpi_init( &xZ ); mpi_init( &yZ );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100160
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200161 TEST_ASSERT( ecp_use_known_dp( &grp, {id} ) == 0 );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100162
Manuel Pégourié-Gonnard1c330572012-11-24 12:05:44 +0100163 TEST_ASSERT( ecp_check_pubkey( &grp, &grp.G ) == 0 );
164
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200165 TEST_ASSERT( mpi_read_string( &dA, 16, {dA_str} ) == 0 );
166 TEST_ASSERT( mpi_read_string( &xA, 16, {xA_str} ) == 0 );
167 TEST_ASSERT( mpi_read_string( &yA, 16, {yA_str} ) == 0 );
168 TEST_ASSERT( mpi_read_string( &dB, 16, {dB_str} ) == 0 );
169 TEST_ASSERT( mpi_read_string( &xB, 16, {xB_str} ) == 0 );
170 TEST_ASSERT( mpi_read_string( &yB, 16, {yB_str} ) == 0 );
171 TEST_ASSERT( mpi_read_string( &xZ, 16, {xZ_str} ) == 0 );
172 TEST_ASSERT( mpi_read_string( &yZ, 16, {yZ_str} ) == 0 );
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100173
174 TEST_ASSERT( ecp_mul( &grp, &R, &dA, &grp.G ) == 0 );
175 TEST_ASSERT( mpi_cmp_mpi( &R.X, &xA ) == 0 );
176 TEST_ASSERT( mpi_cmp_mpi( &R.Y, &yA ) == 0 );
Manuel Pégourié-Gonnard1c330572012-11-24 12:05:44 +0100177 TEST_ASSERT( ecp_check_pubkey( &grp, &R ) == 0 );
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100178 TEST_ASSERT( ecp_mul( &grp, &R, &dB, &R ) == 0 );
179 TEST_ASSERT( mpi_cmp_mpi( &R.X, &xZ ) == 0 );
180 TEST_ASSERT( mpi_cmp_mpi( &R.Y, &yZ ) == 0 );
Manuel Pégourié-Gonnard1c330572012-11-24 12:05:44 +0100181 TEST_ASSERT( ecp_check_pubkey( &grp, &R ) == 0 );
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100182
183 TEST_ASSERT( ecp_mul( &grp, &R, &dB, &grp.G ) == 0 );
184 TEST_ASSERT( mpi_cmp_mpi( &R.X, &xB ) == 0 );
185 TEST_ASSERT( mpi_cmp_mpi( &R.Y, &yB ) == 0 );
Manuel Pégourié-Gonnard1c330572012-11-24 12:05:44 +0100186 TEST_ASSERT( ecp_check_pubkey( &grp, &R ) == 0 );
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100187 TEST_ASSERT( ecp_mul( &grp, &R, &dA, &R ) == 0 );
188 TEST_ASSERT( mpi_cmp_mpi( &R.X, &xZ ) == 0 );
189 TEST_ASSERT( mpi_cmp_mpi( &R.Y, &yZ ) == 0 );
Manuel Pégourié-Gonnard1c330572012-11-24 12:05:44 +0100190 TEST_ASSERT( ecp_check_pubkey( &grp, &R ) == 0 );
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100191
192 ecp_group_free( &grp ); ecp_point_free( &R );
193 mpi_free( &dA ); mpi_free( &xA ); mpi_free( &yA ); mpi_free( &dB );
194 mpi_free( &xB ); mpi_free( &yB ); mpi_free( &xZ ); mpi_free( &yZ );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100195}
196END_CASE
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100197
198BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200199ecp_fast_mod:#id:N_str
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100200{
201 ecp_group grp;
202 mpi N, R;
203
204 mpi_init( &N ); mpi_init( &R );
205 ecp_group_init( &grp );
206
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200207 TEST_ASSERT( ecp_use_known_dp( &grp, {id} ) == 0 );
208 TEST_ASSERT( mpi_read_string( &N, 16, {N_str} ) == 0 );
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100209
210 /*
211 * Store correct result before we touch N
212 */
213 TEST_ASSERT( mpi_mod_mpi( &R, &N, &grp.P ) == 0 );
214
215 TEST_ASSERT( grp.modp( &N ) == 0 );
216 TEST_ASSERT( mpi_msb( &N ) <= grp.pbits + 3 );
217
218 /*
219 * Use mod rather than addition/substraction in case previous test fails
220 */
221 TEST_ASSERT( mpi_mod_mpi( &N, &N, &grp.P ) == 0 );
222 TEST_ASSERT( mpi_cmp_mpi( &N, &R ) == 0 );
223
224 mpi_free( &N ); mpi_free( &R );
225 ecp_group_free( &grp );
226}
227END_CASE
Manuel Pégourié-Gonnardb4a310b2012-11-13 20:57:00 +0100228
229BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200230ecp_write_binary:#id:x:y:z:#format:out:#blen:#ret
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100231{
232 ecp_group grp;
233 ecp_point P;
234 unsigned char buf[256], str[512];
Manuel Pégourié-Gonnard420f1eb2013-02-10 12:22:46 +0100235 size_t olen;
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100236
237 memset( buf, 0, sizeof( buf ) );
238 memset( str, 0, sizeof( str ) );
239
240 ecp_group_init( &grp ); ecp_point_init( &P );
241
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200242 TEST_ASSERT( ecp_use_known_dp( &grp, {id} ) == 0 );
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100243
244 TEST_ASSERT( mpi_read_string( &P.X, 16, {x} ) == 0 );
245 TEST_ASSERT( mpi_read_string( &P.Y, 16, {y} ) == 0 );
246 TEST_ASSERT( mpi_read_string( &P.Z, 16, {z} ) == 0 );
247
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200248 TEST_ASSERT( ecp_point_write_binary( &grp, &P, {format},
Manuel Pégourié-Gonnard37d218a2012-11-24 15:19:55 +0100249 &olen, buf, {blen} ) == {ret} );
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100250
251 if( {ret} == 0 )
252 {
Manuel Pégourié-Gonnard37d218a2012-11-24 15:19:55 +0100253 hexify( str, buf, olen );
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100254 TEST_ASSERT( strcasecmp( (char *) str, {out} ) == 0 );
255 }
256
257 ecp_group_free( &grp ); ecp_point_free( &P );
258}
259END_CASE
260
261BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200262ecp_read_binary:#id:input:x:y:z:#ret
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100263{
264 ecp_group grp;
265 ecp_point P;
266 mpi X, Y, Z;
267 int ilen;
268 unsigned char buf[256];
269
270 memset( buf, 0, sizeof( buf ) );
271
272 ecp_group_init( &grp ); ecp_point_init( &P );
273 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
274
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200275 TEST_ASSERT( ecp_use_known_dp( &grp, {id} ) == 0 );
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100276
277 TEST_ASSERT( mpi_read_string( &X, 16, {x} ) == 0 );
278 TEST_ASSERT( mpi_read_string( &Y, 16, {y} ) == 0 );
279 TEST_ASSERT( mpi_read_string( &Z, 16, {z} ) == 0 );
280
281 ilen = unhexify( buf, {input} );
282
Manuel Pégourié-Gonnard7e860252013-02-10 10:58:48 +0100283 TEST_ASSERT( ecp_point_read_binary( &grp, &P, buf, ilen ) == {ret} );
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100284
285 if( {ret} == 0 )
286 {
287 TEST_ASSERT( mpi_cmp_mpi( &P.X, &X ) == 0 );
288 TEST_ASSERT( mpi_cmp_mpi( &P.Y, &Y ) == 0 );
289 TEST_ASSERT( mpi_cmp_mpi( &P.Z, &Z ) == 0 );
290 }
291
292 ecp_group_free( &grp ); ecp_point_free( &P );
293 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
294}
295END_CASE
296
297BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200298ecp_tls_read_point:#id:input:x:y:z:#ret
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100299{
300 ecp_group grp;
301 ecp_point P;
302 mpi X, Y, Z;
303 size_t ilen;
304 unsigned char buf[256];
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100305 const unsigned char *vbuf = buf;
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100306
307 memset( buf, 0, sizeof( buf ) );
308
309 ecp_group_init( &grp ); ecp_point_init( &P );
310 mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
311
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200312 TEST_ASSERT( ecp_use_known_dp( &grp, {id} ) == 0 );
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100313
314 TEST_ASSERT( mpi_read_string( &X, 16, {x} ) == 0 );
315 TEST_ASSERT( mpi_read_string( &Y, 16, {y} ) == 0 );
316 TEST_ASSERT( mpi_read_string( &Z, 16, {z} ) == 0 );
317
318 ilen = unhexify( buf, {input} );
319
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100320 TEST_ASSERT( ecp_tls_read_point( &grp, &P, &vbuf, ilen ) == {ret} );
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100321
322 if( {ret} == 0 )
323 {
324 TEST_ASSERT( mpi_cmp_mpi( &P.X, &X ) == 0 );
325 TEST_ASSERT( mpi_cmp_mpi( &P.Y, &Y ) == 0 );
326 TEST_ASSERT( mpi_cmp_mpi( &P.Z, &Z ) == 0 );
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100327 TEST_ASSERT( *vbuf == 0x00 );
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100328 }
329
330 ecp_group_free( &grp ); ecp_point_free( &P );
331 mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
332}
333END_CASE
334
335BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200336ecp_tls_write_read_point:#id
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100337{
338 ecp_group grp;
339 ecp_point pt;
340 unsigned char buf[256];
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100341 const unsigned char *vbuf;
Manuel Pégourié-Gonnard420f1eb2013-02-10 12:22:46 +0100342 size_t olen;
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100343
344 ecp_group_init( &grp );
345 ecp_point_init( &pt );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100346
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200347 TEST_ASSERT( ecp_use_known_dp( &grp, {id} ) == 0 );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100348
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100349 memset( buf, 0x00, sizeof( buf ) ); vbuf = buf;
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100350 TEST_ASSERT( ecp_tls_write_point( &grp, &grp.G,
Manuel Pégourié-Gonnard420f1eb2013-02-10 12:22:46 +0100351 POLARSSL_ECP_PF_COMPRESSED, &olen, buf, 256 ) == 0 );
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100352 TEST_ASSERT( ecp_tls_read_point( &grp, &pt, &vbuf, olen )
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100353 == POLARSSL_ERR_ECP_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100354 TEST_ASSERT( vbuf == buf + olen );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100355
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100356 memset( buf, 0x00, sizeof( buf ) ); vbuf = buf;
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100357 TEST_ASSERT( ecp_tls_write_point( &grp, &grp.G,
Manuel Pégourié-Gonnard420f1eb2013-02-10 12:22:46 +0100358 POLARSSL_ECP_PF_UNCOMPRESSED, &olen, buf, 256 ) == 0 );
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100359 TEST_ASSERT( ecp_tls_read_point( &grp, &pt, &vbuf, olen ) == 0 );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100360 TEST_ASSERT( mpi_cmp_mpi( &grp.G.X, &pt.X ) == 0 );
361 TEST_ASSERT( mpi_cmp_mpi( &grp.G.Y, &pt.Y ) == 0 );
362 TEST_ASSERT( mpi_cmp_mpi( &grp.G.Z, &pt.Z ) == 0 );
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100363 TEST_ASSERT( vbuf == buf + olen );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100364
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100365 memset( buf, 0x00, sizeof( buf ) ); vbuf = buf;
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100366 TEST_ASSERT( ecp_set_zero( &pt ) == 0 );
367 TEST_ASSERT( ecp_tls_write_point( &grp, &pt,
Manuel Pégourié-Gonnard420f1eb2013-02-10 12:22:46 +0100368 POLARSSL_ECP_PF_COMPRESSED, &olen, buf, 256 ) == 0 );
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100369 TEST_ASSERT( ecp_tls_read_point( &grp, &pt, &vbuf, olen ) == 0 );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100370 TEST_ASSERT( ecp_is_zero( &pt ) );
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100371 TEST_ASSERT( vbuf == buf + olen );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100372
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100373 memset( buf, 0x00, sizeof( buf ) ); vbuf = buf;
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100374 TEST_ASSERT( ecp_set_zero( &pt ) == 0 );
375 TEST_ASSERT( ecp_tls_write_point( &grp, &pt,
Manuel Pégourié-Gonnard420f1eb2013-02-10 12:22:46 +0100376 POLARSSL_ECP_PF_UNCOMPRESSED, &olen, buf, 256 ) == 0 );
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100377 TEST_ASSERT( ecp_tls_read_point( &grp, &pt, &vbuf, olen ) == 0 );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100378 TEST_ASSERT( ecp_is_zero( &pt ) );
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100379 TEST_ASSERT( vbuf == buf + olen );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100380
381 ecp_group_free( &grp );
382 ecp_point_free( &pt );
383}
384END_CASE
385
386BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200387ecp_tls_read_group:record:#result:#bits
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100388{
389 ecp_group grp;
390 unsigned char buf[10];
Manuel Pégourié-Gonnard7c145c62013-02-10 13:20:52 +0100391 const unsigned char *vbuf = buf;
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100392 int len, ret;
393
394 ecp_group_init( &grp );
395 memset( buf, 0x00, sizeof( buf ) );
396
397 len = unhexify( buf, {record} );
398
Manuel Pégourié-Gonnard7c145c62013-02-10 13:20:52 +0100399 ret = ecp_tls_read_group( &grp, &vbuf, len );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100400
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200401 TEST_ASSERT( ret == {result} );
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100402 if( ret == 0)
Manuel Pégourié-Gonnard7c145c62013-02-10 13:20:52 +0100403 {
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200404 TEST_ASSERT( mpi_msb( &grp.P ) == (size_t) {bits} );
Manuel Pégourié-Gonnard7c145c62013-02-10 13:20:52 +0100405 TEST_ASSERT( *vbuf == 0x00 );
406 }
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100407
408 ecp_group_free( &grp );
409}
410END_CASE
411
412BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200413ecp_tls_write_read_group:#id
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100414{
415 ecp_group grp1, grp2;
416 unsigned char buf[10];
Manuel Pégourié-Gonnard7c145c62013-02-10 13:20:52 +0100417 const unsigned char *vbuf = buf;
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100418 size_t len;
419 int ret;
420
421 ecp_group_init( &grp1 );
422 ecp_group_init( &grp2 );
423 memset( buf, 0x00, sizeof( buf ) );
424
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200425 TEST_ASSERT( ecp_use_known_dp( &grp1, {id} ) == 0 );
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100426
427 TEST_ASSERT( ecp_tls_write_group( &grp1, &len, buf, 10 ) == 0 );
Manuel Pégourié-Gonnard7c145c62013-02-10 13:20:52 +0100428 TEST_ASSERT( ( ret = ecp_tls_read_group( &grp2, &vbuf, len ) ) == 0 );
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100429
430 if( ret == 0 )
431 {
432 TEST_ASSERT( mpi_cmp_mpi( &grp1.N, &grp2.N ) == 0 );
433 TEST_ASSERT( grp1.id == grp2.id );
434 }
435
436 ecp_group_free( &grp1 );
437 ecp_group_free( &grp2 );
438}
439END_CASE
440
441BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200442ecp_check_privkey:#id
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200443{
444 ecp_group grp;
445 mpi d;
446
447 ecp_group_init( &grp );
448 mpi_init( &d );
449
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200450 TEST_ASSERT( ecp_use_known_dp( &grp, {id} ) == 0 );
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200451
452 TEST_ASSERT( mpi_lset( &d, 0 ) == 0 );
Paul Bakker8ea6c612013-07-16 17:15:03 +0200453 TEST_ASSERT( ecp_check_privkey( &grp, &d ) == POLARSSL_ERR_ECP_GENERIC );
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200454
455 TEST_ASSERT( mpi_copy( &d, &grp.N ) == 0 );
Paul Bakker8ea6c612013-07-16 17:15:03 +0200456 TEST_ASSERT( ecp_check_privkey( &grp, &d ) == POLARSSL_ERR_ECP_GENERIC );
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200457
458 ecp_group_free( &grp );
459 mpi_free( &d );
460}
461END_CASE
462
463BEGIN_CASE
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200464ecp_gen_keypair:#id
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +0100465{
466 ecp_group grp;
467 ecp_point Q;
468 mpi d;
469 rnd_pseudo_info rnd_info;
470
471 ecp_group_init( &grp );
472 ecp_point_init( &Q );
473 mpi_init( &d );
474 memset( &rnd_info, 0x00, sizeof( rnd_pseudo_info ) );
475
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200476 TEST_ASSERT( ecp_use_known_dp( &grp, {id} ) == 0 );
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +0100477
478 TEST_ASSERT( ecp_gen_keypair( &grp, &d, &Q, &rnd_pseudo_rand, &rnd_info )
479 == 0 );
480
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200481 TEST_ASSERT( ecp_check_pubkey( &grp, &Q ) == 0 );
Paul Bakker8ea6c612013-07-16 17:15:03 +0200482 TEST_ASSERT( ecp_check_privkey( &grp, &d ) == 0 );
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +0100483
484 ecp_group_free( &grp );
485 ecp_point_free( &Q );
486 mpi_free( &d );
487}
488END_CASE
489
490BEGIN_CASE
Manuel Pégourié-Gonnardb4a310b2012-11-13 20:57:00 +0100491ecp_selftest:
492{
493 TEST_ASSERT( ecp_self_test( 0 ) == 0 );
494}
495END_CASE