1 /* main-threefish-test.c */
3 This file is part of the AVR-Crypto-Lib.
4 Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "serial-tools.h"
29 #include "threefish.h"
30 #include "nessie_bc_test.h"
32 #include "performance_test.h"
38 char* algo_name = "Threefish";
40 /*****************************************************************************
41 * additional validation-functions *
42 *****************************************************************************/
44 void threefish256_dummy_init(const uint8_t* key, uint16_t keysize_b, void* ctx){
47 threefish256_init(key, null, ctx);
50 void testrun_nessie_threefish256(void){
51 nessie_bc_ctx.keysize_b = 256;
52 nessie_bc_ctx.blocksize_B = 32;
53 nessie_bc_ctx.ctx_size_B = sizeof(threefish256_ctx_t);
54 nessie_bc_ctx.name = "Threefish256";
55 nessie_bc_ctx.cipher_genctx = threefish256_dummy_init;
56 nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)threefish256_enc;
57 nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)threefish256_dec;
58 nessie_bc_ctx.cipher_free = NULL;
63 void threefish512_dummy_init(const uint8_t* key, uint16_t keysize_b, void* ctx){
66 threefish512_init(key, null, ctx);
69 void testrun_nessie_threefish512(void){
70 nessie_bc_ctx.keysize_b = 512;
71 nessie_bc_ctx.blocksize_B = 64;
72 nessie_bc_ctx.ctx_size_B = sizeof(threefish512_ctx_t);
73 nessie_bc_ctx.name = "Threefish512";
74 nessie_bc_ctx.cipher_genctx = threefish512_dummy_init;
75 nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)threefish512_enc;
76 nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)threefish512_dec;
77 nessie_bc_ctx.cipher_free = NULL;
82 void threefish1024_dummy_init(const uint8_t* key, uint16_t keysize_b, void* ctx){
85 threefish1024_init(key, null, ctx);
88 void testrun_nessie_threefish1024(void){
89 nessie_bc_ctx.keysize_b = 1024;
90 nessie_bc_ctx.blocksize_B = 128;
91 nessie_bc_ctx.ctx_size_B = sizeof(threefish1024_ctx_t);
92 nessie_bc_ctx.name = "Threefish1024";
93 nessie_bc_ctx.cipher_genctx = threefish1024_dummy_init;
94 nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)threefish1024_enc;
95 nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)threefish1024_dec;
96 nessie_bc_ctx.cipher_free = NULL;
101 void testrun_nessie_threefish(void){
102 testrun_nessie_threefish256();
103 testrun_nessie_threefish512();
104 testrun_nessie_threefish1024();
107 void testrun_stdtest_threefish256(void){
108 uint8_t key[32], data[32];
111 threefish256_ctx_t ctx;
113 cli_putstr_P(PSTR("\r\n\r\nTest vectors for block cipher Threefish (256 bits):"));
116 memset(tweak, 0, 16);
118 cli_putstr_P(PSTR("\r\nkey: "));
119 cli_hexdump_block(key, 32, 4, 16);
120 cli_putstr_P(PSTR("\r\ntweak: "));
121 cli_hexdump_block(tweak, 16, 4, 16);
122 cli_putstr_P(PSTR("\r\nplain: "));
123 cli_hexdump_block(data, 32, 4, 16);
124 threefish256_init(key, tweak, &ctx);
125 threefish256_enc(data, &ctx);
126 cli_putstr_P(PSTR("\r\ncipher: "));
127 cli_hexdump_block(data, 32, 4, 16);
136 cli_putstr_P(PSTR("\r\nkey: "));
137 cli_hexdump_block(key, 32, 4, 16);
138 cli_putstr_P(PSTR("\r\ntweak: "));
139 cli_hexdump_block(tweak, 16, 4, 16);
140 cli_putstr_P(PSTR("\r\nplain: "));
141 cli_hexdump_block(data, 32, 4, 16);
142 threefish256_init(key, tweak, &ctx);
143 threefish256_enc(data, &ctx);
144 cli_putstr_P(PSTR("\r\ncipher: "));
145 cli_hexdump_block(data, 32, 4, 16);
148 void testrun_stdtest_threefish512(void){
149 uint8_t key[64], data[64];
152 threefish512_ctx_t ctx;
154 cli_putstr_P(PSTR("\r\n\r\nTest vectors for block cipher Threefish (512 bits) :"));
157 memset(tweak, 0, 16);
159 cli_putstr_P(PSTR("\r\nkey: "));
160 cli_hexdump_block(key, 32, 4, 16);
161 cli_putstr_P(PSTR("\r\n "));
162 cli_hexdump_block(key+32, 32, 4, 16);
163 cli_putstr_P(PSTR("\r\ntweak: "));
164 cli_hexdump_block(tweak, 16, 4, 16);
165 cli_putstr_P(PSTR("\r\nplain: "));
166 cli_hexdump_block(data, 64, 4, 16);
167 threefish512_init(key, tweak, &ctx);
168 threefish512_enc(data, &ctx);
169 cli_putstr_P(PSTR("\r\ncipher: "));
170 cli_hexdump_block(data, 64, 4, 16);
179 cli_putstr_P(PSTR("\r\nkey: "));
180 cli_hexdump_block(key, 32, 4, 16);
181 cli_putstr_P(PSTR("\r\n "));
182 cli_hexdump_block(key+32, 32, 4, 16);
183 cli_putstr_P(PSTR("\r\ntweak: "));
184 cli_hexdump_block(tweak, 16, 4, 16);
185 cli_putstr_P(PSTR("\r\nplain: "));
186 cli_hexdump_block(data, 64, 4, 16);
187 threefish512_init(key, tweak, &ctx);
188 threefish512_enc(data, &ctx);
189 cli_putstr_P(PSTR("\r\ncipher: "));
190 cli_hexdump_block(data, 64, 4, 16);
193 void testrun_stdtest_threefish1024(void){
194 uint8_t key[128], data[128];
197 threefish1024_ctx_t ctx;
199 cli_putstr_P(PSTR("\r\n\r\nTest vectors for block cipher Threefish (1024 bits) :"));
201 memset(data, 0, 128);
202 memset(tweak, 0, 16);
204 cli_putstr_P(PSTR("\r\nkey: "));
205 cli_hexdump_block(key, 128, 4, 16);
206 cli_putstr_P(PSTR("\r\ntweak: "));
207 cli_hexdump_block(tweak, 16, 4, 16);
208 cli_putstr_P(PSTR("\r\nplain: "));
209 cli_hexdump_block(data, 128, 4, 16);
210 threefish1024_init(key, tweak, &ctx);
211 threefish1024_enc(data, &ctx);
212 cli_putstr_P(PSTR("\r\ncipher: "));
213 cli_hexdump_block(data, 128, 4, 16);
215 for(i=0; i<128; ++i){
222 cli_putstr_P(PSTR("\r\nkey: "));
223 cli_hexdump_block(key, 128, 4, 16);
224 cli_putstr_P(PSTR("\r\ntweak: "));
225 cli_hexdump_block(tweak, 16, 4, 16);
226 cli_putstr_P(PSTR("\r\nplain: "));
227 cli_hexdump_block(data, 128, 4, 16);
228 threefish1024_init(key, tweak, &ctx);
229 threefish1024_enc(data, &ctx);
230 cli_putstr_P(PSTR("\r\ncipher: "));
231 cli_hexdump_block(data, 128, 4, 16);
235 void testrun_stdtest_threefish(void){
236 testrun_stdtest_threefish256();
237 testrun_stdtest_threefish512();
238 testrun_stdtest_threefish1024();
241 void testrun_performance_threefish256(void){
244 uint8_t key[THREEFISH256_BLOCKSIZE_B];
245 uint8_t data[THREEFISH256_BLOCKSIZE_B];
247 threefish256_ctx_t ctx;
249 cli_putstr_P(PSTR("\r\nThreefish-256 performance:"));
254 // memset(key, 0, THREEFISH256_BLOCKSIZE_B);
255 // memset(tweak, 0, 16);
258 threefish256_init(key, tweak, &ctx);
260 cli_putstr_P(PSTR("\r\n\tctx-gen time: "));
261 ultoa((unsigned long)t, str, 10);
265 threefish256_enc(data, &ctx);
267 cli_putstr_P(PSTR("\r\n\tencrypt time: "));
268 ultoa((unsigned long)t, str, 10);
271 cli_putstr_P(PSTR("\r\n"));
274 void testrun_performance_threefish512(void){
277 uint8_t key[THREEFISH512_BLOCKSIZE_B];
278 uint8_t data[THREEFISH512_BLOCKSIZE_B];
280 threefish512_ctx_t ctx;
282 cli_putstr_P(PSTR("\r\nThreefish-512 performance:"));
287 // memset(key, 0, THREEFISH512_BLOCKSIZE_B);
288 // memset(tweak, 0, 16);
291 threefish512_init(key, tweak, &ctx);
293 cli_putstr_P(PSTR("\r\n\tctx-gen time: "));
294 ultoa((unsigned long)t, str, 10);
298 threefish512_enc(data, &ctx);
300 cli_putstr_P(PSTR("\r\n\tencrypt time: "));
301 ultoa((unsigned long)t, str, 10);
304 cli_putstr_P(PSTR("\r\n"));
307 void testrun_performance_threefish1024(void){
310 uint8_t key[THREEFISH1024_BLOCKSIZE_B];
311 uint8_t data[THREEFISH1024_BLOCKSIZE_B];
313 threefish1024_ctx_t ctx;
315 cli_putstr_P(PSTR("\r\nThreefish-1024 performance:"));
320 // memset(key, 0, THREEFISH1024_BLOCKSIZE_B);
321 // memset(tweak, 0, 16);
324 threefish1024_init(key, tweak, &ctx);
326 cli_putstr_P(PSTR("\r\n\tctx-gen time: "));
327 ultoa((unsigned long)t, str, 10);
331 threefish1024_enc(data, &ctx);
333 cli_putstr_P(PSTR("\r\n\tencrypt time: "));
334 ultoa((unsigned long)t, str, 10);
337 cli_putstr_P(PSTR("\r\n"));
340 void testrun_performance_threefish(void){
341 testrun_performance_threefish256();
342 testrun_performance_threefish512();
343 testrun_performance_threefish1024();
346 void init_test(void){
347 threefish256_ctx_t ctx;
348 uint8_t key[32], tweak[16];
351 threefish256_init(key, tweak, &ctx);
352 cli_putstr_P(PSTR("\r\n ctx: \r\n\tk:"));
353 cli_hexdump(ctx.k, 5*8);
354 cli_putstr_P(PSTR("\r\n\tt:"));
355 cli_hexdump(ctx.t, 3*8);
359 /*****************************************************************************
361 *****************************************************************************/
363 const char nessie_str[] PROGMEM = "nessie";
364 const char test_str[] PROGMEM = "test";
365 const char test256_str[] PROGMEM = "test256";
366 const char test512_str[] PROGMEM = "test512";
367 const char test1024_str[] PROGMEM = "test1024";
368 const char inittest_str[] PROGMEM = "inittest";
369 const char performance_str[] PROGMEM = "performance";
370 const char echo_str[] PROGMEM = "echo";
372 cmdlist_entry_t cmdlist[] PROGMEM = {
373 { nessie_str, NULL, testrun_nessie_threefish},
374 { test_str, NULL, testrun_stdtest_threefish},
375 { test256_str, NULL, testrun_stdtest_threefish256},
376 { test512_str, NULL, testrun_stdtest_threefish512},
377 { test1024_str, NULL, testrun_stdtest_threefish1024},
378 { inittest_str, NULL, init_test},
379 { performance_str, NULL, testrun_performance_threefish},
380 { echo_str, (void*)1, (void_fpt)echo_ctrl},
390 cli_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
391 cli_putstr(algo_name);
392 cli_putstr_P(PSTR(")\r\nloaded and running\r\n"));
393 cmd_interface(cmdlist);