blob: 389bc6e911a34b6dd5ce539efec379c2aa7ab4e0 [file] [log] [blame]
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +01001BEGIN_HEADER
2#include <polarssl/ecp.h>
3END_HEADER
4
5BEGIN_DEPENDENCIES
6depends_on:POLARSSL_ECP_C:POLARSSL_BIGNUM_C
7END_DEPENDENCIES
8
9BEGIN_CASE
10ecp_small_add:a_zero:x_a:y_a:b_zero:x_b:y_b:c_zero:x_c:y_c
11{
12 ecp_group grp;
13 ecp_point A, B, C;
14
15 ecp_group_init( &grp );
16 ecp_point_init( &A ); ecp_point_init( &B ); ecp_point_init( &C );
17
18 TEST_ASSERT( ecp_group_read_string( &grp, 10,
19 "47", "4", "17", "42", "13" ) == 0 );
20
21 if( {a_zero} )
22 ecp_set_zero( &A );
23 else
24 TEST_ASSERT( ecp_point_read_string( &A, 10, {x_a}, {y_a} ) == 0 );
25
26 if( {b_zero} )
27 ecp_set_zero( &B );
28 else
29 TEST_ASSERT( ecp_point_read_string( &B, 10, {x_b}, {y_b} ) == 0 );
30
31 TEST_ASSERT( ecp_add( &grp, &C, &A, &B ) == 0 );
32
33 if( {c_zero} )
Manuel Pégourié-Gonnard1c2782c2012-11-19 20:16:28 +010034 TEST_ASSERT( mpi_cmp_int( &C.Z, 0 ) == 0 );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +010035 else
36 {
37 TEST_ASSERT( mpi_cmp_int( &C.X, {x_c} ) == 0 );
38 TEST_ASSERT( mpi_cmp_int( &C.Y, {y_c} ) == 0 );
39 }
40
41 TEST_ASSERT( ecp_add( &grp, &C, &B, &A ) == 0 );
42
43 if( {c_zero} )
Manuel Pégourié-Gonnard1c2782c2012-11-19 20:16:28 +010044 TEST_ASSERT( mpi_cmp_int( &C.Z, 0 ) == 0 );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +010045 else
46 {
47 TEST_ASSERT( mpi_cmp_int( &C.X, {x_c} ) == 0 );
48 TEST_ASSERT( mpi_cmp_int( &C.Y, {y_c} ) == 0 );
49 }
50
51 ecp_group_free( &grp );
52 ecp_point_free( &A ); ecp_point_free( &B ); ecp_point_free( &C );
53}
54END_CASE
55
56BEGIN_CASE
Manuel Pégourié-Gonnard9674fd02012-11-19 21:23:27 +010057ecp_small_sub:a_zero:x_a:y_a:b_zero:x_b:y_b:c_zero:x_c:y_c
58{
59 ecp_group grp;
60 ecp_point A, B, C;
61
62 ecp_group_init( &grp );
63 ecp_point_init( &A ); ecp_point_init( &B ); ecp_point_init( &C );
64
65 TEST_ASSERT( ecp_group_read_string( &grp, 10,
66 "47", "4", "17", "42", "13" ) == 0 );
67
68 if( {a_zero} )
69 ecp_set_zero( &A );
70 else
71 TEST_ASSERT( ecp_point_read_string( &A, 10, {x_a}, {y_a} ) == 0 );
72
73 if( {b_zero} )
74 ecp_set_zero( &B );
75 else
76 TEST_ASSERT( ecp_point_read_string( &B, 10, {x_b}, {y_b} ) == 0 );
77
78 TEST_ASSERT( ecp_sub( &grp, &C, &A, &B ) == 0 );
79
80 if( {c_zero} )
81 TEST_ASSERT( mpi_cmp_int( &C.Z, 0 ) == 0 );
82 else
83 {
84 TEST_ASSERT( mpi_cmp_int( &C.X, {x_c} ) == 0 );
85 TEST_ASSERT( mpi_cmp_int( &C.Y, {y_c} ) == 0 );
86 }
87
88 ecp_group_free( &grp );
89 ecp_point_free( &A ); ecp_point_free( &B ); ecp_point_free( &C );
90}
91END_CASE
92
93BEGIN_CASE
Manuel Pégourié-Gonnard4bdd47d2012-11-11 14:33:59 +010094ecp_small_mul:m:r_zero:x_r:y_r:ret
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +010095{
96 ecp_group grp;
97 ecp_point R;
98 mpi m;
99
100 ecp_group_init( &grp );
101 ecp_point_init( &R );
102 mpi_init( &m );
103
104 TEST_ASSERT( ecp_group_read_string( &grp, 10,
105 "47", "4", "17", "42", "13" ) == 0 );
106
107 TEST_ASSERT( mpi_lset( &m, {m} ) == 0 );
108
Manuel Pégourié-Gonnard4bdd47d2012-11-11 14:33:59 +0100109 TEST_ASSERT( ecp_mul( &grp, &R, &m, &grp.G ) == {ret} );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100110
111 if( {r_zero} )
Manuel Pégourié-Gonnard1c2782c2012-11-19 20:16:28 +0100112 TEST_ASSERT( mpi_cmp_int( &R.Z, 0 ) == 0 );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100113 else
114 {
115 TEST_ASSERT( mpi_cmp_int( &R.X, {x_r} ) == 0 );
116 TEST_ASSERT( mpi_cmp_int( &R.Y, {y_r} ) == 0 );
117 }
118
119 ecp_group_free( &grp );
120 ecp_point_free( &R );
121 mpi_free( &m );
122}
123END_CASE
124
125BEGIN_CASE
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100126ecp_test_vect:id:dA:xA:yA:dB:xB:yB:xZ:yZ
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100127{
128 ecp_group grp;
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100129 ecp_point R;
130 mpi dA, xA, yA, dB, xB, yB, xZ, yZ;
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100131
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100132 ecp_group_init( &grp ); ecp_point_init( &R );
133 mpi_init( &dA ); mpi_init( &xA ); mpi_init( &yA ); mpi_init( &dB );
134 mpi_init( &xB ); mpi_init( &yB ); mpi_init( &xZ ); mpi_init( &yZ );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100135
136 TEST_ASSERT( ecp_use_known_dp( &grp, POLARSSL_ECP_DP_{id} ) == 0 );
137
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100138 TEST_ASSERT( mpi_read_string( &dA, 16, {dA} ) == 0 );
139 TEST_ASSERT( mpi_read_string( &xA, 16, {xA} ) == 0 );
140 TEST_ASSERT( mpi_read_string( &yA, 16, {yA} ) == 0 );
141 TEST_ASSERT( mpi_read_string( &dB, 16, {dB} ) == 0 );
142 TEST_ASSERT( mpi_read_string( &xB, 16, {xB} ) == 0 );
143 TEST_ASSERT( mpi_read_string( &yB, 16, {yB} ) == 0 );
144 TEST_ASSERT( mpi_read_string( &xZ, 16, {xZ} ) == 0 );
145 TEST_ASSERT( mpi_read_string( &yZ, 16, {yZ} ) == 0 );
146
147 TEST_ASSERT( ecp_mul( &grp, &R, &dA, &grp.G ) == 0 );
148 TEST_ASSERT( mpi_cmp_mpi( &R.X, &xA ) == 0 );
149 TEST_ASSERT( mpi_cmp_mpi( &R.Y, &yA ) == 0 );
150 TEST_ASSERT( ecp_mul( &grp, &R, &dB, &R ) == 0 );
151 TEST_ASSERT( mpi_cmp_mpi( &R.X, &xZ ) == 0 );
152 TEST_ASSERT( mpi_cmp_mpi( &R.Y, &yZ ) == 0 );
153
154 TEST_ASSERT( ecp_mul( &grp, &R, &dB, &grp.G ) == 0 );
155 TEST_ASSERT( mpi_cmp_mpi( &R.X, &xB ) == 0 );
156 TEST_ASSERT( mpi_cmp_mpi( &R.Y, &yB ) == 0 );
157 TEST_ASSERT( ecp_mul( &grp, &R, &dA, &R ) == 0 );
158 TEST_ASSERT( mpi_cmp_mpi( &R.X, &xZ ) == 0 );
159 TEST_ASSERT( mpi_cmp_mpi( &R.Y, &yZ ) == 0 );
160
161 ecp_group_free( &grp ); ecp_point_free( &R );
162 mpi_free( &dA ); mpi_free( &xA ); mpi_free( &yA ); mpi_free( &dB );
163 mpi_free( &xB ); mpi_free( &yB ); mpi_free( &xZ ); mpi_free( &yZ );
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100164}
165END_CASE
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100166
167BEGIN_CASE
168ecp_fast_mod:id:N
169{
170 ecp_group grp;
171 mpi N, R;
172
173 mpi_init( &N ); mpi_init( &R );
174 ecp_group_init( &grp );
175
176 TEST_ASSERT( ecp_use_known_dp( &grp, POLARSSL_ECP_DP_{id} ) == 0 );
177 TEST_ASSERT( mpi_read_string( &N, 16, {N} ) == 0 );
178
179 /*
180 * Store correct result before we touch N
181 */
182 TEST_ASSERT( mpi_mod_mpi( &R, &N, &grp.P ) == 0 );
183
184 TEST_ASSERT( grp.modp( &N ) == 0 );
185 TEST_ASSERT( mpi_msb( &N ) <= grp.pbits + 3 );
186
187 /*
188 * Use mod rather than addition/substraction in case previous test fails
189 */
190 TEST_ASSERT( mpi_mod_mpi( &N, &N, &grp.P ) == 0 );
191 TEST_ASSERT( mpi_cmp_mpi( &N, &R ) == 0 );
192
193 mpi_free( &N ); mpi_free( &R );
194 ecp_group_free( &grp );
195}
196END_CASE
Manuel Pégourié-Gonnardb4a310b2012-11-13 20:57:00 +0100197
198BEGIN_CASE
199ecp_selftest:
200{
201 TEST_ASSERT( ecp_self_test( 0 ) == 0 );
202}
203END_CASE