openssl 0.9.8 on linux:
BN_MONT_CTX_set hangs if the argument is 0
Demonstration program:
#include <stdio.h>
#include <stdlib.h>
#include <openssl/bn.h>
void error(int line) {
fprintf(stderr, "Error on line %d\n", line);
exit(1);
}
int main(void) {
BIGNUM m;
BN_MONT_CTX mont;
BN_CTX *ctx;
BN_init(&m);
if (!BN_zero(&m)) error(__LINE__);
ctx = BN_CTX_new();
if (!ctx) error(__LINE__);
BN_MONT_CTX_init(&mont);
fprintf(stderr, "Now on line %d\n", __LINE__);
if (!BN_MONT_CTX_set(&mont, &m, ctx)) error(__LINE__);
fprintf(stderr, "Now on line %d\n", __LINE__);
BN_MONT_CTX_free(&mont);
BN_CTX_free(ctx);
BN_free(&m);
return 0;
}
====================================
The essence of the hang can be reduced to:
where BN_mod_inverse doesn't seem to like the quick and dirty constructed
tmod:
int test_set(BN_CTX *ctx) {
int ret = 0;
BN_ULONG buf[2];
BIGNUM *R, *Ri;
BIGNUM tmod;
BN_CTX_start(ctx);
if((Ri = BN_CTX_get(ctx)) == NULL) goto err;
R= BN_new(); /* grab RR as a temp */
if (!R) goto err;
BN_zero(R);
if (!(BN_set_bit(R,BN_BITS2))) goto err; /* R */
buf[0]=0;
buf[1]=0;
tmod.d=buf;
tmod.top=1;
tmod.dmax=2;
tmod.neg=0;
fprintf(stderr, "File %s, line %d\n", __FILE__, __LINE__);
BN_mod_inverse(Ri,R,&tmod,ctx);
fprintf(stderr, "File %s, line %d\n", __FILE__, __LINE__);
err:
return 1;
}
______________________________________________________________________
OpenSSL Project http://www.openssl.org
Development Mailing List [email protected]
Automated List Manager [EMAIL PROTECTED]