Add GF reciprocal function

This commit is contained in:
Matthias Schiffer 2012-12-07 20:11:54 +01:00
parent bccf64ec1b
commit 80db8a2f72
2 changed files with 52 additions and 0 deletions

View file

@ -61,6 +61,7 @@ void ecc_25519_gf_add(ecc_int_256 *out, const ecc_int_256 *in1, const ecc_int_25
void ecc_25519_gf_sub(ecc_int_256 *out, const ecc_int_256 *in1, const ecc_int_256 *in2);
void ecc_25519_gf_reduce(ecc_int_256 *out, const ecc_int_256 *in);
void ecc_25519_gf_mult(ecc_int_256 *out, const ecc_int_256 *in1, const ecc_int_256 *in2);
void ecc_25519_gf_recip(ecc_int_256 *out, const ecc_int_256 *in);
void ecc_25519_gf_sanitize_secret(ecc_int_256 *out, const ecc_int_256 *in);

View file

@ -176,6 +176,57 @@ void ecc_25519_gf_mult(ecc_int_256 *out, const ecc_int_256 *in1, const ecc_int_2
montgomery(out->p, R, C);
}
void ecc_25519_gf_recip(ecc_int_256 *out, const ecc_int_256 *in) {
static const unsigned char C[32] = {
0x01
};
unsigned char A[32], B[32];
unsigned char R1[32], R2[32];
int use_r2 = 0;
unsigned int i, j;
for (i = 0; i < 32; i++) {
R1[i] = (i == 0);
A[i] = in->p[i];
}
for (i = 0; i < 32; i++) {
unsigned char c;
if (i == 0)
c = 0xeb; /* q[0] - 2 */
else
c = q[i];
for (j = 0; j < 8; j+=2) {
if (c & (1 << j)) {
if (use_r2)
montgomery(R1, R2, A);
else
montgomery(R2, R1, A);
use_r2 = !use_r2;
}
montgomery(B, A, A);
if (c & (2 << j)) {
if (use_r2)
montgomery(R1, R2, B);
else
montgomery(R2, R1, B);
use_r2 = !use_r2;
}
montgomery(A, B, B);
}
}
montgomery(out->p, R2, C);
}
void ecc_25519_gf_sanitize_secret(ecc_int_256 *out, const ecc_int_256 *in) {
int i;