提交 c4e7870a 编写于 作者: B Bodo Möller

Change array representation of binary polynomials to make GF2m part of

the BN library more generally useful.

Submitted by: Douglas Stebila
上级 4584ecce
...@@ -4,6 +4,14 @@ ...@@ -4,6 +4,14 @@
Changes between 0.9.8b and 0.9.9 [xx XXX xxxx] Changes between 0.9.8b and 0.9.9 [xx XXX xxxx]
*) Change the array representation of binary polynomials: the list
of degrees of non-zero coefficients is now terminated with -1.
Previously it was terminated with 0, which was also part of the
value; thus, the array representation was not applicable to
polynomials where t^0 has coefficient zero. This change makes
the array representation useful in a more general context.
[Douglas Stebila]
*) Various modifications and fixes to SSL/TLS cipher string *) Various modifications and fixes to SSL/TLS cipher string
handling. For ECC, the code now distinguishes between fixed ECDH handling. For ECC, the code now distinguishes between fixed ECDH
with RSA certificates on the one hand and with ECDSA certificates with RSA certificates on the one hand and with ECDSA certificates
......
...@@ -558,24 +558,24 @@ int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, ...@@ -558,24 +558,24 @@ int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
* t^p[0] + t^p[1] + ... + t^p[k] * t^p[0] + t^p[1] + ... + t^p[k]
* where m = p[0] > p[1] > ... > p[k] = 0. * where m = p[0] > p[1] > ... > p[k] = 0.
*/ */
int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[]); int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]);
/* r = a mod p */ /* r = a mod p */
int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
const unsigned int p[], BN_CTX *ctx); /* r = (a * b) mod p */ const int p[], BN_CTX *ctx); /* r = (a * b) mod p */
int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[], int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[],
BN_CTX *ctx); /* r = (a * a) mod p */ BN_CTX *ctx); /* r = (a * a) mod p */
int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const unsigned int p[], int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[],
BN_CTX *ctx); /* r = (1 / b) mod p */ BN_CTX *ctx); /* r = (1 / b) mod p */
int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
const unsigned int p[], BN_CTX *ctx); /* r = (a / b) mod p */ const int p[], BN_CTX *ctx); /* r = (a / b) mod p */
int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
const unsigned int p[], BN_CTX *ctx); /* r = (a ^ b) mod p */ const int p[], BN_CTX *ctx); /* r = (a ^ b) mod p */
int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a,
const unsigned int p[], BN_CTX *ctx); /* r = sqrt(a) mod p */ const int p[], BN_CTX *ctx); /* r = sqrt(a) mod p */
int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a,
const unsigned int p[], BN_CTX *ctx); /* r^2 + r = a mod p */ const int p[], BN_CTX *ctx); /* r^2 + r = a mod p */
int BN_GF2m_poly2arr(const BIGNUM *a, unsigned int p[], int max); int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max);
int BN_GF2m_arr2poly(const unsigned int p[], BIGNUM *a); int BN_GF2m_arr2poly(const int p[], BIGNUM *a);
/* faster mod functions for the 'NIST primes' /* faster mod functions for the 'NIST primes'
* 0 <= a < p^2 */ * 0 <= a < p^2 */
......
...@@ -258,7 +258,7 @@ int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) ...@@ -258,7 +258,7 @@ int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
/* Performs modular reduction of a and store result in r. r could be a. */ /* Performs modular reduction of a and store result in r. r could be a. */
int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[]) int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[])
{ {
int j, k; int j, k;
int n, dN, d0, d1; int n, dN, d0, d1;
...@@ -355,11 +355,11 @@ int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[]) ...@@ -355,11 +355,11 @@ int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[])
int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p) int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p)
{ {
int ret = 0; int ret = 0;
const int max = BN_num_bits(p); const int max = BN_num_bits(p) + 1;
unsigned int *arr=NULL; int *arr=NULL;
bn_check_top(a); bn_check_top(a);
bn_check_top(p); bn_check_top(p);
if ((arr = (unsigned int *)OPENSSL_malloc(sizeof(unsigned int) * max)) == NULL) goto err; if ((arr = (int *)OPENSSL_malloc(sizeof(int) * max)) == NULL) goto err;
ret = BN_GF2m_poly2arr(p, arr, max); ret = BN_GF2m_poly2arr(p, arr, max);
if (!ret || ret > max) if (!ret || ret > max)
{ {
...@@ -377,7 +377,7 @@ err: ...@@ -377,7 +377,7 @@ err:
/* Compute the product of two polynomials a and b, reduce modulo p, and store /* Compute the product of two polynomials a and b, reduce modulo p, and store
* the result in r. r could be a or b; a could be b. * the result in r. r could be a or b; a could be b.
*/ */
int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const unsigned int p[], BN_CTX *ctx) int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const int p[], BN_CTX *ctx)
{ {
int zlen, i, j, k, ret = 0; int zlen, i, j, k, ret = 0;
BIGNUM *s; BIGNUM *s;
...@@ -433,12 +433,12 @@ err: ...@@ -433,12 +433,12 @@ err:
int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx) int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx)
{ {
int ret = 0; int ret = 0;
const int max = BN_num_bits(p); const int max = BN_num_bits(p) + 1;
unsigned int *arr=NULL; int *arr=NULL;
bn_check_top(a); bn_check_top(a);
bn_check_top(b); bn_check_top(b);
bn_check_top(p); bn_check_top(p);
if ((arr = (unsigned int *)OPENSSL_malloc(sizeof(unsigned int) * max)) == NULL) goto err; if ((arr = (int *)OPENSSL_malloc(sizeof(int) * max)) == NULL) goto err;
ret = BN_GF2m_poly2arr(p, arr, max); ret = BN_GF2m_poly2arr(p, arr, max);
if (!ret || ret > max) if (!ret || ret > max)
{ {
...@@ -454,7 +454,7 @@ err: ...@@ -454,7 +454,7 @@ err:
/* Square a, reduce the result mod p, and store it in a. r could be a. */ /* Square a, reduce the result mod p, and store it in a. r could be a. */
int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[], BN_CTX *ctx) int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], BN_CTX *ctx)
{ {
int i, ret = 0; int i, ret = 0;
BIGNUM *s; BIGNUM *s;
...@@ -489,12 +489,12 @@ err: ...@@ -489,12 +489,12 @@ err:
int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
{ {
int ret = 0; int ret = 0;
const int max = BN_num_bits(p); const int max = BN_num_bits(p) + 1;
unsigned int *arr=NULL; int *arr=NULL;
bn_check_top(a); bn_check_top(a);
bn_check_top(p); bn_check_top(p);
if ((arr = (unsigned int *)OPENSSL_malloc(sizeof(unsigned int) * max)) == NULL) goto err; if ((arr = (int *)OPENSSL_malloc(sizeof(int) * max)) == NULL) goto err;
ret = BN_GF2m_poly2arr(p, arr, max); ret = BN_GF2m_poly2arr(p, arr, max);
if (!ret || ret > max) if (!ret || ret > max)
{ {
...@@ -576,7 +576,7 @@ err: ...@@ -576,7 +576,7 @@ err:
* function is only provided for convenience; for best performance, use the * function is only provided for convenience; for best performance, use the
* BN_GF2m_mod_inv function. * BN_GF2m_mod_inv function.
*/ */
int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *xx, const unsigned int p[], BN_CTX *ctx) int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *xx, const int p[], BN_CTX *ctx)
{ {
BIGNUM *field; BIGNUM *field;
int ret = 0; int ret = 0;
...@@ -702,7 +702,7 @@ err: ...@@ -702,7 +702,7 @@ err:
* function is only provided for convenience; for best performance, use the * function is only provided for convenience; for best performance, use the
* BN_GF2m_mod_div function. * BN_GF2m_mod_div function.
*/ */
int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *yy, const BIGNUM *xx, const unsigned int p[], BN_CTX *ctx) int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *yy, const BIGNUM *xx, const int p[], BN_CTX *ctx)
{ {
BIGNUM *field; BIGNUM *field;
int ret = 0; int ret = 0;
...@@ -727,7 +727,7 @@ err: ...@@ -727,7 +727,7 @@ err:
* the result in r. r could be a. * the result in r. r could be a.
* Uses simple square-and-multiply algorithm A.5.1 from IEEE P1363. * Uses simple square-and-multiply algorithm A.5.1 from IEEE P1363.
*/ */
int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const unsigned int p[], BN_CTX *ctx) int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const int p[], BN_CTX *ctx)
{ {
int ret = 0, i, n; int ret = 0, i, n;
BIGNUM *u; BIGNUM *u;
...@@ -773,12 +773,12 @@ err: ...@@ -773,12 +773,12 @@ err:
int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx) int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx)
{ {
int ret = 0; int ret = 0;
const int max = BN_num_bits(p); const int max = BN_num_bits(p) + 1;
unsigned int *arr=NULL; int *arr=NULL;
bn_check_top(a); bn_check_top(a);
bn_check_top(b); bn_check_top(b);
bn_check_top(p); bn_check_top(p);
if ((arr = (unsigned int *)OPENSSL_malloc(sizeof(unsigned int) * max)) == NULL) goto err; if ((arr = (int *)OPENSSL_malloc(sizeof(int) * max)) == NULL) goto err;
ret = BN_GF2m_poly2arr(p, arr, max); ret = BN_GF2m_poly2arr(p, arr, max);
if (!ret || ret > max) if (!ret || ret > max)
{ {
...@@ -796,7 +796,7 @@ err: ...@@ -796,7 +796,7 @@ err:
* the result in r. r could be a. * the result in r. r could be a.
* Uses exponentiation as in algorithm A.4.1 from IEEE P1363. * Uses exponentiation as in algorithm A.4.1 from IEEE P1363.
*/ */
int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[], BN_CTX *ctx) int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, const int p[], BN_CTX *ctx)
{ {
int ret = 0; int ret = 0;
BIGNUM *u; BIGNUM *u;
...@@ -832,11 +832,11 @@ err: ...@@ -832,11 +832,11 @@ err:
int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
{ {
int ret = 0; int ret = 0;
const int max = BN_num_bits(p); const int max = BN_num_bits(p) + 1;
unsigned int *arr=NULL; int *arr=NULL;
bn_check_top(a); bn_check_top(a);
bn_check_top(p); bn_check_top(p);
if ((arr = (unsigned int *)OPENSSL_malloc(sizeof(unsigned int) * max)) == NULL) goto err; if ((arr = (int *)OPENSSL_malloc(sizeof(int) * max)) == NULL) goto err;
ret = BN_GF2m_poly2arr(p, arr, max); ret = BN_GF2m_poly2arr(p, arr, max);
if (!ret || ret > max) if (!ret || ret > max)
{ {
...@@ -853,7 +853,7 @@ err: ...@@ -853,7 +853,7 @@ err:
/* Find r such that r^2 + r = a mod p. r could be a. If no r exists returns 0. /* Find r such that r^2 + r = a mod p. r could be a. If no r exists returns 0.
* Uses algorithms A.4.7 and A.4.6 from IEEE P1363. * Uses algorithms A.4.7 and A.4.6 from IEEE P1363.
*/ */
int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a_, const unsigned int p[], BN_CTX *ctx) int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a_, const int p[], BN_CTX *ctx)
{ {
int ret = 0, count = 0; int ret = 0, count = 0;
unsigned int j; unsigned int j;
...@@ -951,11 +951,11 @@ err: ...@@ -951,11 +951,11 @@ err:
int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
{ {
int ret = 0; int ret = 0;
const int max = BN_num_bits(p); const int max = BN_num_bits(p) + 1;
unsigned int *arr=NULL; int *arr=NULL;
bn_check_top(a); bn_check_top(a);
bn_check_top(p); bn_check_top(p);
if ((arr = (unsigned int *)OPENSSL_malloc(sizeof(unsigned int) * if ((arr = (int *)OPENSSL_malloc(sizeof(int) *
max)) == NULL) goto err; max)) == NULL) goto err;
ret = BN_GF2m_poly2arr(p, arr, max); ret = BN_GF2m_poly2arr(p, arr, max);
if (!ret || ret > max) if (!ret || ret > max)
...@@ -971,20 +971,17 @@ err: ...@@ -971,20 +971,17 @@ err:
} }
/* Convert the bit-string representation of a polynomial /* Convert the bit-string representation of a polynomial
* ( \sum_{i=0}^n a_i * x^i , where a_0 is *not* zero) into an array * ( \sum_{i=0}^n a_i * x^i) into an array of integers corresponding
* of integers corresponding to the bits with non-zero coefficient. * to the bits with non-zero coefficient. Array is terminated with -1.
* Up to max elements of the array will be filled. Return value is total * Up to max elements of the array will be filled. Return value is total
* number of coefficients that would be extracted if array was large enough. * number of array elements that would be filled if array was large enough.
*/ */
int BN_GF2m_poly2arr(const BIGNUM *a, unsigned int p[], int max) int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max)
{ {
int i, j, k = 0; int i, j, k = 0;
BN_ULONG mask; BN_ULONG mask;
if (BN_is_zero(a) || !BN_is_bit_set(a, 0)) if (BN_is_zero(a))
/* a_0 == 0 => return error (the unsigned int array
* must be terminated by 0)
*/
return 0; return 0;
for (i = a->top - 1; i >= 0; i--) for (i = a->top - 1; i >= 0; i--)
...@@ -1004,24 +1001,28 @@ int BN_GF2m_poly2arr(const BIGNUM *a, unsigned int p[], int max) ...@@ -1004,24 +1001,28 @@ int BN_GF2m_poly2arr(const BIGNUM *a, unsigned int p[], int max)
} }
} }
if (k < max) {
p[k] = -1;
k++;
}
return k; return k;
} }
/* Convert the coefficient array representation of a polynomial to a /* Convert the coefficient array representation of a polynomial to a
* bit-string. The array must be terminated by 0. * bit-string. The array must be terminated by -1.
*/ */
int BN_GF2m_arr2poly(const unsigned int p[], BIGNUM *a) int BN_GF2m_arr2poly(const int p[], BIGNUM *a)
{ {
int i; int i;
bn_check_top(a); bn_check_top(a);
BN_zero(a); BN_zero(a);
for (i = 0; p[i] != 0; i++) for (i = 0; p[i] != -1; i++)
{ {
if (BN_set_bit(a, p[i]) == 0) if (BN_set_bit(a, p[i]) == 0)
return 0; return 0;
} }
BN_set_bit(a, 0);
bn_check_top(a); bn_check_top(a);
return 1; return 1;
......
...@@ -1118,8 +1118,8 @@ int test_gf2m_mod(BIO *bp) ...@@ -1118,8 +1118,8 @@ int test_gf2m_mod(BIO *bp)
{ {
BIGNUM *a,*b[2],*c,*d,*e; BIGNUM *a,*b[2],*c,*d,*e;
int i, j, ret = 0; int i, j, ret = 0;
unsigned int p0[] = {163,7,6,3,0}; int p0[] = {163,7,6,3,0,-1};
unsigned int p1[] = {193,15,0}; int p1[] = {193,15,0,-1};
a=BN_new(); a=BN_new();
b[0]=BN_new(); b[0]=BN_new();
...@@ -1176,8 +1176,8 @@ int test_gf2m_mod_mul(BIO *bp,BN_CTX *ctx) ...@@ -1176,8 +1176,8 @@ int test_gf2m_mod_mul(BIO *bp,BN_CTX *ctx)
{ {
BIGNUM *a,*b[2],*c,*d,*e,*f,*g,*h; BIGNUM *a,*b[2],*c,*d,*e,*f,*g,*h;
int i, j, ret = 0; int i, j, ret = 0;
unsigned int p0[] = {163,7,6,3,0}; int p0[] = {163,7,6,3,0,-1};
unsigned int p1[] = {193,15,0}; int p1[] = {193,15,0,-1};
a=BN_new(); a=BN_new();
b[0]=BN_new(); b[0]=BN_new();
...@@ -1247,8 +1247,8 @@ int test_gf2m_mod_sqr(BIO *bp,BN_CTX *ctx) ...@@ -1247,8 +1247,8 @@ int test_gf2m_mod_sqr(BIO *bp,BN_CTX *ctx)
{ {
BIGNUM *a,*b[2],*c,*d; BIGNUM *a,*b[2],*c,*d;
int i, j, ret = 0; int i, j, ret = 0;
unsigned int p0[] = {163,7,6,3,0}; int p0[] = {163,7,6,3,0,-1};
unsigned int p1[] = {193,15,0}; int p1[] = {193,15,0,-1};
a=BN_new(); a=BN_new();
b[0]=BN_new(); b[0]=BN_new();
...@@ -1306,8 +1306,8 @@ int test_gf2m_mod_inv(BIO *bp,BN_CTX *ctx) ...@@ -1306,8 +1306,8 @@ int test_gf2m_mod_inv(BIO *bp,BN_CTX *ctx)
{ {
BIGNUM *a,*b[2],*c,*d; BIGNUM *a,*b[2],*c,*d;
int i, j, ret = 0; int i, j, ret = 0;
unsigned int p0[] = {163,7,6,3,0}; int p0[] = {163,7,6,3,0,-1};
unsigned int p1[] = {193,15,0}; int p1[] = {193,15,0,-1};
a=BN_new(); a=BN_new();
b[0]=BN_new(); b[0]=BN_new();
...@@ -1361,8 +1361,8 @@ int test_gf2m_mod_div(BIO *bp,BN_CTX *ctx) ...@@ -1361,8 +1361,8 @@ int test_gf2m_mod_div(BIO *bp,BN_CTX *ctx)
{ {
BIGNUM *a,*b[2],*c,*d,*e,*f; BIGNUM *a,*b[2],*c,*d,*e,*f;
int i, j, ret = 0; int i, j, ret = 0;
unsigned int p0[] = {163,7,6,3,0}; int p0[] = {163,7,6,3,0,-1};
unsigned int p1[] = {193,15,0}; int p1[] = {193,15,0,-1};
a=BN_new(); a=BN_new();
b[0]=BN_new(); b[0]=BN_new();
...@@ -1424,8 +1424,8 @@ int test_gf2m_mod_exp(BIO *bp,BN_CTX *ctx) ...@@ -1424,8 +1424,8 @@ int test_gf2m_mod_exp(BIO *bp,BN_CTX *ctx)
{ {
BIGNUM *a,*b[2],*c,*d,*e,*f; BIGNUM *a,*b[2],*c,*d,*e,*f;
int i, j, ret = 0; int i, j, ret = 0;
unsigned int p0[] = {163,7,6,3,0}; int p0[] = {163,7,6,3,0,-1};
unsigned int p1[] = {193,15,0}; int p1[] = {193,15,0,-1};
a=BN_new(); a=BN_new();
b[0]=BN_new(); b[0]=BN_new();
...@@ -1495,8 +1495,8 @@ int test_gf2m_mod_sqrt(BIO *bp,BN_CTX *ctx) ...@@ -1495,8 +1495,8 @@ int test_gf2m_mod_sqrt(BIO *bp,BN_CTX *ctx)
{ {
BIGNUM *a,*b[2],*c,*d,*e,*f; BIGNUM *a,*b[2],*c,*d,*e,*f;
int i, j, ret = 0; int i, j, ret = 0;
unsigned int p0[] = {163,7,6,3,0}; int p0[] = {163,7,6,3,0,-1};
unsigned int p1[] = {193,15,0}; int p1[] = {193,15,0,-1};
a=BN_new(); a=BN_new();
b[0]=BN_new(); b[0]=BN_new();
...@@ -1554,8 +1554,8 @@ int test_gf2m_mod_solve_quad(BIO *bp,BN_CTX *ctx) ...@@ -1554,8 +1554,8 @@ int test_gf2m_mod_solve_quad(BIO *bp,BN_CTX *ctx)
{ {
BIGNUM *a,*b[2],*c,*d,*e; BIGNUM *a,*b[2],*c,*d,*e;
int i, j, s = 0, t, ret = 0; int i, j, s = 0, t, ret = 0;
unsigned int p0[] = {163,7,6,3,0}; int p0[] = {163,7,6,3,0,-1};
unsigned int p1[] = {193,15,0}; int p1[] = {193,15,0,-1};
a=BN_new(); a=BN_new();
b[0]=BN_new(); b[0]=BN_new();
......
...@@ -157,6 +157,7 @@ void ec_GF2m_simple_group_clear_finish(EC_GROUP *group) ...@@ -157,6 +157,7 @@ void ec_GF2m_simple_group_clear_finish(EC_GROUP *group)
group->poly[2] = 0; group->poly[2] = 0;
group->poly[3] = 0; group->poly[3] = 0;
group->poly[4] = 0; group->poly[4] = 0;
group->poly[5] = -1;
} }
...@@ -174,6 +175,7 @@ int ec_GF2m_simple_group_copy(EC_GROUP *dest, const EC_GROUP *src) ...@@ -174,6 +175,7 @@ int ec_GF2m_simple_group_copy(EC_GROUP *dest, const EC_GROUP *src)
dest->poly[2] = src->poly[2]; dest->poly[2] = src->poly[2];
dest->poly[3] = src->poly[3]; dest->poly[3] = src->poly[3];
dest->poly[4] = src->poly[4]; dest->poly[4] = src->poly[4];
dest->poly[5] = src->poly[5];
bn_wexpand(&dest->a, (int)(dest->poly[0] + BN_BITS2 - 1) / BN_BITS2); bn_wexpand(&dest->a, (int)(dest->poly[0] + BN_BITS2 - 1) / BN_BITS2);
bn_wexpand(&dest->b, (int)(dest->poly[0] + BN_BITS2 - 1) / BN_BITS2); bn_wexpand(&dest->b, (int)(dest->poly[0] + BN_BITS2 - 1) / BN_BITS2);
for (i = dest->a.top; i < dest->a.dmax; i++) dest->a.d[i] = 0; for (i = dest->a.top; i < dest->a.dmax; i++) dest->a.d[i] = 0;
...@@ -190,7 +192,7 @@ int ec_GF2m_simple_group_set_curve(EC_GROUP *group, ...@@ -190,7 +192,7 @@ int ec_GF2m_simple_group_set_curve(EC_GROUP *group,
/* group->field */ /* group->field */
if (!BN_copy(&group->field, p)) goto err; if (!BN_copy(&group->field, p)) goto err;
i = BN_GF2m_poly2arr(&group->field, group->poly, 5); i = BN_GF2m_poly2arr(&group->field, group->poly, 6) - 1;
if ((i != 5) && (i != 3)) if ((i != 5) && (i != 3))
{ {
ECerr(EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE, EC_R_UNSUPPORTED_FIELD); ECerr(EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE, EC_R_UNSUPPORTED_FIELD);
......
...@@ -205,11 +205,14 @@ struct ec_group_st { ...@@ -205,11 +205,14 @@ struct ec_group_st {
* irreducible polynomial defining the field. * irreducible polynomial defining the field.
*/ */
unsigned int poly[5]; /* Field specification for curves over GF(2^m). int poly[6]; /* Field specification for curves over GF(2^m).
* The irreducible f(t) is then of the form: * The irreducible f(t) is then of the form:
* t^poly[0] + t^poly[1] + ... + t^poly[k] * t^poly[0] + t^poly[1] + ... + t^poly[k]
* where m = poly[0] > poly[1] > ... > poly[k] = 0. * where m = poly[0] > poly[1] > ... > poly[k] = 0.
*/ * The array is terminated with poly[k+1]=-1.
* All elliptic curve irreducibles have at most 5
* non-zero terms.
*/
BIGNUM a, b; /* Curve coefficients. BIGNUM a, b; /* Curve coefficients.
* (Here the assumption is that BIGNUMs can be used * (Here the assumption is that BIGNUMs can be used
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册