Example program to test AES-GCM functionality. Used for a workshop

Dependencies:   mbed

Committer:
HannesTschofenig
Date:
Thu Sep 27 06:34:22 2018 +0000
Revision:
0:796d0f61a05b
Example AES-GCM test program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HannesTschofenig 0:796d0f61a05b 1 /**
HannesTschofenig 0:796d0f61a05b 2 * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion
HannesTschofenig 0:796d0f61a05b 3 *
HannesTschofenig 0:796d0f61a05b 4 * Copyright (C) 2006-2014, Brainspark B.V.
HannesTschofenig 0:796d0f61a05b 5 *
HannesTschofenig 0:796d0f61a05b 6 * This file is part of PolarSSL (http://www.polarssl.org)
HannesTschofenig 0:796d0f61a05b 7 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
HannesTschofenig 0:796d0f61a05b 8 *
HannesTschofenig 0:796d0f61a05b 9 * All rights reserved.
HannesTschofenig 0:796d0f61a05b 10 *
HannesTschofenig 0:796d0f61a05b 11 * This program is free software; you can redistribute it and/or modify
HannesTschofenig 0:796d0f61a05b 12 * it under the terms of the GNU General Public License as published by
HannesTschofenig 0:796d0f61a05b 13 * the Free Software Foundation; either version 2 of the License, or
HannesTschofenig 0:796d0f61a05b 14 * (at your option) any later version.
HannesTschofenig 0:796d0f61a05b 15 *
HannesTschofenig 0:796d0f61a05b 16 * This program is distributed in the hope that it will be useful,
HannesTschofenig 0:796d0f61a05b 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
HannesTschofenig 0:796d0f61a05b 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
HannesTschofenig 0:796d0f61a05b 19 * GNU General Public License for more details.
HannesTschofenig 0:796d0f61a05b 20 *
HannesTschofenig 0:796d0f61a05b 21 * You should have received a copy of the GNU General Public License along
HannesTschofenig 0:796d0f61a05b 22 * with this program; if not, write to the Free Software Foundation, Inc.,
HannesTschofenig 0:796d0f61a05b 23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
HannesTschofenig 0:796d0f61a05b 24 */
HannesTschofenig 0:796d0f61a05b 25 /*
HannesTschofenig 0:796d0f61a05b 26 * The HAVEGE RNG was designed by Andre Seznec in 2002.
HannesTschofenig 0:796d0f61a05b 27 *
HannesTschofenig 0:796d0f61a05b 28 * http://www.irisa.fr/caps/projects/hipsor/publi.php
HannesTschofenig 0:796d0f61a05b 29 *
HannesTschofenig 0:796d0f61a05b 30 * Contact: seznec(at)irisa_dot_fr - orocheco(at)irisa_dot_fr
HannesTschofenig 0:796d0f61a05b 31 */
HannesTschofenig 0:796d0f61a05b 32
HannesTschofenig 0:796d0f61a05b 33 #if !defined(POLARSSL_CONFIG_FILE)
HannesTschofenig 0:796d0f61a05b 34 #include "polarssl/config.h"
HannesTschofenig 0:796d0f61a05b 35 #else
HannesTschofenig 0:796d0f61a05b 36 #include POLARSSL_CONFIG_FILE
HannesTschofenig 0:796d0f61a05b 37 #endif
HannesTschofenig 0:796d0f61a05b 38
HannesTschofenig 0:796d0f61a05b 39 #if defined(POLARSSL_HAVEGE_C)
HannesTschofenig 0:796d0f61a05b 40
HannesTschofenig 0:796d0f61a05b 41 #include "polarssl/havege.h"
HannesTschofenig 0:796d0f61a05b 42 #include "polarssl/timing.h"
HannesTschofenig 0:796d0f61a05b 43
HannesTschofenig 0:796d0f61a05b 44 #include <string.h>
HannesTschofenig 0:796d0f61a05b 45
HannesTschofenig 0:796d0f61a05b 46 /* ------------------------------------------------------------------------
HannesTschofenig 0:796d0f61a05b 47 * On average, one iteration accesses two 8-word blocks in the havege WALK
HannesTschofenig 0:796d0f61a05b 48 * table, and generates 16 words in the RES array.
HannesTschofenig 0:796d0f61a05b 49 *
HannesTschofenig 0:796d0f61a05b 50 * The data read in the WALK table is updated and permuted after each use.
HannesTschofenig 0:796d0f61a05b 51 * The result of the hardware clock counter read is used for this update.
HannesTschofenig 0:796d0f61a05b 52 *
HannesTschofenig 0:796d0f61a05b 53 * 25 conditional tests are present. The conditional tests are grouped in
HannesTschofenig 0:796d0f61a05b 54 * two nested groups of 12 conditional tests and 1 test that controls the
HannesTschofenig 0:796d0f61a05b 55 * permutation; on average, there should be 6 tests executed and 3 of them
HannesTschofenig 0:796d0f61a05b 56 * should be mispredicted.
HannesTschofenig 0:796d0f61a05b 57 * ------------------------------------------------------------------------
HannesTschofenig 0:796d0f61a05b 58 */
HannesTschofenig 0:796d0f61a05b 59
HannesTschofenig 0:796d0f61a05b 60 #define SWAP(X,Y) { int *T = X; X = Y; Y = T; }
HannesTschofenig 0:796d0f61a05b 61
HannesTschofenig 0:796d0f61a05b 62 #define TST1_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1;
HannesTschofenig 0:796d0f61a05b 63 #define TST2_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1;
HannesTschofenig 0:796d0f61a05b 64
HannesTschofenig 0:796d0f61a05b 65 #define TST1_LEAVE U1++; }
HannesTschofenig 0:796d0f61a05b 66 #define TST2_LEAVE U2++; }
HannesTschofenig 0:796d0f61a05b 67
HannesTschofenig 0:796d0f61a05b 68 #define ONE_ITERATION \
HannesTschofenig 0:796d0f61a05b 69 \
HannesTschofenig 0:796d0f61a05b 70 PTEST = PT1 >> 20; \
HannesTschofenig 0:796d0f61a05b 71 \
HannesTschofenig 0:796d0f61a05b 72 TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \
HannesTschofenig 0:796d0f61a05b 73 TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \
HannesTschofenig 0:796d0f61a05b 74 TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \
HannesTschofenig 0:796d0f61a05b 75 \
HannesTschofenig 0:796d0f61a05b 76 TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \
HannesTschofenig 0:796d0f61a05b 77 TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \
HannesTschofenig 0:796d0f61a05b 78 TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \
HannesTschofenig 0:796d0f61a05b 79 \
HannesTschofenig 0:796d0f61a05b 80 PTX = (PT1 >> 18) & 7; \
HannesTschofenig 0:796d0f61a05b 81 PT1 &= 0x1FFF; \
HannesTschofenig 0:796d0f61a05b 82 PT2 &= 0x1FFF; \
HannesTschofenig 0:796d0f61a05b 83 CLK = (int) hardclock(); \
HannesTschofenig 0:796d0f61a05b 84 \
HannesTschofenig 0:796d0f61a05b 85 i = 0; \
HannesTschofenig 0:796d0f61a05b 86 A = &WALK[PT1 ]; RES[i++] ^= *A; \
HannesTschofenig 0:796d0f61a05b 87 B = &WALK[PT2 ]; RES[i++] ^= *B; \
HannesTschofenig 0:796d0f61a05b 88 C = &WALK[PT1 ^ 1]; RES[i++] ^= *C; \
HannesTschofenig 0:796d0f61a05b 89 D = &WALK[PT2 ^ 4]; RES[i++] ^= *D; \
HannesTschofenig 0:796d0f61a05b 90 \
HannesTschofenig 0:796d0f61a05b 91 IN = (*A >> (1)) ^ (*A << (31)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 92 *A = (*B >> (2)) ^ (*B << (30)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 93 *B = IN ^ U1; \
HannesTschofenig 0:796d0f61a05b 94 *C = (*C >> (3)) ^ (*C << (29)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 95 *D = (*D >> (4)) ^ (*D << (28)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 96 \
HannesTschofenig 0:796d0f61a05b 97 A = &WALK[PT1 ^ 2]; RES[i++] ^= *A; \
HannesTschofenig 0:796d0f61a05b 98 B = &WALK[PT2 ^ 2]; RES[i++] ^= *B; \
HannesTschofenig 0:796d0f61a05b 99 C = &WALK[PT1 ^ 3]; RES[i++] ^= *C; \
HannesTschofenig 0:796d0f61a05b 100 D = &WALK[PT2 ^ 6]; RES[i++] ^= *D; \
HannesTschofenig 0:796d0f61a05b 101 \
HannesTschofenig 0:796d0f61a05b 102 if( PTEST & 1 ) SWAP( A, C ); \
HannesTschofenig 0:796d0f61a05b 103 \
HannesTschofenig 0:796d0f61a05b 104 IN = (*A >> (5)) ^ (*A << (27)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 105 *A = (*B >> (6)) ^ (*B << (26)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 106 *B = IN; CLK = (int) hardclock(); \
HannesTschofenig 0:796d0f61a05b 107 *C = (*C >> (7)) ^ (*C << (25)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 108 *D = (*D >> (8)) ^ (*D << (24)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 109 \
HannesTschofenig 0:796d0f61a05b 110 A = &WALK[PT1 ^ 4]; \
HannesTschofenig 0:796d0f61a05b 111 B = &WALK[PT2 ^ 1]; \
HannesTschofenig 0:796d0f61a05b 112 \
HannesTschofenig 0:796d0f61a05b 113 PTEST = PT2 >> 1; \
HannesTschofenig 0:796d0f61a05b 114 \
HannesTschofenig 0:796d0f61a05b 115 PT2 = (RES[(i - 8) ^ PTY] ^ WALK[PT2 ^ PTY ^ 7]); \
HannesTschofenig 0:796d0f61a05b 116 PT2 = ((PT2 & 0x1FFF) & (~8)) ^ ((PT1 ^ 8) & 0x8); \
HannesTschofenig 0:796d0f61a05b 117 PTY = (PT2 >> 10) & 7; \
HannesTschofenig 0:796d0f61a05b 118 \
HannesTschofenig 0:796d0f61a05b 119 TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \
HannesTschofenig 0:796d0f61a05b 120 TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \
HannesTschofenig 0:796d0f61a05b 121 TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \
HannesTschofenig 0:796d0f61a05b 122 \
HannesTschofenig 0:796d0f61a05b 123 TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \
HannesTschofenig 0:796d0f61a05b 124 TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \
HannesTschofenig 0:796d0f61a05b 125 TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \
HannesTschofenig 0:796d0f61a05b 126 \
HannesTschofenig 0:796d0f61a05b 127 C = &WALK[PT1 ^ 5]; \
HannesTschofenig 0:796d0f61a05b 128 D = &WALK[PT2 ^ 5]; \
HannesTschofenig 0:796d0f61a05b 129 \
HannesTschofenig 0:796d0f61a05b 130 RES[i++] ^= *A; \
HannesTschofenig 0:796d0f61a05b 131 RES[i++] ^= *B; \
HannesTschofenig 0:796d0f61a05b 132 RES[i++] ^= *C; \
HannesTschofenig 0:796d0f61a05b 133 RES[i++] ^= *D; \
HannesTschofenig 0:796d0f61a05b 134 \
HannesTschofenig 0:796d0f61a05b 135 IN = (*A >> ( 9)) ^ (*A << (23)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 136 *A = (*B >> (10)) ^ (*B << (22)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 137 *B = IN ^ U2; \
HannesTschofenig 0:796d0f61a05b 138 *C = (*C >> (11)) ^ (*C << (21)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 139 *D = (*D >> (12)) ^ (*D << (20)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 140 \
HannesTschofenig 0:796d0f61a05b 141 A = &WALK[PT1 ^ 6]; RES[i++] ^= *A; \
HannesTschofenig 0:796d0f61a05b 142 B = &WALK[PT2 ^ 3]; RES[i++] ^= *B; \
HannesTschofenig 0:796d0f61a05b 143 C = &WALK[PT1 ^ 7]; RES[i++] ^= *C; \
HannesTschofenig 0:796d0f61a05b 144 D = &WALK[PT2 ^ 7]; RES[i++] ^= *D; \
HannesTschofenig 0:796d0f61a05b 145 \
HannesTschofenig 0:796d0f61a05b 146 IN = (*A >> (13)) ^ (*A << (19)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 147 *A = (*B >> (14)) ^ (*B << (18)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 148 *B = IN; \
HannesTschofenig 0:796d0f61a05b 149 *C = (*C >> (15)) ^ (*C << (17)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 150 *D = (*D >> (16)) ^ (*D << (16)) ^ CLK; \
HannesTschofenig 0:796d0f61a05b 151 \
HannesTschofenig 0:796d0f61a05b 152 PT1 = ( RES[(i - 8) ^ PTX] ^ \
HannesTschofenig 0:796d0f61a05b 153 WALK[PT1 ^ PTX ^ 7] ) & (~1); \
HannesTschofenig 0:796d0f61a05b 154 PT1 ^= (PT2 ^ 0x10) & 0x10; \
HannesTschofenig 0:796d0f61a05b 155 \
HannesTschofenig 0:796d0f61a05b 156 for( n++, i = 0; i < 16; i++ ) \
HannesTschofenig 0:796d0f61a05b 157 hs->pool[n % COLLECT_SIZE] ^= RES[i];
HannesTschofenig 0:796d0f61a05b 158
HannesTschofenig 0:796d0f61a05b 159 /*
HannesTschofenig 0:796d0f61a05b 160 * Entropy gathering function
HannesTschofenig 0:796d0f61a05b 161 */
HannesTschofenig 0:796d0f61a05b 162 static void havege_fill( havege_state *hs )
HannesTschofenig 0:796d0f61a05b 163 {
HannesTschofenig 0:796d0f61a05b 164 int i, n = 0;
HannesTschofenig 0:796d0f61a05b 165 int U1, U2, *A, *B, *C, *D;
HannesTschofenig 0:796d0f61a05b 166 int PT1, PT2, *WALK, RES[16];
HannesTschofenig 0:796d0f61a05b 167 int PTX, PTY, CLK, PTEST, IN;
HannesTschofenig 0:796d0f61a05b 168
HannesTschofenig 0:796d0f61a05b 169 WALK = hs->WALK;
HannesTschofenig 0:796d0f61a05b 170 PT1 = hs->PT1;
HannesTschofenig 0:796d0f61a05b 171 PT2 = hs->PT2;
HannesTschofenig 0:796d0f61a05b 172
HannesTschofenig 0:796d0f61a05b 173 PTX = U1 = 0;
HannesTschofenig 0:796d0f61a05b 174 PTY = U2 = 0;
HannesTschofenig 0:796d0f61a05b 175
HannesTschofenig 0:796d0f61a05b 176 memset( RES, 0, sizeof( RES ) );
HannesTschofenig 0:796d0f61a05b 177
HannesTschofenig 0:796d0f61a05b 178 while( n < COLLECT_SIZE * 4 )
HannesTschofenig 0:796d0f61a05b 179 {
HannesTschofenig 0:796d0f61a05b 180 ONE_ITERATION
HannesTschofenig 0:796d0f61a05b 181 ONE_ITERATION
HannesTschofenig 0:796d0f61a05b 182 ONE_ITERATION
HannesTschofenig 0:796d0f61a05b 183 ONE_ITERATION
HannesTschofenig 0:796d0f61a05b 184 }
HannesTschofenig 0:796d0f61a05b 185
HannesTschofenig 0:796d0f61a05b 186 hs->PT1 = PT1;
HannesTschofenig 0:796d0f61a05b 187 hs->PT2 = PT2;
HannesTschofenig 0:796d0f61a05b 188
HannesTschofenig 0:796d0f61a05b 189 hs->offset[0] = 0;
HannesTschofenig 0:796d0f61a05b 190 hs->offset[1] = COLLECT_SIZE / 2;
HannesTschofenig 0:796d0f61a05b 191 }
HannesTschofenig 0:796d0f61a05b 192
HannesTschofenig 0:796d0f61a05b 193 /*
HannesTschofenig 0:796d0f61a05b 194 * HAVEGE initialization
HannesTschofenig 0:796d0f61a05b 195 */
HannesTschofenig 0:796d0f61a05b 196 void havege_init( havege_state *hs )
HannesTschofenig 0:796d0f61a05b 197 {
HannesTschofenig 0:796d0f61a05b 198 memset( hs, 0, sizeof( havege_state ) );
HannesTschofenig 0:796d0f61a05b 199
HannesTschofenig 0:796d0f61a05b 200 havege_fill( hs );
HannesTschofenig 0:796d0f61a05b 201 }
HannesTschofenig 0:796d0f61a05b 202
HannesTschofenig 0:796d0f61a05b 203 /*
HannesTschofenig 0:796d0f61a05b 204 * HAVEGE rand function
HannesTschofenig 0:796d0f61a05b 205 */
HannesTschofenig 0:796d0f61a05b 206 int havege_random( void *p_rng, unsigned char *buf, size_t len )
HannesTschofenig 0:796d0f61a05b 207 {
HannesTschofenig 0:796d0f61a05b 208 int val;
HannesTschofenig 0:796d0f61a05b 209 size_t use_len;
HannesTschofenig 0:796d0f61a05b 210 havege_state *hs = (havege_state *) p_rng;
HannesTschofenig 0:796d0f61a05b 211 unsigned char *p = buf;
HannesTschofenig 0:796d0f61a05b 212
HannesTschofenig 0:796d0f61a05b 213 while( len > 0 )
HannesTschofenig 0:796d0f61a05b 214 {
HannesTschofenig 0:796d0f61a05b 215 use_len = len;
HannesTschofenig 0:796d0f61a05b 216 if( use_len > sizeof(int) )
HannesTschofenig 0:796d0f61a05b 217 use_len = sizeof(int);
HannesTschofenig 0:796d0f61a05b 218
HannesTschofenig 0:796d0f61a05b 219 if( hs->offset[1] >= COLLECT_SIZE )
HannesTschofenig 0:796d0f61a05b 220 havege_fill( hs );
HannesTschofenig 0:796d0f61a05b 221
HannesTschofenig 0:796d0f61a05b 222 val = hs->pool[hs->offset[0]++];
HannesTschofenig 0:796d0f61a05b 223 val ^= hs->pool[hs->offset[1]++];
HannesTschofenig 0:796d0f61a05b 224
HannesTschofenig 0:796d0f61a05b 225 memcpy( p, &val, use_len );
HannesTschofenig 0:796d0f61a05b 226
HannesTschofenig 0:796d0f61a05b 227 len -= use_len;
HannesTschofenig 0:796d0f61a05b 228 p += use_len;
HannesTschofenig 0:796d0f61a05b 229 }
HannesTschofenig 0:796d0f61a05b 230
HannesTschofenig 0:796d0f61a05b 231 return( 0 );
HannesTschofenig 0:796d0f61a05b 232 }
HannesTschofenig 0:796d0f61a05b 233
HannesTschofenig 0:796d0f61a05b 234 #endif /* POLARSSL_HAVEGE_C */
HannesTschofenig 0:796d0f61a05b 235
HannesTschofenig 0:796d0f61a05b 236