X-Git-Url: https://git.cryptolib.org/?a=blobdiff_plain;f=a51%2FA5_1.c;h=70917f33b446a812392bdd68407a7619df99c456;hb=f63427e84c047aafe16f6ab3b5452d4d2993241d;hp=64b44f73ff865b381ab77bb62a39ec4b977fc40e;hpb=cf610f6848d1a6aef4de849f9ec7895e20605583;p=avr-crypto-lib.git
diff --git a/a51/A5_1.c b/a51/A5_1.c
index 64b44f7..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;
+}