X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=a51%2FA5_1.c;fp=a51%2FA5_1.c;h=70917f33b446a812392bdd68407a7619df99c456;hp=a8bbf3da8513566dcd947064a229362c4082b481;hb=8d1970350aa1d7cdcb59cf79f7f60e385e2816e5;hpb=a30df60ac814350db243b270034ef188c8d02d5e diff --git a/a51/A5_1.c b/a51/A5_1.c index a8bbf3d..70917f3 100644 --- a/a51/A5_1.c +++ b/a51/A5_1.c @@ -1,21 +1,21 @@ /* A5_1.c */ /* - This file is part of the AVR-Crypto-Lib. - Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + 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 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. + 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 . -*/ + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ /* * File: A5_1.c * Author: Daniel Otte @@ -26,7 +26,7 @@ * ! Warning, this is weak crypto ! * */ - + #include #include #include "A5_1.h" @@ -34,117 +34,118 @@ uint8_t a5_1_clock_core(a5_1_ctx_t *c, uint8_t clockoverride); - /* * length is length of key in bits! */ -void a5_1_init(a5_1_ctx_t *c, void *key, uint8_t keylength_b, void *iv, uint8_t ivlength_b){ - uint8_t i,t; - memset(c->r1, 0, 3); - memset(c->r2, 0, 3); - memset(c->r3, 0, 3); - for(i=0; i>i); - c->r1[0] ^= t; - c->r2[0] ^= t; - c->r3[0] ^= t; - a5_1_clock_core(c, 0x7); - } - for(i=0; i>i); - c->r1[0] ^= t; - c->r2[0] ^= t; - c->r3[0] ^= t; - a5_1_clock_core(c, 0x7); - } - for(i=0; i<100; ++i) - a5_1_clock_core(c,0); +void a5_1_init(a5_1_ctx_t *c, void *key, uint8_t keylength_b, void *iv, + uint8_t ivlength_b) +{ + uint8_t i, t; + memset(c->r1, 0, 3); + memset(c->r2, 0, 3); + memset(c->r3, 0, 3); + for (i = 0; i < keylength_b; ++i) { + t = ((uint8_t*) key)[i / 8]; + t = 1 & (t >> i); + c->r1[0] ^= t; + c->r2[0] ^= t; + c->r3[0] ^= t; + a5_1_clock_core(c, 0x7); + } + for (i = 0; i < ivlength_b; ++i) { + t = ((uint8_t*) iv)[i / 8]; + t = 1 & (t >> i); + c->r1[0] ^= t; + c->r2[0] ^= t; + c->r3[0] ^= t; + a5_1_clock_core(c, 0x7); + } + for (i = 0; i < 100; ++i) + a5_1_clock_core(c, 0); } static -void shiftreg(uint8_t *d){ - uint8_t c, c2; - c=d[0]>>7; - d[0] <<= 1; - c2=d[1]>>7; - d[1] = (d[1]<<1) | c; - d[2] = (d[2]<<1) | c2; -} - -const uint8_t parity3_lut[] PROGMEM = {0, 1, 1, 0, - 1, 0, 0, 1}; -const uint8_t clock_lut[] PROGMEM = {0x7, 0x6, 0x5, 0x3, - 0x3, 0x5, 0x6, 0x7}; - -uint8_t a5_1_clock_core(a5_1_ctx_t *c, uint8_t clockoverride){ - uint8_t ret,clk,fb; - ret = (0x04&c->r1[2]) | (0x20&c->r2[2]) | (0x40&c->r3[2]); - ret = ret^(ret>>6); - ret &= 0x7; - ret = pgm_read_byte(parity3_lut+ret); - clk = (0x08&c->r1[1]) | (0x10&c->r2[1]) | (0x20&c->r3[1]); - clk >>= 3; - clk = pgm_read_byte(clock_lut+clk); - clk |= clockoverride; - - if(clk&1){ - fb = c->r1[2] ^ (1&((c->r1[1])>>5)); - fb &= 0x7; - fb = pgm_read_byte(parity3_lut+fb); - shiftreg(c->r1); - c->r1[0] |= fb; - c->r1[2] &= 0x07; - } - clk>>=1; - if(clk&1){ - fb = c->r2[2]>>4 ; - fb &= 0x7; - fb = pgm_read_byte(parity3_lut+fb); - shiftreg(c->r2); - c->r2[0] |= fb; - c->r2[2] &= 0x3F; - - } - clk>>=1; - if(clk&1){ - fb = (c->r3[2]>>4) ^ (1&((c->r3[0])>>7)); - fb &= 0x7; - fb = pgm_read_byte(parity3_lut+fb); - shiftreg(c->r3); - c->r3[0] |= fb; - c->r3[2] &= 0x7F; - } - return ret; +void shiftreg(uint8_t *d) +{ + uint8_t c, c2; + c = d[0] >> 7; + d[0] <<= 1; + c2 = d[1] >> 7; + d[1] = (d[1] << 1) | c; + d[2] = (d[2] << 1) | c2; } -uint8_t a5_1_clock(a5_1_ctx_t *c){ - return a5_1_clock_core(c, 0); +const uint8_t parity3_lut[] PROGMEM = { 0, 1, 1, 0, + 1, 0, 0, 1 }; +const uint8_t clock_lut[] PROGMEM = { 0x7, 0x6, 0x5, 0x3, + 0x3, 0x5, 0x6, 0x7 }; + +uint8_t a5_1_clock_core(a5_1_ctx_t *c, uint8_t clockoverride) +{ + uint8_t ret, clk, fb; + ret = (0x04 & c->r1[2]) | (0x20 & c->r2[2]) | (0x40 & c->r3[2]); + ret = ret ^ (ret >> 6); + ret &= 0x7; + ret = pgm_read_byte(parity3_lut + ret); + clk = (0x08 & c->r1[1]) | (0x10 & c->r2[1]) | (0x20 & c->r3[1]); + clk >>= 3; + clk = pgm_read_byte(clock_lut + clk); + clk |= clockoverride; + + if (clk & 1) { + fb = c->r1[2] ^ (1 & ((c->r1[1]) >> 5)); + fb &= 0x7; + fb = pgm_read_byte(parity3_lut + fb); + shiftreg(c->r1); + c->r1[0] |= fb; + c->r1[2] &= 0x07; + } + clk >>= 1; + if (clk & 1) { + fb = c->r2[2] >> 4; + fb &= 0x7; + fb = pgm_read_byte(parity3_lut + fb); + shiftreg(c->r2); + c->r2[0] |= fb; + c->r2[2] &= 0x3F; + + } + clk >>= 1; + if (clk & 1) { + fb = (c->r3[2] >> 4) ^ (1 & ((c->r3[0]) >> 7)); + fb &= 0x7; + fb = pgm_read_byte(parity3_lut + fb); + shiftreg(c->r3); + c->r3[0] |= fb; + c->r3[2] &= 0x7F; + } + return ret; } - -uint8_t a5_1_gen(a5_1_ctx_t *c){ - uint8_t ret=0; - ret = a5_1_clock(c); - ret <<= 1; - ret = a5_1_clock(c); - ret <<= 1; - ret = a5_1_clock(c); - ret <<= 1; - ret = a5_1_clock(c); - ret <<= 1; - ret = a5_1_clock(c); - ret <<= 1; - ret = a5_1_clock(c); - ret <<= 1; - ret = a5_1_clock(c); - ret <<= 1; - ret = a5_1_clock(c); - return ret; +uint8_t a5_1_clock(a5_1_ctx_t *c) +{ + return a5_1_clock_core(c, 0); } - - +uint8_t a5_1_gen(a5_1_ctx_t *c) +{ + uint8_t ret = 0; + ret = a5_1_clock(c); + ret <<= 1; + ret = a5_1_clock(c); + ret <<= 1; + ret = a5_1_clock(c); + ret <<= 1; + ret = a5_1_clock(c); + ret <<= 1; + ret = a5_1_clock(c); + ret <<= 1; + ret = a5_1_clock(c); + ret <<= 1; + ret = a5_1_clock(c); + ret <<= 1; + ret = a5_1_clock(c); + return ret; +}