void isaac_reseed(isaac_ctx *_ctx,const unsigned char *_seed,int _nseed){ uint32_t *m; uint32_t *r; uint32_t x[8]; int i; int j; m=_ctx->m; r=_ctx->r; if(_nseed>ISAAC_SEED_SZ_MAX)_nseed=ISAAC_SEED_SZ_MAX; for(i=0;i<_nseed>>2;i++){ r[i]^=(uint32_t)_seed[i<<2|3]<<24|(uint32_t)_seed[i<<2|2]<<16| (uint32_t)_seed[i<<2|1]<<8|_seed[i<<2]; } _nseed-=i<<2; if(_nseed>0){ uint32_t ri; ri=_seed[i<<2]; for(j=1;j<_nseed;j++)ri|=(uint32_t)_seed[i<<2|j]<<(j<<3); r[i++]^=ri; } x[0]=x[1]=x[2]=x[3]=x[4]=x[5]=x[6]=x[7]=0x9E3779B9U; for(i=0;i<4;i++)isaac_mix(x); for(i=0;i<ISAAC_SZ;i+=8){ for(j=0;j<8;j++)x[j]+=r[i+j]; isaac_mix(x); memcpy(m+i,x,sizeof(x)); } for(i=0;i<ISAAC_SZ;i+=8){ for(j=0;j<8;j++)x[j]+=m[i+j]; isaac_mix(x); memcpy(m+i,x,sizeof(x)); } isaac_update(_ctx); }
/** * Seed pseudorandom sequence. * * @param ctx ISAAC context * @param seed Seed buffer * @param n Seed length * * @return void */ void isaac_seed(isaac_ctx_t *ctx, const uint8_t *seed, size_t n) { uint32_t a, b, c, d, e, f, g, h, *m, *r; int i; memset(ctx, 0, sizeof(isaac_ctx_t)); memcpy(ctx->r, seed, n); m = ctx->m; r = ctx->r; a = b = c = d = e = f = g = h = 0x9e3779b9; for (i = 0; i < 4; i++) mix(a, b, c, d, e, f, g, h); for (i = 0; i < ISAAC_SIZE; i += 8) { a += r[i ]; b += r[i + 1]; c += r[i + 2]; d += r[i + 3]; e += r[i + 4]; f += r[i + 5]; g += r[i + 6]; h += r[i + 7]; mix(a, b, c, d, e, f, g, h); m[i ] = a; m[i + 1] = b; m[i + 2] = c; m[i + 3] = d; m[i + 4] = e; m[i + 5] = f; m[i + 6] = g; m[i + 7] = h; } for (i = 0; i < ISAAC_SIZE; i += 8) { a += m[i ]; b += m[i + 1]; c += m[i + 2]; d += m[i + 3]; e += m[i + 4]; f += m[i + 5]; g += m[i + 6]; h += m[i + 7]; mix(a, b, c, d, e, f, g, h); m[i ] = a; m[i + 1] = b; m[i + 2] = c; m[i + 3] = d; m[i + 4] = e; m[i + 5] = f; m[i + 6] = g; m[i + 7] = h; } isaac_update(ctx); }
/** * Generate 32-bit pseudorandom integer. * * @param ctx ISAAC context * * @return 32-bit pseudorandom integer */ uint32_t isaac_rand(isaac_ctx_t *ctx) { if (ctx->n == 0) isaac_update(ctx); return ctx->r[--ctx->n]; }
uint32_t isaac_next_uint32(isaac_ctx *_ctx){ if(!_ctx->n)isaac_update(_ctx); return _ctx->r[--_ctx->n]; }