Skip to content

Commit a8d0442

Browse files
authored
Merge pull request #400 from libtom/pr/avoid-anonymous-union
avoid anonymous union
2 parents 1035567 + 5834223 commit a8d0442

File tree

6 files changed

+129
-129
lines changed

6 files changed

+129
-129
lines changed

src/headers/tomcrypt_prng.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ typedef struct {
7272
#ifdef LTC_SOBER128
7373
struct sober128_prng sober128;
7474
#endif
75-
};
75+
} u;
7676
short ready; /* ready flag 0-1 */
7777
LTC_MUTEX_TYPE(lock) /* lock */
7878
} prng_state;

src/prngs/chacha20.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ int chacha20_prng_start(prng_state *prng)
3838
{
3939
LTC_ARGCHK(prng != NULL);
4040
prng->ready = 0;
41-
XMEMSET(&prng->chacha.ent, 0, sizeof(prng->chacha.ent));
42-
prng->chacha.idx = 0;
41+
XMEMSET(&prng->u.chacha.ent, 0, sizeof(prng->u.chacha.ent));
42+
prng->u.chacha.idx = 0;
4343
LTC_MUTEX_INIT(&prng->lock)
4444
return CRYPT_OK;
4545
}
@@ -64,18 +64,18 @@ int chacha20_prng_add_entropy(const unsigned char *in, unsigned long inlen, prng
6464
LTC_MUTEX_LOCK(&prng->lock);
6565
if (prng->ready) {
6666
/* chacha20_prng_ready() was already called, do "rekey" operation */
67-
if ((err = chacha_keystream(&prng->chacha.s, buf, sizeof(buf))) != CRYPT_OK) goto LBL_UNLOCK;
67+
if ((err = chacha_keystream(&prng->u.chacha.s, buf, sizeof(buf))) != CRYPT_OK) goto LBL_UNLOCK;
6868
for(i = 0; i < inlen; i++) buf[i % sizeof(buf)] ^= in[i];
6969
/* key 32 bytes, 20 rounds */
70-
if ((err = chacha_setup(&prng->chacha.s, buf, 32, 20)) != CRYPT_OK) goto LBL_UNLOCK;
70+
if ((err = chacha_setup(&prng->u.chacha.s, buf, 32, 20)) != CRYPT_OK) goto LBL_UNLOCK;
7171
/* iv 8 bytes */
72-
if ((err = chacha_ivctr64(&prng->chacha.s, buf + 32, 8, 0)) != CRYPT_OK) goto LBL_UNLOCK;
72+
if ((err = chacha_ivctr64(&prng->u.chacha.s, buf + 32, 8, 0)) != CRYPT_OK) goto LBL_UNLOCK;
7373
/* clear KEY + IV */
7474
zeromem(buf, sizeof(buf));
7575
}
7676
else {
7777
/* chacha20_prng_ready() was not called yet, add entropy to ent buffer */
78-
while (inlen--) prng->chacha.ent[prng->chacha.idx++ % sizeof(prng->chacha.ent)] ^= *in++;
78+
while (inlen--) prng->u.chacha.ent[prng->u.chacha.idx++ % sizeof(prng->u.chacha.ent)] ^= *in++;
7979
}
8080
err = CRYPT_OK;
8181
LBL_UNLOCK:
@@ -97,11 +97,11 @@ int chacha20_prng_ready(prng_state *prng)
9797
LTC_MUTEX_LOCK(&prng->lock);
9898
if (prng->ready) { err = CRYPT_OK; goto LBL_UNLOCK; }
9999
/* key 32 bytes, 20 rounds */
100-
if ((err = chacha_setup(&prng->chacha.s, prng->chacha.ent, 32, 20)) != CRYPT_OK) goto LBL_UNLOCK;
100+
if ((err = chacha_setup(&prng->u.chacha.s, prng->u.chacha.ent, 32, 20)) != CRYPT_OK) goto LBL_UNLOCK;
101101
/* iv 8 bytes */
102-
if ((err = chacha_ivctr64(&prng->chacha.s, prng->chacha.ent + 32, 8, 0)) != CRYPT_OK) goto LBL_UNLOCK;
103-
XMEMSET(&prng->chacha.ent, 0, sizeof(prng->chacha.ent));
104-
prng->chacha.idx = 0;
102+
if ((err = chacha_ivctr64(&prng->u.chacha.s, prng->u.chacha.ent + 32, 8, 0)) != CRYPT_OK) goto LBL_UNLOCK;
103+
XMEMSET(&prng->u.chacha.ent, 0, sizeof(prng->u.chacha.ent));
104+
prng->u.chacha.idx = 0;
105105
prng->ready = 1;
106106
LBL_UNLOCK:
107107
LTC_MUTEX_UNLOCK(&prng->lock);
@@ -120,7 +120,7 @@ unsigned long chacha20_prng_read(unsigned char *out, unsigned long outlen, prng_
120120
if (outlen == 0 || prng == NULL || out == NULL) return 0;
121121
LTC_MUTEX_LOCK(&prng->lock);
122122
if (!prng->ready) { outlen = 0; goto LBL_UNLOCK; }
123-
if (chacha_keystream(&prng->chacha.s, out, outlen) != CRYPT_OK) outlen = 0;
123+
if (chacha_keystream(&prng->u.chacha.s, out, outlen) != CRYPT_OK) outlen = 0;
124124
LBL_UNLOCK:
125125
LTC_MUTEX_UNLOCK(&prng->lock);
126126
return outlen;
@@ -137,7 +137,7 @@ int chacha20_prng_done(prng_state *prng)
137137
LTC_ARGCHK(prng != NULL);
138138
LTC_MUTEX_LOCK(&prng->lock);
139139
prng->ready = 0;
140-
err = chacha_done(&prng->chacha.s);
140+
err = chacha_done(&prng->u.chacha.s);
141141
LTC_MUTEX_UNLOCK(&prng->lock);
142142
LTC_MUTEX_DESTROY(&prng->lock);
143143
return err;

src/prngs/fortuna.c

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ static void _fortuna_update_iv(prng_state *prng)
6464
int x;
6565
unsigned char *IV;
6666
/* update IV */
67-
IV = prng->fortuna.IV;
67+
IV = prng->u.fortuna.IV;
6868
for (x = 0; x < 16; x++) {
6969
IV[x] = (IV[x] + 1) & 255;
7070
if (IV[x] != 0) break;
@@ -108,26 +108,26 @@ static int _fortuna_reseed(prng_state *prng)
108108

109109
#ifdef LTC_FORTUNA_RESEED_RATELIMIT_TIMED
110110
ulong64 now = _fortuna_current_time();
111-
if (now == prng->fortuna.wd)
111+
if (now == prng->u.fortuna.wd)
112112
return CRYPT_OK;
113113
#else
114-
if (++prng->fortuna.wd < LTC_FORTUNA_WD)
114+
if (++prng->u.fortuna.wd < LTC_FORTUNA_WD)
115115
return CRYPT_OK;
116116
#endif
117117

118118
/* new K == LTC_SHA256(K || s) where s == LTC_SHA256(P0) || LTC_SHA256(P1) ... */
119119
sha256_init(&md);
120-
if ((err = sha256_process(&md, prng->fortuna.K, 32)) != CRYPT_OK) {
120+
if ((err = sha256_process(&md, prng->u.fortuna.K, 32)) != CRYPT_OK) {
121121
sha256_done(&md, tmp);
122122
return err;
123123
}
124124

125-
reset_cnt = prng->fortuna.reset_cnt + 1;
125+
reset_cnt = prng->u.fortuna.reset_cnt + 1;
126126

127127
for (x = 0; x < LTC_FORTUNA_POOLS; x++) {
128128
if (x == 0 || ((reset_cnt >> (x-1)) & 1) == 0) {
129129
/* terminate this hash */
130-
if ((err = sha256_done(&prng->fortuna.pool[x], tmp)) != CRYPT_OK) {
130+
if ((err = sha256_done(&prng->u.fortuna.pool[x], tmp)) != CRYPT_OK) {
131131
sha256_done(&md, tmp);
132132
return err;
133133
}
@@ -137,7 +137,7 @@ static int _fortuna_reseed(prng_state *prng)
137137
return err;
138138
}
139139
/* reset this pool */
140-
if ((err = sha256_init(&prng->fortuna.pool[x])) != CRYPT_OK) {
140+
if ((err = sha256_init(&prng->u.fortuna.pool[x])) != CRYPT_OK) {
141141
sha256_done(&md, tmp);
142142
return err;
143143
}
@@ -147,22 +147,22 @@ static int _fortuna_reseed(prng_state *prng)
147147
}
148148

149149
/* finish key */
150-
if ((err = sha256_done(&md, prng->fortuna.K)) != CRYPT_OK) {
150+
if ((err = sha256_done(&md, prng->u.fortuna.K)) != CRYPT_OK) {
151151
return err;
152152
}
153-
if ((err = rijndael_setup(prng->fortuna.K, 32, 0, &prng->fortuna.skey)) != CRYPT_OK) {
153+
if ((err = rijndael_setup(prng->u.fortuna.K, 32, 0, &prng->u.fortuna.skey)) != CRYPT_OK) {
154154
return err;
155155
}
156156
_fortuna_update_iv(prng);
157157

158158
/* reset/update internals */
159-
prng->fortuna.pool0_len = 0;
159+
prng->u.fortuna.pool0_len = 0;
160160
#ifdef LTC_FORTUNA_RESEED_RATELIMIT_TIMED
161-
prng->fortuna.wd = now;
161+
prng->u.fortuna.wd = now;
162162
#else
163-
prng->fortuna.wd = 0;
163+
prng->u.fortuna.wd = 0;
164164
#endif
165-
prng->fortuna.reset_cnt = reset_cnt;
165+
prng->u.fortuna.reset_cnt = reset_cnt;
166166

167167

168168
#ifdef LTC_CLEAN_STACK
@@ -190,7 +190,7 @@ int fortuna_update_seed(const unsigned char *in, unsigned long inlen, prng_state
190190
LTC_MUTEX_LOCK(&prng->lock);
191191
/* new K = LTC_SHA256(K || in) */
192192
sha256_init(&md);
193-
if ((err = sha256_process(&md, prng->fortuna.K, 32)) != CRYPT_OK) {
193+
if ((err = sha256_process(&md, prng->u.fortuna.K, 32)) != CRYPT_OK) {
194194
sha256_done(&md, tmp);
195195
goto LBL_UNLOCK;
196196
}
@@ -199,7 +199,7 @@ int fortuna_update_seed(const unsigned char *in, unsigned long inlen, prng_state
199199
goto LBL_UNLOCK;
200200
}
201201
/* finish key */
202-
if ((err = sha256_done(&md, prng->fortuna.K)) != CRYPT_OK) {
202+
if ((err = sha256_done(&md, prng->u.fortuna.K)) != CRYPT_OK) {
203203
goto LBL_UNLOCK;
204204
}
205205
_fortuna_update_iv(prng);
@@ -228,25 +228,25 @@ int fortuna_start(prng_state *prng)
228228

229229
/* initialize the pools */
230230
for (x = 0; x < LTC_FORTUNA_POOLS; x++) {
231-
if ((err = sha256_init(&prng->fortuna.pool[x])) != CRYPT_OK) {
231+
if ((err = sha256_init(&prng->u.fortuna.pool[x])) != CRYPT_OK) {
232232
for (y = 0; y < x; y++) {
233-
sha256_done(&prng->fortuna.pool[y], tmp);
233+
sha256_done(&prng->u.fortuna.pool[y], tmp);
234234
}
235235
return err;
236236
}
237237
}
238-
prng->fortuna.pool_idx = prng->fortuna.pool0_len = prng->fortuna.wd = 0;
239-
prng->fortuna.reset_cnt = 0;
238+
prng->u.fortuna.pool_idx = prng->u.fortuna.pool0_len = prng->u.fortuna.wd = 0;
239+
prng->u.fortuna.reset_cnt = 0;
240240

241241
/* reset bufs */
242-
zeromem(prng->fortuna.K, 32);
243-
if ((err = rijndael_setup(prng->fortuna.K, 32, 0, &prng->fortuna.skey)) != CRYPT_OK) {
242+
zeromem(prng->u.fortuna.K, 32);
243+
if ((err = rijndael_setup(prng->u.fortuna.K, 32, 0, &prng->u.fortuna.skey)) != CRYPT_OK) {
244244
for (x = 0; x < LTC_FORTUNA_POOLS; x++) {
245-
sha256_done(&prng->fortuna.pool[x], tmp);
245+
sha256_done(&prng->u.fortuna.pool[x], tmp);
246246
}
247247
return err;
248248
}
249-
zeromem(prng->fortuna.IV, 16);
249+
zeromem(prng->u.fortuna.IV, 16);
250250

251251
LTC_MUTEX_INIT(&prng->lock)
252252

@@ -267,14 +267,14 @@ static int _fortuna_add(unsigned long source, unsigned long pool, const unsigned
267267
tmp[0] = (unsigned char)source;
268268
tmp[1] = (unsigned char)inlen;
269269

270-
if ((err = sha256_process(&prng->fortuna.pool[pool], tmp, 2)) != CRYPT_OK) {
270+
if ((err = sha256_process(&prng->u.fortuna.pool[pool], tmp, 2)) != CRYPT_OK) {
271271
return err;
272272
}
273-
if ((err = sha256_process(&prng->fortuna.pool[pool], in, inlen)) != CRYPT_OK) {
273+
if ((err = sha256_process(&prng->u.fortuna.pool[pool], in, inlen)) != CRYPT_OK) {
274274
return err;
275275
}
276276
if (pool == 0) {
277-
prng->fortuna.pool0_len += inlen;
277+
prng->u.fortuna.pool0_len += inlen;
278278
}
279279
return CRYPT_OK; /* success */
280280
}
@@ -324,11 +324,11 @@ int fortuna_add_entropy(const unsigned char *in, unsigned long inlen, prng_state
324324

325325
LTC_MUTEX_LOCK(&prng->lock);
326326

327-
err = _fortuna_add(0, prng->fortuna.pool_idx, in, inlen, prng);
327+
err = _fortuna_add(0, prng->u.fortuna.pool_idx, in, inlen, prng);
328328

329329
if (err == CRYPT_OK) {
330-
++(prng->fortuna.pool_idx);
331-
prng->fortuna.pool_idx %= LTC_FORTUNA_POOLS;
330+
++(prng->u.fortuna.pool_idx);
331+
prng->u.fortuna.pool_idx %= LTC_FORTUNA_POOLS;
332332
}
333333

334334
LTC_MUTEX_UNLOCK(&prng->lock);
@@ -350,9 +350,9 @@ int fortuna_ready(prng_state *prng)
350350
/* make sure the reseed doesn't fail because
351351
* of the chosen rate limit */
352352
#ifdef LTC_FORTUNA_RESEED_RATELIMIT_TIMED
353-
prng->fortuna.wd = _fortuna_current_time() - 1;
353+
prng->u.fortuna.wd = _fortuna_current_time() - 1;
354354
#else
355-
prng->fortuna.wd = LTC_FORTUNA_WD;
355+
prng->u.fortuna.wd = LTC_FORTUNA_WD;
356356
#endif
357357
err = _fortuna_reseed(prng);
358358
prng->ready = (err == CRYPT_OK) ? 1 : 0;
@@ -382,14 +382,14 @@ unsigned long fortuna_read(unsigned char *out, unsigned long outlen, prng_state
382382
}
383383

384384
/* do we have to reseed? */
385-
if (prng->fortuna.pool0_len >= 64) {
385+
if (prng->u.fortuna.pool0_len >= 64) {
386386
if (_fortuna_reseed(prng) != CRYPT_OK) {
387387
goto LBL_UNLOCK;
388388
}
389389
}
390390

391391
/* ensure that one reseed happened before allowing to read */
392-
if (prng->fortuna.reset_cnt == 0) {
392+
if (prng->u.fortuna.reset_cnt == 0) {
393393
goto LBL_UNLOCK;
394394
}
395395

@@ -399,27 +399,27 @@ unsigned long fortuna_read(unsigned char *out, unsigned long outlen, prng_state
399399
/* handle whole blocks without the extra XMEMCPY */
400400
while (outlen >= 16) {
401401
/* encrypt the IV and store it */
402-
rijndael_ecb_encrypt(prng->fortuna.IV, out, &prng->fortuna.skey);
402+
rijndael_ecb_encrypt(prng->u.fortuna.IV, out, &prng->u.fortuna.skey);
403403
out += 16;
404404
outlen -= 16;
405405
_fortuna_update_iv(prng);
406406
}
407407

408408
/* left over bytes? */
409409
if (outlen > 0) {
410-
rijndael_ecb_encrypt(prng->fortuna.IV, tmp, &prng->fortuna.skey);
410+
rijndael_ecb_encrypt(prng->u.fortuna.IV, tmp, &prng->u.fortuna.skey);
411411
XMEMCPY(out, tmp, outlen);
412412
_fortuna_update_iv(prng);
413413
}
414414

415415
/* generate new key */
416-
rijndael_ecb_encrypt(prng->fortuna.IV, prng->fortuna.K , &prng->fortuna.skey);
416+
rijndael_ecb_encrypt(prng->u.fortuna.IV, prng->u.fortuna.K , &prng->u.fortuna.skey);
417417
_fortuna_update_iv(prng);
418418

419-
rijndael_ecb_encrypt(prng->fortuna.IV, prng->fortuna.K+16, &prng->fortuna.skey);
419+
rijndael_ecb_encrypt(prng->u.fortuna.IV, prng->u.fortuna.K+16, &prng->u.fortuna.skey);
420420
_fortuna_update_iv(prng);
421421

422-
if (rijndael_setup(prng->fortuna.K, 32, 0, &prng->fortuna.skey) != CRYPT_OK) {
422+
if (rijndael_setup(prng->u.fortuna.K, 32, 0, &prng->u.fortuna.skey) != CRYPT_OK) {
423423
tlen = 0;
424424
}
425425

@@ -448,7 +448,7 @@ int fortuna_done(prng_state *prng)
448448

449449
/* terminate all the hashes */
450450
for (x = 0; x < LTC_FORTUNA_POOLS; x++) {
451-
if ((err = sha256_done(&(prng->fortuna.pool[x]), tmp)) != CRYPT_OK) {
451+
if ((err = sha256_done(&(prng->u.fortuna.pool[x]), tmp)) != CRYPT_OK) {
452452
goto LBL_UNLOCK;
453453
}
454454
}

src/prngs/rc4.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ int rc4_start(prng_state *prng)
3939
LTC_ARGCHK(prng != NULL);
4040
prng->ready = 0;
4141
/* set entropy (key) size to zero */
42-
prng->rc4.s.x = 0;
42+
prng->u.rc4.s.x = 0;
4343
/* clear entropy (key) buffer */
44-
XMEMSET(&prng->rc4.s.buf, 0, sizeof(prng->rc4.s.buf));
44+
XMEMSET(&prng->u.rc4.s.buf, 0, sizeof(prng->u.rc4.s.buf));
4545
LTC_MUTEX_INIT(&prng->lock)
4646
return CRYPT_OK;
4747
}
@@ -66,17 +66,17 @@ int rc4_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *pr
6666
LTC_MUTEX_LOCK(&prng->lock);
6767
if (prng->ready) {
6868
/* rc4_ready() was already called, do "rekey" operation */
69-
if ((err = rc4_stream_keystream(&prng->rc4.s, buf, sizeof(buf))) != CRYPT_OK) goto LBL_UNLOCK;
69+
if ((err = rc4_stream_keystream(&prng->u.rc4.s, buf, sizeof(buf))) != CRYPT_OK) goto LBL_UNLOCK;
7070
for(i = 0; i < inlen; i++) buf[i % sizeof(buf)] ^= in[i];
7171
/* initialize RC4 */
72-
if ((err = rc4_stream_setup(&prng->rc4.s, buf, sizeof(buf))) != CRYPT_OK) goto LBL_UNLOCK;
72+
if ((err = rc4_stream_setup(&prng->u.rc4.s, buf, sizeof(buf))) != CRYPT_OK) goto LBL_UNLOCK;
7373
/* drop first 3072 bytes - https://en.wikipedia.org/wiki/RC4#Fluhrer.2C_Mantin_and_Shamir_attack */
74-
for (i = 0; i < 12; i++) rc4_stream_keystream(&prng->rc4.s, buf, sizeof(buf));
74+
for (i = 0; i < 12; i++) rc4_stream_keystream(&prng->u.rc4.s, buf, sizeof(buf));
7575
zeromem(buf, sizeof(buf));
7676
}
7777
else {
7878
/* rc4_ready() was not called yet, add entropy to the buffer */
79-
while (inlen--) prng->rc4.s.buf[prng->rc4.s.x++ % sizeof(prng->rc4.s.buf)] ^= *in++;
79+
while (inlen--) prng->u.rc4.s.buf[prng->u.rc4.s.x++ % sizeof(prng->u.rc4.s.buf)] ^= *in++;
8080
}
8181
err = CRYPT_OK;
8282
LBL_UNLOCK:
@@ -99,12 +99,12 @@ int rc4_ready(prng_state *prng)
9999

100100
LTC_MUTEX_LOCK(&prng->lock);
101101
if (prng->ready) { err = CRYPT_OK; goto LBL_UNLOCK; }
102-
XMEMCPY(buf, prng->rc4.s.buf, sizeof(buf));
102+
XMEMCPY(buf, prng->u.rc4.s.buf, sizeof(buf));
103103
/* initialize RC4 */
104-
len = MIN(prng->rc4.s.x, 256); /* TODO: we can perhaps always use all 256 bytes */
105-
if ((err = rc4_stream_setup(&prng->rc4.s, buf, len)) != CRYPT_OK) goto LBL_UNLOCK;
104+
len = MIN(prng->u.rc4.s.x, 256); /* TODO: we can perhaps always use all 256 bytes */
105+
if ((err = rc4_stream_setup(&prng->u.rc4.s, buf, len)) != CRYPT_OK) goto LBL_UNLOCK;
106106
/* drop first 3072 bytes - https://en.wikipedia.org/wiki/RC4#Fluhrer.2C_Mantin_and_Shamir_attack */
107-
for (i = 0; i < 12; i++) rc4_stream_keystream(&prng->rc4.s, buf, sizeof(buf));
107+
for (i = 0; i < 12; i++) rc4_stream_keystream(&prng->u.rc4.s, buf, sizeof(buf));
108108
prng->ready = 1;
109109
LBL_UNLOCK:
110110
LTC_MUTEX_UNLOCK(&prng->lock);
@@ -123,7 +123,7 @@ unsigned long rc4_read(unsigned char *out, unsigned long outlen, prng_state *prn
123123
if (outlen == 0 || prng == NULL || out == NULL) return 0;
124124
LTC_MUTEX_LOCK(&prng->lock);
125125
if (!prng->ready) { outlen = 0; goto LBL_UNLOCK; }
126-
if (rc4_stream_keystream(&prng->rc4.s, out, outlen) != CRYPT_OK) outlen = 0;
126+
if (rc4_stream_keystream(&prng->u.rc4.s, out, outlen) != CRYPT_OK) outlen = 0;
127127
LBL_UNLOCK:
128128
LTC_MUTEX_UNLOCK(&prng->lock);
129129
return outlen;
@@ -140,7 +140,7 @@ int rc4_done(prng_state *prng)
140140
LTC_ARGCHK(prng != NULL);
141141
LTC_MUTEX_LOCK(&prng->lock);
142142
prng->ready = 0;
143-
err = rc4_stream_done(&prng->rc4.s);
143+
err = rc4_stream_done(&prng->u.rc4.s);
144144
LTC_MUTEX_UNLOCK(&prng->lock);
145145
LTC_MUTEX_DESTROY(&prng->lock);
146146
return err;

0 commit comments

Comments
 (0)