X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fsec%2Fprng%2Fx917.c;h=4111aa228d5f5942b5e50fb47472a08d7d3da40b;hb=6a562eac017ec5d3cb98822d90702b2acf099bcc;hp=d2c84f71f1a4ae8d0a5e0b2aab0208e7852188cc;hpb=1bb0ad8f023538906d593d44a872cf4c091499c9;p=bertos.git diff --git a/bertos/sec/prng/x917.c b/bertos/sec/prng/x917.c index d2c84f71..4111aa22 100644 --- a/bertos/sec/prng/x917.c +++ b/bertos/sec/prng/x917.c @@ -33,6 +33,7 @@ * \brief ANSI X9.17 PRNG implementation * \author Giovanni Bajo * + * notest:avr */ #include "x917.h" @@ -44,30 +45,28 @@ static void x917_next(X917Context *ctx, BlockCipher *cipher, uint8_t *out) { const size_t blen = cipher_block_len(cipher); - union + struct { - uint8_t bytes[blen]; - struct - { - time_t t0; - hptime_t t1; - } data; + time_t t0; + hptime_t t1; + uint8_t padding[blen - sizeof(time_t) - sizeof(hptime_t)]; } DT; - ASSERT(sizeof(DT.bytes) >= sizeof(ticks_t) + sizeof(hptime_t)); + ASSERT(sizeof(DT) == blen); - DT.data.t0 = timer_clock(); - DT.data.t1 = timer_hw_hpread(); + memset(&DT, 0, sizeof(DT)); + DT.t0 = timer_clock(); + DT.t1 = timer_hw_hpread(); - cipher_ecb_encrypt(cipher, DT.bytes); + cipher_ecb_encrypt(cipher, &DT); - xor_block(out, DT.bytes, ctx->state, blen); + xor_block(out, (uint8_t*)&DT, ctx->state, blen); cipher_ecb_encrypt(cipher, out); - xor_block(ctx->state, DT.bytes, out, blen); + xor_block(ctx->state, (uint8_t*)&DT, out, blen); cipher_ecb_encrypt(cipher, ctx->state); - PURGE(DT.bytes); + PURGE(DT); }