#include #include BIGNUM * seed; void ab(BIGNUM * a) { printf("%s\n", BN_bn2dec(a)); } BIGNUM * BIGNUM_xor(BIGNUM * r ,BIGNUM * a ,BIGNUM * b) { if(a == NULL || b == NULL) return (BIGNUM *)-1; BIGNUM * retVal = 0; if ( 0 != r ) retVal = r; else { retVal = BN_new(); if ( 0 == retVal ) return (BIGNUM *)-1; } BN_clear(retVal); BIGNUM *at, *bt; if ( a->top < b->top ) { at = b; bt = a; } else { at = a; bt = b; } bn_expand2(retVal, at->top); int i; for (i = 0; i < bt->top; i++) retVal->d[i] = at->d[i] ^ bt->d[i]; for (;i < at->top; i++) retVal->d[i] = at->d[i]; retVal->top = at->top; bn_fix_top(retVal); return retVal; } BIGNUM * BIGNUM_and(BIGNUM * r ,BIGNUM * a ,BIGNUM * b) { if(a == NULL || b == NULL) return (BIGNUM *)-1; BIGNUM * retVal = 0; if ( 0 != r ) retVal = r; else { retVal = BN_new(); if ( 0 == retVal ) return (BIGNUM *)-1; } BN_clear(retVal); BIGNUM *at, *bt; if ( a->top < b->top ) { at = b; bt = a; } else { at = a; bt = b; } bn_expand2(retVal, at->top); int i; for (i = 0; i < bt->top; i++) retVal->d[i] = at->d[i] & bt->d[i]; for (;i < at->top; i++) retVal->d[i] = 0; retVal->top = at->top; bn_fix_top(retVal); return retVal; } BIGNUM * next(int bits) { BIGNUM * a = BN_new(); BIGNUM * b = BN_new(); BN_CTX *ctx = BN_CTX_new(); BN_CTX_start(ctx); BN_dec2bn(&a, "25214903917"); BN_dec2bn(&b, "11"); BN_mul(seed, a, seed, ctx); BN_add(seed, seed, b); BN_dec2bn(&b, "1"); BN_lshift(a, b, 48); BN_sub(a, a, b); seed = BIGNUM_and(0, seed, a); BIGNUM * res = BN_new(); res = BN_dup(seed); if(res->neg == 0) BN_rshift(res, res, (48 - bits)); else { BN_rshift(res, res, (48 - bits)); BN_dec2bn(&b, "2"); BN_lshift(b, b, ~(48 - bits)); BN_add(res, res, b); } return res; } BIGNUM * nextInt(BIGNUM * n) { BN_CTX *ctx = BN_CTX_new(); BN_CTX_start(ctx); BIGNUM * a = BN_new(); if(n->neg == 1) return NULL; /* BIGNUM * neg = BN_new(); BN_copy(neg ,n); BN_set_negative(neg,1); if(BN_cmp(BIGNUM_and(0, n, neg), n) == 0) // is power of 2. { BN_mul(n, next(31), n, ctx); BN_rshift(a, a, 31); printf("caca\n"); return a; }*/ BIGNUM * bits = BN_new(); BIGNUM * val = BN_new(); do { bits = next(31); BN_mod(val, bits, n, ctx); BIGNUM * b = BN_new(); BN_dec2bn(&a, "1"); BN_sub(b, n, a); BN_sub(a, bits, val); BN_add(a, b, a); } while(BN_is_negative(a) != 0); return val; } BIGNUM * nextLong(void) { BIGNUM * a = BN_new(); BIGNUM * b = BN_new(); a = next(32); BN_lshift(a, a, 32); b = next(32); BN_add(a, a, b); return a; } void setSeed(BIGNUM * seed_init) { BIGNUM * a = BN_new(); BIGNUM * b = BN_new(); BN_dec2bn(&a, "25214903917"); BN_dec2bn(&b, "1"); seed_init = BIGNUM_xor(0, seed_init, a); BN_lshift(a, b, 48); BN_sub(a, a, b); seed = BIGNUM_and(0, seed_init, a); } char * makes1() { seed = BN_new(); BN_dec2bn(&seed, "5406"); setSeed(seed); BIGNUM * a = BN_new(); BN_dec2bn(&a, "99999999"); a = nextInt(a); return BN_bn2dec(a); } char * makes2() { return "00014"; } static const char H18[]="0123456789ABCDEFGH"; /* FONCTION EN TRAVAUX */ char *BN_bn2h18(const BIGNUM *a) { int i,j,v,z=0; char *buf; char *p; buf=(char *)malloc(a->top*BN_BYTES*2+2); p=buf; if (a->neg) *(p++)='-'; if (BN_is_zero(a)) *(p++)='0'; for (i=a->top-1; i >=0; i--) { for (j=BN_BITS2-8; j >= 0; j-=8) { /* strip leading zeros */ v=((int)(a->d[i]>>(long)j))&0xff; if (z || (v != 0)) { *(p++)=H18[v>>4]; *(p++)=H18[v&0x11]; z=1; } } } *p='\0'; return(buf); } char * makes3(char * s1, char * s2) { BN_CTX *ctx = BN_CTX_new(); BN_CTX_start(ctx); BIGNUM * a = BN_new(); BIGNUM * b = BN_new(); BIGNUM * c = BN_new(); BN_dec2bn(&a, s1); BN_dec2bn(&b, s2); BN_dec2bn(&c, "123456789"); BN_mul(b, b, c, ctx); BN_add(a, a, b); setSeed(a); a = nextLong(); // \o/ BUG : ca tombe pas loin, mais c'est pas encore ça \o/ printf("%s\n", BN_bn2h18(a)); return BN_bn2dec(a); } int main(int argc, char *argv[]) { BN_CTX *ctx = BN_CTX_new(); BN_CTX_start(ctx); char * s1 = makes1(); char * s2 = makes2(); char * s3 = makes3(s1, s2); BIGNUM * a = BN_new(); BN_dec2bn(&a, "20"); printf("%s\n", BN_bn2h18(a)); return 0; }