noekeon optimized++

This commit is contained in:
bg 2008-08-05 21:19:55 +00:00
parent 11a70cc550
commit 8d79feec50
8 changed files with 172 additions and 102 deletions

View File

@ -10,7 +10,7 @@ CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English OUTPUT_LANGUAGE = English
USE_WINDOWS_ENCODING = NO USE_WINDOWS_ENCODING = NO
BRIEF_MEMBER_DESC = YES BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES REPEAT_BRIEF = NO
ABBREVIATE_BRIEF = "The $name class" \ ABBREVIATE_BRIEF = "The $name class" \
"The $name widget" \ "The $name widget" \
"The $name file" \ "The $name file" \
@ -22,7 +22,7 @@ ABBREVIATE_BRIEF = "The $name class" \
a \ a \
an \ an \
the the
ALWAYS_DETAILED_SEC = NO ALWAYS_DETAILED_SEC = YES
INLINE_INHERITED_MEMB = NO INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = YES FULL_PATH_NAMES = YES
STRIP_FROM_PATH = /home/bg/workspace/micro-crypt/ STRIP_FROM_PATH = /home/bg/workspace/micro-crypt/
@ -30,11 +30,12 @@ STRIP_FROM_INC_PATH =
SHORT_NAMES = NO SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = NO JAVADOC_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO MULTILINE_CPP_IS_BRIEF = NO
DETAILS_AT_TOP = NO DETAILS_AT_TOP = YES
INHERIT_DOCS = YES INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8 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_FOR_C = YES
OPTIMIZE_OUTPUT_JAVA = NO OPTIMIZE_OUTPUT_JAVA = NO
BUILTIN_STL_SUPPORT = NO BUILTIN_STL_SUPPORT = NO
@ -43,13 +44,13 @@ SUBGROUPING = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Build related configuration options # Build related configuration options
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
EXTRACT_ALL = YES EXTRACT_ALL = NO
EXTRACT_PRIVATE = YES EXTRACT_PRIVATE = NO
EXTRACT_STATIC = YES EXTRACT_STATIC = NO
EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO EXTRACT_LOCAL_METHODS = NO
HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_MEMBERS = YES
HIDE_UNDOC_CLASSES = NO HIDE_UNDOC_CLASSES = YES
HIDE_FRIEND_COMPOUNDS = NO HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO INTERNAL_DOCS = NO
@ -83,47 +84,14 @@ WARN_LOGFILE =
# configuration options related to the input files # configuration options related to the input files
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
INPUT = /home/bg/workspace/micro-crypt INPUT = /home/bg/workspace/micro-crypt
FILE_PATTERNS = *.c \ FILE_PATTERNS = *.h \
*.cc \
*.cxx \
*.cpp \
*.c++ \
*.d \
*.java \
*.ii \
*.ixx \
*.ipp \
*.i++ \
*.inl \
*.h \
*.hh \
*.hxx \
*.hpp \
*.h++ \
*.idl \
*.odl \
*.cs \
*.php \
*.php3 \
*.inc \
*.m \
*.mm \
*.dox \ *.dox \
*.py \
*.C \
*.CC \
*.C++ \
*.II \
*.I++ \
*.H \ *.H \
*.HH \ *.HH \
*.H++ \ *.H++ \
*.CS \ RECURSIVE \
*.PHP \ = \
*.PHP3 \ NO
*.M \
*.MM \
*.PY
RECURSIVE = NO RECURSIVE = NO
EXCLUDE = EXCLUDE =
EXCLUDE_SYMLINKS = NO EXCLUDE_SYMLINKS = NO
@ -138,14 +106,14 @@ FILTER_SOURCE_FILES = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to source browsing # configuration options related to source browsing
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
SOURCE_BROWSER = YES SOURCE_BROWSER = NO
INLINE_SOURCES = NO INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = YES REFERENCED_BY_RELATION = NO
REFERENCES_RELATION = YES REFERENCES_RELATION = NO
REFERENCES_LINK_SOURCE = YES REFERENCES_LINK_SOURCE = YES
USE_HTAGS = NO USE_HTAGS = NO
VERBATIM_HEADERS = YES VERBATIM_HEADERS = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the alphabetical class index # configuration options related to the alphabetical class index
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@ -170,7 +138,7 @@ BINARY_TOC = NO
TOC_EXPAND = NO TOC_EXPAND = NO
DISABLE_INDEX = NO DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 4 ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = NO GENERATE_TREEVIEW = YES
TREEVIEW_WIDTH = 250 TREEVIEW_WIDTH = 250
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the LaTeX output # configuration options related to the LaTeX output
@ -253,8 +221,8 @@ COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES GROUP_GRAPHS = YES
UML_LOOK = NO UML_LOOK = NO
TEMPLATE_RELATIONS = NO TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES INCLUDE_GRAPH = NO
INCLUDED_BY_GRAPH = YES INCLUDED_BY_GRAPH = NO
CALL_GRAPH = NO CALL_GRAPH = NO
CALLER_GRAPH = NO CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = NO GRAPHICAL_HIERARCHY = NO

