]> AND Private Git Repository - Cipher_code.git/blob - Arduino/libraries/AES-master/examples_Rpi/test_vectors.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
correction
[Cipher_code.git] / Arduino / libraries / AES-master / examples_Rpi / test_vectors.cpp
1 #include <AES.h>
2 #include "printf.h"
3
4 AES aes ;
5
6 byte key [2*N_BLOCK] ;
7 byte plain [N_BLOCK] ;
8 byte iv [N_BLOCK] ;
9 byte cipher [N_BLOCK] ;
10 byte check [N_BLOCK] ;
11
12 void print_value (const char * str, byte * a, int bits);
13 void prekey_test_var_plaintext (int bits);
14 void prekey_test_var_key (int bits);
15 void set_bits (int bits, byte * a, int count);
16 void check_same (byte * a, byte * b, int bits);
17 void monte_carlo (int bits);
18
19 int main(int argc, char** argv)
20 {
21   printf ("AES library test vectors") ;
22
23   monte_carlo (128) ;
24
25   for (int keysize = 128 ; keysize <= 256 ; keysize += 64)
26     {
27       prekey_test_var_plaintext (keysize) ;
28       prekey_test_var_key (keysize) ;
29     }
30 }
31
32
33 void prekey_test_var_plaintext (int bits)
34 {
35   printf ("\nECB Varying Plaintext %i bits\n",bits) ;
36  
37   byte succ ;
38   set_bits (bits, key, 0) ;  // all zero key
39   succ = aes.set_key (key, bits) ;
40   if (succ != SUCCESS)
41     printf("Failure set_key\n") ;
42
43
44   for (int bitcount = 1 ; bitcount <= 128 ; bitcount++)
45     {
46       printf ("COUNT = %i \n",bitcount-1);
47       print_value ("KEY = ", key, bits) ;
48       set_bits (128, plain, bitcount) ;
49       
50       print_value ("PLAINTEXT = ", plain, 128) ;
51       
52       succ = aes.encrypt (plain, cipher) ;
53       if (succ != SUCCESS)
54         printf ("Failure encrypt\n") ;
55
56       print_value ("CIPHERTEXT = ", cipher, 128) ;
57       
58       succ = aes.decrypt (cipher, check) ;
59       if (succ != SUCCESS)
60         printf ("Failure decrypt\n") ;
61
62       //print_value ("CHECK = ", check, 128) ;
63       check_same (plain, check, 128) ;
64       printf ("\n") ;
65     }
66 }
67
68
69 void prekey_test_var_key (int bits)
70 {
71   printf ("\nECB Varying key %i bits\n",bits);
72   
73   byte succ ;
74   set_bits (128, plain, 0) ;
75
76   for (int bitcount = 1 ; bitcount <= bits ; bitcount++)
77     {
78       set_bits (bits, key, bitcount) ;  // all zero key
79       succ = aes.set_key (key, bits) ;
80       if (succ != SUCCESS)
81         printf ("Failure set_key\n") ;
82       printf ("COUNT = %i\n",bitcount-1);
83       print_value ("KEY = ", key, bits) ;
84
85       print_value ("PLAINTEXT = ", plain, 128) ;
86
87       succ = aes.encrypt (plain, cipher) ;
88       if (succ != SUCCESS)
89         printf ("Failure encrypt\n") ;
90
91       print_value ("CIPHERTEXT = ", cipher, 128) ;
92
93       succ = aes.decrypt (cipher, check) ;
94       if (succ != SUCCESS)
95         printf ("Failure decrypt\n") ;
96
97       check_same (plain, check, 128) ;
98       printf("\n");
99     }
100 }
101
102 void set_bits (int bits, byte * a, int count)
103 {
104   bits >>= 3 ;
105   byte bcount = count >> 3 ;
106   for (byte i = 0 ; i < bcount ; i++)
107     a [i] = 0xFF ;
108   if ((count & 7) != 0)
109     a [bcount++] = 0xFF & (0xFF00 >> (count & 7)) ;
110   for (byte i = bcount ; i < bits ; i++)
111     a [i] = 0x00 ;
112 }
113
114 void check_same (byte * a, byte * b, int bits)
115 {
116   bits >>= 3 ;
117   for (byte i = 0 ; i < bits ; i++)
118     if (a[i] != b[i])
119       {
120         printf ("Failure plain != check\n") ;
121         return ;
122       }
123 }
124
125 char hex[] = "0123456789abcdef" ;
126
127
128 void print_value (const char * str, byte * a, int bits)
129 {
130   printf ("%s",str) ;
131   bits >>= 3 ;
132   for (int i = 0 ; i < bits ; i++)
133     {
134       byte b = a[i] ;
135       printf("%c%c",hex[b >> 4],hex [b & 15]);
136       //Serial.print (hex [b >> 4]) ;
137       //Serial.print (hex [b & 15]) ;
138     }
139   printf("\n") ;
140 }
141
142 byte monteplain [] = 
143   { 0xb9, 0x14, 0x5a, 0x76, 0x8b, 0x7d, 0xc4, 0x89, 
144     0xa0, 0x96, 0xb5, 0x46, 0xf4, 0x3b, 0x23, 0x1f } ;
145 byte montekey []   = 
146   { 0x13, 0x9a, 0x35, 0x42, 0x2f, 0x1d, 0x61, 0xde, 
147     0x3c, 0x91, 0x78, 0x7f, 0xe0, 0x50, 0x7a, 0xfd } ;
148
149 void monte_carlo (int bits)
150 {
151   printf ("\nMonte Carlo %i bits\n",bits);
152   byte succ;
153   for (int i = 0 ; i < 16 ; i++)
154   {
155     plain [i] = monteplain [i] ;
156     key [i] = montekey [i] ;
157   }
158   for (int i = 0 ; i < 100 ; i++)
159     {
160      printf ("COUNT = %i\n",i);
161       print_value ("KEY = ", key, bits) ;
162       print_value ("PLAINTEXT = ", plain, 128) ;
163       succ = aes.set_key (key, bits) ;
164       for (int j = 0 ; j < 1000 ; j++)
165         {
166           succ = aes.encrypt (plain, cipher) ;
167           aes.copy_n_bytes (plain, cipher, 16) ;
168         }
169       print_value ("CIPHERTEXT = ", cipher, 128) ;
170       printf("\n");
171       if (bits == 128)
172         {
173           for (byte k = 0 ; k < 16 ; k++)
174             key [k] ^= cipher [k] ;
175         }
176       else if (bits == 192)
177         {
178         }
179       else
180         {
181         }
182     }
183 }