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
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

View File

@ -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

12
grain.h
View File

@ -16,12 +16,12 @@
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_

View File

@ -40,7 +40,11 @@
\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)
@ -48,10 +52,22 @@
- 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)
*/

View File

@ -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;
}
}

View File

@ -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

View File

@ -68,6 +68,18 @@
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

View File

@ -17,11 +17,10 @@
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
*
*/
@ -33,35 +32,91 @@
#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);
void sha256_ctx2hash(sha256_hash_t *dest, const sha256_ctx_t *state);
/*
* length in bits!
/** \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(sha256_hash_t *dest, const void* msg, uint32_t length_b);
uint32_t change_endian32(uint32_t x);
void sha256_nextBlock (sha256_ctx_t* state, const void* block);
/** \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_*/