- if(giantsInitd) {
- return;
- }
- curveParamsInitGiants();
- giantsInitd = 1;
-}
-#endif
-
-static void pmod(giant x, int bits) {
- /* Force x to be x (mod 2^bits). */
- int j;
- int digits = bits / GIANT_BITS_PER_DIGIT;
-
- for(j = (digits-1); j >= 0; j--) {
- if(x->n[j] != 0) break;
- }
- x->sign = j+1;
-}
-
-
-feeRand feeRandAllocWithSeed(unsigned seed)
-{
- randInst *rinst = (randInst *) fmalloc(sizeof(randInst));
- int digits = RAND_GIANT_DIGITS * 4;
- unsigned j;
-
- #if GIANTS_VIA_STACK
- feeRandInitGiants();
- #endif
- rinst->SEED = newGiant(digits);
- rinst->C = newGiant(digits);
- rinst->A = newGiant(digits);
- rinst->x = newGiant(digits);
- rinst->C->sign = rinst->A->sign = rinst->SEED->sign = RAND_GIANT_DIGITS;
- for(j=0; j<RAND_GIANT_DIGITS; j++) {
- rinst->C->n[j] = (giantDigit)(seed + 0xdddddddd - j);
- rinst->A->n[j] = (giantDigit)(seed + 0xfff12223 + j);
- rinst->SEED->n[j] = (giantDigit)(seed + j);
- }
-
- /*
- * on the first feeRandBytes or feeRandNextNum, bytes 4 and 5 of
- * the result are duplicated 4.5 times (up to byte 15). Subsequent
- * data is indeed random. Thus...
- */
- #if EXTRA_NEXT_NUM
- feeRandNextNum(rinst);
- #endif // EXTRA_NEXT_NUM
- return rinst;