View File

@ -40,7 +40,7 @@ all: $(foreach algo, $(ALGORITHMS), $(algo)_OBJ)
define MAIN_OBJ_TEMPLATE define MAIN_OBJ_TEMPLATE
$(2): $(3) $(4) $(2): $(3) $(4)
@echo "[gcc]: $$@" @echo "[ld]: $$@"
# echo $$^ # echo $$^
@$(CC) $(CFLAGS) $(LDFLAGS)$(patsubst %.elf,%.map,$(2)) -o \ @$(CC) $(CFLAGS) $(LDFLAGS)$(patsubst %.elf,%.map,$(2)) -o \
$(2) \ $(2) \
@ -207,25 +207,31 @@ docu:
# Rules for building the .text rom images # Rules for building the .text rom images
%.hex: %.elf %.hex: %.elf
$(OBJCOPY) -j .text -j .data -O ihex $< $@ @echo "[objcopy]: $@"
@$(OBJCOPY) -j .text -j .data -O ihex $< $@
%.srec: %.elf %.srec: %.elf
$(OBJCOPY) -j .text -j .data -O srec $< $@ @echo "[objcopy]: $@"
@$(OBJCOPY) -j .text -j .data -O srec $< $@
%.bin: %.elf %.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 # Rules for building the .eeprom rom images
%_eeprom.hex: %.elf %_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 %_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 %_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 # Every thing below here is used by avr-libc's build system and can be ignored

12
grain.h
View File

@ -16,12 +16,12 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/**
* /** \file grain.h
* author: Daniel Otte * \author Daniel Otte
* email: daniel.otte@rub.de * \email daniel.otte@rub.de
* license: GPLv3 * \license GPLv3 or later
* * \brief implementation of the Grain streamcipher
*/ */
#ifndef GRAIN_H_ #ifndef GRAIN_H_

View File

@ -40,7 +40,11 @@
\subsection Hashes Hashes \subsection Hashes Hashes
A Hash function produces a fixed length output (called hash value or message 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: Implemented hash functions:
- MD5 (md5.h) - MD5 (md5.h)
@ -48,10 +52,22 @@
- SHA-256 (sha256.h) - SHA-256 (sha256.h)
\subsection MACs Message-Authentification-Codes (MACs) \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-1 (hmac-sha1.h)
- HMAC-SHA-256 (hmac-sha256.h) - HMAC-SHA-256 (hmac-sha256.h)
\subsection PRNGs Pseudo-Random-Number-Generators (PRNGs) \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) - Entropium (entropium.h)
*/ */

View File

@ -1,8 +1,12 @@
#include <stdint.h> #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--){ 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;
} }
} }

View File

@ -2,6 +2,6 @@
#define MEMXOR_H_ #define MEMXOR_H_
#include <stdint.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 #endif

View File

