]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - noekeon.c
updated Makefile
[avr-crypto-lib.git] / noekeon.c
index fc25d62a78f2641d8e2203cc63238121db25e0ae..f48d1e6a9b282b4da6a038a356495087d57ff6da 100644 (file)
--- a/noekeon.c
+++ b/noekeon.c
@@ -1,7 +1,25 @@
+/* noekeon.c */
+/*
+    This file is part of the AVR-Crypto-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 <http://www.gnu.org/licenses/>.
+*/
 /*
  * author: Daniel Otte
  * email:  daniel.otte@rub.de
- * license: GPLv3
+ * license: GPLv3 or later
  * 
  * 
  * 
@@ -9,9 +27,12 @@
 
 #include <stdint.h>
 #include <string.h>
-#include <avr/pgmspace.h>
+
+#ifdef __AVR__
+       #include <avr/pgmspace.h>
+#endif
 #include "noekeon.h"
-#include "uart.h"
+// #include "cli.h"
 
 #define ROUND_NR 16
 
@@ -49,7 +70,7 @@ void pi2(uint32_t* a){
 }
 
 static
-void theta(uint32_t* k, uint32_t* a){
+void theta(const uint32_t* k, uint32_t* a){
        uint32_t temp;
 
        temp = a[0] ^ a[2]; temp ^= ROTR32(temp, 8) ^ ROTL32(temp, 8);
@@ -77,7 +98,11 @@ void noekeon_round(uint32_t* key, uint32_t* state, uint8_t const1, uint8_t const
        pi2(state);
 }
 
-uint8_t rc_tab[] PROGMEM = {
+uint8_t rc_tab[]
+#ifdef __AVR__
+ PROGMEM 
+#endif
+  = {
 /*     0x80, */
              0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A,
        0x2F, 0x5E, 0xBC, 0x63, 0xC6, 0x97, 0x35, 0x6A,
@@ -109,26 +134,31 @@ void changendian(void* a){
 
 /******************************************************************************/
 
-void noekeon_enc(void* buffer, void* key){
+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(key);
+       changendian(keyb);
 
        for(i=0; i<ROUND_NR; ++i){
-               noekeon_round((uint32_t*)key, (uint32_t*)buffer, rc, 0);
+               noekeon_round((uint32_t*)keyb, (uint32_t*)buffer, rc, 0);
+#ifdef __AVR__
                rc = pgm_read_byte(rc_tab+i);
+#else
+               rc = rc_tab[i];
+#endif
        }
        ((uint8_t*)buffer)[RC_POS] ^= rc;
-       theta((uint32_t*)key, (uint32_t*)buffer);
+       theta((uint32_t*)keyb, (uint32_t*)buffer);
 
        changendian(buffer);
-       changendian(key);
 }
 
 
-void noekeon_dec(void* buffer, void* key){
+void noekeon_dec(void* buffer, const void* key){
        uint8_t rc;
        int8_t i;
        uint8_t nullv[16];
@@ -136,27 +166,30 @@ void noekeon_dec(void* buffer, void* key){
        
 
        changendian(buffer);
-       changendian(key);
        
        memset(nullv, 0, 16);
        memcpy(dkey, key, 16);
+       changendian(dkey);
        
        theta((uint32_t*)nullv, (uint32_t*)dkey);
-       uart_putstr_P(PSTR("\r\nTheta: "));
-       uart_hexdump(dkey, 16);
+//     cli_putstr_P(PSTR("\r\nTheta: "));
+//     cli_hexdump(dkey, 16);
        
        for(i=ROUND_NR-1; 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);
-       changendian(key);
 }
 
-void noekeon_init(void* key, noekeon_ctx_t* ctx){
+void noekeon_init(const void* key, noekeon_ctx_t* ctx){
        uint8_t nullv[16];
        
        memset(nullv, 0, 16);