]> git.cryptolib.org Git - avr-crypto-lib.git/commitdiff
noekeon optimized++
authorbg <bg@b1d182e4-1ff8-0310-901f-bddb46175740>
Tue, 5 Aug 2008 21:19:55 +0000 (21:19 +0000)
committerbg <bg@b1d182e4-1ff8-0310-901f-bddb46175740>
Tue, 5 Aug 2008 21:19:55 +0000 (21:19 +0000)
Doxyfile
Makefile
grain.h
main.dox
memxor.c
memxor.h
noekeon_asm.S
sha256.h

index 3eed9fc0c9c1c91fbaaa2434841e938875ea9a0c..527caaaba8e890bff73f86a3f97a372a9a4ad93a 100644 (file)
--- a/Doxyfile
+++ b/Doxyfile
@@ -10,7 +10,7 @@ CREATE_SUBDIRS         = NO
 OUTPUT_LANGUAGE        = English
 USE_WINDOWS_ENCODING   = NO
 BRIEF_MEMBER_DESC      = YES
-REPEAT_BRIEF           = YES
+REPEAT_BRIEF           = NO
 ABBREVIATE_BRIEF       = "The $name class" \
                          "The $name widget" \
                          "The $name file" \
@@ -22,7 +22,7 @@ ABBREVIATE_BRIEF       = "The $name class" \
                          a \
                          an \
                          the
-ALWAYS_DETAILED_SEC    = NO
+ALWAYS_DETAILED_SEC    = YES
 INLINE_INHERITED_MEMB  = NO
 FULL_PATH_NAMES        = YES
 STRIP_FROM_PATH        = /home/bg/workspace/micro-crypt/
@@ -30,11 +30,12 @@ STRIP_FROM_INC_PATH    =
 SHORT_NAMES            = NO
 JAVADOC_AUTOBRIEF      = NO
 MULTILINE_CPP_IS_BRIEF = NO
-DETAILS_AT_TOP         = NO
+DETAILS_AT_TOP         = YES
 INHERIT_DOCS           = YES
 SEPARATE_MEMBER_PAGES  = NO
 TAB_SIZE               = 8
-ALIASES                = "license=\par License:\n" "email=\par E-Mail:\n" 
+ALIASES                = "license=\par License:\n" \
+                         "email=\par E-Mail:\n"
 OPTIMIZE_OUTPUT_FOR_C  = YES
 OPTIMIZE_OUTPUT_JAVA   = NO
 BUILTIN_STL_SUPPORT    = NO
@@ -43,13 +44,13 @@ SUBGROUPING            = YES
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
-EXTRACT_ALL            = YES
-EXTRACT_PRIVATE        = YES
-EXTRACT_STATIC         = YES
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
 EXTRACT_LOCAL_CLASSES  = YES
 EXTRACT_LOCAL_METHODS  = NO
-HIDE_UNDOC_MEMBERS     = NO
-HIDE_UNDOC_CLASSES     = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
 HIDE_FRIEND_COMPOUNDS  = NO
 HIDE_IN_BODY_DOCS      = NO
 INTERNAL_DOCS          = NO
@@ -83,47 +84,14 @@ WARN_LOGFILE           =
 # configuration options related to the input files
 #---------------------------------------------------------------------------
 INPUT                  = /home/bg/workspace/micro-crypt
-FILE_PATTERNS          = *.c \
-                         *.cc \
-                         *.cxx \
-                         *.cpp \
-                         *.c++ \
-                         *.d \
-                         *.java \
-                         *.ii \
-                         *.ixx \
-                         *.ipp \
-                         *.i++ \
-                         *.inl \
-                         *.h \
-                         *.hh \
-                         *.hxx \
-                         *.hpp \
-                         *.h++ \
-                         *.idl \
-                         *.odl \
-                         *.cs \
-                         *.php \
-                         *.php3 \
-                         *.inc \
-                         *.m \
-                         *.mm \
+FILE_PATTERNS          = *.h \
                          *.dox \
-                         *.py \
-                         *.C \
-                         *.CC \
-                         *.C++ \
-                         *.II \
-                         *.I++ \
                          *.H \
                          *.HH \
                          *.H++ \
