From 2e9d9970033ae104abd3e77cbff63f24c68f5189 Mon Sep 17 00:00:00 2001 From: tixiv Date: Fri, 5 Dec 2008 14:17:04 +0000 Subject: [PATCH] prng works (almost..) in simulator now, can compile all animations against simulator --- Makefile | 6 +- animations/gameoflife.c | 6 +- compat/eeprom.h | 18 +++ compat/interrupt.h | 3 + pgmspace.h => compat/pgmspace.h | 0 depend.mk | 15 ++- display_loop.c | 11 ++ random/Makefile | 6 + random/memxor_c.c | 12 ++ random/noekeon.c | 199 ++++++++++++++++++++++++++++++++ random/persistentCounter.c | 4 +- scrolltext/font.h | 2 +- scrolltext/scrolltext3.c | 1 - simulator/Makefile | 2 +- simulator/eeprom.c | 71 ++++++++++++ 15 files changed, 345 insertions(+), 11 deletions(-) create mode 100644 compat/eeprom.h create mode 100644 compat/interrupt.h rename pgmspace.h => compat/pgmspace.h (100%) create mode 100644 random/memxor_c.c create mode 100644 random/noekeon.c create mode 100644 simulator/eeprom.c diff --git a/Makefile b/Makefile index 983f460..ac0a38a 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,7 @@ ifneq ($(MAKECMDGOALS),mrproper) ifneq ($(MAKECMDGOALS),menuconfig) include $(TOPDIR)/.subdirs --include $(TOPDIR)/.config +include $(TOPDIR)/.config endif # MAKECMDGOALS!=menuconfig endif # MAKECMDGOALS!=mrproper @@ -74,7 +74,7 @@ compile-$(TARGET): compile-subdirs_avr $(TARGET).hex $(TARGET).bin $(TARGET).lst OBJECTS += $(patsubst %.c,./obj_avr/%.o,${SRC}) -SUBDIROBJECTS = $(foreach subdir,$(SUBDIRS_AVR),$(foreach object,$(shell cat $(subdir)/obj_avr/.objects),$(subdir)/$(object))) +SUBDIROBJECTS = $(foreach subdir,$(SUBDIRS_AVR),$(foreach object,$(shell cat $(subdir)/obj_avr/.objects 2>/dev/null),$(subdir)/$(object))) $(TARGET): $(OBJECTS) $(SUBDIROBJECTS) $(CC) $(LDFLAGS) -o $@ $(OBJECTS) $(SUBDIROBJECTS) @@ -115,7 +115,7 @@ compile-subdirs_sim: simulator: autoconf.h .config .subdirs compile-subdirs_sim $(TARGET_SIM) -SUBDIROBJECTS_SIM = $(foreach subdir,$(SUBDIRS_SIM),$(foreach object,$(shell cat $(subdir)/obj_sim/.objects),$(subdir)/$(object))) +SUBDIROBJECTS_SIM = $(foreach subdir,$(SUBDIRS_SIM),$(foreach object,$(shell cat $(subdir)/obj_sim/.objects 2>/dev/null),$(subdir)/$(object))) OBJECTS_SIM = $(patsubst %.c,obj_sim/%.o,${SRC_SIM}) diff --git a/animations/gameoflife.c b/animations/gameoflife.c index 40db870..81e34cf 100644 --- a/animations/gameoflife.c +++ b/animations/gameoflife.c @@ -7,8 +7,10 @@ */ #include -#include -#include /* for debugging */ +#ifdef AVR + #include + #include /* for debugging */ +#endif #include "../config.h" #include "../random/prng.h" #include "../pixel.h" diff --git a/compat/eeprom.h b/compat/eeprom.h new file mode 100644 index 0000000..28b9b62 --- /dev/null +++ b/compat/eeprom.h @@ -0,0 +1,18 @@ + +//EEPPROM compatibility support for simulator + +#ifdef AVR + #include +#else + #include + + void eeprom_write_byte (uint8_t *p, uint8_t value); + void eeprom_write_word (uint16_t *p, uint16_t value); + + uint8_t eeprom_read_byte (const uint8_t *p); + uint16_t eeprom_read_word (const uint16_t *p); + + #define eeprom_busy_wait() + #define EEMEM + +#endif diff --git a/compat/interrupt.h b/compat/interrupt.h new file mode 100644 index 0000000..8871ad9 --- /dev/null +++ b/compat/interrupt.h @@ -0,0 +1,3 @@ + +#define sei() +#define cli() diff --git a/pgmspace.h b/compat/pgmspace.h similarity index 100% rename from pgmspace.h rename to compat/pgmspace.h diff --git a/depend.mk b/depend.mk index 0208f79..1106ee3 100644 --- a/depend.mk +++ b/depend.mk @@ -10,8 +10,8 @@ ifneq ($(MAKECMDGOALS),mrproper) ifneq ($(MAKECMDGOALS),menuconfig) # For each .o file we need a .d file. -#-include $(subst .o,.d,$(filter %.o,$(OBJECTS))) /dev/null -include $(subst .o,.d,$(filter %.o,$(OBJECTS))) +-include $(subst .o,.d,$(filter %.o,$(OBJECTS_SIM))) endif endif @@ -33,3 +33,16 @@ endef obj_avr/%.d: %.c ; @ $(make-deps) obj_avr/%.d: %.S ; @ $(make-deps) + + +define make-deps-sim +echo "checking dependencies for $<" +if [ ! -d obj_sim ]; then mkdir obj_sim ; fi +set -e; $(HOSTCC) $(SIM_CFLAGS) -M -MM $< | \ +sed > $@.new -e 's;$(*F)\.o:;$@ obj_sim/$*.o obj_sim/$*.E $*.s:;' \ + -e 's% [^ ]*/gcc-lib/[^ ]*\.h%%g' +if test -s $@.new; then mv -f $@.new $@; else rm -f $@.new; fi +endef + + +obj_sim/%.d: %.c ; $(make-deps-sim) diff --git a/display_loop.c b/display_loop.c index b6b0596..4a59e0f 100644 --- a/display_loop.c +++ b/display_loop.c @@ -24,6 +24,10 @@ jmp_buf newmode_jmpbuf; void display_loop(){ // mcuf_serial_mode(); +#ifdef RANDOM_SUPPORT + percnt_inc(); +#endif + mode = setjmp(newmode_jmpbuf); oldOldmode = oldMode; waitForFire = 1; @@ -34,6 +38,13 @@ void display_loop(){ #ifdef ANIMATION_SCROLLTEXT case 1: scrolltext(scrolltext_text); + +#ifdef RANDOM_SUPPORT + { char a[14]; + sprintf(a," + +#include "memxor.h" + +void memxor(void* dest, const void* src, uint16_t n){ + while(n--){ + *((uint8_t*)dest) ^= *((uint8_t*)src); + dest = (uint8_t*)dest +1; + src = (uint8_t*)src +1; + } +} + diff --git a/random/noekeon.c b/random/noekeon.c new file mode 100644 index 0000000..f5f5299 --- /dev/null +++ b/random/noekeon.c @@ -0,0 +1,199 @@ +/* noekeon.c */ +/* + This file is part of the Crypto-avr-lib/microcrypt-lib. + Copyright (C) 2008 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 . +*/ +/* + * author: Daniel Otte + * email: daniel.otte@rub.de + * license: GPLv3 or later + * + * + * + */ + +#include +#include + +#ifdef __AVR__ + #include +#endif +#include "noekeon.h" +// #include "uart.h" + +#define ROUND_NR 16 + +#define RC_POS 0 + +static +void gamma(uint32_t* a){ + uint32_t tmp; + + a[1] ^= ~((a[3]) | (a[2])); + a[0] ^= a[2] & a[1]; + + tmp=a[3]; a[3]=a[0]; a[0]=tmp; + a[2] ^= a[0] ^ a[1] ^ a[3]; + + a[1] ^= ~((a[3]) | (a[2])); + a[0] ^= a[2] & a[1]; +} + +#define ROTL32(a,n) (((a)<>(32-n))) +#define ROTR32(a,n) (((a)>>n)|((a)<<(32-n))) + +static +void pi1(uint32_t* a){ + a[1] = ROTL32(a[1], 1); + a[2] = ROTL32(a[2], 5); + a[3] = ROTL32(a[3], 2); +} + +static +void pi2(uint32_t* a){ + a[1] = ROTR32(a[1], 1); + a[2] = ROTR32(a[2], 5); + a[3] = ROTR32(a[3], 2); +} + +static +void theta(const uint32_t* k, uint32_t* a){ + uint32_t temp; + + temp = a[0] ^ a[2]; temp ^= ROTR32(temp, 8) ^ ROTL32(temp, 8); + a[1] ^= temp; + a[3] ^= temp; + + a[0] ^= k[0]; + a[1] ^= k[1]; + a[2] ^= k[2]; + a[3] ^= k[3]; + + temp = a[1] ^ a[3]; temp ^= ROTR32(temp, 8) ^ ROTL32(temp, 8); + a[0] ^= temp; + a[2] ^= temp; + +} + +static +void noekeon_round(uint32_t* key, uint32_t* state, uint8_t const1, uint8_t const2){ + ((uint8_t*)state)[RC_POS] ^= const1; + theta(key, state); + ((uint8_t*)state)[RC_POS] ^= const2; + gamma(state); + pi2(state); + pi1(state); +} + +uint8_t rc_tab[] +#ifdef __AVR__ + PROGMEM +#endif + = { +/* 0x80, */ + 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A, + 0x2F, 0x5E, 0xBC, 0x63, 0xC6, 0x97, 0x35, 0x6A, + 0xD4 +}; +/* for more rounds + 0xD4, 0xB3, 0x7D, 0xFA, 0xEF, 0xC5, 0x91, 0x39, + 0x72, 0xE4, 0xD3, 0xBD, 0x61, 0xC2, 0x9F, 0x25, +*/ + +static +void changendian32(void* a){ + ((uint8_t*)a)[0] ^= ((uint8_t*)a)[3]; + ((uint8_t*)a)[3] ^= ((uint8_t*)a)[0]; + ((uint8_t*)a)[0] ^= ((uint8_t*)a)[3]; + + ((uint8_t*)a)[1] ^= ((uint8_t*)a)[2]; + ((uint8_t*)a)[2] ^= ((uint8_t*)a)[1]; + ((uint8_t*)a)[1] ^= ((uint8_t*)a)[2]; +} + +static +void changendian(void* a){ + changendian32((uint32_t*)(&(((uint32_t*)a)[0]))); + changendian32((uint32_t*)(&(((uint32_t*)a)[1]))); + changendian32((uint32_t*)(&(((uint32_t*)a)[2]))); + changendian32((uint32_t*)(&(((uint32_t*)a)[3]))); +} + +/******************************************************************************/ + +void noekeon_enc(void* buffer, const void* key){ + uint8_t rc=0x80; + uint8_t keyb[16]; + int8_t i; + + memcpy(keyb, key, 16); + changendian(buffer); + changendian(keyb); + + for(i=0; i=0; --i){ +#ifdef __AVR__ + rc = pgm_read_byte(rc_tab+i); +#else + rc = rc_tab[i]; +#endif + noekeon_round((uint32_t*)dkey, (uint32_t*)buffer, 0, rc); + } + theta((uint32_t*)dkey, (uint32_t*)buffer); + ((uint8_t*)buffer)[RC_POS] ^= 0x80; + + changendian(buffer); +} + +void noekeon_init(const void* key, noekeon_ctx_t* ctx){ + uint8_t nullv[16]; + + memset(nullv, 0, 16); + memcpy(ctx, key, 16); + noekeon_enc(ctx, nullv); +} + diff --git a/random/persistentCounter.c b/random/persistentCounter.c index 5ccf85e..883c74f 100644 --- a/random/persistentCounter.c +++ b/random/persistentCounter.c @@ -6,8 +6,8 @@ */ #include -#include /* cli() & sei() */ -#include +#include "../compat/interrupt.h" /* cli() & sei() */ +#include "../compat/eeprom.h" #include "../config.h" #ifdef ERROR_HANDLING diff --git a/scrolltext/font.h b/scrolltext/font.h index 580a616..5a93d05 100644 --- a/scrolltext/font.h +++ b/scrolltext/font.h @@ -1,7 +1,7 @@ #ifndef FONT_H #define FONT_H -#include "../pgmspace.h" +#include "../compat/pgmspace.h" typedef struct{ unsigned char fontHeight; diff --git a/scrolltext/scrolltext3.c b/scrolltext/scrolltext3.c index a8d3e7d..c2942c7 100644 --- a/scrolltext/scrolltext3.c +++ b/scrolltext/scrolltext3.c @@ -9,7 +9,6 @@ #include "../pixel.h" #include "../util.h" -#include "../pgmspace.h" #include "font_arial8.h" #include "font_small6.h" #include "font_uni53.h" diff --git a/simulator/Makefile b/simulator/Makefile index 8189708..b9f40f4 100644 --- a/simulator/Makefile +++ b/simulator/Makefile @@ -3,7 +3,7 @@ TOPDIR = .. include $(TOPDIR)/defaults.mk -SRC_SIM = main.c trackball.c util.c +SRC_SIM = main.c trackball.c util.c eeprom.c include $(TOPDIR)/rules.mk diff --git a/simulator/eeprom.c b/simulator/eeprom.c new file mode 100644 index 0000000..78518c2 --- /dev/null +++ b/simulator/eeprom.c @@ -0,0 +1,71 @@ + +//EEPPROM compatibility support for simulator + +#include +#include +#include +#include + +#define EEPROM_SIZE 1024 + +static FILE * fp; + +static uint8_t eemem[EEPROM_SIZE]; + +static uint8_t inited; +static void init(){ + if(!inited){ + inited = 1; + char* filename = ".simulated_eeprom.bin"; + size_t size; + fp = fopen(filename, "r+"); + if(fp == 0){ + fp = fopen(filename, "w+"); + if(fp == 0){ + printf("Failed to open %s\n",filename ); + exit (1); + } + } + size = fread (eemem, 1, EEPROM_SIZE, fp); + if(size < EEPROM_SIZE){ + memset(eemem, 0xff, EEPROM_SIZE); + } + } +} + +uint16_t conv_addr(uint8_t * p){ + uint16_t addr; + addr = (unsigned int)p; + if(addr >= EEPROM_SIZE){ + printf ("warning: eeprom write to %X\n",addr); + } + addr &= (EEPROM_SIZE-1); + return addr; +} + +void eeprom_write_byte (uint8_t *p, uint8_t value){ + init(); + eemem[conv_addr(p)] = value; + fseek(fp, 0, SEEK_SET); + fwrite(eemem, 1, EEPROM_SIZE, fp); +} + +void eeprom_write_word (uint16_t *p, uint16_t value){ + init(); + eemem[conv_addr(p) ] = value & 0xff; + eemem[conv_addr(p)+1] = value >> 8; + + fseek(fp, 0, SEEK_SET); + fwrite(eemem, 1, EEPROM_SIZE, fp); + fflush(fp); +} + +uint8_t eeprom_read_byte (uint8_t *p){ + init(); + return eemem[conv_addr(p)]; +} + +uint16_t eeprom_read_word (uint16_t *p){ + init(); + return eemem[conv_addr(p)] | (eemem[conv_addr(p)+1]<<8); +}