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
];
51 if(i
+j
< 33) r2
[i
+j
] += m
[i
]*q3
[j
];
63 r
->v
[i
] = r1
[i
]-pb
-r2
[i
]+b
*256;
67 /* XXX: Can it really happen that r<0?, See HAC, Alg 14.42, Step 3
68 * If so: Handle it here!
76 static int iszero(const sc25519 *x)
83 void sc25519_from32bytes(sc25519
*r
, const unsigned char x
[32])
86 crypto_uint32 t
[64] = {0};
87 for(i
=0;i
<32;i
++) t
[i
] = x
[i
];
91 void sc25519_from64bytes(sc25519
*r
, const unsigned char x
[64])
94 crypto_uint32 t
[64] = {0};
95 for(i
=0;i
<64;i
++) t
[i
] = x
[i
];
99 /* XXX: What we actually want for crypto_group is probably just something like
100 * void sc25519_frombytes(sc25519 *r, const unsigned char *x, size_t xlen)
103 void sc25519_to32bytes(unsigned char r
[32], const sc25519
*x
)
106 for(i
=0;i
<32;i
++) r
[i
] = x
->v
[i
];
109 void sc25519_add(sc25519
*r
, const sc25519
*x
, const sc25519
*y
)
112 for(i
=0;i
<32;i
++) r
->v
[i
] = x
->v
[i
] + y
->v
[i
];
115 carry
= r
->v
[i
] >> 8;
122 void sc25519_mul(sc25519
*r
, const sc25519
*x
, const sc25519
*y
)
126 for(i
=0;i
<64;i
++)t
[i
] = 0;
130 t
[i
+j
] += x
->v
[i
] * y
->v
[j
];
132 /* Reduce coefficients */
140 barrett_reduce(r
, t
);
143 void sc25519_square(sc25519
*r
, const sc25519
*x
)
145 sc25519_mul(r
, x
, x
);