@ -68,6 +68,18 @@
clr r1 clr r1
.endm .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 .macro xchg a b
eor \a, \b eor \a, \b
eor \b, \a eor \b, \a
@ -275,6 +287,7 @@ theta:
ret ret
/******************************************************************************/ /******************************************************************************/
#ifndef NOEKEON_NO_ENC
; === noekeon_enc === ; === noekeon_enc ===
; ;
; param1: pointer to buffer/state (r24,r25) ; param1: pointer to buffer/state (r24,r25)
@ -282,7 +295,7 @@ theta:
; ;
.global noekeon_enc .global noekeon_enc
noekeon_enc: noekeon_enc:
push_all rcall push_all_func
/* load state */ /* load state */
movw r26, r22 movw r26, r22
ldi r28, 2 ldi r28, 2
@ -312,7 +325,7 @@ noekeon_enc:
lpm r0, Z lpm r0, Z
push r0 push r0
3: 3:
call round /* pops rc2 & rc1 */ rcall round /* pops rc2 & rc1 */
pop r22 pop r22
dec r22 dec r22
push r22 push r22
@ -322,7 +335,7 @@ noekeon_enc:
ldi r22, 0xD4 ldi r22, 0xD4
eor state0_3, r22 eor state0_3, r22
call theta rcall theta
pop r31 pop r31
pop r30 pop r30
@ -335,10 +348,13 @@ noekeon_enc:
dec r22 dec r22
brne 1b brne 1b
pop_all rcall pop_all_func
ret ret
#endif
/******************************************************************************/ /******************************************************************************/
/******************************************************************************/ /******************************************************************************/
#ifndef NOEKEON_NO_DEC
; === noekeon_dec === ; === noekeon_dec ===
; ;
; param1: pointer to buffer/state (r24,r25) ; param1: pointer to buffer/state (r24,r25)
@ -346,7 +362,7 @@ noekeon_enc:
; ;
.global noekeon_dec .global noekeon_dec
noekeon_dec: noekeon_dec:
push_all rcall push_all_func
/* allocate 16 bytes on the stack */ /* allocate 16 bytes on the stack */
in r30, _SFR_IO_ADDR(SPL) in r30, _SFR_IO_ADDR(SPL)
in r31, _SFR_IO_ADDR(SPH) in r31, _SFR_IO_ADDR(SPH)
@ -377,7 +393,7 @@ noekeon_dec:
movw r26, r30 movw r26, r30
sbiw r26, 16 /* set X back to begining of stack key */ sbiw r26, 16 /* set X back to begining of stack key */
call theta rcall theta
/* mov state to stackkey */ /* mov state to stackkey */
clr r29 clr r29
@ -419,7 +435,7 @@ noekeon_dec:
push r0 push r0
push r1 push r1
3: 3:
call round /* pops rc2 & rc1 */ rcall round /* pops rc2 & rc1 */
pop r22 pop r22
dec r22 dec r22
push r22 push r22
@ -427,7 +443,7 @@ noekeon_dec:
;---- ;----
pop r22 pop r22
call theta rcall theta
ldi r22, 0x80 ldi r22, 0x80
eor state0_3, r22 eor state0_3, r22
@ -450,16 +466,18 @@ write_state_back:
adiw r30, 16 adiw r30, 16
out _SFR_IO_ADDR(SPH), r31 out _SFR_IO_ADDR(SPH), r31
out _SFR_IO_ADDR(SPL), r30 out _SFR_IO_ADDR(SPL), r30
pop_all rcall pop_all_func
ret ret
#endif
/******************************************************************************/ /******************************************************************************/
round: round:
pop r24 pop r24
pop r25 pop r25
pop r1 pop r1
eor state0_3, r1 eor state0_3, r1
call theta rcall theta
pop r1 pop r1
eor state0_3, r1 eor state0_3, r1
push r25 push r25
@ -467,9 +485,9 @@ round:
pi_gamma_pi: pi_gamma_pi:
ldi r30, pm_lo8(bigendian_rotl32) ldi r30, pm_lo8(bigendian_rotl32)
ldi r31, pm_hi8(bigendian_rotl32) ldi r31, pm_hi8(bigendian_rotl32)
call pi rcall pi
/* pi1 done; now gamma */ /* pi1 done; now gamma */
call gamma_1 rcall gamma_1
/* a[0] <-> a[3] */ /* a[0] <-> a[3] */
xchg state0_0, state3_0 xchg state0_0, state3_0
xchg state0_1, state3_1 xchg state0_1, state3_1
@ -480,10 +498,10 @@ pi_gamma_pi:
op32 eor, state2, state1 op32 eor, state2, state1
op32 eor, state2, state3 op32 eor, state2, state3
call gamma_1 rcall gamma_1
ldi r30, pm_lo8(bigendian_rotr32) ldi r30, pm_lo8(bigendian_rotr32)
ldi r31, pm_hi8(bigendian_rotr32) ldi r31, pm_hi8(bigendian_rotr32)
call pi rcall pi
ret ret
gamma_1: gamma_1:
@ -573,6 +591,9 @@ void noekeon_init(void* key, noekeon_ctx_t* ctx){
noekeon_enc(ctx, nullv); noekeon_enc(ctx, nullv);
} }
*/ */
#ifndef NOEKEON_NO_INIT
.global noekeon_init .global noekeon_init
noekeon_init: noekeon_init:
; === noekeon_init === ; === noekeon_init ===
@ -606,7 +627,7 @@ noekeon_init:
sbiw r26, 16 sbiw r26, 16
movw r24, r26 movw r24, r26
call noekeon_enc rcall noekeon_enc
in r30, _SFR_IO_ADDR(SPL) in r30, _SFR_IO_ADDR(SPL)
in r31, _SFR_IO_ADDR(SPH) in r31, _SFR_IO_ADDR(SPH)
@ -615,6 +636,6 @@ noekeon_init:
out _SFR_IO_ADDR(SPL), r30 out _SFR_IO_ADDR(SPL), r30
ret ret
#endif

