X-Git-Url: https://git.cryptolib.org/?a=blobdiff_plain;f=noekeon.c;h=fe720a6bb005651aedbcefaf805cdf83d042bf1a;hb=17332291e15183d71d88ed868275e3cb53917180;hp=dd68b6575e6121c8c2b334d4a79d731efae43194;hpb=9e7453525f32441ea49ef1d9b3248e94d9554eec;p=avr-crypto-lib.git diff --git a/noekeon.c b/noekeon.c index dd68b65..fe720a6 100644 --- a/noekeon.c +++ b/noekeon.c @@ -1,7 +1,25 @@ +/* noekeon.c */ +/* + This file is part of the 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 . +*/ /* * author: Daniel Otte * email: daniel.otte@rub.de - * license: GPLv3 + * license: GPLv3 or later * * * @@ -9,8 +27,12 @@ #include #include -#include + +#ifdef __AVR__ + #include +#endif #include "noekeon.h" +// #include "uart.h" #define ROUND_NR 16 @@ -48,8 +70,9 @@ 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); a[1] ^= temp; a[3] ^= temp; @@ -62,6 +85,7 @@ void theta(uint32_t* k, uint32_t* a){ temp = a[1] ^ a[3]; temp ^= ROTR32(temp, 8) ^ ROTL32(temp, 8); a[0] ^= temp; a[2] ^= temp; + } static @@ -74,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, @@ -106,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=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);