xref: /freebsd-src/crypto/libecc/src/curves/ec_montgomery.c (revision f0865ec9906d5a18fa2a3b61381f22ce16e606ad)
1*f0865ec9SKyle Evans /*
2*f0865ec9SKyle Evans  *  Copyright (C) 2021 - This file is part of libecc project
3*f0865ec9SKyle Evans  *
4*f0865ec9SKyle Evans  *  Authors:
5*f0865ec9SKyle Evans  *      Ryad BENADJILA <ryadbenadjila@gmail.com>
6*f0865ec9SKyle Evans  *      Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr>
7*f0865ec9SKyle Evans  *
8*f0865ec9SKyle Evans  *  This software is licensed under a dual BSD and GPL v2 license.
9*f0865ec9SKyle Evans  *  See LICENSE file at the root folder of the project.
10*f0865ec9SKyle Evans  */
11*f0865ec9SKyle Evans #include <libecc/curves/ec_montgomery.h>
12*f0865ec9SKyle Evans 
13*f0865ec9SKyle Evans #define EC_MONTGOMERY_CRV_MAGIC ((word_t)(0x83734673a0443720ULL))
14*f0865ec9SKyle Evans 
15*f0865ec9SKyle Evans /* Check if a Montgomery curve is initialized.
16*f0865ec9SKyle Evans  * Returns 0 on success, -1 on error.
17*f0865ec9SKyle Evans  */
18*f0865ec9SKyle Evans int ec_montgomery_crv_check_initialized(ec_montgomery_crv_src_t crv)
19*f0865ec9SKyle Evans {
20*f0865ec9SKyle Evans 	int ret;
21*f0865ec9SKyle Evans 
22*f0865ec9SKyle Evans 	MUST_HAVE((crv != NULL) && (crv->magic == EC_MONTGOMERY_CRV_MAGIC), ret, err);
23*f0865ec9SKyle Evans 	ret = 0;
24*f0865ec9SKyle Evans 
25*f0865ec9SKyle Evans err:
26*f0865ec9SKyle Evans 	return ret;
27*f0865ec9SKyle Evans }
28*f0865ec9SKyle Evans 
29*f0865ec9SKyle Evans /*
30*f0865ec9SKyle Evans  * Initialize pointed Montgomery curve structure using given A and B
31*f0865ec9SKyle Evans  * Fp elements representing curve equation (B v^2 = u^3 + A u^2 + u) parameters.
32*f0865ec9SKyle Evans  *
33*f0865ec9SKyle Evans  * The function returns 0 on success, -1 on error.
34*f0865ec9SKyle Evans  */
35*f0865ec9SKyle Evans int ec_montgomery_crv_init(ec_montgomery_crv_t crv, fp_src_t A, fp_src_t B, nn_src_t order)
36*f0865ec9SKyle Evans {
37*f0865ec9SKyle Evans 	int ret, iszero;
38*f0865ec9SKyle Evans 	fp tmp;
39*f0865ec9SKyle Evans 	tmp.magic = WORD(0);
40*f0865ec9SKyle Evans 
41*f0865ec9SKyle Evans 	MUST_HAVE((crv != NULL), ret, err);
42*f0865ec9SKyle Evans 
43*f0865ec9SKyle Evans 	ret = nn_check_initialized(order); EG(ret, err);
44*f0865ec9SKyle Evans 	ret = fp_check_initialized(A); EG(ret, err);
45*f0865ec9SKyle Evans 	ret = fp_check_initialized(B); EG(ret, err);
46*f0865ec9SKyle Evans 	MUST_HAVE(A->ctx == B->ctx, ret, err);
47*f0865ec9SKyle Evans 
48*f0865ec9SKyle Evans 	ret = fp_init(&tmp, A->ctx); EG(ret, err);
49*f0865ec9SKyle Evans 
50*f0865ec9SKyle Evans 	/* A and B elements of Fp, A unequal to (+/-)2 and B non zero */
51*f0865ec9SKyle Evans 	ret = fp_set_word_value(&tmp, 2); EG(ret, err);
52*f0865ec9SKyle Evans 	ret = fp_add(&tmp, A, &tmp); EG(ret, err);
53*f0865ec9SKyle Evans 	MUST_HAVE((!fp_iszero(&tmp, &iszero)) && (!iszero), ret, err);
54*f0865ec9SKyle Evans 
55*f0865ec9SKyle Evans 	ret = fp_set_word_value(&tmp, 2); EG(ret, err);
56*f0865ec9SKyle Evans 	ret = fp_sub(&tmp, A, &tmp); EG(ret, err);
57*f0865ec9SKyle Evans 	MUST_HAVE((!fp_iszero(&tmp, &iszero)) && (!iszero), ret, err);
58*f0865ec9SKyle Evans 	MUST_HAVE((!fp_iszero(B, &iszero)) && (!iszero), ret, err);
59*f0865ec9SKyle Evans 
60*f0865ec9SKyle Evans 	ret = fp_init(&(crv->A), A->ctx); EG(ret, err);
61*f0865ec9SKyle Evans 	ret = fp_init(&(crv->B), B->ctx); EG(ret, err);
62*f0865ec9SKyle Evans 
63*f0865ec9SKyle Evans 	ret = fp_copy(&(crv->A), A); EG(ret, err);
64*f0865ec9SKyle Evans 	ret = fp_copy(&(crv->B), B); EG(ret, err);
65*f0865ec9SKyle Evans 
66*f0865ec9SKyle Evans 	ret = nn_copy(&(crv->order), order); EG(ret, err);
67*f0865ec9SKyle Evans 
68*f0865ec9SKyle Evans 	crv->magic = EC_MONTGOMERY_CRV_MAGIC;
69*f0865ec9SKyle Evans 
70*f0865ec9SKyle Evans err:
71*f0865ec9SKyle Evans 	fp_uninit(&tmp);
72*f0865ec9SKyle Evans 
73*f0865ec9SKyle Evans 	return ret;
74*f0865ec9SKyle Evans }
75*f0865ec9SKyle Evans 
76*f0865ec9SKyle Evans /* Uninitialize curve
77*f0865ec9SKyle Evans  */
78*f0865ec9SKyle Evans void ec_montgomery_crv_uninit(ec_montgomery_crv_t crv)
79*f0865ec9SKyle Evans {
80*f0865ec9SKyle Evans 	if ((crv != NULL) && (crv->magic == EC_MONTGOMERY_CRV_MAGIC)) {
81*f0865ec9SKyle Evans 		crv->magic = WORD(0);
82*f0865ec9SKyle Evans 	}
83*f0865ec9SKyle Evans 
84*f0865ec9SKyle Evans 	return;
85*f0865ec9SKyle Evans }
86