-                         *.CS \
-                         *.PHP \
-                         *.PHP3 \
-                         *.M \
-                         *.MM \
-                         *.PY
+                         RECURSIVE \
+                         = \
+                         NO
 RECURSIVE              = NO
 EXCLUDE                = 
 EXCLUDE_SYMLINKS       = NO
@@ -138,14 +106,14 @@ FILTER_SOURCE_FILES    = NO
 #---------------------------------------------------------------------------
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
-SOURCE_BROWSER         = YES
+SOURCE_BROWSER         = NO
 INLINE_SOURCES         = NO
 STRIP_CODE_COMMENTS    = YES
-REFERENCED_BY_RELATION = YES
-REFERENCES_RELATION    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
 REFERENCES_LINK_SOURCE = YES
 USE_HTAGS              = NO
-VERBATIM_HEADERS       = YES
+VERBATIM_HEADERS       = NO
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
@@ -170,7 +138,7 @@ BINARY_TOC             = NO
 TOC_EXPAND             = NO
 DISABLE_INDEX          = NO
 ENUM_VALUES_PER_LINE   = 4
-GENERATE_TREEVIEW      = NO
+GENERATE_TREEVIEW      = YES
 TREEVIEW_WIDTH         = 250
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
@@ -253,8 +221,8 @@ COLLABORATION_GRAPH    = YES
 GROUP_GRAPHS           = YES
 UML_LOOK               = NO
 TEMPLATE_RELATIONS     = NO
-INCLUDE_GRAPH          = YES
-INCLUDED_BY_GRAPH      = YES
+INCLUDE_GRAPH          = NO
+INCLUDED_BY_GRAPH      = NO
 CALL_GRAPH             = NO
 CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = NO
index 00d1f5f3f935dbcc5898a9351c2f23be7fe9913b..06b4475ce5af2087ca46fe5092e43152c866c046 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -40,7 +40,7 @@ all: $(foreach algo, $(ALGORITHMS), $(algo)_OBJ)
 
 define MAIN_OBJ_TEMPLATE
 $(2): $(3) $(4)
-       @echo "[gcc]: $$@"
+       @echo "[ld]: $$@"
 #      echo $$^
        @$(CC) $(CFLAGS) $(LDFLAGS)$(patsubst %.elf,%.map,$(2)) -o \
        $(2) \
@@ -207,25 +207,31 @@ docu:
 # Rules for building the .text rom images
 
 %.hex: %.elf
-       $(OBJCOPY) -j .text -j .data -O ihex $< $@
+       @echo "[objcopy]: $@"
+       @$(OBJCOPY) -j .text -j .data -O ihex $< $@
 
 %.srec: %.elf
-       $(OBJCOPY) -j .text -j .data -O srec $< $@
+       @echo "[objcopy]: $@"
+       @$(OBJCOPY) -j .text -j .data -O srec $< $@
 
 %.bin: %.elf
-       $(OBJCOPY) -j .text -j .data -O binary $< $@
+       @echo "[objcopy]: $@"
+       @$(OBJCOPY) -j .text -j .data -O binary $< $@
 
 # Rules for building the .eeprom rom images
 
 
 %_eeprom.hex: %.elf
-       $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@
+       @echo "[objcopy]: $@"
+       @$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@
 
 %_eeprom.srec: %.elf
-       $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@
+       @echo "[objcopy]: $@"
+       @$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@
 
 %_eeprom.bin: %.elf
-       $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O binary $< $@
+       @echo "[objcopy]: $@"
+       @$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O binary $< $@
        
        
 # Every thing below here is used by avr-libc's build system and can be ignored
diff --git a/grain.h b/grain.h
index 508c1d1c9ca8055e1ae51d8cdef694ac7aecb45b..c8a3d7f8b87ab8d6bb66a7cc58fb2dae7c063034 100644 (file)
--- a/grain.h
+++ b/grain.h
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
-/**
- * 
- * author: Daniel Otte
- * email:  daniel.otte@rub.de
- * license: GPLv3
- * 
+
+/** \file grain.h
+ * \author  Daniel Otte
+ * \email   daniel.otte@rub.de
+ * \license GPLv3 or later
+ * \brief implementation of the Grain streamcipher
  */
 
 #ifndef GRAIN_H_
