]> git.cryptolib.org Git - avr-crypto-lib.git/commitdiff
migration to SCAL initiated
authorbg <bg@b1d182e4-1ff8-0310-901f-bddb46175740>
Fri, 21 Jan 2011 23:29:18 +0000 (23:29 +0000)
committerbg <bg@b1d182e4-1ff8-0310-901f-bddb46175740>
Fri, 21 Jan 2011 23:29:18 +0000 (23:29 +0000)
16 files changed:
arcfour/arcfour-asm.S
arcfour/arcfour.c
arcfour/arcfour.h
keysize_descriptor.c
keysize_descriptor.h
mkfiles/arcfour.mk
mkfiles/arcfour_c.mk
scal/scal-basic.c [new file with mode: 0644]
scal/scal-basic.h [new file with mode: 0644]
scal/scal-nessie.c [new file with mode: 0644]
scal/scal-nessie.h [new file with mode: 0644]
scal/scal_arcfour.c [new file with mode: 0644]
scal/scal_arcfour.h [new file with mode: 0644]
test_src/main-arcfour-test.c
test_src/nessie_common.c
test_src/nessie_stream_test.c

index 1ef8218ce971a608ffaf096959dc40fb63141804..63932abe2d25a87a644e8e1b3e907a9877001c1c 100644 (file)
@@ -40,8 +40,8 @@
  *  this function initialises the context
  * param1: 16-bit pointer to the key
  *     given in r24:r25
- * param2: 8-bit integer indicating keylength in byte
- *     given in r22
+ * param2: 8-bit integer indicating keylength in bits
+ *     given in r22:r23
  * param3: 16-bit pointer to a ctx struct
  *     given in r20:r21
  */
@@ -52,7 +52,12 @@ arcfour_init:
        st X+, r1
        st X+, r1       /* X points to S */
        movw r20, r26   /* store pointer to S in r21:r20 */
-       
+       lsr r23
+       ror r22
+       lsr r23
+       ror r22
+       lsr r23
+       ror r22
 1:             
        st X+, r1 
        inc r1
index e07193f2cbfbc9564adff1557c4f78b3b1ed414e..0d929efa899edfeba59634a76688970cabcdbdb1 100644 (file)
@@ -33,8 +33,9 @@
  * length is length of key in bytes!
  */
 
