From 3711896e923a5d819733fbfe50590e7e1e6ab51a Mon Sep 17 00:00:00 2001 From: bg Date: Sat, 30 Jan 2010 03:09:22 +0000 Subject: [PATCH] new cfb-mode (still limited to byte operations) --- bcal-cbc.c | 7 ++-- bcal-cfb_byte.c | 86 ++++++++++++++++++++++++++++++++++++++++ bcal-cfb_byte.h | 46 +++++++++++++++++++++ mkfiles/aes.mk | 2 +- mkfiles/aes_c.mk | 2 +- test_src/main-aes-test.c | 85 +++++++++++++++++++++++++++++++-------- 6 files changed, 205 insertions(+), 23 deletions(-) create mode 100644 bcal-cfb_byte.c create mode 100644 bcal-cfb_byte.h diff --git a/bcal-cbc.c b/bcal-cbc.c index 7ae892e..5e76135 100644 --- a/bcal-cbc.c +++ b/bcal-cbc.c @@ -28,7 +28,7 @@ uint8_t bcal_cbc_init(const bcdesc_t* desc, const void* key, uint16_t keysize, b ctx->blocksize_B = (bcal_cipher_getBlocksize_b(desc)+7)/8; ctx->prev_block = malloc(ctx->blocksize_B); - if(!(ctx->prev_block)){ + if(ctx->prev_block==NULL){ return 0x11; } return bcal_cipher_init(desc, key, keysize, &(ctx->cctx)); @@ -64,16 +64,15 @@ void bcal_cbc_decRand(void* block, const void* prev_block, bcal_cbc_ctx_t* ctx){ void bcal_cbc_encMsg(const void* iv, void* msg, uint16_t msg_blocks, bcal_cbc_ctx_t* ctx){ bcal_cbc_loadIV(iv, ctx); - while(msg_blocks){ + while(msg_blocks--){ bcal_cbc_encNext(msg, ctx); - msg_blocks -= 1; msg = (uint8_t*)msg + ctx->blocksize_B; } } void bcal_cbc_decMsg(const void* iv, void* msg, uint16_t msg_blocks, bcal_cbc_ctx_t* ctx){ msg=(uint8_t*)msg + (msg_blocks-1)*ctx->blocksize_B; - while(msg_blocks>1){ + while(msg_blocks > 1){ bcal_cbc_decRand(msg, (uint8_t*)msg-ctx->blocksize_B, ctx); msg_blocks -= 1; msg=(uint8_t*)msg-ctx->blocksize_B; diff --git a/bcal-cfb_byte.c b/bcal-cfb_byte.c new file mode 100644 index 0000000..f7c08f1 --- /dev/null +++ b/bcal-cfb_byte.c @@ -0,0 +1,86 @@ +/* bcal-cfb_byte.c */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2010 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +#include +#include +#include "bcal-cfb_byte.h" +#include "bcal-basic.h" +#include "memxor.h" + + +uint8_t bcal_cfb_B_init(const bcdesc_t* desc, const void* key, uint16_t keysize, uint16_t size_b, bcal_cfb_B_ctx_t* ctx){ + ctx->desc = (bcdesc_t*)desc; + ctx->blocksize_B = (bcal_cipher_getBlocksize_b(desc)+7)/8; + ctx->in_block=malloc(ctx->blocksize_B); + if(ctx->in_block==NULL){ + return 0x11; + } + if(size_b&7){ + return 0x12; + } + ctx->size_B = size_b/8; + return bcal_cipher_init(desc, key, keysize, &(ctx->cctx)); +} + +void bcal_cfb_B_free(bcal_cfb_B_ctx_t* ctx){ + free(ctx->in_block); + bcal_cipher_free(&(ctx->cctx)); +} + +void bcal_cfb_B_loadIV(const void* iv, bcal_cfb_B_ctx_t* ctx){ + memcpy(ctx->in_block, iv, ctx->blocksize_B); +} + +void bcal_cfb_B_encNext(void* block, bcal_cfb_B_ctx_t* ctx){ + uint8_t tmp[ctx->blocksize_B]; + memcpy(tmp, ctx->in_block, ctx->blocksize_B); + bcal_cipher_enc(tmp, &(ctx->cctx)); + memxor(block, tmp, ctx->size_B); + memmove(ctx->in_block, ctx->in_block+ctx->size_B, ctx->blocksize_B - ctx->size_B); + memcpy(ctx->in_block+ctx->blocksize_B-ctx->size_B, block, ctx->size_B); +} + +void bcal_cfb_B_decNext(void* block, bcal_cfb_B_ctx_t* ctx){ + uint8_t tmp[ctx->blocksize_B]; + uint8_t xblock[ctx->size_B]; + memcpy(xblock, block, ctx->size_B); + memcpy(tmp, ctx->in_block, ctx->blocksize_B); + bcal_cipher_enc(tmp, &(ctx->cctx)); + memxor(block, tmp, ctx->size_B); + memmove(ctx->in_block, ctx->in_block+ctx->size_B, ctx->blocksize_B - ctx->size_B); + memcpy(ctx->in_block+ctx->blocksize_B-ctx->size_B, xblock, ctx->size_B); +} + +void bcal_cfb_B_encMsg(const void* iv, void* msg, uint16_t msg_blocks, bcal_cfb_B_ctx_t* ctx){ + bcal_cfb_B_loadIV(iv, ctx); + while(msg_blocks--){ + bcal_cfb_B_encNext(msg, ctx); + msg = (uint8_t*)msg+ctx->size_B; + } +} + +void bcal_cfb_B_decMsg(const void* iv, void* msg, uint16_t msg_blocks, bcal_cfb_B_ctx_t* ctx){ + bcal_cfb_B_loadIV(iv, ctx); + while(msg_blocks--){ + bcal_cfb_B_decNext(msg, ctx); + msg = (uint8_t*)msg+ctx->size_B; + } +} + diff --git a/bcal-cfb_byte.h b/bcal-cfb_byte.h new file mode 100644 index 0000000..22fb583 --- /dev/null +++ b/bcal-cfb_byte.h @@ -0,0 +1,46 @@ +/* bcal-cbc.h */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2010 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef BCALCFB_BYTE_H_ +#define BCALCFB_BYTE_H_ + +#include +#include "bcal-basic.h" +#include "blockcipher_descriptor.h" + + +typedef struct{ + bcdesc_t* desc; + bcgen_ctx_t cctx; + uint8_t* in_block; + uint8_t blocksize_B; + uint8_t size_B; +} bcal_cfb_B_ctx_t; + + +uint8_t bcal_cfb_B_init(const bcdesc_t* desc, const void* key, uint16_t keysize, uint16_t size_b, bcal_cfb_B_ctx_t* ctx); +void bcal_cfb_B_free(bcal_cfb_B_ctx_t* ctx); +void bcal_cfb_B_loadIV(const void* iv, bcal_cfb_B_ctx_t* ctx); +void bcal_cfb_B_encNext(void* block, bcal_cfb_B_ctx_t* ctx); +void bcal_cfb_B_decNext(void* block, bcal_cfb_B_ctx_t* ctx); +void bcal_cfb_B_encMsg(const void* iv, void* msg, uint16_t msg_blocks, bcal_cfb_B_ctx_t* ctx); +void bcal_cfb_B_decMsg(const void* iv, void* msg, uint16_t msg_blocks, bcal_cfb_B_ctx_t* ctx); + + +#endif /* BCALCFB_BYTE_H_ */ diff --git a/mkfiles/aes.mk b/mkfiles/aes.mk index bc52d94..af5601a 100644 --- a/mkfiles/aes.mk +++ b/mkfiles/aes.mk @@ -10,7 +10,7 @@ $(ALGO_NAME)_OBJ := aes_enc-asm.o aes_dec-asm.o aes_sbox-asm.o aes_invsbox- $(ALGO_NAME)_TEST_BIN := main-aes-test.o $(CLI_STD) \ nessie_bc_test.o nessie_common.o performance_test.o memxor.o \ bcal_aes128.o bcal_aes192.o bcal_aes256.o bcal-basic.o bcal-cbc.o \ - keysize_descriptor.o dump-asm.o dump-decl.o + keysize_descriptor.o dump-asm.o dump-decl.o bcal-cfb_byte.o $(ALGO_NAME)_NESSIE_TEST := test nessie $(ALGO_NAME)_PERFORMANCE_TEST := performance diff --git a/mkfiles/aes_c.mk b/mkfiles/aes_c.mk index 69ddd5a..734db13 100644 --- a/mkfiles/aes_c.mk +++ b/mkfiles/aes_c.mk @@ -13,7 +13,7 @@ $(ALGO_NAME)_OBJ := aes_enc.o aes_dec.o aes_sbox.o aes_invsbox.o \ $(ALGO_NAME)_TEST_BIN := main-aes-test.o $(CLI_STD) \ nessie_bc_test.o nessie_common.o performance_test.o memxor.o \ bcal_aes128.o bcal_aes192.o bcal_aes256.o bcal-basic.o bcal-cbc.o \ - keysize_descriptor.o dump-asm.o dump-decl.o + keysize_descriptor.o dump-asm.o dump-decl.o bcal-cfb_byte.o $(ALGO_NAME)_NESSIE_TEST := test nessie $(ALGO_NAME)_PERFORMANCE_TEST := performance diff --git a/test_src/main-aes-test.c b/test_src/main-aes-test.c index ac80d80..7d1fa9a 100644 --- a/test_src/main-aes-test.c +++ b/test_src/main-aes-test.c @@ -37,6 +37,7 @@ #include "bcal_aes192.h" #include "bcal_aes256.h" #include "bcal-cbc.h" +#include "bcal-cfb_byte.h" #include #include @@ -106,6 +107,7 @@ void testrun_test_aes(void){ bcal_cipher_dec(data, &bcal_ctx); cli_putstr_P(PSTR("\r\n plaintext: ")); cli_hexdump(data, 16); + bcal_cipher_free(&bcal_ctx); } void testrun_testkey_aes128(void){ @@ -180,25 +182,37 @@ void testrun_testkey_aes(void){ testrun_testkey_aes256(); } +uint8_t modes_key[] PROGMEM={ 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, + 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c + }; +uint8_t modes_iv[] PROGMEM={ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f + }; +uint8_t modes_plain[] PROGMEM={ 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, + 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, + /* --- */ + 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, + 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, + /* --- */ + 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, + 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, + /* --- */ + 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, + 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 + }; void testrun_aes128_cbc(void){ - uint8_t key[] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, - 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }; - uint8_t iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; - uint8_t plain[] = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, - 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, - /* --- */ - 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, - 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, - /* --- */ - 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, - 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, - /* --- */ - 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, - 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }; + uint8_t key[16]; + uint8_t iv[16]; + uint8_t plain[64]; + bcal_cbc_ctx_t ctx; uint8_t r; + + memcpy_P(key, modes_key, 16); + memcpy_P(iv, modes_iv, 16); + memcpy_P(plain, modes_plain, 64); + cli_putstr_P(PSTR("\r\n** AES128-CBC-TEST **")); r = bcal_cbc_init(&aes128_desc, key, 128, &ctx); cli_putstr_P(PSTR("\r\n init = 0x")); @@ -220,6 +234,41 @@ void testrun_aes128_cbc(void){ bcal_cbc_free(&ctx); } +void testrun_aes128_cfb8(void){ + uint8_t key[16]; + uint8_t iv[16]; + uint8_t plain[64]; + + bcal_cfb_B_ctx_t ctx; + uint8_t r; + + memcpy_P(key, modes_key, 16); + memcpy_P(iv, modes_iv, 16); + memcpy_P(plain, modes_plain, 64); + + cli_putstr_P(PSTR("\r\n** AES128-CFB8-TEST **")); + r = bcal_cfb_B_init(&aes128_desc, key, 128, 8, &ctx); + cli_putstr_P(PSTR("\r\n init = 0x")); + cli_hexdump(&r, 1); + cli_putstr_P(PSTR("\r\n key: ")); + cli_hexdump(key, 128/8); + cli_putstr_P(PSTR("\r\n IV: ")); + cli_hexdump(iv, 128/8); + cli_putstr_P(PSTR("\r\n plaintext:")); + cli_hexdump_block(plain, 4*128/8, 4, 8); + if(r) + return; + bcal_cfb_B_encMsg(iv, plain, 64, &ctx); + cli_putstr_P(PSTR("\r\n ciphertext: ")); + cli_hexdump_block(plain, 64, 4, 8); + + bcal_cfb_B_decMsg(iv, plain, 64, &ctx); + cli_putstr_P(PSTR("\r\n plaintext: ")); + cli_hexdump_block(plain, 64, 4, 8); + + bcal_cfb_B_free(&ctx); + +} /*****************************************************************************/ @@ -355,7 +404,8 @@ void testrun_performance_aes(void){ const char nessie_str[] PROGMEM = "nessie"; const char test_str[] PROGMEM = "test"; const char testkey_str[] PROGMEM = "testkey"; -const char testcbc128_str[] PROGMEM = "testcbc128"; +const char testcbc_str[] PROGMEM = "testcbc"; +const char testcfb8_str[] PROGMEM = "testcfb8"; const char performance_str[] PROGMEM = "performance"; const char dump_str[] PROGMEM = "dump"; const char echo_str[] PROGMEM = "echo"; @@ -364,7 +414,8 @@ cmdlist_entry_t cmdlist[] PROGMEM = { { nessie_str, NULL, testrun_nessie_aes }, { test_str, NULL, testrun_test_aes}, { testkey_str, NULL, testrun_testkey_aes}, - { testcbc128_str, NULL, testrun_aes128_cbc}, + { testcbc_str, NULL, testrun_aes128_cbc}, + { testcfb8_str, NULL, testrun_aes128_cfb8}, { performance_str, NULL, testrun_performance_aes}, { dump_str, (void*)1, (void_fpt)dump}, { echo_str, (void*)1, (void_fpt)echo_ctrl}, -- 2.39.5