index 199a398cf63e8a1e9b77516c38fdbb1d3b419aef..54db5359e15d2b861b38b9e805e967ec5423fb33 100644 (file)
--- a/main.dox
+++ b/main.dox
    
  \subsection Hashes Hashes
   A Hash function produces a fixed length output (called hash value or message
-  digest) from a variable length message input. 
+  digest) from a variable length message input. Most hash algorithms have a 
+  state which is updated by the hash core function from a block of fixed size 
+  from the message. A "lastBlock" function is used to add the last block which
+  is not required to have the fixed length. An addition function is then used
+  to transform the state into the final hash value.
   
   Implemented hash functions:
    - MD5 (md5.h)
    - SHA-256 (sha256.h)
    
  \subsection MACs Message-Authentification-Codes (MACs)
+  Message-Authentification-Codes work like hash function but take an additional
+  key. The produced output is also called MAC and is highly dependant on the
+  key. They can be thought of symmetric signatures.
+  
+  Implemented MAC functions:
    - HMAC-SHA-1 (hmac-sha1.h)
    - HMAC-SHA-256 (hmac-sha256.h)
 
  \subsection PRNGs Pseudo-Random-Number-Generators (PRNGs)
+  PRNGs produce pseudo random output determinated by the input. They aim to 
+  produce an arbitrary length of good cryptographically secure random if the
+  input has enough entropy. PRNGs differ in the way they accept input. Some
+  are seeded only once, other (like the implemented) maintain an entropy pool
+  to which input can be added at virtually any time.
+  
+  Implemented PRNGs:
    - Entropium (entropium.h)
    
 */
\ No newline at end of file
index 1fbde5a526777e3230e8f5b5448da19fbc115bb6..7485b3eebb1fbc8612f5099a6dd13f33f0c63c87 100644 (file)
--- a/memxor.c
+++ b/memxor.c
@@ -1,8 +1,12 @@
 #include <stdint.h>
 