-void arcfour_init(const void *key, uint8_t length_B, arcfour_ctx_t *ctx){
+void arcfour_init(const void *key, uint16_t length_b, arcfour_ctx_t *ctx){
        uint8_t t;
+       uint8_t length_B = length_b/8;
        uint16_t x,y=0;
        for(x=0; x<= 255; ++x)
                ctx->s[x]=x;
index d332d7f8ed1f384f6368b4bfe2f1ae6caded66ad..d7bb60632c3e1a3db599dfb76074de6183da8b74 100644 (file)
@@ -71,10 +71,10 @@ typedef struct arcfour_ctx_st {
  * the supplied key of the given length.
  * \param ctx pointer to the context
  * \param key pointer to the key
- * \param length_B length of the key in bytes (between 1 and 255)
+ * \param length_b length of the key in bits (between 8 and 2048)
  */
 
-void arcfour_init(const void *key, uint8_t length_B, arcfour_ctx_t *ctx);
+void arcfour_init(const void *key, uint16_t length_b, arcfour_ctx_t *ctx);
 
 /** \fn uint8_t arcfour_gen(arcfour_ctx_t *ctx)
  * \brief generates a byte of keystream
index 045ff65f4c24c2c5188fad812ebbf24886f94095..d78ed031c925921b6574eaa0eca6065e76f5c147 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 #include <stdint.h>
+#include <stdlib.h>
 #include <avr/pgmspace.h>
 #include "keysize_descriptor.h"
 
@@ -76,11 +77,85 @@ uint16_t get_keysize(PGM_VOID_P ks_desc){
        uint8_t type;
        uint16_t keysize;
        type = pgm_read_byte(ks_desc);
-       if(type==KS_TYPE_LIST)
+       if(type==KS_TYPE_LIST){
                ks_desc = (uint8_t*)ks_desc + 1;
+       }
        ks_desc = (uint8_t*)ks_desc + 1;
        keysize = pgm_read_word(ks_desc);
        return keysize;
 }
 
-
+uint16_t get_keysizes(PGM_VOID_P ks_desc, uint16_t** list){
+       uint8_t type;
+       uint16_t items;
+       uint8_t i;
+       type = pgm_read_byte(ks_desc);
+       ks_desc = (uint8_t*)ks_desc + 1;
+       if(type==KS_TYPE_LIST){
+               items = pgm_read_byte(ks_desc);
+               ks_desc = (uint8_t*)ks_desc + 1;
+               if(!*list){
+                       *list = malloc(items*2);
+                       if(!*list){
+                               return 0;
+                       }
+               }
+               for(i=0; i<items; ++i){
+                       ((uint16_t*)(*list))[i] = pgm_read_word(ks_desc);
+                       ks_desc = (uint8_t*)ks_desc + 2;
+               }
+               return items;
+       }
+       if(type==KS_TYPE_ARG_RANGE){
+               uint16_t min, max, distance, offset;
+               min = pgm_read_word(ks_desc);
+               ks_desc = (uint8_t*)ks_desc + 2;
+               max = pgm_read_word(ks_desc);
+               ks_desc = (uint8_t*)ks_desc + 2;
+               distance = pgm_read_word(ks_desc);
+               ks_desc = (uint8_t*)ks_desc + 2;
+               offset = pgm_read_word(ks_desc);
+               ks_desc = (uint8_t*)ks_desc + 2;
+               items = (max-min)/distance+1;
+               if(min%distance!=offset){
+                       --items;
+                       min += (distance-(min%distance-offset))%distance;
+               }
+               if(!*list){
+                       *list = malloc(items*2);
+                       if(!*list){
+                               return 0;
+                       }
+               }
+               i=0;
+               while(min<max){
+                       ((uint16_t*)*list)[i++] = min;
+                       min += distance;
+               }
+               return i;
+       }
+       if(type==KS_TYPE_RANGE){
+               uint16_t min, max, distance=8, offset=0;
+               min = pgm_read_word(ks_desc);
+               ks_desc = (uint8_t*)ks_desc + 2;
+               max = pgm_read_word(ks_desc);
+               items = (max-min)/distance+1;
+               if(min%distance!=offset){
+                       --items;
+                       min += (distance-(min%distance-offset))%distance;
+               }
+               if(!*list){
+                       *list = malloc(items*2);
+                       if(!*list){
+                               return 0;
+                       }
+               }
+               i=0;
+               while(min<max){
+                       ((uint16_t*)*list)[i++] = min;
+                       min += distance;
+               }
+               return i;
+       }
+       return 0;
+}
index dd912542915c1b6d7ae8d360c961ab8f7c9e352b..af5e38395ad72a7c3042c4d954309a48c942ff53 100644 (file)
@@ -56,4 +56,7 @@ typedef struct{ /* keysize is valid if min<=keysize<=max and if keysize mod dist
 
 uint8_t is_valid_keysize_P(PGM_VOID_P ks_desc, uint16_t keysize);
 uint16_t get_keysize(PGM_VOID_P ks_desc);
+uint16_t get_keysizes(PGM_VOID_P ks_desc, uint16_t** list);
+
+
 #endif /* KEYSIZE_DESCRIPTOR_H_ */
index ebc6858e5638c111954843c0b6f03f9b371df605..67beed3bcd8576c25aa639a8d2dca0840030dee2 100644 (file)
@@ -6,8 +6,8 @@ STREAM_CIPHERS += $(ALGO_NAME)
 
 $(ALGO_NAME)_DIR      := arcfour/
 $(ALGO_NAME)_OBJ      := arcfour-asm.o
-$(ALGO_NAME)_TEST_BIN := main-arcfour-test.o $(CLI_STD)  \
-                         nessie_stream_test.o nessie_common.o performance_test.o
+$(ALGO_NAME)_INCDIR   := memxor/ scal/
+$(ALGO_NAME)_TEST_BIN := main-arcfour-test.o $(CLI_STD) $(SCAL_STD) scal_arcfour.o
 $(ALGO_NAME)_NESSIE_TEST      := "nessie"
 $(ALGO_NAME)_PERFORMANCE_TEST := "performance"
 
index 5bee9f06208fd9f86465758976d55b3d1f8a5f98..aa6d0eb79dee2a3c0b8a4e4a21761c8623810ba6 100644 (file)
@@ -5,8 +5,9 @@ ALGO_NAME := ARCFOUR_C
 STREAM_CIPHERS += $(ALGO_NAME)
 
 $(ALGO_NAME)_DIR      := arcfour/
+$(ALGO_NAME)_INCDIR   := memxor/ scal/
 $(ALGO_NAME)_OBJ      := arcfour.o
-$(ALGO_NAME)_TEST_BIN := main-arcfour-test.o $(CLI_STD) nessie_stream_test.o nessie_common.o performance_test.o
+$(ALGO_NAME)_TEST_BIN := main-arcfour-test.o $(CLI_STD) $(SCAL_STD) scal_arcfour.o
 $(ALGO_NAME)_NESSIE_TEST      := "nessie"
 $(ALGO_NAME)_PERFORMANCE_TEST := "performance"
 
diff --git a/scal/scal-basic.c b/scal/scal-basic.c
new file mode 100644 (file)
index 0000000..441a88c
--- /dev/null
@@ -0,0 +1,164 @@
+/* scal-basic.c */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2011  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 <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <avr/pgmspace.h>
+#include "streamcipher_descriptor.h"
+#include "keysize_descriptor.h"
+
+uint8_t scal_cipher_init(const scdesc_t* cipher_descriptor,
+                         const void* key, uint16_t keysize_b,
+                         const void* iv,  uint16_t ivsize_b, scgen_ctx_t* ctx){
+       ctx->buffer = NULL;
+       ctx->ctx = NULL;
+
+       if(!is_valid_keysize_P((PGM_VOID_P)pgm_read_word(&(cipher_descriptor->valid_keysize_desc)), keysize_b)){
+               return 1;
+       }
+       if(!is_valid_keysize_P((PGM_VOID_P)pgm_read_word(&(cipher_descriptor->valid_ivsize_desc)), ivsize_b)){
+               return 2;
+       }
+       uint8_t flags;
+       void_fpt init_fpt;
+       flags = pgm_read_byte(&(cipher_descriptor->flags));
+       ctx->desc_ptr = cipher_descriptor;
+       ctx->keysize = keysize_b;
+       ctx->ivsize  = ivsize_b;
+       ctx->ctx = malloc(pgm_read_word(&(cipher_descriptor->ctxsize_B)));
+       if(ctx->ctx==NULL){
+               return 3;
+       }
+       init_fpt = (void_fpt)pgm_read_word(&(cipher_descriptor->init));
+       switch(flags&SC_INIT_TYPE){
+               case SC_INIT_TYPE_1:
+                       ((sc_init1_fpt)init_fpt)(key, ctx->ctx);
+                       break;
+               case SC_INIT_TYPE_2:
+                       ((sc_init2_fpt)init_fpt)(key, iv, ctx->ctx);
+                       break;
+               case SC_INIT_TYPE_3:
+                       ((sc_init3_fpt)init_fpt)(key, keysize_b, ctx->ctx);
+                       break;
+               case SC_INIT_TYPE_4:
+                       ((sc_init4_fpt)init_fpt)(key, keysize_b, iv, ctx->ctx);
+                       break;
+               case SC_INIT_TYPE_5:
+                       ((sc_init5_fpt)init_fpt)(key, keysize_b, iv, ivsize_b, ctx->ctx);
+                       break;
+               default:
+                       return 4;
+       }
+       uint16_t blocksize_b;
+       blocksize_b = pgm_read_word(&(cipher_descriptor->gensize_b));
+       if(blocksize_b>8){
+               ctx->buffer=malloc((blocksize_b+7)/8);
+               if(ctx->buffer==NULL){
+                       return 5;
+               }
+               ctx->index=0;
+       }
+       return 0;
+}
+
+
+void scal_cipher_free(scgen_ctx_t* ctx){
+       if(ctx->buffer){
+               free(ctx->buffer);
+       }
+       if(ctx->ctx){
+               free(ctx->ctx);
+       }
+}
+
+uint8_t scal_cipher_gen_byte(scgen_ctx_t* ctx){
+       uint8_t flags;
+       uint16_t blocksize_b;
+       void_fpt gen_fpt;
+       flags = pgm_read_byte(&(ctx->desc_ptr->flags));
+       blocksize_b = pgm_read_word(&(ctx->desc_ptr->gensize_b));
+       gen_fpt = (void_fpt)(pgm_read_word(&(ctx->desc_ptr->gen.genvoid)));
+
+       if(blocksize_b==8){
+               if((flags&SC_GEN_TYPE)==SC_GEN_TYPE_1){
+                       return ((sc_gen1_fpt)gen_fpt)(ctx->ctx);
+               }else{
+                       uint8_t r;
+                       ((sc_gen2_fpt)gen_fpt)(&r, ctx->ctx);
+                       return r;
+               }
+       }
+       if(blocksize_b<8){
+               uint8_t r=0;
+               uint8_t fill=0;
+               do{
+                       r |= ((((sc_gen1_fpt)gen_fpt)(ctx->ctx))&(0xff<<(8-blocksize_b)))>>fill;
+                       fill += blocksize_b;
+               }while(fill<8);
+               return r;
+       }else{
+               uint8_t r;
+               if(ctx->index==0){
+                       ((sc_gen2_fpt)gen_fpt)(ctx->buffer, ctx->ctx);
+                       ctx->index = blocksize_b;
+               }
+               r=ctx->buffer[(blocksize_b-ctx->index)/8];
+               ctx->index -= 8;
+               return r;
+       }
+}
+
+void scal_cipher_gen_block(void* block, scgen_ctx_t* ctx){
+       uint8_t flags;
+       uint16_t blocksize_b;
+       void_fpt gen_fpt;
+       flags = pgm_read_byte(&(ctx->desc_ptr->flags));
+       blocksize_b = pgm_read_word(&(ctx->desc_ptr->gensize_b));
+       gen_fpt = (void_fpt)pgm_read_word(&(ctx->desc_ptr->gen));
+       if((flags&SC_GEN_TYPE)==SC_GEN_TYPE_1){
+               *((uint8_t*)block) = ((sc_gen1_fpt)gen_fpt)(ctx->ctx);
+       }else{
+               ((sc_gen2_fpt)gen_fpt)(block, ctx->ctx);
+       }
+}
+
+void scal_cipher_gen_fillblock(void* block, uint16_t blocksize_B, scgen_ctx_t* ctx){
+       while(blocksize_B){
+               *((uint8_t*)block) = scal_cipher_gen_byte(ctx);
+               block = (uint8_t*)block + 1;
+               blocksize_B -= 1;
+       }
+}
+
+uint16_t scal_cipher_getBlocksize_b(const scdesc_t* desc){
+       uint16_t blocksize_b;
+       blocksize_b = pgm_read_word(&(desc->gensize_b));
+       return blocksize_b;
+}
+
+PGM_VOID_P scal_cipher_getKeysizeDesc(const scdesc_t* desc){
+       return (PGM_VOID_P)pgm_read_word(&(desc->valid_keysize_desc));
+}
+
+PGM_VOID_P scal_cipher_getIVsizeDesc(const scdesc_t* desc){
+       return (PGM_VOID_P)pgm_read_word(&(desc->valid_ivsize_desc));
+}
+
+
diff --git a/scal/scal-basic.h b/scal/scal-basic.h
new file mode 100644 (file)
index 0000000..890a73d
--- /dev/null
@@ -0,0 +1,41 @@
+/* scal-basic.h */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2011  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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SCAL_BASIC_H_
+#define SCAL_BASIC_H_
+
+#include <stdlib.h>
+#include <stdint.h>
+#include "streamcipher_descriptor.h"
+#include "keysize_descriptor.h"
+#include <avr/pgmspace.h>
+
+uint8_t scal_cipher_init(const scdesc_t* cipher_descriptor,
+                         const void* key, uint16_t keysize_b,
+                         const void* iv,  uint16_t ivsize_b, scgen_ctx_t* ctx);
+void scal_cipher_free(scgen_ctx_t* ctx);
+uint8_t scal_cipher_gen_byte(scgen_ctx_t* ctx);
+void scal_cipher_gen_block(void* block, scgen_ctx_t* ctx);
+void scal_cipher_gen_fillblock(void* block, uint16_t blocksize_B, scgen_ctx_t* ctx);
+uint16_t scal_cipher_getBlocksize_b(const scdesc_t* desc);
+PGM_VOID_P scal_cipher_getKeysizeDesc(const scdesc_t* desc);
+PGM_VOID_P scal_cipher_getIVsizeDesc(const scdesc_t* desc);
+
+
+#endif /* SCAL_BASIC_H_ */
diff --git a/scal/scal-nessie.c b/scal/scal-nessie.c
new file mode 100644 (file)
index 0000000..26105c0
--- /dev/null
@@ -0,0 +1,265 @@
+/* scal-nessie.c */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2006-2011 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 <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdint.h>
+#include <string.h>
+#include "streamcipher_descriptor.h"
+#include "scal-basic.h"
+#include "nessie_common.h"
+#include "memxor.h"
+#include <avr/pgmspace.h>
+
+static const uint8_t normal_hooks[] PROGMEM = {
+               0, 192/64, 256/64, 448/64
+};
+
+static const uint16_t long_hooks[] PROGMEM = {
+               0, 65472/64, 65536/64, 131008/64
+};
+
+static const char stream0_n[] PROGMEM = "stream[0..63]";
+static const char stream1_n[] PROGMEM = "stream[192..255]";
+static const char stream2_n[] PROGMEM = "stream[256..319]";
+static const char stream3_n[] PROGMEM = "stream[448..511]";
+static const char streamX_n[] PROGMEM = "stream[0..511]xored";
+
+static const char* stream_n_str[] PROGMEM = {
+               stream0_n,
+               stream1_n,
+               stream2_n,
+               stream3_n,
+               streamX_n
+};
+
+static const char stream1_l[] PROGMEM = "stream[65472..65535]";
+static const char stream2_l[] PROGMEM = "stream[65536..65599]";
+static const char stream3_l[] PROGMEM = "stream[131008..131071]";
+static const char streamX_l[] PROGMEM = "stream[0..131071]xored";
+
+static const char* stream_l_str[] PROGMEM = {
+               stream0_n,
+               stream1_l,
+               stream2_l,
+               stream3_l,
+               streamX_l
+};
+
+static const uint8_t list_of_keys[][20] PROGMEM = {
+       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+       { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc,
+         0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x00, 0x00, 0x00 },
+       { 0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab, 0x89, 0x98, 0xba,
+         0xdc, 0xfe, 0x10, 0x32, 0x54, 0x76, 0xc3, 0xd2, 0xe1, 0xf0 }
+};
+
+static const uint8_t list_of_ivs[][4] PROGMEM = {
+       { 0x00, 0x00, 0x00, 0x00 },
+       { 0x01, 0x01, 0x01, 0x01 },
+       { 0x01, 0x35, 0x77, 0xaf }
+};
+
+static
+void normal_block(scgen_ctx_t *ctx){
+       uint8_t xor_block[64];
+       uint8_t block[64];
+       PGM_VOID_P hook_ptr = normal_hooks;
+       PGM_VOID_P hook_str_ptr = stream_n_str;
+       char str[21];
+       uint8_t i;
+
+       memset(xor_block, 0, 64);
+       for(i=0; i<=448/64; ++i){
+               scal_cipher_gen_fillblock(block, 64, ctx);
+               memxor(xor_block, block, 64);
+               if(i==pgm_read_byte(hook_ptr)){
+                       hook_ptr = (uint8_t*)hook_ptr + 1;
+                       strcpy_P(str, (PGM_VOID_P)pgm_read_word(hook_str_ptr));
+                       hook_str_ptr = (uint8_t*)hook_str_ptr + 2;
+                       nessie_print_item(str, block, 64);
+               }
+       }
+       strcpy_P(str, (PGM_VOID_P)pgm_read_word(hook_str_ptr));
+       nessie_print_item(str, xor_block, 64);
+}
+
+static
+void long_block(scgen_ctx_t *ctx){
+       uint8_t xor_block[64];
+       uint8_t block[64];
+       PGM_VOID_P hook_ptr = long_hooks;
+       PGM_VOID_P hook_str_ptr = stream_l_str;
+       char str[24];
+       uint16_t i;
+
+       memset(xor_block, 0, 64);
+       for(i=0; i<=131008/64; ++i){
+               scal_cipher_gen_fillblock(block, 64, ctx);
+               memxor(xor_block, block, 64);
+               if(i==pgm_read_word(hook_ptr)){
+                       hook_ptr = (uint8_t*)hook_ptr + 2;
+                       strcpy_P(str, (PGM_VOID_P)pgm_read_word(hook_str_ptr));
+                       hook_str_ptr =  (uint8_t*)hook_str_ptr + 2;
+                       nessie_print_item(str, block, 64);
+               }
+       }
+       strcpy_P(str, (PGM_VOID_P)pgm_read_word(hook_str_ptr));
+       nessie_print_item(str, xor_block, 64);
+}
+
+void scal_nessie_stream_run(const scdesc_t *desc, uint16_t keysize_b, uint16_t ivsize_b){
+       uint8_t name_length = strlen_P((PGM_VOID_P)pgm_read_word(&(desc->name)));
+       char name[name_length+1];
+       memcpy_P(name, (PGM_VOID_P)pgm_read_word(&(desc->name)), name_length+1);
+
+       uint8_t key[(keysize_b+7)/8];
+       uint8_t iv[(ivsize_b+7)/8];
+       uint16_t v;
+       scgen_ctx_t ctx;
+       nessie_print_header(name, keysize_b, 0, 0, 0, ivsize_b?ivsize_b:((uint16_t)-1));
+
+       memset(iv, 0, (ivsize_b+7)/8);
+       memset(key, 0, (keysize_b+7)/8);
+       /***  Test SET 1 ***/
+       nessie_print_setheader(1);
+       for(v=0;v<keysize_b; ++v){
+               nessie_print_set_vector(1,v);
+               key[v/8] |= 0x80>>(v&7);
+               nessie_print_item("key", key, (keysize_b+7)/8);
+               if(ivsize_b){
+                       nessie_print_item("IV", iv, (ivsize_b+7)/8);
+               }
+               scal_cipher_init(desc, key, keysize_b, iv, ivsize_b, &ctx);
+               normal_block(&ctx);
+               key[v/8] = 0;
+               scal_cipher_free(&ctx);
+       }
+       /***  Test SET 2 ***/
+       nessie_print_setheader(2);
+       for(v=0;v<256; ++v){
+               nessie_print_set_vector(2,v);
+               memset(key, v&0xff, (keysize_b+7)/8);
+               nessie_print_item("key", key, (keysize_b+7)/8);
+               if(ivsize_b){
+                       nessie_print_item("IV", iv, (ivsize_b+7)/8);
+               }
+               scal_cipher_init(desc, key, keysize_b, iv, ivsize_b, &ctx);
+               normal_block(&ctx);
+               scal_cipher_free(&ctx);
+       }
+       /***  Test SET 3 ***/
+       nessie_print_setheader(3);
+       for(v=0;v<256; ++v){
+               uint8_t i;
+               nessie_print_set_vector(3,v);
+               for(i=0; i<((keysize_b+7)/8); ++i){
+                       key[i]=(i+v)&0xff;
+               }
+               nessie_print_item("key", key, (keysize_b+7)/8);
+               if(ivsize_b){
+                       nessie_print_item("IV", iv, (ivsize_b+7)/8);
+               }
+               scal_cipher_init(desc, key, keysize_b, iv, ivsize_b, &ctx);
+               normal_block(&ctx);
+               scal_cipher_free(&ctx);
+       }
+       /***  Test SET 4 ***/
+       nessie_print_setheader(4);
+       for(v=0;v<4; ++v){
+               uint8_t i;
+               nessie_print_set_vector(4,v);
+               for(i=0; i<((keysize_b+7)/8); ++i){
+                       key[i]=(i*0x53+v*5)&0xff;
+               }
+               nessie_print_item("key", key, (keysize_b+7)/8);
+               if(ivsize_b){
+                       nessie_print_item("IV", iv, (ivsize_b+7)/8);
+               }
+               scal_cipher_init(desc, key, keysize_b, iv, ivsize_b, &ctx);
+               long_block(&ctx);
+               scal_cipher_free(&ctx);
+       }
+       if(ivsize_b==0){ /* exit if there is no IV */
+               nessie_print_footer();
+               return;
+       }
+       /***  Test SET 5 ***/
+       nessie_print_setheader(5);
+       memset(key, 0, (keysize_b+7)/8);
+       for(v=0;v<ivsize_b; ++v){
+               nessie_print_set_vector(5,v);
+               iv[v/8] |= 0x80>>(v&7);
+               nessie_print_item("key", key, (keysize_b+7)/8);
+               nessie_print_item("IV", iv, (ivsize_b+7)/8);
+               scal_cipher_init(desc, key, keysize_b, iv, ivsize_b, &ctx);
+               normal_block(&ctx);
+               scal_cipher_free(&ctx);
+               iv[v/8] = 0;
+       }
+       /***  Test SET 6 ***/
+       nessie_print_setheader(6);
+       for(v=0;v<4; ++v){
+               uint8_t i;
+               nessie_print_set_vector(6,v);
+               for(i=0; i<((keysize_b+7)/8); ++i){
+                       key[i]=(i*0x53+v*5)&0xff;
+               }
+               for(i=0; i<((ivsize_b+7)/8); ++i){
+                       iv[i]=(i*0x67+v*9+13)&0xff;
+               }
+               nessie_print_item("key", key, (keysize_b+7)/8);
+               nessie_print_item("IV", iv, (ivsize_b+7)/8);
+               scal_cipher_init(desc, key, keysize_b, iv, ivsize_b, &ctx);
+               long_block(&ctx);
+               scal_cipher_free(&ctx);
+       }
+       /***  Test SET 7 ***/
+       nessie_print_setheader(7);
+       uint8_t u;
+       for(v=0;v<3; ++v){
+               for(u=0; u<3; ++u){
+                       uint8_t i;
+                       nessie_print_set_vector(7,v*3+u);
+                       for(i=0; i<((keysize_b+7)/8); ++i){
+                               key[i]=pgm_read_byte(list_of_keys+20*v+(i%20));
+                       }
+                       for(i=0; i<((ivsize_b+7)/8); ++i){
+                               key[i]=pgm_read_byte(list_of_keys+4*u+(i%4));
+                       }
+               }
+               nessie_print_item("key", key, (keysize_b+7)/8);
+               nessie_print_item("IV", iv, (ivsize_b+7)/8);
+               scal_cipher_init(desc, key, keysize_b, iv, ivsize_b, &ctx);
+               long_block(&ctx);
+               scal_cipher_free(&ctx);
+       }
+       nessie_print_footer();
+}
+
+void scal_nessie_run(const scdesc_t* desc){
+       uint16_t keysizes_count, ivsizes_count,i,j;
+       uint16_t *keysizes=NULL, *ivsizes=NULL;
+       keysizes_count = get_keysizes((PGM_VOID_P)pgm_read_word(&(desc->valid_keysize_desc)), &keysizes);
+       ivsizes_count = get_keysizes((PGM_VOID_P)pgm_read_word(&(desc->valid_ivsize_desc)), &ivsizes);
+       for(i=0; i<keysizes_count; ++i){
+               for(j=0; j<ivsizes_count; ++j){
+                       scal_nessie_stream_run(desc, keysizes[i], ivsizes[j]);
+               }
+       }
+}
diff --git a/scal/scal-nessie.h b/scal/scal-nessie.h
new file mode 100644 (file)
index 0000000..47b6680
--- /dev/null
@@ -0,0 +1,29 @@
+/* scal-nessie.h */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2011 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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SCALNESSIE_H_
+#define SCALNESSIE_H_
+
+#include <stdint.h>
+#include <streamcipher_descriptor.h>
+
+void scal_nessie_stream_run(const scdesc_t *desc, uint16_t keysize_b, uint16_t ivsize_b);
+void scal_nessie_run(const scdesc_t* desc);
+
+#endif /* SCALNESSIE_H_ */
diff --git a/scal/scal_arcfour.c b/scal/scal_arcfour.c
new file mode 100644 (file)
index 0000000..9303714
--- /dev/null
@@ -0,0 +1,56 @@
+/* scal_arcfour.c */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2011  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 <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+#include <avr/pgmspace.h>
+#include <stdint.h>
+#include "streamcipher_descriptor.h"
+#include "keysize_descriptor.h"
+
+#include "arcfour.h"
+
+const char arcfour_str[]   PROGMEM = "ARCFOUR";
+
+const uint8_t arcfour_keysize_desc[] PROGMEM = {
+               KS_TYPE_ARG_RANGE, KS_INT(8), KS_INT(2040), KS_INT(8),  KS_INT(0),
+        KS_TYPE_TERMINATOR   };
+
+const uint8_t arcfour_ivsize_desc[] PROGMEM = {
+               KS_TYPE_LIST, 1, KS_INT(0),
+        KS_TYPE_TERMINATOR   };
+
+const scdesc_t arcfour_desc PROGMEM = {
+               SCDESC_TYPE_BLOCKCIPHER,      /* abstraction layer type designator */
+               SC_INIT_TYPE_3|SC_GEN_TYPE_1, /* flags*/
+               arcfour_str,                  /* name string pointer */
+               sizeof(arcfour_ctx_t),        /* size of context */
+               8,                            /* blocksize */
+               {(void_fpt)arcfour_init},     /* init function pointer */
+               {(void_fpt)arcfour_gen},      /* key stream generator function pointer */
+               {(void_fpt)NULL},             /* key stream generator for random access function pointer */
+               (sc_free_fpt)NULL,                /* free function pointer */
+               arcfour_keysize_desc,         /* key size descriptor pointer */
+               arcfour_ivsize_desc           /* iv size descriptor pointer */
+};
+
+
+
+
+
+
diff --git a/scal/scal_arcfour.h b/scal/scal_arcfour.h
new file mode 100644 (file)
index 0000000..512e90d
--- /dev/null
@@ -0,0 +1,27 @@
+/* scal_arcfour.h */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2011 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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SCAL_ARCFOUR_H_
+#define SCAL_ARCFOUR_H_
+
+#include "streamcipher_descriptor.h"
+
+extern const scdesc_t arcfour_desc;
+
+#endif /* SCAL_ARCFOUR_H_ */
index e66a1d4b13957caa0b4da1100f2674453730d0f1..760479b21bae2a81532f6c337f170d03eaba94dc 100644 (file)
 #include "debug.h"
 
 #include <arcfour.h>
-#include "nessie_stream_test.h"
 #include "cli.h"
 #include "performance_test.h"
 
+#include "scal_arcfour.h"
+#include "scal-basic.h"
+#include "scal-nessie.h"
+
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
@@ -44,18 +47,8 @@ void arcfour_genctx_dummy(uint8_t* key, uint16_t keysize, void* ctx){
        arcfour_init(key, (uint8_t)((keysize+7)/8), ctx);
 }
 
-
-
 void testrun_nessie_arcfour(void){
-       nessie_stream_ctx.outsize_b = 8; /* actually unused */
-       nessie_stream_ctx.keysize_b = 128; /* this is theone we have refrence vectors for */
-       nessie_stream_ctx.ivsize_b = (uint16_t)-1;
-       nessie_stream_ctx.name = algo_name;
-       nessie_stream_ctx.ctx_size_B = sizeof(arcfour_ctx_t);
-       nessie_stream_ctx.cipher_genctx = (nessie_stream_genctx_fpt)arcfour_genctx_dummy;
-       nessie_stream_ctx.cipher_enc = (nessie_stream_genenc_fpt)arcfour_gen;
-       
-       nessie_stream_run();    
+       scal_nessie_run(&arcfour_desc);
 }
 
 void testrun_performance_arcfour(void){
index 94e19f51701a8aef71a5727cd4043b26c7c38b62..8798dd2b51735464cfcdcaf60db1b609516b593f 100644 (file)
@@ -170,8 +170,7 @@ void nessie_print_header(char* name,
        if(ivsize_b){
                if(ivsize_b==(uint16_t)-1){
                        NESSIE_PUTSTR_P(PSTR("\r\nNo initial value (IV) mode"));
-               }
-               {
+               }else{
                        NESSIE_PUTSTR_P(PSTR("\r\nIV size: "));
                        utoa(ivsize_b, str, 10);
                        NESSIE_PUTSTR(str);
index 751669b6a4ac5451865b495e969c03f94171de4a..662259da15d44a48f686665e9362148f2aa0cb4c 100644 (file)
 #include <string.h>
 #include "nessie_stream_test.h"
 #include "nessie_common.h"
+#include "memxor.h"
 
 nessie_stream_ctx_t nessie_stream_ctx;
 
 
 #define BLOCKSIZE_B 64
 
-static
-void memxor(void* dest, void* src, uint8_t length){
-       while(length--){
-               *((uint8_t*)dest) ^= *((uint8_t*)src);
-               dest = (uint8_t*)dest +1;
-               src  = (uint8_t*)src +1;
-       }
-}
-
 
 static 
 void nessie_gen_block(void* ctx, uint8_t* block){