]> AND Private Git Repository - Cipher_code.git/blob - IDA_new/gf-complete/src/gf_rand.c
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Merge branch 'master' of ssh://info.iut-bm.univ-fcomte.fr/Cipher_code
[Cipher_code.git] / IDA_new / gf-complete / src / gf_rand.c
1 /*
2  * GF-Complete: A Comprehensive Open Source Library for Galois Field Arithmetic
3  * James S. Plank, Ethan L. Miller, Kevin M. Greenan,
4  * Benjamin A. Arnold, John A. Burnum, Adam W. Disney, Allen C. McBride.
5  *
6  * gf_rand.c -- Random number generator.
7  */
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <stdint.h>
12 #include "gf_rand.h"
13
14 /* Lifted the "Mother of All" random number generator from http://www.agner.org/random/ */
15
16 static uint32_t MOA_X[5];
17
18 uint32_t MOA_Random_32() {
19   uint64_t sum;
20   sum = (uint64_t)2111111111UL * (uint64_t)MOA_X[3] +
21      (uint64_t)1492 * (uint64_t)(MOA_X[2]) +
22      (uint64_t)1776 * (uint64_t)(MOA_X[1]) +
23      (uint64_t)5115 * (uint64_t)(MOA_X[0]) +
24      (uint64_t)MOA_X[4];
25   MOA_X[3] = MOA_X[2];  MOA_X[2] = MOA_X[1];  MOA_X[1] = MOA_X[0];
26   MOA_X[4] = (uint32_t)(sum >> 32);
27   MOA_X[0] = (uint32_t)sum;
28   return MOA_X[0];
29 }
30
31 uint64_t MOA_Random_64() {
32   uint64_t sum;
33
34   sum = MOA_Random_32();
35   sum <<= 32;
36   sum |= MOA_Random_32();
37   return sum;
38 }
39
40 void MOA_Random_128(uint64_t *x) {
41   x[0] = MOA_Random_64();
42   x[1] = MOA_Random_64();
43   return;
44 }
45
46 uint32_t MOA_Random_W(int w, int zero_ok)
47 {
48   uint32_t b;
49
50   do {
51     b = MOA_Random_32();
52     if (w == 31) b &= 0x7fffffff;
53     if (w < 31)  b %= (1 << w);
54   } while (!zero_ok && b == 0);
55   return b;
56 }
57
58 void MOA_Seed(uint32_t seed) {
59   int i;
60   uint32_t s = seed;
61   for (i = 0; i < 5; i++) {
62     s = s * 29943829 - 1;
63     MOA_X[i] = s;
64   }
65   for (i=0; i<19; i++) MOA_Random_32();
66 }
67
68
69 void MOA_Fill_Random_Region (void *reg, int size)
70 {
71   uint32_t *r32;
72   uint8_t *r8;
73   int i;
74
75   r32 = (uint32_t *) reg;
76   r8 = (uint8_t *) reg;
77   for (i = 0; i < size/4; i++) r32[i] = MOA_Random_32();
78   for (i *= 4; i < size; i++) r8[i] = MOA_Random_W(8, 1);
79 }
80