-void memxor(void * dest, const void * src, uint16_t n){
+#include "memxor.h"
+
+void memxor(void* dest, const void* src, uint16_t n){
   while(n--){
-    ((uint8_t*)dest)[n] ^= ((uint8_t*)src)[n];
+    *((uint8_t*)dest) ^= *((uint8_t*)src);
+    dest = (uint8_t*)dest +1;
+    src  = (uint8_t*)src  +1;
   }
 }
 
index d84f33559bcd07b7a7ed14a7f132d7fd1519d773..a62a616874f82085f1041af1014cba3c84df03a0 100644 (file)
--- a/memxor.h
+++ b/memxor.h
@@ -2,6 +2,6 @@
 #define MEMXOR_H_
 #include <stdint.h>
 
-void memxor(void * dest, const void * src, uint16_t n);
+void memxor(void* dest, const void* src, uint16_t n);
 
 #endif
index 8ebcc93c6578ce3b13698cf4e9bff2cf084c7278..146cbb4a4d1f3f11a0f4fd1affc86a84783f888d 100644 (file)
        clr r1
 .endm
 
+push_all_func:
+       pop r31
+       pop r30
+       push_all
+       ijmp
+
+pop_all_func:
+    pop r31
+    pop r30
+    pop_all
+    ijmp
+
 .macro xchg a b
        eor \a, \b
        eor \b, \a
@@ -275,6 +287,7 @@ theta:
        ret
 
 /******************************************************************************/
+#ifndef NOEKEON_NO_ENC
 ; === noekeon_enc ===
 ;
 ;  param1: pointer to buffer/state (r24,r25)
@@ -282,7 +295,7 @@ theta:
 ;
 .global noekeon_enc
 noekeon_enc:
-       push_all
+       rcall push_all_func
        /* load state */
        movw r26, r22
        ldi r28, 2
@@ -312,7 +325,7 @@ noekeon_enc:
        lpm r0, Z
        push r0
 3:
-       call round /* pops rc2 & rc1 */
+       rcall round /* pops rc2 & rc1 */
        pop r22
        dec r22
        push r22
@@ -322,7 +335,7 @@ noekeon_enc:
 
        ldi r22, 0xD4
        eor state0_3, r22
-       call theta
+       rcall theta
 
        pop r31
        pop r30
@@ -335,10 +348,13 @@ noekeon_enc:
        dec r22
        brne 1b
        
-       pop_all
+       rcall pop_all_func
        ret
+#endif
 /******************************************************************************/
 /******************************************************************************/
+#ifndef NOEKEON_NO_DEC
+
 ; === noekeon_dec ===
 ;
 ;  param1: pointer to buffer/state (r24,r25)
@@ -346,7 +362,7 @@ noekeon_enc:
 ;
 .global noekeon_dec
 noekeon_dec:
-       push_all
+       rcall push_all_func
        /* allocate 16 bytes on the stack */
        in r30, _SFR_IO_ADDR(SPL)
        in r31, _SFR_IO_ADDR(SPH)
@@ -377,7 +393,7 @@ noekeon_dec:
 
        movw r26, r30
        sbiw r26, 16 /* set X back to begining of stack key */
-       call theta
+       rcall theta
        
        /* mov state to stackkey */
        clr r29
@@ -419,7 +435,7 @@ noekeon_dec:
        push r0
        push r1
 3:
-       call round /* pops rc2 & rc1 */
+       rcall round /* pops rc2 & rc1 */
        pop r22
        dec r22
        push r22
@@ -427,7 +443,7 @@ noekeon_dec:
 ;----
        pop r22
 
-       call theta
+       rcall theta
        ldi r22, 0x80
        eor state0_3, r22
        
@@ -450,16 +466,18 @@ write_state_back:
        adiw r30, 16 
        out  _SFR_IO_ADDR(SPH), r31
        out  _SFR_IO_ADDR(SPL), r30
-       pop_all
+       rcall pop_all_func
        ret
+#endif
 /******************************************************************************/
        
+       
 round: 
        pop r24
        pop r25
        pop r1
        eor state0_3, r1
-       call theta
+       rcall theta
        pop r1
        eor state0_3, r1
        push r25
@@ -467,9 +485,9 @@ round:
 pi_gamma_pi:
        ldi r30, pm_lo8(bigendian_rotl32)
        ldi r31, pm_hi8(bigendian_rotl32)
-       call pi
+       rcall pi
        /* pi1 done; now gamma */
-       call gamma_1
+       rcall gamma_1
        /* a[0] <-> a[3] */
        xchg state0_0, state3_0
        xchg state0_1, state3_1
@@ -480,10 +498,10 @@ pi_gamma_pi:
        op32 eor, state2, state1
        op32 eor, state2, state3
 
-       call gamma_1
+       rcall gamma_1
        ldi r30, pm_lo8(bigendian_rotr32)
        ldi r31, pm_hi8(bigendian_rotr32)
-       call pi
+       rcall pi
        ret
        
 gamma_1:
@@ -573,6 +591,9 @@ void noekeon_init(void* key, noekeon_ctx_t* ctx){
        noekeon_enc(ctx, nullv);
 }
 */
+
+#ifndef NOEKEON_NO_INIT
+
 .global noekeon_init
 noekeon_init:
 ; === noekeon_init ===
@@ -606,7 +627,7 @@ noekeon_init:
        
        sbiw r26, 16
        movw r24, r26
-       call noekeon_enc
+       rcall noekeon_enc
        
        in r30, _SFR_IO_ADDR(SPL)
        in r31, _SFR_IO_ADDR(SPH)
@@ -615,6 +636,6 @@ noekeon_init:
        out  _SFR_IO_ADDR(SPL), r30     
        ret
        
-
+#endif
 
 
index ec1dac0045d73b61b37c486912d6010b94677cfe..ec43488b7acca2179030622ec1fb653d580e00cd 100644 (file)
--- a/sha256.h
+++ b/sha256.h
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 /**
- * \file               sha256-asm.h
- * \author             Daniel Otte 
- * \date               2006-05-16
- * \par License        
- * GPL
+ * \file       sha256.h
+ * \author  Daniel Otte 
+ * \date    2006-05-16
+ * \license    GPLv3 or later
  * 
  */
 
 
 #include <stdint.h>
 
+/** \def SHA256_HASH_BITS
+ * defines the size of a SHA-256 hash value in bits
+ */
+
+/** \def SHA256_HASH_BYTES
+ * defines the size of a SHA-256 hash value in bytes
+ */
+
+/** \def SHA256_BLOCK_BITS
+ * defines the size of a SHA-256 input block in bits
+ */
+
+/** \def SHA256_BLOCK_BYTES
+ * defines the size of a SHA-256 input block in bytes
+ */
 
 #define SHA256_HASH_BITS  256
 #define SHA256_HASH_BYTES (SHA256_HASH_BITS/8)
 #define SHA256_BLOCK_BITS 512
 #define SHA256_BLOCK_BYTES (SHA256_BLOCK_BITS/8)
 
-/**
- * \brief sha256 context type
+/** \typedef sha256_ctx_t
+ * \brief SHA-256 context type
  * 
+ * A variable of this type may hold the state of a SHA-256 hashing process
  */
 typedef struct {
        uint32_t h[8];
        uint64_t length;
 } sha256_ctx_t;
 
+/** \typedef sha256_hash_t
+ * \brief SHA-256 hash value type
+ * 
+ * A variable of this type may hold the hash value produced by the
+ * sha256_ctx2hash(sha256_hash_t* dest, const sha256_ctx_t* state) function.
+ */
 typedef uint8_t sha256_hash_t[SHA256_HASH_BYTES];
 
+/** \fn void sha256_init(sha256_ctx_t *state)
+ * \brief initialise a SHA-256 context
+ * 
+ * This function sets a ::sha256_ctx_t to the initial values for hashing.
+ * \param state pointer to the SHA-256 hashing context
+ */
 void sha256_init(sha256_ctx_t *state);
 
-void sha256_nextBlock (sha256_ctx_t *state, const void* block);
-void sha256_lastBlock(sha256_ctx_t *state, const void* block, uint16_t length_b);
+/** \fn void sha256_nextBlock (sha256_ctx_t* state, const void* block)
+ * \brief update the context with a given block
+ * 
+ * This function updates the SHA-256 hash context by processing the given block
+ * of fixed length.
+ * \param state pointer to the SHA-256 hash context
+ * \param block pointer to the block of fixed length (512 bit = 64 byte)
+ */
+void sha256_nextBlock (sha256_ctx_t* state, const void* block);
 
-void sha256_ctx2hash(sha256_hash_t *dest, const sha256_ctx_t *state);
+/** \fn void sha256_lastBlock(sha256_ctx_t* state, const void* block, uint16_t length_b)
+ * \brief finalize the context with the given block 
+ * 
+ * This function finalizes the SHA-256 hash context by processing the given block
+ * of variable length.
+ * \param state pointer to the SHA-256 hash context
+ * \param block pointer to the block of fixed length (512 bit = 64 byte)
+ * \param length_b the length of the block in bits
+ */
+void sha256_lastBlock(sha256_ctx_t* state, const void* block, uint16_t length_b);
 
-/*
- * length in bits!
+/** \fn void sha256_ctx2hash(sha256_hash_t* dest, const sha256_ctx_t* state)
+ * \brief convert the hash state into the hash value
+ * This function reads the context and writes the hash value to the destination
+ * \param dest pointer to the location where the hash value should be written
+ * \param state pointer to the SHA-256 hash context
  */
-void sha256(sha256_hash_t *dest, const void* msg, uint32_t length_b);
-uint32_t change_endian32(uint32_t x);
+void sha256_ctx2hash(sha256_hash_t* dest, const sha256_ctx_t* state);
 
+/** \fn void sha256(sha256_hash_t* dest, const void* msg, uint32_t length_b)
+ * \brief simple SHA-256 hashing function for direct hashing
+ * 
+ * This function automaticaly hashes a given message of arbitary length with
+ * the SHA-256 hashing algorithm.
+ * \param dest pointer to the location where the hash value is going to be written to
+ * \param msg pointer to the message thats going to be hashed
+ * \param length_b length of the message in bits
+ */
+void sha256(sha256_hash_t* dest, const void* msg, uint32_t length_b);
 
 #endif /*SHA256_H_*/