X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=cast5%2Fcast5.c;h=4cf5c65c837cd30574b9b3de0d3cfb9b0ea95b7d;hp=6d7f42fff5b3d323cb7950e2ca1af65154baf077;hb=4b5da1dc27a791b5c448274a3db09cd035b33493;hpb=d32eba56ce10ea6b9eff123b50d9842673b38f2b diff --git a/cast5/cast5.c b/cast5/cast5.c index 6d7f42f..4cf5c65 100644 --- a/cast5/cast5.c +++ b/cast5/cast5.c @@ -1,92 +1,95 @@ /* cast5.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 . -*/ + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org) + + 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 . + */ /* * \file cast5.c * \author Daniel Otte - * \email daniel.otte@rub.de + * \email bg@nerilex.org * \date 2006-07-26 * \par License: * GPLv3 or later * \brief Implementation of the CAST5 (aka CAST-128) cipher algorithm as described in RFC 2144 * */ - - #include - #include - #include "cast5.h" - #include "config.h" - #include "debug.h" - - #undef DEBUG - - #ifdef DEBUG - #include "cli.h" - #endif - -#include "cast5-sbox.h" +#include +#include +#include "cast5.h" +#include + +#undef DEBUG + +#ifdef DEBUG +#include "cli.h" +#endif + +#include "cast5-sbox.h" - #define S5(x) pgm_read_dword(&s5[(x)]) #define S6(x) pgm_read_dword(&s6[(x)]) #define S7(x) pgm_read_dword(&s7[(x)]) #define S8(x) pgm_read_dword(&s8[(x)]) -static -void cast5_init_A(uint8_t *dest, uint8_t *src, bool bmode){ - uint8_t mask = bmode?0x8:0; - *((uint32_t*)(&dest[0x0])) = *((uint32_t*)(&src[0x0^mask])) - ^ S5(src[0xD^mask]) ^ S6(src[0xF^mask]) - ^ S7(src[0xC^mask]) ^ S8(src[0xE^mask]) - ^ S7(src[0x8^mask]); - *((uint32_t*)(&dest[0x4])) = *((uint32_t*)(&src[0x8^mask])) - ^ S5(dest[0x0]) ^ S6(dest[0x2]) - ^ S7(dest[0x1]) ^ S8(dest[0x3]) - ^ S8(src[0xA^mask]); - *((uint32_t*)(&dest[0x8])) = *((uint32_t*)(&src[0xC^mask])) - ^ S5(dest[0x7]) ^ S6(dest[0x6]) - ^ S7(dest[0x5]) ^ S8(dest[0x4]) - ^ S5(src[0x9^mask]); - *((uint32_t*)(&dest[0xC])) = *((uint32_t*)(&src[0x4^mask])) - ^ S5(dest[0xA]) - ^ S6(dest[0x9]) - ^ S7(dest[0xB]) - ^ S8(dest[0x8]) - ^ S6(src[0xB^mask]); +static +void cast5_init_A(uint8_t *dest, uint8_t *src, bool bmode) +{ + uint8_t mask = bmode ? 0x8 : 0; + *((uint32_t*) (&dest[0x0])) = *((uint32_t*) (&src[0x0 ^ mask])) + ^ S5(src[0xD ^ mask]) ^ S6(src[0xF ^ mask]) + ^ S7(src[0xC ^ mask]) ^ S8(src[0xE ^ mask]) + ^ S7(src[0x8 ^ mask]); + *((uint32_t*) (&dest[0x4])) = *((uint32_t*) (&src[0x8 ^ mask])) + ^ S5(dest[0x0]) ^ S6(dest[0x2]) + ^ S7(dest[0x1]) ^ S8(dest[0x3]) + ^ S8(src[0xA ^ mask]); + *((uint32_t*) (&dest[0x8])) = *((uint32_t*) (&src[0xC ^ mask])) + ^ S5(dest[0x7]) ^ S6(dest[0x6]) + ^ S7(dest[0x5]) ^ S8(dest[0x4]) + ^ S5(src[0x9 ^ mask]); + *((uint32_t*) (&dest[0xC])) = *((uint32_t*) (&src[0x4 ^ mask])) + ^ S5(dest[0xA]) + ^ S6(dest[0x9]) + ^ S7(dest[0xB]) + ^ S8(dest[0x8]) + ^ S6(src[0xB ^ mask]); } static -void cast5_init_M(uint8_t *dest, uint8_t *src, bool nmode, bool xmode){ - uint8_t nmt[] = {0xB, 0xA, 0x9, 0x8, - 0xF, 0xE, 0xD, 0xC, - 0x3, 0x2, 0x1, 0x0, - 0x7, 0x6, 0x5, 0x4}; /* nmode table */ - uint8_t xmt[4][4] = {{0x2, 0x6, 0x9, 0xC}, - {0x8, 0xD, 0x3, 0x7}, - {0x3, 0x7, 0x8, 0xD}, - {0x9, 0xC, 0x2, 0x6}}; - #define NMT(x) (src[nmode?nmt[(x)]:(x)]) - #define XMT(x) (src[xmt[(xmode<<1) + nmode][(x)]]) - *((uint32_t*)(&dest[0x0])) = S5(NMT(0x8)) ^ S6(NMT(0x9)) ^ S7(NMT(0x7)) ^ S8(NMT(0x6)) ^ S5(XMT(0)); - *((uint32_t*)(&dest[0x4])) = S5(NMT(0xA)) ^ S6(NMT(0xB)) ^ S7(NMT(0x5)) ^ S8(NMT(0x4)) ^ S6(XMT(1)); - *((uint32_t*)(&dest[0x8])) = S5(NMT(0xC)) ^ S6(NMT(0xD)) ^ S7(NMT(0x3)) ^ S8(NMT(0x2)) ^ S7(XMT(2)); - *((uint32_t*)(&dest[0xC])) = S5(NMT(0xE)) ^ S6(NMT(0xF)) ^ S7(NMT(0x1)) ^ S8(NMT(0x0)) ^ S8(XMT(3)); +void cast5_init_M(uint8_t *dest, uint8_t *src, bool nmode, bool xmode) +{ + uint8_t nmt[] = { 0xB, 0xA, 0x9, 0x8, + 0xF, 0xE, 0xD, 0xC, + 0x3, 0x2, 0x1, 0x0, + 0x7, 0x6, 0x5, 0x4 }; /* nmode table */ + uint8_t xmt[4][4] = { { 0x2, 0x6, 0x9, 0xC }, + { 0x8, 0xD, 0x3, 0x7 }, + { 0x3, 0x7, 0x8, 0xD }, + { 0x9, 0xC, 0x2, 0x6 } }; +#define NMT(x) (src[nmode?nmt[(x)]:(x)]) +#define XMT(x) (src[xmt[(xmode<<1) + nmode][(x)]]) + *((uint32_t*) (&dest[0x0])) = + S5(NMT(0x8)) ^ S6(NMT(0x9)) ^ S7(NMT(0x7)) ^ S8(NMT(0x6)) ^ S5(XMT(0)); + *((uint32_t*) (&dest[0x4])) = + S5(NMT(0xA)) ^ S6(NMT(0xB)) ^ S7(NMT(0x5)) ^ S8(NMT(0x4)) ^ S6(XMT(1)); + *((uint32_t*) (&dest[0x8])) = + S5(NMT(0xC)) ^ S6(NMT(0xD)) ^ S7(NMT(0x3)) ^ S8(NMT(0x2)) ^ S7(XMT(2)); + *((uint32_t*) (&dest[0xC])) = + S5(NMT(0xE)) ^ S6(NMT(0xF)) ^ S7(NMT(0x1)) ^ S8(NMT(0x0)) ^ S8(XMT(3)); } #define S5B(x) pgm_read_byte(3+(uint8_t*)(&s5[(x)])) @@ -95,26 +98,38 @@ void cast5_init_M(uint8_t *dest, uint8_t *src, bool nmode, bool xmode){ #define S8B(x) pgm_read_byte(3+(uint8_t*)(&s8[(x)])) static -void cast5_init_rM(uint8_t *klo, uint8_t *khi, uint8_t offset, uint8_t *src, bool nmode, bool xmode){ - uint8_t nmt[] = {0xB, 0xA, 0x9, 0x8, 0xF, 0xE, 0xD, 0xC, 0x3, 0x2, 0x1, 0x0, 0x7, 0x6, 0x5, 0x4}; /* nmode table */ - uint8_t xmt[4][4] = {{0x2, 0x6, 0x9, 0xC}, {0x8, 0xD, 0x3, 0x7}, {0x3, 0x7, 0x8, 0xD}, {0x9, 0xC, 0x2, 0x6}}; - uint8_t t, h=0; - t = S5B(NMT(0x8)) ^ S6B(NMT(0x9)) ^ S7B(NMT(0x7)) ^ S8B(NMT(0x6)) ^ S5B(XMT(0)); - klo[offset*2] |= (t & 0x0f); - h |= (t&0x10); h>>=1; - t = S5B(NMT(0xA)) ^ S6B(NMT(0xB)) ^ S7B(NMT(0x5)) ^ S8B(NMT(0x4)) ^ S6B(XMT(1)); - klo[offset*2] |= (t<<4) & 0xf0; - h |= t&0x10; h>>=1; - t = S5B(NMT(0xC)) ^ S6B(NMT(0xD)) ^ S7B(NMT(0x3)) ^ S8B(NMT(0x2)) ^ S7B(XMT(2)); - klo[offset*2+1] |= t&0xf; - h |= t&0x10; h>>=1; - t = S5B(NMT(0xE)) ^ S6B(NMT(0xF)) ^ S7B(NMT(0x1)) ^ S8B(NMT(0x0)) ^ S8B(XMT(3)); - klo[offset*2+1] |= t<<4; - h |= t&0x10; h >>=1; - #ifdef DEBUG - cli_putstr("\r\n\t h="); cli_hexdump(&h,1); - #endif - khi[offset>>1] |= h<<((offset&0x1)?4:0); +void cast5_init_rM(uint8_t *klo, uint8_t *khi, uint8_t offset, uint8_t *src, + bool nmode, bool xmode) +{ + uint8_t nmt[] = { 0xB, 0xA, 0x9, 0x8, 0xF, 0xE, 0xD, 0xC, 0x3, 0x2, 0x1, + 0x0, 0x7, 0x6, 0x5, 0x4 }; /* nmode table */ + uint8_t xmt[4][4] = { { 0x2, 0x6, 0x9, 0xC }, { 0x8, 0xD, 0x3, 0x7 }, { 0x3, + 0x7, 0x8, 0xD }, { 0x9, 0xC, 0x2, 0x6 } }; + uint8_t t, h = 0; + t = + S5B(NMT(0x8)) ^ S6B(NMT(0x9)) ^ S7B(NMT(0x7)) ^ S8B(NMT(0x6)) ^ S5B(XMT(0)); + klo[offset * 2] |= (t & 0x0f); + h |= (t & 0x10); + h >>= 1; + t = + S5B(NMT(0xA)) ^ S6B(NMT(0xB)) ^ S7B(NMT(0x5)) ^ S8B(NMT(0x4)) ^ S6B(XMT(1)); + klo[offset * 2] |= (t << 4) & 0xf0; + h |= t & 0x10; + h >>= 1; + t = + S5B(NMT(0xC)) ^ S6B(NMT(0xD)) ^ S7B(NMT(0x3)) ^ S8B(NMT(0x2)) ^ S7B(XMT(2)); + klo[offset * 2 + 1] |= t & 0xf; + h |= t & 0x10; + h >>= 1; + t = + S5B(NMT(0xE)) ^ S6B(NMT(0xF)) ^ S7B(NMT(0x1)) ^ S8B(NMT(0x0)) ^ S8B(XMT(3)); + klo[offset * 2 + 1] |= t << 4; + h |= t & 0x10; + h >>= 1; +#ifdef DEBUG + cli_putstr("\r\n\t h="); cli_hexdump(&h,1); +#endif + khi[offset >> 1] |= h << ((offset & 0x1) ? 4 : 0); } #define S_5X(s) pgm_read_dword(&s5[BPX[(s)]]) @@ -127,217 +142,210 @@ void cast5_init_rM(uint8_t *klo, uint8_t *khi, uint8_t offset, uint8_t *src, boo #define S_7Z(s) pgm_read_dword(&s7[BPZ[(s)]]) #define S_8Z(s) pgm_read_dword(&s8[BPZ[(s)]]) - - - -void cast5_init(const void* key, uint16_t keylength_b, cast5_ctx_t* s){ - /* we migth return if the key is valid and if setup was successful */ - uint32_t x[4], z[4]; - #define BPX ((uint8_t*)&(x[0])) - #define BPZ ((uint8_t*)&(z[0])) - s->shortkey = (keylength_b<=80); - /* littel endian only! */ - memset(&(x[0]), 0 ,16); /* set x to zero */ - if(keylength_b > 128) - keylength_b=128; - memcpy(&(x[0]), key, (keylength_b+7)/8); - - - /* todo: merge a and b and compress the whole stuff */ - /***** A *****/ - cast5_init_A((uint8_t*)(&z[0]), (uint8_t*)(&x[0]), false); - /***** M *****/ - cast5_init_M((uint8_t*)(&(s->mask[0])), (uint8_t*)(&z[0]), false, false); - /***** B *****/ - cast5_init_A((uint8_t*)(&x[0]), (uint8_t*)(&z[0]), true); - /***** N *****/ - cast5_init_M((uint8_t*)(&(s->mask[4])), (uint8_t*)(&x[0]), true, false); - /***** A *****/ - cast5_init_A((uint8_t*)(&z[0]), (uint8_t*)(&x[0]), false); - /***** N' *****/ - cast5_init_M((uint8_t*)(&(s->mask[8])), (uint8_t*)(&z[0]), true, true); - /***** B *****/ - cast5_init_A((uint8_t*)(&x[0]), (uint8_t*)(&z[0]), true); - /***** M' *****/ - cast5_init_M((uint8_t*)(&(s->mask[12])), (uint8_t*)(&x[0]), false, true); - - /* that were the masking keys, now the rotation keys */ - /* set the keys to zero */ - memset(&(s->rotl[0]),0,8); - s->roth[0]=s->roth[1]=0; - /***** A *****/ - cast5_init_A((uint8_t*)(&z[0]), (uint8_t*)(&x[0]), false); - /***** M *****/ - cast5_init_rM(&(s->rotl[0]), &(s->roth[0]), 0, (uint8_t*)(&z[0]), false, false); - /***** B *****/ - cast5_init_A((uint8_t*)(&x[0]), (uint8_t*)(&z[0]), true); - /***** N *****/ - cast5_init_rM(&(s->rotl[0]), &(s->roth[0]), 1, (uint8_t*)(&x[0]), true, false); - /***** A *****/ - cast5_init_A((uint8_t*)(&z[0]), (uint8_t*)(&x[0]), false); - /***** N' *****/ - cast5_init_rM(&(s->rotl[0]), &(s->roth[0]), 2, (uint8_t*)(&z[0]), true, true); - /***** B *****/ - cast5_init_A((uint8_t*)(&x[0]), (uint8_t*)(&z[0]), true); - /***** M' *****/ - cast5_init_rM(&(s->rotl[0]), &(s->roth[0]), 3, (uint8_t*)(&x[0]), false, true); - /* done ;-) */ +void cast5_init(const void *key, uint16_t keylength_b, cast5_ctx_t *s) +{ + /* we migth return if the key is valid and if setup was successful */ + uint32_t x[4], z[4]; +#define BPX ((uint8_t*)&(x[0])) +#define BPZ ((uint8_t*)&(z[0])) + s->shortkey = (keylength_b <= 80); + /* littel endian only! */ + memset(&(x[0]), 0, 16); /* set x to zero */ + if (keylength_b > 128) + keylength_b = 128; + memcpy(&(x[0]), key, (keylength_b + 7) / 8); + + /* todo: merge a and b and compress the whole stuff */ + /***** A *****/ + cast5_init_A((uint8_t*) (&z[0]), (uint8_t*) (&x[0]), false); + /***** M *****/ + cast5_init_M((uint8_t*) (&(s->mask[0])), (uint8_t*) (&z[0]), false, false); + /***** B *****/ + cast5_init_A((uint8_t*) (&x[0]), (uint8_t*) (&z[0]), true); + /***** N *****/ + cast5_init_M((uint8_t*) (&(s->mask[4])), (uint8_t*) (&x[0]), true, false); + /***** A *****/ + cast5_init_A((uint8_t*) (&z[0]), (uint8_t*) (&x[0]), false); + /***** N' *****/ + cast5_init_M((uint8_t*) (&(s->mask[8])), (uint8_t*) (&z[0]), true, true); + /***** B *****/ + cast5_init_A((uint8_t*) (&x[0]), (uint8_t*) (&z[0]), true); + /***** M' *****/ + cast5_init_M((uint8_t*) (&(s->mask[12])), (uint8_t*) (&x[0]), false, true); + + /* that were the masking keys, now the rotation keys */ + /* set the keys to zero */ + memset(&(s->rotl[0]), 0, 8); + s->roth[0] = s->roth[1] = 0; + /***** A *****/ + cast5_init_A((uint8_t*) (&z[0]), (uint8_t*) (&x[0]), false); + /***** M *****/ + cast5_init_rM(&(s->rotl[0]), &(s->roth[0]), 0, (uint8_t*) (&z[0]), false, false); + /***** B *****/ + cast5_init_A((uint8_t*) (&x[0]), (uint8_t*) (&z[0]), true); + /***** N *****/ + cast5_init_rM(&(s->rotl[0]), &(s->roth[0]), 1, (uint8_t*) (&x[0]), true, false); + /***** A *****/ + cast5_init_A((uint8_t*) (&z[0]), (uint8_t*) (&x[0]), false); + /***** N' *****/ + cast5_init_rM(&(s->rotl[0]), &(s->roth[0]), 2, (uint8_t*) (&z[0]), true, true); + /***** B *****/ + cast5_init_A((uint8_t*) (&x[0]), (uint8_t*) (&z[0]), true); + /***** M' *****/ + cast5_init_rM(&(s->rotl[0]), &(s->roth[0]), 3, (uint8_t*) (&x[0]), false, true); + /* done ;-) */ } - - /********************************************************************************************************/ #define ROTL32(a,n) ((a)<<(n) | (a)>>(32-(n))) #define CHANGE_ENDIAN32(x) ((x)<<24 | (x)>>24 | ((x)&0xff00)<<8 | ((x)&0xff0000)>>8 ) -typedef uint32_t cast5_f_t(uint32_t,uint32_t,uint8_t); +typedef uint32_t cast5_f_t(uint32_t, uint32_t, uint8_t); #define IA 3 #define IB 2 #define IC 1 #define ID 0 -static -uint32_t cast5_f1(uint32_t d, uint32_t m, uint8_t r){ - uint32_t t; - t = ROTL32((d + m),r); +static uint32_t cast5_f1(uint32_t d, uint32_t m, uint8_t r) +{ + uint32_t t; + t = ROTL32((d + m), r); #ifdef DEBUG - uint32_t ia,ib,ic,id; - cli_putstr("\r\n f1("); cli_hexdump(&d, 4); cli_putc(','); - cli_hexdump(&m , 4); cli_putc(','); cli_hexdump(&r, 1);cli_putstr("): I="); - cli_hexdump(&t, 4); - ia = pgm_read_dword(&s1[((uint8_t*)&t)[IA]] ); - ib = pgm_read_dword(&s2[((uint8_t*)&t)[IB]] ); - ic = pgm_read_dword(&s3[((uint8_t*)&t)[IC]] ); - id = pgm_read_dword(&s4[((uint8_t*)&t)[ID]] ); - cli_putstr("\r\n\tIA="); cli_hexdump(&ia, 4); - cli_putstr("\r\n\tIB="); cli_hexdump(&ib, 4); - cli_putstr("\r\n\tIC="); cli_hexdump(&ic, 4); - cli_putstr("\r\n\tID="); cli_hexdump(&id, 4); - - return (((ia ^ ib) - ic) + id); + uint32_t ia,ib,ic,id; + cli_putstr("\r\n f1("); cli_hexdump(&d, 4); cli_putc(','); + cli_hexdump(&m , 4); cli_putc(','); cli_hexdump(&r, 1);cli_putstr("): I="); + cli_hexdump(&t, 4); + ia = pgm_read_dword(&s1[((uint8_t*)&t)[IA]] ); + ib = pgm_read_dword(&s2[((uint8_t*)&t)[IB]] ); + ic = pgm_read_dword(&s3[((uint8_t*)&t)[IC]] ); + id = pgm_read_dword(&s4[((uint8_t*)&t)[ID]] ); + cli_putstr("\r\n\tIA="); cli_hexdump(&ia, 4); + cli_putstr("\r\n\tIB="); cli_hexdump(&ib, 4); + cli_putstr("\r\n\tIC="); cli_hexdump(&ic, 4); + cli_putstr("\r\n\tID="); cli_hexdump(&id, 4); + + return (((ia ^ ib) - ic) + id); #else - - return ((( pgm_read_dword(&s1[((uint8_t*)&t)[IA]]) - ^ pgm_read_dword(&s2[((uint8_t*)&t)[IB]]) ) - - pgm_read_dword(&s3[((uint8_t*)&t)[IC]]) ) - + pgm_read_dword(&s4[((uint8_t*)&t)[ID]]) ); + + return ((( pgm_read_dword(&s1[((uint8_t*)&t)[IA]]) + ^ pgm_read_dword(&s2[((uint8_t*)&t)[IB]])) + - pgm_read_dword(&s3[((uint8_t*)&t)[IC]])) + + pgm_read_dword(&s4[((uint8_t*)&t)[ID]])); #endif } -static -uint32_t cast5_f2(uint32_t d, uint32_t m, uint8_t r){ - uint32_t t; - t = ROTL32((d ^ m),r); +static uint32_t cast5_f2(uint32_t d, uint32_t m, uint8_t r) +{ + uint32_t t; + t = ROTL32((d ^ m), r); #ifdef DEBUG - uint32_t ia,ib,ic,id; - cli_putstr("\r\n f2("); cli_hexdump(&d, 4); cli_putc(','); - cli_hexdump(&m , 4); cli_putc(','); cli_hexdump(&r, 1);cli_putstr("): I="); - cli_hexdump(&t, 4); - - ia = pgm_read_dword(&s1[((uint8_t*)&t)[IA]] ); - ib = pgm_read_dword(&s2[((uint8_t*)&t)[IB]] ); - ic = pgm_read_dword(&s3[((uint8_t*)&t)[IC]] ); - id = pgm_read_dword(&s4[((uint8_t*)&t)[ID]] ); - - cli_putstr("\r\n\tIA="); cli_hexdump(&ia, 4); - cli_putstr("\r\n\tIB="); cli_hexdump(&ib, 4); - cli_putstr("\r\n\tIC="); cli_hexdump(&ic, 4); - cli_putstr("\r\n\tID="); cli_hexdump(&id, 4); - - return (((ia - ib) + ic) ^ id); + uint32_t ia,ib,ic,id; + cli_putstr("\r\n f2("); cli_hexdump(&d, 4); cli_putc(','); + cli_hexdump(&m , 4); cli_putc(','); cli_hexdump(&r, 1);cli_putstr("): I="); + cli_hexdump(&t, 4); + + ia = pgm_read_dword(&s1[((uint8_t*)&t)[IA]] ); + ib = pgm_read_dword(&s2[((uint8_t*)&t)[IB]] ); + ic = pgm_read_dword(&s3[((uint8_t*)&t)[IC]] ); + id = pgm_read_dword(&s4[((uint8_t*)&t)[ID]] ); + + cli_putstr("\r\n\tIA="); cli_hexdump(&ia, 4); + cli_putstr("\r\n\tIB="); cli_hexdump(&ib, 4); + cli_putstr("\r\n\tIC="); cli_hexdump(&ic, 4); + cli_putstr("\r\n\tID="); cli_hexdump(&id, 4); + + return (((ia - ib) + ic) ^ id); #else - - return ((( pgm_read_dword(&s1[((uint8_t*)&t)[IA]]) - - pgm_read_dword(&s2[((uint8_t*)&t)[IB]]) ) - + pgm_read_dword(&s3[((uint8_t*)&t)[IC]]) ) - ^ pgm_read_dword(&s4[((uint8_t*)&t)[ID]]) ); + + return ((( pgm_read_dword(&s1[((uint8_t*)&t)[IA]]) + - pgm_read_dword(&s2[((uint8_t*)&t)[IB]])) + + pgm_read_dword(&s3[((uint8_t*)&t)[IC]])) + ^ pgm_read_dword(&s4[((uint8_t*)&t)[ID]])); #endif } -static -uint32_t cast5_f3(uint32_t d, uint32_t m, uint8_t r){ - uint32_t t; - t = ROTL32((m - d),r); +static uint32_t cast5_f3(uint32_t d, uint32_t m, uint8_t r) +{ + uint32_t t; + t = ROTL32((m - d), r); #ifdef DEBUG - uint32_t ia,ib,ic,id; - - cli_putstr("\r\n f3("); cli_hexdump(&d, 4); cli_putc(','); - cli_hexdump(&m , 4); cli_putc(','); cli_hexdump(&r, 1);cli_putstr("): I="); - cli_hexdump(&t, 4); - - ia = pgm_read_dword(&s1[((uint8_t*)&t)[IA]] ); - ib = pgm_read_dword(&s2[((uint8_t*)&t)[IB]] ); - ic = pgm_read_dword(&s3[((uint8_t*)&t)[IC]] ); - id = pgm_read_dword(&s4[((uint8_t*)&t)[ID]] ); - - cli_putstr("\r\n\tIA="); cli_hexdump(&ia, 4); - cli_putstr("\r\n\tIB="); cli_hexdump(&ib, 4); - cli_putstr("\r\n\tIC="); cli_hexdump(&ic, 4); - cli_putstr("\r\n\tID="); cli_hexdump(&id, 4); - return (((ia + ib) ^ ic) - id); + uint32_t ia,ib,ic,id; + + cli_putstr("\r\n f3("); cli_hexdump(&d, 4); cli_putc(','); + cli_hexdump(&m , 4); cli_putc(','); cli_hexdump(&r, 1);cli_putstr("): I="); + cli_hexdump(&t, 4); + + ia = pgm_read_dword(&s1[((uint8_t*)&t)[IA]] ); + ib = pgm_read_dword(&s2[((uint8_t*)&t)[IB]] ); + ic = pgm_read_dword(&s3[((uint8_t*)&t)[IC]] ); + id = pgm_read_dword(&s4[((uint8_t*)&t)[ID]] ); + + cli_putstr("\r\n\tIA="); cli_hexdump(&ia, 4); + cli_putstr("\r\n\tIB="); cli_hexdump(&ib, 4); + cli_putstr("\r\n\tIC="); cli_hexdump(&ic, 4); + cli_putstr("\r\n\tID="); cli_hexdump(&id, 4); + return (((ia + ib) ^ ic) - id); #else - return (( pgm_read_dword(&s1[((uint8_t*)&t)[IA]] ) - + pgm_read_dword(&s2[((uint8_t*)&t)[IB]] )) - ^ pgm_read_dword(&s3[((uint8_t*)&t)[IC]] )) - - pgm_read_dword(&s4[((uint8_t*)&t)[ID]] ); + return (( pgm_read_dword(&s1[((uint8_t*)&t)[IA]] ) + + pgm_read_dword(&s2[((uint8_t*)&t)[IB]])) + ^ pgm_read_dword(&s3[((uint8_t*)&t)[IC]])) + - pgm_read_dword(&s4[((uint8_t*)&t)[ID]]); #endif } /******************************************************************************/ -void cast5_enc(void* block, const cast5_ctx_t *s){ - uint32_t l,r, x, y; - uint8_t i; - cast5_f_t* f[]={cast5_f1,cast5_f2,cast5_f3}; - l=((uint32_t*)block)[0]; - r=((uint32_t*)block)[1]; +void cast5_enc(void *block, const cast5_ctx_t *s) +{ + uint32_t l, r, x, y; + uint8_t i; + cast5_f_t *f[] = { cast5_f1, cast5_f2, cast5_f3 }; + l = ((uint32_t*) block)[0]; + r = ((uint32_t*) block)[1]; // cli_putstr("\r\n round[-1] = "); // cli_hexdump(&r, 4); - for (i=0;i<(s->shortkey?12:16);++i){ - x = r; - y = (f[i%3])(CHANGE_ENDIAN32(r), CHANGE_ENDIAN32(s->mask[i]), - (((s->roth[i>>3]) & (1<<(i&0x7)))?0x10:0x00) - + ( ((s->rotl[i>>1])>>((i&1)?4:0)) & 0x0f) ); - r = l ^ CHANGE_ENDIAN32(y); + for (i = 0; i < (s->shortkey ? 12 : 16); ++i) { + x = r; + y = (f[i % 3])(CHANGE_ENDIAN32(r), CHANGE_ENDIAN32(s->mask[i]), + (((s->roth[i >> 3]) & (1 << (i & 0x7))) ? 0x10 : 0x00) + + (((s->rotl[i >> 1]) >> ((i & 1) ? 4 : 0)) & 0x0f)); + r = l ^ CHANGE_ENDIAN32(y); // cli_putstr("\r\n round["); DEBUG_B(i); cli_putstr("] = "); // cli_hexdump(&r, 4); - l = x; - } - ((uint32_t*)block)[0]=r; - ((uint32_t*)block)[1]=l; + l = x; + } + ((uint32_t*) block)[0] = r; + ((uint32_t*) block)[1] = l; } /******************************************************************************/ -void cast5_dec(void* block, const cast5_ctx_t *s){ - uint32_t l,r, x, y; - int8_t i, rounds; - cast5_f_t* f[]={cast5_f1,cast5_f2,cast5_f3}; - l=((uint32_t*)block)[0]; - r=((uint32_t*)block)[1]; - rounds = (s->shortkey?12:16); - for (i=rounds-1; i>=0 ;--i){ - x = r; - y = (f[i%3])(CHANGE_ENDIAN32(r), CHANGE_ENDIAN32(s->mask[i]), - (((s->roth[i>>3]) & (1<<(i&0x7)))?0x10:0x00) - + ( ((s->rotl[i>>1])>>((i&1)?4:0)) & 0x0f) ); - r = l ^ CHANGE_ENDIAN32(y); - l = x; - } - ((uint32_t*)block)[0]=r; - ((uint32_t*)block)[1]=l; +void cast5_dec(void *block, const cast5_ctx_t *s) +{ + uint32_t l, r, x, y; + int8_t i, rounds; + cast5_f_t *f[] = { cast5_f1, cast5_f2, cast5_f3 }; + l = ((uint32_t*) block)[0]; + r = ((uint32_t*) block)[1]; + rounds = (s->shortkey ? 12 : 16); + for (i = rounds - 1; i >= 0; --i) { + x = r; + y = (f[i % 3])(CHANGE_ENDIAN32(r), CHANGE_ENDIAN32(s->mask[i]), + (((s->roth[i >> 3]) & (1 << (i & 0x7))) ? 0x10 : 0x00) + + (((s->rotl[i >> 1]) >> ((i & 1) ? 4 : 0)) & 0x0f)); + r = l ^ CHANGE_ENDIAN32(y); + l = x; + } + ((uint32_t*) block)[0] = r; + ((uint32_t*) block)[1] = l; } - /******************************************************************************/ - - -