Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
Archivo: isaac.c Proyecto: lokhman/dtsp
/**
 * 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);
}
Ejemplo n.º 3
0
Archivo: isaac.c Proyecto: lokhman/dtsp
/**
 * 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];
}
Ejemplo n.º 4
0
uint32_t isaac_next_uint32(isaac_ctx *_ctx){
  if(!_ctx->n)isaac_update(_ctx);
  return _ctx->r[--_ctx->n];
}