1*0957b409SSimon J. Gerraty /*
2*0957b409SSimon J. Gerraty * Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
3*0957b409SSimon J. Gerraty *
4*0957b409SSimon J. Gerraty * Permission is hereby granted, free of charge, to any person obtaining
5*0957b409SSimon J. Gerraty * a copy of this software and associated documentation files (the
6*0957b409SSimon J. Gerraty * "Software"), to deal in the Software without restriction, including
7*0957b409SSimon J. Gerraty * without limitation the rights to use, copy, modify, merge, publish,
8*0957b409SSimon J. Gerraty * distribute, sublicense, and/or sell copies of the Software, and to
9*0957b409SSimon J. Gerraty * permit persons to whom the Software is furnished to do so, subject to
10*0957b409SSimon J. Gerraty * the following conditions:
11*0957b409SSimon J. Gerraty *
12*0957b409SSimon J. Gerraty * The above copyright notice and this permission notice shall be
13*0957b409SSimon J. Gerraty * included in all copies or substantial portions of the Software.
14*0957b409SSimon J. Gerraty *
15*0957b409SSimon J. Gerraty * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*0957b409SSimon J. Gerraty * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*0957b409SSimon J. Gerraty * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*0957b409SSimon J. Gerraty * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19*0957b409SSimon J. Gerraty * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20*0957b409SSimon J. Gerraty * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21*0957b409SSimon J. Gerraty * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*0957b409SSimon J. Gerraty * SOFTWARE.
23*0957b409SSimon J. Gerraty */
24*0957b409SSimon J. Gerraty
25*0957b409SSimon J. Gerraty #include "inner.h"
26*0957b409SSimon J. Gerraty
27*0957b409SSimon J. Gerraty static const unsigned char *
api_generator(int curve,size_t * len)28*0957b409SSimon J. Gerraty api_generator(int curve, size_t *len)
29*0957b409SSimon J. Gerraty {
30*0957b409SSimon J. Gerraty switch (curve) {
31*0957b409SSimon J. Gerraty case BR_EC_secp256r1:
32*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
33*0957b409SSimon J. Gerraty return br_ec_p256_m64.generator(curve, len);
34*0957b409SSimon J. Gerraty #else
35*0957b409SSimon J. Gerraty return br_ec_p256_m31.generator(curve, len);
36*0957b409SSimon J. Gerraty #endif
37*0957b409SSimon J. Gerraty case BR_EC_curve25519:
38*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
39*0957b409SSimon J. Gerraty return br_ec_c25519_m64.generator(curve, len);
40*0957b409SSimon J. Gerraty #else
41*0957b409SSimon J. Gerraty return br_ec_c25519_m31.generator(curve, len);
42*0957b409SSimon J. Gerraty #endif
43*0957b409SSimon J. Gerraty default:
44*0957b409SSimon J. Gerraty return br_ec_prime_i31.generator(curve, len);
45*0957b409SSimon J. Gerraty }
46*0957b409SSimon J. Gerraty }
47*0957b409SSimon J. Gerraty
48*0957b409SSimon J. Gerraty static const unsigned char *
api_order(int curve,size_t * len)49*0957b409SSimon J. Gerraty api_order(int curve, size_t *len)
50*0957b409SSimon J. Gerraty {
51*0957b409SSimon J. Gerraty switch (curve) {
52*0957b409SSimon J. Gerraty case BR_EC_secp256r1:
53*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
54*0957b409SSimon J. Gerraty return br_ec_p256_m64.order(curve, len);
55*0957b409SSimon J. Gerraty #else
56*0957b409SSimon J. Gerraty return br_ec_p256_m31.order(curve, len);
57*0957b409SSimon J. Gerraty #endif
58*0957b409SSimon J. Gerraty case BR_EC_curve25519:
59*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
60*0957b409SSimon J. Gerraty return br_ec_c25519_m64.order(curve, len);
61*0957b409SSimon J. Gerraty #else
62*0957b409SSimon J. Gerraty return br_ec_c25519_m31.order(curve, len);
63*0957b409SSimon J. Gerraty #endif
64*0957b409SSimon J. Gerraty default:
65*0957b409SSimon J. Gerraty return br_ec_prime_i31.order(curve, len);
66*0957b409SSimon J. Gerraty }
67*0957b409SSimon J. Gerraty }
68*0957b409SSimon J. Gerraty
69*0957b409SSimon J. Gerraty static size_t
api_xoff(int curve,size_t * len)70*0957b409SSimon J. Gerraty api_xoff(int curve, size_t *len)
71*0957b409SSimon J. Gerraty {
72*0957b409SSimon J. Gerraty switch (curve) {
73*0957b409SSimon J. Gerraty case BR_EC_secp256r1:
74*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
75*0957b409SSimon J. Gerraty return br_ec_p256_m64.xoff(curve, len);
76*0957b409SSimon J. Gerraty #else
77*0957b409SSimon J. Gerraty return br_ec_p256_m31.xoff(curve, len);
78*0957b409SSimon J. Gerraty #endif
79*0957b409SSimon J. Gerraty case BR_EC_curve25519:
80*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
81*0957b409SSimon J. Gerraty return br_ec_c25519_m64.xoff(curve, len);
82*0957b409SSimon J. Gerraty #else
83*0957b409SSimon J. Gerraty return br_ec_c25519_m31.xoff(curve, len);
84*0957b409SSimon J. Gerraty #endif
85*0957b409SSimon J. Gerraty default:
86*0957b409SSimon J. Gerraty return br_ec_prime_i31.xoff(curve, len);
87*0957b409SSimon J. Gerraty }
88*0957b409SSimon J. Gerraty }
89*0957b409SSimon J. Gerraty
90*0957b409SSimon J. Gerraty static uint32_t
api_mul(unsigned char * G,size_t Glen,const unsigned char * kb,size_t kblen,int curve)91*0957b409SSimon J. Gerraty api_mul(unsigned char *G, size_t Glen,
92*0957b409SSimon J. Gerraty const unsigned char *kb, size_t kblen, int curve)
93*0957b409SSimon J. Gerraty {
94*0957b409SSimon J. Gerraty switch (curve) {
95*0957b409SSimon J. Gerraty case BR_EC_secp256r1:
96*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
97*0957b409SSimon J. Gerraty return br_ec_p256_m64.mul(G, Glen, kb, kblen, curve);
98*0957b409SSimon J. Gerraty #else
99*0957b409SSimon J. Gerraty return br_ec_p256_m31.mul(G, Glen, kb, kblen, curve);
100*0957b409SSimon J. Gerraty #endif
101*0957b409SSimon J. Gerraty case BR_EC_curve25519:
102*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
103*0957b409SSimon J. Gerraty return br_ec_c25519_m64.mul(G, Glen, kb, kblen, curve);
104*0957b409SSimon J. Gerraty #else
105*0957b409SSimon J. Gerraty return br_ec_c25519_m31.mul(G, Glen, kb, kblen, curve);
106*0957b409SSimon J. Gerraty #endif
107*0957b409SSimon J. Gerraty default:
108*0957b409SSimon J. Gerraty return br_ec_prime_i31.mul(G, Glen, kb, kblen, curve);
109*0957b409SSimon J. Gerraty }
110*0957b409SSimon J. Gerraty }
111*0957b409SSimon J. Gerraty
112*0957b409SSimon J. Gerraty static size_t
api_mulgen(unsigned char * R,const unsigned char * x,size_t xlen,int curve)113*0957b409SSimon J. Gerraty api_mulgen(unsigned char *R,
114*0957b409SSimon J. Gerraty const unsigned char *x, size_t xlen, int curve)
115*0957b409SSimon J. Gerraty {
116*0957b409SSimon J. Gerraty switch (curve) {
117*0957b409SSimon J. Gerraty case BR_EC_secp256r1:
118*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
119*0957b409SSimon J. Gerraty return br_ec_p256_m64.mulgen(R, x, xlen, curve);
120*0957b409SSimon J. Gerraty #else
121*0957b409SSimon J. Gerraty return br_ec_p256_m31.mulgen(R, x, xlen, curve);
122*0957b409SSimon J. Gerraty #endif
123*0957b409SSimon J. Gerraty case BR_EC_curve25519:
124*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
125*0957b409SSimon J. Gerraty return br_ec_c25519_m64.mulgen(R, x, xlen, curve);
126*0957b409SSimon J. Gerraty #else
127*0957b409SSimon J. Gerraty return br_ec_c25519_m31.mulgen(R, x, xlen, curve);
128*0957b409SSimon J. Gerraty #endif
129*0957b409SSimon J. Gerraty default:
130*0957b409SSimon J. Gerraty return br_ec_prime_i31.mulgen(R, x, xlen, curve);
131*0957b409SSimon J. Gerraty }
132*0957b409SSimon J. Gerraty }
133*0957b409SSimon J. Gerraty
134*0957b409SSimon J. Gerraty static uint32_t
api_muladd(unsigned char * A,const unsigned char * B,size_t len,const unsigned char * x,size_t xlen,const unsigned char * y,size_t ylen,int curve)135*0957b409SSimon J. Gerraty api_muladd(unsigned char *A, const unsigned char *B, size_t len,
136*0957b409SSimon J. Gerraty const unsigned char *x, size_t xlen,
137*0957b409SSimon J. Gerraty const unsigned char *y, size_t ylen, int curve)
138*0957b409SSimon J. Gerraty {
139*0957b409SSimon J. Gerraty switch (curve) {
140*0957b409SSimon J. Gerraty case BR_EC_secp256r1:
141*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
142*0957b409SSimon J. Gerraty return br_ec_p256_m64.muladd(A, B, len,
143*0957b409SSimon J. Gerraty x, xlen, y, ylen, curve);
144*0957b409SSimon J. Gerraty #else
145*0957b409SSimon J. Gerraty return br_ec_p256_m31.muladd(A, B, len,
146*0957b409SSimon J. Gerraty x, xlen, y, ylen, curve);
147*0957b409SSimon J. Gerraty #endif
148*0957b409SSimon J. Gerraty case BR_EC_curve25519:
149*0957b409SSimon J. Gerraty #if BR_INT128 || BR_UMUL128
150*0957b409SSimon J. Gerraty return br_ec_c25519_m64.muladd(A, B, len,
151*0957b409SSimon J. Gerraty x, xlen, y, ylen, curve);
152*0957b409SSimon J. Gerraty #else
153*0957b409SSimon J. Gerraty return br_ec_c25519_m31.muladd(A, B, len,
154*0957b409SSimon J. Gerraty x, xlen, y, ylen, curve);
155*0957b409SSimon J. Gerraty #endif
156*0957b409SSimon J. Gerraty default:
157*0957b409SSimon J. Gerraty return br_ec_prime_i31.muladd(A, B, len,
158*0957b409SSimon J. Gerraty x, xlen, y, ylen, curve);
159*0957b409SSimon J. Gerraty }
160*0957b409SSimon J. Gerraty }
161*0957b409SSimon J. Gerraty
162*0957b409SSimon J. Gerraty /* see bearssl_ec.h */
163*0957b409SSimon J. Gerraty const br_ec_impl br_ec_all_m31 = {
164*0957b409SSimon J. Gerraty (uint32_t)0x23800000,
165*0957b409SSimon J. Gerraty &api_generator,
166*0957b409SSimon J. Gerraty &api_order,
167*0957b409SSimon J. Gerraty &api_xoff,
168*0957b409SSimon J. Gerraty &api_mul,
169*0957b409SSimon J. Gerraty &api_mulgen,
170*0957b409SSimon J. Gerraty &api_muladd
171*0957b409SSimon J. Gerraty };
172