OLD | NEW |
1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 | 4 |
5 #include "ecp.h" | 5 #include "ecp.h" |
6 #include "mplogic.h" | 6 #include "mplogic.h" |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 | 8 |
9 /* Checks if point P(px, py) is at infinity. Uses affine coordinates. */ | 9 /* Checks if point P(px, py) is at infinity. Uses affine coordinates. */ |
10 mp_err | 10 mp_err |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 /* 3: Verify that publicValue is on the curve. */ | 278 /* 3: Verify that publicValue is on the curve. */ |
279 if (group->meth->field_enc) { | 279 if (group->meth->field_enc) { |
280 group->meth->field_enc(px, &pxt, group->meth); | 280 group->meth->field_enc(px, &pxt, group->meth); |
281 group->meth->field_enc(py, &pyt, group->meth); | 281 group->meth->field_enc(py, &pyt, group->meth); |
282 } else { | 282 } else { |
283 mp_copy(px, &pxt); | 283 mp_copy(px, &pxt); |
284 mp_copy(py, &pyt); | 284 mp_copy(py, &pyt); |
285 } | 285 } |
286 /* left-hand side: y^2 */ | 286 /* left-hand side: y^2 */ |
287 MP_CHECKOK( group->meth->field_sqr(&pyt, &accl, group->meth) ); | 287 MP_CHECKOK( group->meth->field_sqr(&pyt, &accl, group->meth) ); |
288 » /* right-hand side: x^3 + a*x + b */ | 288 » /* right-hand side: x^3 + a*x + b = (x^2 + a)*x + b by Horner's rule */ |
289 MP_CHECKOK( group->meth->field_sqr(&pxt, &tmp, group->meth) ); | 289 MP_CHECKOK( group->meth->field_sqr(&pxt, &tmp, group->meth) ); |
290 » MP_CHECKOK( group->meth->field_mul(&pxt, &tmp, &accr, group->meth) ); | 290 » MP_CHECKOK( group->meth->field_add(&tmp, &group->curvea, &tmp, group->me
th) ); |
291 » MP_CHECKOK( group->meth->field_mul(&group->curvea, &pxt, &tmp, group->me
th) ); | 291 » MP_CHECKOK( group->meth->field_mul(&tmp, &pxt, &accr, group->meth) ); |
292 » MP_CHECKOK( group->meth->field_add(&tmp, &accr, &accr, group->meth) ); | |
293 MP_CHECKOK( group->meth->field_add(&accr, &group->curveb, &accr, group->
meth) ); | 292 MP_CHECKOK( group->meth->field_add(&accr, &group->curveb, &accr, group->
meth) ); |
294 /* check LHS - RHS == 0 */ | 293 /* check LHS - RHS == 0 */ |
295 MP_CHECKOK( group->meth->field_sub(&accl, &accr, &accr, group->meth) ); | 294 MP_CHECKOK( group->meth->field_sub(&accl, &accr, &accr, group->meth) ); |
296 if (mp_cmp_z(&accr) != 0) { | 295 if (mp_cmp_z(&accr) != 0) { |
297 res = MP_NO; | 296 res = MP_NO; |
298 goto CLEANUP; | 297 goto CLEANUP; |
299 } | 298 } |
300 /* 4: Verify that the order of the curve times the publicValue | 299 /* 4: Verify that the order of the curve times the publicValue |
301 * is the point at infinity. | 300 * is the point at infinity. |
302 */ | 301 */ |
303 MP_CHECKOK( ECPoint_mul(group, &group->order, px, py, &pxt, &pyt) ); | 302 MP_CHECKOK( ECPoint_mul(group, &group->order, px, py, &pxt, &pyt) ); |
304 if (ec_GFp_pt_is_inf_aff(&pxt, &pyt) != MP_YES) { | 303 if (ec_GFp_pt_is_inf_aff(&pxt, &pyt) != MP_YES) { |
305 res = MP_NO; | 304 res = MP_NO; |
306 goto CLEANUP; | 305 goto CLEANUP; |
307 } | 306 } |
308 | 307 |
309 res = MP_YES; | 308 res = MP_YES; |
310 | 309 |
311 CLEANUP: | 310 CLEANUP: |
312 mp_clear(&accl); | 311 mp_clear(&accl); |
313 mp_clear(&accr); | 312 mp_clear(&accr); |
314 mp_clear(&tmp); | 313 mp_clear(&tmp); |
315 mp_clear(&pxt); | 314 mp_clear(&pxt); |
316 mp_clear(&pyt); | 315 mp_clear(&pyt); |
317 return res; | 316 return res; |
318 } | 317 } |
OLD | NEW |