X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=cast6%2Fcast6.c;fp=cast6%2Fcast6.c;h=2e6a22837e1482ef25a0ebe1bbc05bab1fcac676;hp=5d21e5b5da03b35e8f1d3534398d3b5561e4dc12;hb=8d1970350aa1d7cdcb59cf79f7f60e385e2816e5;hpb=a30df60ac814350db243b270034ef188c8d02d5e diff --git a/cast6/cast6.c b/cast6/cast6.c index 5d21e5b..2e6a228 100644 --- a/cast6/cast6.c +++ b/cast6/cast6.c @@ -15,31 +15,31 @@ #define CHANGE_ENDIAN32(x) (((x)<<24 | (x)>>24 | ((x)&0xff00)<<8 | ((x)&0xff0000)>>8)&0xffffffff) - -static -uint8_t kr(uint8_t i, const cast6_ctx_t *ctx){ - uint8_t ret; - ret = ctx->krx[i/2]; - if(i&1){ - ret >>= 4; - }else{ - ret &= 0x0f; - } - /* now get the high bit */ - ret |= ((ctx->krx[24+i/8])&(1<<(i%8)))?0x10:0x00; - return ret; +static uint8_t kr(uint8_t i, const cast6_ctx_t *ctx) +{ + uint8_t ret; + ret = ctx->krx[i / 2]; + if (i & 1) { + ret >>= 4; + } else { + ret &= 0x0f; + } + /* now get the high bit */ + ret |= ((ctx->krx[24 + i / 8]) & (1 << (i % 8))) ? 0x10 : 0x00; + return ret; } static -void set_kr(uint8_t value, uint8_t i, cast6_ctx_t *ctx){ - value &= 0x1F; - - (ctx->krx[i/2]) &= 0xF0>>((i&1)*4); /* clear the location where v should go */ - (ctx->krx[i/2]) |= (value&0x0f)<<((i&1)*4); - - /* now set the high bit */ - (ctx->krx[24+i/8]) &= ~(1<<(i%8)); /* clear the location where v should go */ - (ctx->krx[24+i/8]) |= (value>>4)<<(i%8); +void set_kr(uint8_t value, uint8_t i, cast6_ctx_t *ctx) +{ + value &= 0x1F; + + (ctx->krx[i / 2]) &= 0xF0 >> ((i & 1) * 4); /* clear the location where v should go */ + (ctx->krx[i / 2]) |= (value & 0x0f) << ((i & 1) * 4); + + /* now set the high bit */ + (ctx->krx[24 + i / 8]) &= ~(1 << (i % 8)); /* clear the location where v should go */ + (ctx->krx[24 + i / 8]) |= (value >> 4) << (i % 8); } #define ROTL32(a,n) (((a)<<(n))|((a)>>(32-(n)))) @@ -55,41 +55,40 @@ void set_kr(uint8_t value, uint8_t i, cast6_ctx_t *ctx){ #define C ((uint8_t)(v>>(8*1))) #define D ((uint8_t)(v>>(8*0))) - -static -uint32_t f1(uint32_t v, uint8_t kri, uint32_t kmi){ - uint32_t o; - kri &= 0x1F; - v = ROTL32(kmi+v, kri); - o = S1(A); - o ^= S2(B); - o -= S3(C); - o += S4(D); - return o; +static uint32_t f1(uint32_t v, uint8_t kri, uint32_t kmi) +{ + uint32_t o; + kri &= 0x1F; + v = ROTL32(kmi + v, kri); + o = S1(A); + o ^= S2(B); + o -= S3(C); + o += S4(D); + return o; } -static -uint32_t f2(uint32_t v, uint8_t kri, uint32_t kmi){ - uint32_t o; - kri &= 0x1F; - v = ROTL32(kmi^v, kri); - o = S1(A); - o -= S2(B); - o += S3(C); - o ^= S4(D); - return o; +static uint32_t f2(uint32_t v, uint8_t kri, uint32_t kmi) +{ + uint32_t o; + kri &= 0x1F; + v = ROTL32(kmi ^ v, kri); + o = S1(A); + o -= S2(B); + o += S3(C); + o ^= S4(D); + return o; } -static -uint32_t f3(uint32_t v, uint8_t kri, uint32_t kmi){ - uint32_t o; - kri &= 0x1F; - v = ROTL32(kmi-v, kri); - o = S1(A); - o += S2(B); - o ^= S3(C); - o -= S4(D); - return o; +static uint32_t f3(uint32_t v, uint8_t kri, uint32_t kmi) +{ + uint32_t o; + kri &= 0x1F; + v = ROTL32(kmi - v, kri); + o = S1(A); + o += S2(B); + o ^= S3(C); + o -= S4(D); + return o; } #undef A @@ -103,54 +102,57 @@ uint32_t f3(uint32_t v, uint8_t kri, uint32_t kmi){ #define D (((uint32_t*)buffer)[3]) static -void q(void *buffer, uint8_t i, const cast6_ctx_t *ctx){ - C ^= f1(D, kr(i*4+0, ctx), ctx->km[i][0]); - B ^= f2(C, kr(i*4+1, ctx), ctx->km[i][1]); - A ^= f3(B, kr(i*4+2, ctx), ctx->km[i][2]); - D ^= f1(A, kr(i*4+3, ctx), ctx->km[i][3]); +void q(void *buffer, uint8_t i, const cast6_ctx_t *ctx) +{ + C ^= f1(D, kr(i * 4 + 0, ctx), ctx->km[i][0]); + B ^= f2(C, kr(i * 4 + 1, ctx), ctx->km[i][1]); + A ^= f3(B, kr(i * 4 + 2, ctx), ctx->km[i][2]); + D ^= f1(A, kr(i * 4 + 3, ctx), ctx->km[i][3]); } static -void qbar(void *buffer, uint8_t i, const cast6_ctx_t *ctx){ - D ^= f1(A, kr(i*4+3, ctx), ctx->km[i][3]); - A ^= f3(B, kr(i*4+2, ctx), ctx->km[i][2]); - B ^= f2(C, kr(i*4+1, ctx), ctx->km[i][1]); - C ^= f1(D, kr(i*4+0, ctx), ctx->km[i][0]); +void qbar(void *buffer, uint8_t i, const cast6_ctx_t *ctx) +{ + D ^= f1(A, kr(i * 4 + 3, ctx), ctx->km[i][3]); + A ^= f3(B, kr(i * 4 + 2, ctx), ctx->km[i][2]); + B ^= f2(C, kr(i * 4 + 1, ctx), ctx->km[i][1]); + C ^= f1(D, kr(i * 4 + 0, ctx), ctx->km[i][0]); } -void cast6_enc(void *buffer, const cast6_ctx_t *ctx){ - uint8_t i; - for(i=0; i<32/4; ++i){ - ((uint32_t*)buffer)[i] = CHANGE_ENDIAN32(((uint32_t*)buffer)[i]); - } - for(i=0; i<6; ++i){ - q(buffer, i, ctx); - } - for(i=6; i<12; ++i){ - qbar(buffer, i, ctx); - } - for(i=0; i<32/4; ++i){ - ((uint32_t*)buffer)[i] = CHANGE_ENDIAN32(((uint32_t*)buffer)[i]); - } +void cast6_enc(void *buffer, const cast6_ctx_t *ctx) +{ + uint8_t i; + for (i = 0; i < 32 / 4; ++i) { + ((uint32_t*) buffer)[i] = CHANGE_ENDIAN32(((uint32_t* )buffer)[i]); + } + for (i = 0; i < 6; ++i) { + q(buffer, i, ctx); + } + for (i = 6; i < 12; ++i) { + qbar(buffer, i, ctx); + } + for (i = 0; i < 32 / 4; ++i) { + ((uint32_t*) buffer)[i] = CHANGE_ENDIAN32(((uint32_t* )buffer)[i]); + } } -void cast6_dec(void *buffer, const cast6_ctx_t *ctx){ - uint8_t i; - for(i=0; i<32/4; ++i){ - ((uint32_t*)buffer)[i] = CHANGE_ENDIAN32(((uint32_t*)buffer)[i]); - } - for(i=12; i>6; --i){ - q(buffer, i-1, ctx); - } - for(i=6; i>0; --i){ - qbar(buffer, i-1, ctx); - } - for(i=0; i<32/4; ++i){ - ((uint32_t*)buffer)[i] = CHANGE_ENDIAN32(((uint32_t*)buffer)[i]); - } +void cast6_dec(void *buffer, const cast6_ctx_t *ctx) +{ + uint8_t i; + for (i = 0; i < 32 / 4; ++i) { + ((uint32_t*) buffer)[i] = CHANGE_ENDIAN32(((uint32_t* )buffer)[i]); + } + for (i = 12; i > 6; --i) { + q(buffer, i - 1, ctx); + } + for (i = 6; i > 0; --i) { + qbar(buffer, i - 1, ctx); + } + for (i = 0; i < 32 / 4; ++i) { + ((uint32_t*) buffer)[i] = CHANGE_ENDIAN32(((uint32_t* )buffer)[i]); + } } - #undef A #undef B #undef C @@ -167,101 +169,101 @@ void cast6_dec(void *buffer, const cast6_ctx_t *ctx){ /* * we might later make it optional to use this small thing + static + void w(void *buffer, uint8_t *tr, uint32_t *tm){ + G ^= f1(H, (tr[0]&0x0f)+(tr[5]&0x01)?0x10:0x00, tm[0]); + F ^= f2(G, (tr[0]>>4) +(tr[5]&0x02)?0x10:0x00, tm[1]); + E ^= f3(F, (tr[1]&0x0f)+(tr[5]&0x04)?0x10:0x00, tm[2]); + D ^= f1(E, (tr[1]>>4) +(tr[5]&0x08)?0x10:0x00, tm[3]); + C ^= f2(D, (tr[2]&0x0f)+(tr[5]&0x10)?0x10:0x00, tm[4]); + B ^= f3(C, (tr[2]>>4) +(tr[5]&0x20)?0x10:0x00, tm[5]); + A ^= f1(B, (tr[3]&0x0f)+(tr[5]&0x40)?0x10:0x00, tm[6]); + H ^= f2(A, (tr[3]>>4) +(tr[5]&0x80)?0x10:0x00, tm[7]); + } + */ static -void w(void *buffer, uint8_t *tr, uint32_t *tm){ - G ^= f1(H, (tr[0]&0x0f)+(tr[5]&0x01)?0x10:0x00, tm[0]); - F ^= f2(G, (tr[0]>>4) +(tr[5]&0x02)?0x10:0x00, tm[1]); - E ^= f3(F, (tr[1]&0x0f)+(tr[5]&0x04)?0x10:0x00, tm[2]); - D ^= f1(E, (tr[1]>>4) +(tr[5]&0x08)?0x10:0x00, tm[3]); - C ^= f2(D, (tr[2]&0x0f)+(tr[5]&0x10)?0x10:0x00, tm[4]); - B ^= f3(C, (tr[2]>>4) +(tr[5]&0x20)?0x10:0x00, tm[5]); - A ^= f1(B, (tr[3]&0x0f)+(tr[5]&0x40)?0x10:0x00, tm[6]); - H ^= f2(A, (tr[3]>>4) +(tr[5]&0x80)?0x10:0x00, tm[7]); -} -*/ -static -void w(void *buffer, uint8_t *tr, uint32_t *tm){ - G ^= f1(H, tr[0], tm[0]); - F ^= f2(G, tr[1], tm[1]); - E ^= f3(F, tr[2], tm[2]); - D ^= f1(E, tr[3], tm[3]); - C ^= f2(D, tr[4], tm[4]); - B ^= f3(C, tr[5], tm[5]); - A ^= f1(B, tr[6], tm[6]); - H ^= f2(A, tr[7], tm[7]); +void w(void *buffer, uint8_t *tr, uint32_t *tm) +{ + G ^= f1(H, tr[0], tm[0]); + F ^= f2(G, tr[1], tm[1]); + E ^= f3(F, tr[2], tm[2]); + D ^= f1(E, tr[3], tm[3]); + C ^= f2(D, tr[4], tm[4]); + B ^= f3(C, tr[5], tm[5]); + A ^= f1(B, tr[6], tm[6]); + H ^= f2(A, tr[7], tm[7]); } /* -void dump_ctx(const cast6_ctx_t *ctx){ - uint8_t i,t; - cli_putstr_P(PSTR("\r\n DBG:")); - for(i=0; i<12; ++i){ - cli_putstr_P(PSTR("\r\n DBG:")); - cli_putstr_P(PSTR(" rotk1=")); - t=kr(i*4+0, ctx); - cli_hexdump(&t,1); - cli_putstr_P(PSTR(" rotk2=")); - t=kr(i*4+1, ctx); - cli_hexdump(&t,1); - cli_putstr_P(PSTR(" rotk3=")); - t=kr(i*4+2, ctx); - cli_hexdump(&t,1); - cli_putstr_P(PSTR(" rotk4=")); - t=kr(i*4+3, ctx); - cli_hexdump(&t,1); - cli_putstr_P(PSTR("\r\n ")); - cli_putstr_P(PSTR(" mask1=")); - cli_hexdump(&(ctx->km[i][0]),4); - cli_putstr_P(PSTR(" mask2=")); - cli_hexdump(&(ctx->km[i][1]),4); - cli_putstr_P(PSTR(" mask3=")); - cli_hexdump(&(ctx->km[i][2]),4); - cli_putstr_P(PSTR(" mask4=")); - cli_hexdump(&(ctx->km[i][3]),4); - cli_putstr_P(PSTR("\r\n;-----")); - } -} -*/ + void dump_ctx(const cast6_ctx_t *ctx){ + uint8_t i,t; + cli_putstr_P(PSTR("\r\n DBG:")); + for(i=0; i<12; ++i){ + cli_putstr_P(PSTR("\r\n DBG:")); + cli_putstr_P(PSTR(" rotk1=")); + t=kr(i*4+0, ctx); + cli_hexdump(&t,1); + cli_putstr_P(PSTR(" rotk2=")); + t=kr(i*4+1, ctx); + cli_hexdump(&t,1); + cli_putstr_P(PSTR(" rotk3=")); + t=kr(i*4+2, ctx); + cli_hexdump(&t,1); + cli_putstr_P(PSTR(" rotk4=")); + t=kr(i*4+3, ctx); + cli_hexdump(&t,1); + cli_putstr_P(PSTR("\r\n ")); + cli_putstr_P(PSTR(" mask1=")); + cli_hexdump(&(ctx->km[i][0]),4); + cli_putstr_P(PSTR(" mask2=")); + cli_hexdump(&(ctx->km[i][1]),4); + cli_putstr_P(PSTR(" mask3=")); + cli_hexdump(&(ctx->km[i][2]),4); + cli_putstr_P(PSTR(" mask4=")); + cli_hexdump(&(ctx->km[i][3]),4); + cli_putstr_P(PSTR("\r\n;-----")); + } + } + */ #define CR 19 #define CM 0x5A827999 #define MR 17 #define MM 0x6ED9EBA1 -void cast6_init(const void *key, uint16_t keysize_b, cast6_ctx_t *ctx){ - uint8_t buffer[32]; - uint8_t cr=CR, tr[8]; - uint32_t cm=CM, tm[8]; - uint8_t i,j; - - memset(buffer, 0, 32); - memcpy(buffer, key, (keysize_b+7)/8); - for(i=0; i<32/4; ++i){ - ((uint32_t*)buffer)[i] = CHANGE_ENDIAN32(((uint32_t*)buffer)[i]); - } - - for(i=0; i<24; ++i){ - for(j=0; j<8; ++j){ - tm[j] = cm; - cm += MM; - tr[j] = cr&0x1F; - cr += MR; - } - w(buffer, tr, tm); +void cast6_init(const void *key, uint16_t keysize_b, cast6_ctx_t *ctx) +{ + uint8_t buffer[32]; + uint8_t cr = CR, tr[8]; + uint32_t cm = CM, tm[8]; + uint8_t i, j; - if(i&1){ - j=i/2; - ctx->km[j][0]=H; - ctx->km[j][1]=F; - ctx->km[j][2]=D; - ctx->km[j][3]=B; - set_kr(buffer[0*4],j*4+0,ctx); - set_kr(buffer[2*4],j*4+1,ctx); - set_kr(buffer[4*4],j*4+2,ctx); - set_kr(buffer[6*4],j*4+3,ctx); - } - } -} + memset(buffer, 0, 32); + memcpy(buffer, key, (keysize_b + 7) / 8); + for (i = 0; i < 32 / 4; ++i) { + ((uint32_t*) buffer)[i] = CHANGE_ENDIAN32(((uint32_t* )buffer)[i]); + } + for (i = 0; i < 24; ++i) { + for (j = 0; j < 8; ++j) { + tm[j] = cm; + cm += MM; + tr[j] = cr & 0x1F; + cr += MR; + } + w(buffer, tr, tm); + if (i & 1) { + j = i / 2; + ctx->km[j][0] = H; + ctx->km[j][1] = F; + ctx->km[j][2] = D; + ctx->km[j][3] = B; + set_kr(buffer[0 * 4], j * 4 + 0, ctx); + set_kr(buffer[2 * 4], j * 4 + 1, ctx); + set_kr(buffer[4 * 4], j * 4 + 2, ctx); + set_kr(buffer[6 * 4], j * 4 + 3, ctx); + } + } +}