]> git.cryptolib.org Git - avr-crypto-lib.git/blob - nessie_bc_test.c
b6256d4e31e6e77960f3477d8015bb51285d67a2
[avr-crypto-lib.git] / nessie_bc_test.c
1 /**
2  * 
3  * author: Daniel Otte
4  * email:  daniel.otte@rub.de
5  * license: GPLv3
6  * 
7  * a suit for running the nessie-tests for blockciphers
8  * 
9  * */
10 #include <stdint.h>
11 #include <string.h>
12 #include "nessie_bc_test.h"
13 #include "nessie_common.h"
14 #include "uart.h"
15
16 nessie_bc_ctx_t nessie_bc_ctx;
17
18 void nessie_bc_enc(uint8_t* key, uint8_t* pt){
19         uint8_t ctx[nessie_bc_ctx.ctx_size_B];
20         uint8_t buffer[nessie_bc_ctx.blocksize_B];
21         uint16_t i;
22         
23         /* single test */
24         nessie_print_item("key", key, (nessie_bc_ctx.keysize_b+7)/8);
25         nessie_bc_ctx.cipher_genctx(key, nessie_bc_ctx.keysize_b, ctx);
26         memcpy(buffer, pt, nessie_bc_ctx.blocksize_B);
27         nessie_print_item("plain", buffer, nessie_bc_ctx.blocksize_B);
28         nessie_bc_ctx.cipher_enc(buffer, ctx);
29         nessie_print_item("cipher", buffer, nessie_bc_ctx.blocksize_B);
30         nessie_bc_ctx.cipher_dec(buffer, ctx);
31         nessie_print_item("decrypted", buffer, nessie_bc_ctx.blocksize_B);
32         
33         /* 100 times test */
34         memcpy(buffer, pt, nessie_bc_ctx.blocksize_B);
35         for(i=0; i<100; ++i){
36                 nessie_bc_ctx.cipher_enc(buffer, ctx);
37         }
38         nessie_print_item("Iterated 100 times", buffer, nessie_bc_ctx.blocksize_B);
39 #ifndef NESSIE_NO1KTEST 
40         /* 1000 times test, we use the 100 precedig steps to fasten things a bit */
41         for(; i<1000; ++i){
42                 nessie_bc_ctx.cipher_enc(buffer, ctx);
43         }
44         nessie_print_item("Iterated 1000 times", buffer, nessie_bc_ctx.blocksize_B);
45 #endif
46 }
47
48 void nessie_bc_dec(uint8_t* key, uint8_t* ct){
49         uint8_t ctx[nessie_bc_ctx.ctx_size_B];
50         uint8_t buffer[nessie_bc_ctx.blocksize_B];
51         
52         /* single test */
53         nessie_print_item("key", key, (nessie_bc_ctx.keysize_b+7)/8);
54         nessie_bc_ctx.cipher_genctx(key, nessie_bc_ctx.keysize_b, ctx);
55         memcpy(buffer, ct, nessie_bc_ctx.blocksize_B);
56         nessie_print_item("cipher", buffer, nessie_bc_ctx.blocksize_B);
57         nessie_bc_ctx.cipher_dec(buffer, ctx);
58         nessie_print_item("plain", buffer, nessie_bc_ctx.blocksize_B);
59         nessie_bc_ctx.cipher_enc(buffer, ctx);
60         nessie_print_item("encrypted", buffer, nessie_bc_ctx.blocksize_B);
61         
62 }
63
64 void nessie_bc_run(void){
65         uint16_t i;
66         uint8_t set;
67         uint8_t key[(nessie_bc_ctx.keysize_b+7)/8];
68         uint8_t buffer[nessie_bc_ctx.blocksize_B];
69         
70         nessie_print_header(nessie_bc_ctx.name, nessie_bc_ctx.keysize_b,
71                             nessie_bc_ctx.blocksize_B*8, 0, 0, 0);
72         /* test set 1 */
73         set=1;
74         nessie_print_setheader(set);
75         for(i=0; i<nessie_bc_ctx.keysize_b; ++i){
76                 nessie_print_set_vector(set, i);
77                 memset(key, 0, (nessie_bc_ctx.keysize_b+7)/8);
78                 key[i/8] |= 0x80>>(i%8);
79                 memset(buffer, 0, nessie_bc_ctx.blocksize_B);
80                 nessie_bc_enc(key, buffer);
81         }
82         /* test set 2 */
83         set=2;
84         nessie_print_setheader(set);
85         for(i=0; i<nessie_bc_ctx.blocksize_B*8; ++i){
86                 nessie_print_set_vector(set, i);
87                 memset(key, 0, (nessie_bc_ctx.keysize_b+7)/8);
88                 memset(buffer, 0, nessie_bc_ctx.blocksize_B);
89                 buffer[i/8] |= 0x80>>(i%8);
90                 nessie_bc_enc(key, buffer);
91         }
92         /* test set 3 */
93         set=3;
94         nessie_print_setheader(set);
95         for(i=0; i<256; ++i){
96                 nessie_print_set_vector(set, i);
97                 memset(key, i, (nessie_bc_ctx.keysize_b+7)/8);
98                 memset(buffer, i, nessie_bc_ctx.blocksize_B);
99                 nessie_bc_enc(key, buffer);
100         }
101         /* test set 4 */
102         set=4;
103         nessie_print_setheader(set);
104         /* 4 - 0*/
105         nessie_print_set_vector(set, 0);
106         for(i=0; i<(nessie_bc_ctx.keysize_b+7)/8; ++i){
107                 key[i]=i;
108         }
109         for(i=0; i<nessie_bc_ctx.blocksize_B; ++i){
110                 buffer[i]=i*0x11;
111         }
112         nessie_bc_enc(key, buffer);
113         /* 4 - 1 */
114         nessie_print_set_vector(set, 1);        
115     /* This is the test vectors in Kasumi */
116     static uint8_t kasumi_key[] = {
117            0x2B, 0xD6, 0x45, 0x9F, 0x82, 0xC5, 0xB3, 0x00,
118            0x95, 0x2C, 0x49, 0x10, 0x48, 0x81, 0xFF, 0x48 };
119     static uint8_t kasumi_plain[]={
120            0xEA, 0x02, 0x47, 0x14, 0xAD, 0x5C, 0x4D, 0x84 };
121         for(i=0; i<(nessie_bc_ctx.keysize_b+7)/8; ++i){
122                 key[i]=kasumi_key[i%sizeof(kasumi_key)];
123         }
124         for(i=0; i<nessie_bc_ctx.blocksize_B; ++i){
125                 buffer[i]=kasumi_plain[i%sizeof(kasumi_plain)];
126         }
127         nessie_bc_enc(key, buffer);
128         /* half done ;-) */
129         /* test set 5 */
130         set=5;
131         nessie_print_setheader(set);
132         for(i=0; i<nessie_bc_ctx.keysize_b; ++i){
133                 nessie_print_set_vector(set, i);
134                 memset(key, 0, (nessie_bc_ctx.keysize_b+7)/8);
135                 key[i/8] |= 0x80>>(i%8);
136                 memset(buffer, 0, nessie_bc_ctx.blocksize_B);
137                 nessie_bc_dec(key, buffer);
138         }
139         /* test set 6 */
140         set=6;
141         nessie_print_setheader(set);
142         for(i=0; i<nessie_bc_ctx.blocksize_B*8; ++i){
143                 nessie_print_set_vector(set, i);
144                 memset(key, 0, (nessie_bc_ctx.keysize_b+7)/8);
145                 memset(buffer, 0, nessie_bc_ctx.blocksize_B);
146                 buffer[i/8] |= 0x80>>(i%8);
147                 nessie_bc_dec(key, buffer);
148         }
149         /* test set 7 */
150         set=7;
151         nessie_print_setheader(set);
152         for(i=0; i<256; ++i){
153                 nessie_print_set_vector(set, i);
154                 memset(key, i, (nessie_bc_ctx.keysize_b+7)/8);
155                 memset(buffer, i, nessie_bc_ctx.blocksize_B);
156                 nessie_bc_dec(key, buffer);
157         }
158         /* test set 8 */
159         set=8;
160         nessie_print_setheader(set);
161         /* 8 - 0*/
162         nessie_print_set_vector(set, 0);
163         for(i=0; i<(nessie_bc_ctx.keysize_b+7)/8; ++i){
164                 key[i]=i;
165         }
166         for(i=0; i<nessie_bc_ctx.blocksize_B; ++i){
167                 buffer[i]=i*0x11;
168         }
169         nessie_bc_dec(key, buffer);
170         /* 8 - 1 */
171         nessie_print_set_vector(set, 1);        
172         for(i=0; i<(nessie_bc_ctx.keysize_b+7)/8; ++i){
173                 key[i]=kasumi_key[i%sizeof(kasumi_key)];
174         }
175         for(i=0; i<nessie_bc_ctx.blocksize_B; ++i){
176                 buffer[i]=kasumi_plain[i%sizeof(kasumi_plain)];
177         }
178         nessie_bc_dec(key, buffer);
179         nessie_print_footer();
180 }