blob: 74b7fb86608f460b39f0d23cd339b21840998c96 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#include "8192cd_cfg.h"
2#if defined(CONFIG_RTL_WAPI_SUPPORT)
3
4#ifdef __LINUX_2_6__
5#ifdef CONFIG_RTL8672
6#include "./romeperf.h"
7#else
8#if !defined(NOT_RTK_BSP)
9#include <net/rtl/rtl_types.h>
10#endif
11#endif
12#include <linux/jiffies.h>
13#else
14#include "../rtl865x/rtl_types.h"
15#endif
16
17#include <linux/random.h>
18#include "8192cd.h"
19#include "wapi_wai.h"
20#include "wapiCrypto.h"
21#include "8192cd_util.h"
22#include "8192cd_headers.h"
23
24/************************************************************
25generate radom number
26************************************************************/
27#if 0 //Original radom number generator
28void
29GenerateRandomData(unsigned char * data, unsigned int len)
30{
31 unsigned int i, num;
32 unsigned char *pRu8;
33#ifdef __LINUX_2_6__
34 srandom32(jiffies);
35#endif
36
37 for (i=0; i<len; i++) {
38#ifdef __LINUX_2_6__
39 num = random32();
40#else
41 get_random_bytes(&num, 4);
42#endif
43 pRu8 = (unsigned char*)&num;
44 data[i] = pRu8[0]^pRu8[1]^pRu8[2]^pRu8[3];
45 }
46}
47#else //Radom number generator for wapi test
48#define N 624
49#define M 397
50#define MATRIX_A 0x9908b0df /* constant vector a */
51#define UPPER_MASK 0x80000000 /* most significant w-r bits */
52#define LOWER_MASK 0x7fffffff /* least significant r bits */
53//#define S 4357 /*seed*/
54
55/* Tempering parameters */
56#define TEMPERING_MASK_B 0x9d2c5680
57#define TEMPERING_MASK_C 0xefc60000
58#define TEMPERING_SHIFT_U(y) (y >> 11)
59#define TEMPERING_SHIFT_S(y) (y << 7)
60#define TEMPERING_SHIFT_T(y) (y << 15)
61#define TEMPERING_SHIFT_L(y) (y >> 18)
62
63static unsigned long mt[N]; /* the array for the state vector */
64static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */
65
66/* initializing the array with a NONZERO seed */
67void WapiMTgenSeed(unsigned long seed)
68{
69 /* setting initial seeds to mt[N] using */
70 /* the generator Line 25 of Table 1 in */
71 /* [KNUTH 1981, The Art of Computer Programming */
72 /* Vol. 2 (2nd Ed.), pp102] */
73 const unsigned long int factor = 1812433253;
74 mt[0]= seed & 0xffffffff;
75 for (mti=1; mti<N; mti++)
76 {
77 mt[mti] = (factor * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
78 mt[mti] &= 0xffffffff;
79 }
80}
81
82unsigned long WapiMTgenrand(void)
83{
84 unsigned long y;
85 static unsigned long mag01[2]={0x0, MATRIX_A};
86 /* mag01[x] = x * MATRIX_A for x=0,1 */
87
88 if (mti >= N) { /* generate N words at one time */
89 int kk;
90
91 if (mti == N+1) /* if sgenrand() has not been called, */
92 WapiMTgenSeed(5489);
93
94 for (kk=0;kk<N-M;kk++) {
95 y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
96 mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1];
97 }
98 for (;kk<N-1;kk++) {
99 y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
100 mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1];
101 }
102 y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
103 mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1];
104
105 mti = 0;
106 }
107
108 y = mt[mti++];
109 y ^= TEMPERING_SHIFT_U(y);
110 y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B;
111 y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C;
112 y ^= TEMPERING_SHIFT_L(y);
113
114 return y;
115}
116
117//Note: here len should be =< 32
118void GenerateRandomData(unsigned char * data, unsigned int len)
119{
120 int num,i;
121 unsigned char tempBuf[32];
122 unsigned long y,seed;
123
124#ifdef __LINUX_2_6__
125#ifdef __LINUX_3_10__
126 prandom_seed(jiffies);
127#else
128 srandom32(jiffies);
129#endif
130#endif
131
132#ifdef __LINUX_3_10__
133 get_random_bytes(&seed, 4);
134#else
135 seed = random32();
136#endif
137
138 WapiMTgenSeed(seed);
139
140 if(len % 4 == 0)
141 num = len/4;
142 else
143 num= len/4+1;
144
145 memset(tempBuf,0,4*num);
146
147 for(i=0;i<num;i++)
148 {
149 y=WapiMTgenrand();
150 memcpy(tempBuf+4*i,&y,4);
151 }
152
153 memcpy(data,tempBuf,len);
154}
155#endif
156#endif