View File

@ -17,11 +17,10 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* \file sha256-asm.h * \file sha256.h
* \author Daniel Otte * \author Daniel Otte
* \date 2006-05-16 * \date 2006-05-16
* \par License * \license GPLv3 or later
* GPL
* *
*/ */
@ -33,35 +32,91 @@
#include <stdint.h> #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_BITS 256
#define SHA256_HASH_BYTES (SHA256_HASH_BITS/8) #define SHA256_HASH_BYTES (SHA256_HASH_BITS/8)
#define SHA256_BLOCK_BITS 512 #define SHA256_BLOCK_BITS 512
#define SHA256_BLOCK_BYTES (SHA256_BLOCK_BITS/8) #define SHA256_BLOCK_BYTES (SHA256_BLOCK_BITS/8)
/** /** \typedef sha256_ctx_t
* \brief sha256 context type * \brief SHA-256 context type
* *
* A variable of this type may hold the state of a SHA-256 hashing process
*/ */
typedef struct { typedef struct {
uint32_t h[8]; uint32_t h[8];
uint64_t length; uint64_t length;
} sha256_ctx_t; } 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]; 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_init(sha256_ctx_t *state);
void sha256_nextBlock (sha256_ctx_t *state, const void* block); /** \fn void sha256_nextBlock (sha256_ctx_t* state, const void* block)
void sha256_lastBlock(sha256_ctx_t *state, const void* block, uint16_t length_b); * \brief update the context with a given block
*
void sha256_ctx2hash(sha256_hash_t *dest, const sha256_ctx_t *state); * 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
* length in bits! * \param block pointer to the block of fixed length (512 bit = 64 byte)
*/ */
void sha256(sha256_hash_t *dest, const void* msg, uint32_t length_b); void sha256_nextBlock (sha256_ctx_t* state, const void* block);
uint32_t change_endian32(uint32_t x);
/** \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);
/** \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_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_*/ #endif /*SHA256_H_*/