3 /*Arithmetic modulo the group order n = 2^252 + 27742317777372353535851937790883648493 = 7237005577332262213973186563042994240857116359379907606001950938285454250989 */
5 static const crypto_uint32 m[32] = {0xED, 0xD3, 0xF5, 0x5C, 0x1A, 0x63, 0x12, 0x58, 0xD6, 0x9C, 0xF7, 0xA2, 0xDE, 0xF9, 0xDE, 0x14,
6 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
8 static const crypto_uint32 mu[33] = {0x1B, 0x13, 0x2C, 0x0A, 0xA3, 0xE5, 0x9C, 0xED, 0xA7, 0x29, 0x63, 0x08, 0x5D, 0x21, 0x06, 0x21,
9 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F};
11 /* Reduce coefficients of r before calling reduce_add_sub */
12 static void reduce_add_sub(sc25519 *r)
19 b = (r->v[i]<pb+m[i]);
20 t[i] = r->v[i]-pb-m[i]+b*256;
25 r->v[i] = r->v[i]*b + t[i]*nb;
28 /* Reduce coefficients of x before calling barrett_reduce */
29 static void barrett_reduce(sc25519 *r, const crypto_uint32 x[64])
31 /* See HAC, Alg. 14.42 */
33 crypto_uint32 q2[66] = {0};
34 crypto_uint32 *q3 = q2 + 33;
36 crypto_uint32 r2[33] = {0};
42 if(i+j >= 31) q2[i+j] += mu[i]*x[j+31];
48 for(i=0;i<33;i++)r1[i] = x[i];
52 /* coverity[overrun-local] */
53 r2[i+j] += m[i]*q3[j];
67 r->v[i] = r1[i]-pb-r2[i]+b*256;
71 /* XXX: Can it really happen that r<0?, See HAC, Alg 14.42, Step 3
72 * If so: Handle it here!
80 static int iszero(const sc25519 *x)
87 void sc25519_from32bytes(sc25519 *r, const unsigned char x[32])
90 crypto_uint32 t[64] = {0};
91 for(i=0;i<32;i++) t[i] = x[i];
95 void sc25519_from64bytes(sc25519 *r, const unsigned char x[64])
98 crypto_uint32 t[64] = {0};
99 for(i=0;i<64;i++) t[i] = x[i];
100 barrett_reduce(r, t);
103 /* XXX: What we actually want for crypto_group is probably just something like
104 * void sc25519_frombytes(sc25519 *r, const unsigned char *x, size_t xlen)
107 void sc25519_to32bytes(unsigned char r[32], const sc25519 *x)
110 for(i=0;i<32;i++) r[i] = x->v[i];
113 void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y)
116 for(i=0;i<32;i++) r->v[i] = x->v[i] + y->v[i];
119 carry = r->v[i] >> 8;
126 void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y)
130 for(i=0;i<64;i++)t[i] = 0;
134 t[i+j] += x->v[i] * y->v[j];
136 /* Reduce coefficients */
144 barrett_reduce(r, t);
147 void sc25519_square(sc25519 *r, const sc25519 *x)
149 sc25519_mul(r, x, x);