parent
a5bbf8d74b
commit
79c9a6582b
33
Makefile
33
Makefile
|
@ -1,16 +1,27 @@
|
|||
PRG = camellia
|
||||
PRG = tdes-test
|
||||
# camellia
|
||||
# cryptotest
|
||||
OBJ = main-camellia-test.o debug.o uart.o serial-tools.o camellia.o camellia-asm.o
|
||||
# main-skipjack-test.o debug.o uart.o serial-tools.o skipjack.o
|
||||
# main-sha1-test.o debug.o uart.o serial-tools.o sha1-asm.o
|
||||
# main-md5-test.o debug.o uart.o serial-tools.o md5.o
|
||||
# main-cast5-test.o debug.o uart.o serial-tools.o cast5.o
|
||||
# OBJ = main-rc6-test.o debug.o uart.o serial-tools.o rc6.o
|
||||
# main.o debug.o uart.o serial-tools.o sha256-asm.o xtea-asm.o arcfour-asm.o prng.o cast5.o
|
||||
CAMELLIA_OBJ = main-camellia-test.o debug.o uart.o serial-tools.o camellia.o camellia-asm.o
|
||||
SKIPJACK_OBJ = main-skipjack-test.o debug.o uart.o serial-tools.o skipjack.o
|
||||
SHA1_OBJ = main-sha1-test.o debug.o uart.o serial-tools.o sha1-asm.o
|
||||
MD5_OBJ = main-md5-test.o debug.o uart.o serial-tools.o md5.o
|
||||
CAST5_OBJ = main-cast5-test.o debug.o uart.o serial-tools.o cast5.o
|
||||
RC6_OBJ = main-rc6-test.o debug.o uart.o serial-tools.o rc6.o
|
||||
Multi_OBJ = main.o debug.o uart.o serial-tools.o sha256-asm.o xtea-asm.o arcfour-asm.o prng.o cast5.o
|
||||
DES_OBJ = main-des-test.o debug.o uart.o serial-tools.o des.o
|
||||
TDES_OBJ = main-tdes-test.o debug.o uart.o serial-tools.o des.o
|
||||
SEED_OBJ = main-seed-test.o debug.o uart.o serial-tools.o seed.o seed-asm.o
|
||||
SHABEA_OBJ = main-shabea-test.o debug.o uart.o serial-tools.o shabea.o sha256-asm.o
|
||||
|
||||
OBJ = $(TDES_OBJ)
|
||||
MCU_TARGET = atmega32
|
||||
OPTIMIZE = -Os
|
||||
|
||||
FLASHCMD = avrdude -p $(MCU_TARGET) -P /dev/ttyUSB0 -c avr911 -U flash:w:$(PRG).hex
|
||||
# -U eeprom:w:$(PRG)_eeprom.hex
|
||||
#uisp -dprog=bsd -dlpt=/dev/parport1 --upload if=$(PRG).hex
|
||||
ERASECMD =
|
||||
|
||||
DEFS =
|
||||
LIBS =
|
||||
|
||||
|
@ -20,7 +31,7 @@ CC = avr-gcc
|
|||
|
||||
# Override is only needed by avr-lib build system.
|
||||
|
||||
override CFLAGS = -Wall -Wstrict-prototypes $(OPTIMIZE) -mmcu=$(MCU_TARGET)
|
||||
override CFLAGS = -pedantic -std=c99 -Wall -Wstrict-prototypes $(OPTIMIZE) -mmcu=$(MCU_TARGET)
|
||||
$(DEFS)
|
||||
override LDFLAGS = -Wl,-Map,$(PRG).map
|
||||
override ASFLAGS = -mmcu=$(MCU_TARGET)
|
||||
|
@ -39,6 +50,10 @@ clean:
|
|||
rm -rf *.o $(PRG).elf *.eps *.png *.pdf *.bak
|
||||
rm -rf *.lst *.map $(EXTRA_CLEAN_FILES)
|
||||
|
||||
flash:
|
||||
$(ERASECMD)
|
||||
$(FLASHCMD)
|
||||
|
||||
lst: $(PRG).lst
|
||||
|
||||
%.lst: %.elf
|
||||
|
|
6
config.h
6
config.h
|
@ -2,13 +2,13 @@
|
|||
#define __CONFIG_H__
|
||||
#include <avr/io.h>
|
||||
|
||||
#define F_CPU 16000000 // Oszillator-Frequenz in Hz
|
||||
#define F_CPU 16000000 /* Oszillator-Frequenz in Hz */
|
||||
|
||||
#define DEBUG uart
|
||||
|
||||
//c uart.[ch] defines
|
||||
/* uart.[ch] defines */
|
||||
#define UART_INTERRUPT 1
|
||||
#define UART_BAUD_RATE 38400
|
||||
#define UART_BAUD_RATE 9600
|
||||
#define UART_RXBUFSIZE 16
|
||||
#define UART_TXBUFSIZE 16
|
||||
#define UART_LINE_BUFFER_SIZE 40
|
||||
|
|
|
@ -0,0 +1,371 @@
|
|||
/**
|
||||
* \file des.c
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-16
|
||||
* \brief DES and EDE-DES implementation
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "debug.h"
|
||||
#include "uart.h"
|
||||
#include <string.h>
|
||||
#include <util/delay.h>
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
prog_uint8_t sbox[256] = {
|
||||
/* S-box 1 */
|
||||
0xE4, 0xD1, 0x2F, 0xB8, 0x3A, 0x6C, 0x59, 0x07,
|
||||
0x0F, 0x74, 0xE2, 0xD1, 0xA6, 0xCB, 0x95, 0x38,
|
||||
0x41, 0xE8, 0xD6, 0x2B, 0xFC, 0x97, 0x3A, 0x50,
|
||||
0xFC, 0x82, 0x49, 0x17, 0x5B, 0x3E, 0xA0, 0x6D,
|
||||
/* S-box 2 */
|
||||
0xF1, 0x8E, 0x6B, 0x34, 0x97, 0x2D, 0xC0, 0x5A,
|
||||
0x3D, 0x47, 0xF2, 0x8E, 0xC0, 0x1A, 0x69, 0xB5,
|
||||
0x0E, 0x7B, 0xA4, 0xD1, 0x58, 0xC6, 0x93, 0x2F,
|
||||
0xD8, 0xA1, 0x3F, 0x42, 0xB6, 0x7C, 0x05, 0xE9,
|
||||
/* S-box 3 */
|
||||
0xA0, 0x9E, 0x63, 0xF5, 0x1D, 0xC7, 0xB4, 0x28,
|
||||
0xD7, 0x09, 0x34, 0x6A, 0x28, 0x5E, 0xCB, 0xF1,
|
||||
0xD6, 0x49, 0x8F, 0x30, 0xB1, 0x2C, 0x5A, 0xE7,
|
||||
0x1A, 0xD0, 0x69, 0x87, 0x4F, 0xE3, 0xB5, 0x2C,
|
||||
/* S-box 4 */
|
||||
0x7D, 0xE3, 0x06, 0x9A, 0x12, 0x85, 0xBC, 0x4F,
|
||||
0xD8, 0xB5, 0x6F, 0x03, 0x47, 0x2C, 0x1A, 0xE9,
|
||||
0xA6, 0x90, 0xCB, 0x7D, 0xF1, 0x3E, 0x52, 0x84,
|
||||
0x3F, 0x06, 0xA1, 0xD8, 0x94, 0x5B, 0xC7, 0x2E,
|
||||
/* S-box 5 */
|
||||
0x2C, 0x41, 0x7A, 0xB6, 0x85, 0x3F, 0xD0, 0xE9,
|
||||
0xEB, 0x2C, 0x47, 0xD1, 0x50, 0xFA, 0x39, 0x86,
|
||||
0x42, 0x1B, 0xAD, 0x78, 0xF9, 0xC5, 0x63, 0x0E,
|
||||
0xB8, 0xC7, 0x1E, 0x2D, 0x6F, 0x09, 0xA4, 0x53,
|
||||
/* S-box 6 */
|
||||
0xC1, 0xAF, 0x92, 0x68, 0x0D, 0x34, 0xE7, 0x5B,
|
||||
0xAF, 0x42, 0x7C, 0x95, 0x61, 0xDE, 0x0B, 0x38,
|
||||
0x9E, 0xF5, 0x28, 0xC3, 0x70, 0x4A, 0x1D, 0xB6,
|
||||
0x43, 0x2C, 0x95, 0xFA, 0xBE, 0x17, 0x60, 0x8D,
|
||||
/* S-box 7 */
|
||||
0x4B, 0x2E, 0xF0, 0x8D, 0x3C, 0x97, 0x5A, 0x61,
|
||||
0xD0, 0xB7, 0x49, 0x1A, 0xE3, 0x5C, 0x2F, 0x86,
|
||||
0x14, 0xBD, 0xC3, 0x7E, 0xAF, 0x68, 0x05, 0x92,
|
||||
0x6B, 0xD8, 0x14, 0xA7, 0x95, 0x0F, 0xE2, 0x3C,
|
||||
/* S-box 8 */
|
||||
0xD2, 0x84, 0x6F, 0xB1, 0xA9, 0x3E, 0x50, 0xC7,
|
||||
0x1F, 0xD8, 0xA3, 0x74, 0xC5, 0x6B, 0x0E, 0x92,
|
||||
0x7B, 0x41, 0x9C, 0xE2, 0x06, 0xAD, 0xF3, 0x58,
|
||||
0x21, 0xE7, 0x4A, 0x8D, 0xFC, 0x90, 0x35, 0x6B
|
||||
};
|
||||
|
||||
prog_uint8_t e_permtab[] ={
|
||||
4, 6, /* 4 bytes in 6 bytes out*/
|
||||
32, 1, 2, 3, 4, 5,
|
||||
4, 5, 6, 7, 8, 9,
|
||||
8, 9, 10, 11, 12, 13,
|
||||
12, 13, 14, 15, 16, 17,
|
||||
16, 17, 18, 19, 20, 21,
|
||||
20, 21, 22, 23, 24, 25,
|
||||
24, 25, 26, 27, 28, 29,
|
||||
28, 29, 30, 31, 32, 1
|
||||
};
|
||||
|
||||
prog_uint8_t p_permtab[] ={
|
||||
4, 4, /* 32 bit -> 32 bit */
|
||||
16, 7, 20, 21,
|
||||
29, 12, 28, 17,
|
||||
1, 15, 23, 26,
|
||||
5, 18, 31, 10,
|
||||
2, 8, 24, 14,
|
||||
32, 27, 3, 9,
|
||||
19, 13, 30, 6,
|
||||
22, 11, 4, 25
|
||||
};
|
||||
|
||||
prog_uint8_t ip_permtab[] ={
|
||||
8, 8, /* 64 bit -> 64 bit */
|
||||
58, 50, 42, 34, 26, 18, 10, 2,
|
||||
60, 52, 44, 36, 28, 20, 12, 4,
|
||||
62, 54, 46, 38, 30, 22, 14, 6,
|
||||
64, 56, 48, 40, 32, 24, 16, 8,
|
||||
57, 49, 41, 33, 25, 17, 9, 1,
|
||||
59, 51, 43, 35, 27, 19, 11, 3,
|
||||
61, 53, 45, 37, 29, 21, 13, 5,
|
||||
63, 55, 47, 39, 31, 23, 15, 7
|
||||
};
|
||||
|
||||
prog_uint8_t inv_ip_permtab[] ={
|
||||
8, 8, /* 64 bit -> 64 bit */
|
||||
40, 8, 48, 16, 56, 24, 64, 32,
|
||||
39, 7, 47, 15, 55, 23, 63, 31,
|
||||
38, 6, 46, 14, 54, 22, 62, 30,
|
||||
37, 5, 45, 13, 53, 21, 61, 29,
|
||||
36, 4, 44, 12, 52, 20, 60, 28,
|
||||
35, 3, 43, 11, 51, 19, 59, 27,
|
||||
34, 2, 42, 10, 50, 18, 58, 26,
|
||||
33, 1, 41, 9, 49, 17, 57, 25
|
||||
};
|
||||
|
||||
prog_uint8_t pc1_permtab[] ={
|
||||
8, 7, /* 64 bit -> 56 bit*/
|
||||
57, 49, 41, 33, 25, 17, 9,
|
||||
1, 58, 50, 42, 34, 26, 18,
|
||||
10, 2, 59, 51, 43, 35, 27,
|
||||
19, 11, 3, 60, 52, 44, 36,
|
||||
63, 55, 47, 39, 31, 23, 15,
|
||||
7, 62, 54, 46, 38, 30, 22,
|
||||
14, 6, 61, 53, 45, 37, 29,
|
||||
21, 13, 5, 28, 20, 12, 4
|
||||
};
|
||||
|
||||
prog_uint8_t pc2_permtab[] ={
|
||||
7, 6, /* 56 bit -> 48 bit */
|
||||
14, 17, 11, 24, 1, 5,
|
||||
3, 28, 15, 6, 21, 10,
|
||||
23, 19, 12, 4, 26, 8,
|
||||
16, 7, 27, 20, 13, 2,
|
||||
41, 52, 31, 37, 47, 55,
|
||||
30, 40, 51, 45, 33, 48,
|
||||
44, 49, 39, 56, 34, 53,
|
||||
46, 42, 50, 36, 29, 32
|
||||
};
|
||||
|
||||
prog_uint8_t splitin6bitword_permtab[] = {
|
||||
8, 8, /* 64 bit -> 64 bit */
|
||||
64, 64, 1, 6, 2, 3, 4, 5,
|
||||
64, 64, 7, 12, 8, 9, 10, 11,
|
||||
64, 64, 13, 18, 14, 15, 16, 17,
|
||||
64, 64, 19, 24, 20, 21, 22, 23,
|
||||
64, 64, 25, 30, 26, 27, 28, 29,
|
||||
64, 64, 31, 36, 32, 33, 34, 35,
|
||||
64, 64, 37, 42, 38, 39, 40, 41,
|
||||
64, 64, 43, 48, 44, 45, 46, 47
|
||||
};
|
||||
|
||||
prog_uint8_t shiftkey_permtab[] = {
|
||||
7, 7, /* 56 bit -> 56 bit */
|
||||
2, 3, 4, 5, 6, 7, 8, 9,
|
||||
10, 11, 12, 13, 14, 15, 16, 17,
|
||||
18, 19, 20, 21, 22, 23, 24, 25,
|
||||
26, 27, 28, 1,
|
||||
30, 31, 32, 33, 34, 35, 36, 37,
|
||||
38, 39, 40, 41, 42, 43, 44, 45,
|
||||
46, 47, 48, 49, 50, 51, 52, 53,
|
||||
54, 55, 56, 29
|
||||
};
|
||||
|
||||
prog_uint8_t shiftkeyinv_permtab[] = {
|
||||
7, 7,
|
||||
28, 1, 2, 3, 4, 5, 6, 7,
|
||||
8, 9, 10, 11, 12, 13, 14, 15,
|
||||
16, 17, 18, 19, 20, 21, 22, 23,
|
||||
24, 25, 26, 27,
|
||||
56, 29, 30, 31, 32, 33, 34, 35,
|
||||
36, 37, 38, 39, 40, 41, 42, 43,
|
||||
44, 45, 46, 47, 48, 49, 50, 51,
|
||||
52, 53, 54, 55
|
||||
};
|
||||
|
||||
/*
|
||||
1 0
|
||||
1 0
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
----
|
||||
1 0
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
2 1
|
||||
1 0
|
||||
*/
|
||||
#define ROTTABLE 0x7EFC
|
||||
#define ROTTABLE_INV 0x3F7E
|
||||
/******************************************************************************/
|
||||
|
||||
void permute(prog_uint8_t *ptable, uint8_t *in, uint8_t *out){
|
||||
uint8_t ib, ob; /* in-bytes and out-bytes */
|
||||
uint8_t byte, bit; /* counter for bit and byte */
|
||||
ib = pgm_read_byte(&(ptable[0]));
|
||||
ob = pgm_read_byte(&(ptable[1]));
|
||||
ptable = &(ptable[2]);
|
||||
for(byte=0; byte<ob; ++byte){
|
||||
uint8_t x,t=0;
|
||||
for(bit=0; bit<8; ++bit){
|
||||
x=pgm_read_byte(&(ptable[byte*8+bit])) -1 ;
|
||||
t<<=1;
|
||||
if((in[x/8]) & (0x80>>(x%8)) ){
|
||||
t|=0x01;
|
||||
}
|
||||
}
|
||||
out[byte]=t;
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void changeendian32(uint32_t * a){
|
||||
*a = (*a & 0x000000FF) << 24 |
|
||||
(*a & 0x0000FF00) << 8 |
|
||||
(*a & 0x00FF0000) >> 8 |
|
||||
(*a & 0xFF000000) >> 24;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static inline
|
||||
void shiftkey(uint8_t *key){
|
||||
uint8_t k[7];
|
||||
memcpy(k, key, 7);
|
||||
permute((prog_uint8_t*)shiftkey_permtab, k, key);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static inline
|
||||
void shiftkey_inv(uint8_t *key){
|
||||
uint8_t k[7];
|
||||
memcpy(k, key, 7);
|
||||
permute((prog_uint8_t*)shiftkeyinv_permtab, k, key);
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static inline
|
||||
uint64_t splitin6bitwords(uint64_t a){
|
||||
uint64_t ret=0;
|
||||
a &= 0x0000ffffffffffffLL;
|
||||
permute((prog_uint8_t*)splitin6bitword_permtab, (uint8_t*)&a, (uint8_t*)&ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
static inline
|
||||
uint8_t substitute(uint8_t a, prog_uint8_t * sbp){
|
||||
uint8_t x;
|
||||
x = pgm_read_byte(&(sbp[a>>1]));
|
||||
x = (a&1)?x&0x0F:x>>4;
|
||||
return x;
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
uint32_t des_f(uint32_t r, uint8_t* kr){
|
||||
uint8_t i;
|
||||
uint32_t t=0,ret;
|
||||
uint64_t data;
|
||||
prog_uint8_t *sbp; /* sboxpointer */
|
||||
permute((prog_uint8_t*)e_permtab, (uint8_t*)&r, (uint8_t*)&data);
|
||||
for(i=0; i<7; ++i)
|
||||
((uint8_t*)&data)[i] ^= kr[i];
|
||||
|
||||
/* Sbox substitution */
|
||||
data = splitin6bitwords(data);
|
||||
sbp=(prog_uint8_t*)sbox;
|
||||
for(i=0; i<8; ++i){
|
||||
uint8_t x;
|
||||
x = substitute(((uint8_t*)&data)[i], sbp);
|
||||
t<<=4;
|
||||
t |= x;
|
||||
sbp += 32;
|
||||
}
|
||||
changeendian32(&t);
|
||||
|
||||
permute((prog_uint8_t*)p_permtab,(uint8_t*)&t, (uint8_t*)&ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void des_encrypt(uint8_t* out, uint8_t* in, uint8_t* key){
|
||||
#define R *((uint32_t*)&(data[4]))
|
||||
#define L *((uint32_t*)&(data[0]))
|
||||
|
||||
uint8_t data[8],kr[6],k[7];
|
||||
uint8_t i;
|
||||
|
||||
permute((prog_uint8_t*)ip_permtab, in, data);
|
||||
permute((prog_uint8_t*)pc1_permtab, key, k);
|
||||
for(i=0; i<8; ++i){
|
||||
shiftkey(k);
|
||||
if(ROTTABLE&((1<<((i<<1)+0))) )
|
||||
shiftkey(k);
|
||||
permute((prog_uint8_t*)pc2_permtab, k, kr);
|
||||
L ^= des_f(R, kr);
|
||||
|
||||
shiftkey(k);
|
||||
if(ROTTABLE&((1<<((i<<1)+1))) )
|
||||
shiftkey(k);
|
||||
permute((prog_uint8_t*)pc2_permtab, k, kr);
|
||||
R ^= des_f(L, kr);
|
||||
|
||||
}
|
||||
/* L <-> R*/
|
||||
R ^= L;
|
||||
L ^= R;
|
||||
R ^= L;
|
||||
|
||||
permute((prog_uint8_t*)inv_ip_permtab, data, out);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void des_decrypt(uint8_t* out, uint8_t* in, uint8_t* key){
|
||||
#define R *((uint32_t*)&(data[4]))
|
||||
#define L *((uint32_t*)&(data[0]))
|
||||
|
||||
uint8_t data[8],kr[6],k[7];
|
||||
int8_t i;
|
||||
|
||||
permute((prog_uint8_t*)ip_permtab, in, data);
|
||||
permute((prog_uint8_t*)pc1_permtab, key, k);
|
||||
for(i=7; i>=0; --i){
|
||||
|
||||
permute((prog_uint8_t*)pc2_permtab, k, kr);
|
||||
L ^= des_f(R, kr);
|
||||
shiftkey_inv(k);
|
||||
if(ROTTABLE&((1<<((i<<1)+1))) ){
|
||||
shiftkey_inv(k);
|
||||
}
|
||||
|
||||
permute((prog_uint8_t*)pc2_permtab, k, kr);
|
||||
R ^= des_f(L, kr);
|
||||
shiftkey_inv(k);
|
||||
if(ROTTABLE&((1<<((i<<1)+0))) ){
|
||||
shiftkey_inv(k);
|
||||
}
|
||||
|
||||
}
|
||||
/* L <-> R*/
|
||||
R ^= L;
|
||||
L ^= R;
|
||||
R ^= L;
|
||||
|
||||
permute((prog_uint8_t*)inv_ip_permtab, data, out);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void tdes_encrypt(uint8_t* out, uint8_t* in, uint8_t* key){
|
||||
des_encrypt(out, in, key + 0);
|
||||
des_decrypt(out, out, key + 8);
|
||||
des_encrypt(out, out, key +16);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void tdes_decrypt(uint8_t* out, uint8_t* in, uint8_t* key){
|
||||
des_decrypt(out, in, key + 0);
|
||||
des_encrypt(out, out, key + 8);
|
||||
des_decrypt(out, out, key +16);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
/**
|
||||
* \file des.h
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-16
|
||||
* \brief des and tdes declarations
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
*/
|
||||
#ifndef DES_H_
|
||||
#define DES_H_
|
||||
|
||||
#include <stdint.h>
|
||||
/* the FIPS 46-3 (1999-10-25) name for triple DES is triple data encrytion algorithm so TDEA.
|
||||
* Also we only implement the three key mode */
|
||||
#define tdea_encrypt tdes_encrypt
|
||||
#define tdea_decrypt tdes_decrypt
|
||||
|
||||
void des_encrypt(uint8_t* out, uint8_t* in, uint8_t* key);
|
||||
void des_decrypt(uint8_t* out, uint8_t* in, uint8_t* key);
|
||||
void tdes_encrypt(uint8_t* out, uint8_t* in, uint8_t* key);
|
||||
void tdes_decrypt(uint8_t* out, uint8_t* in, uint8_t* key);
|
||||
|
||||
#endif /*DES_H_*/
|
|
@ -0,0 +1,235 @@
|
|||
/**
|
||||
* \file main-des-test.c
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-17
|
||||
* \brief test suit for DES
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "serial-tools.h"
|
||||
#include "uart.h"
|
||||
#include "debug.h"
|
||||
|
||||
#include "des.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* additional validation-functions *
|
||||
*****************************************************************************/
|
||||
|
||||
/*****************************************************************************
|
||||
* self tests *
|
||||
*****************************************************************************/
|
||||
|
||||
void testencrypt(uint8_t* block, uint8_t* key){
|
||||
uart_putstr("\r\n==testy-encrypt==\r\n key: ");
|
||||
uart_hexdump(key,8);
|
||||
uart_putstr("\r\n plain: ");
|
||||
uart_hexdump(block,8);
|
||||
des_encrypt(block,block,key);
|
||||
uart_putstr("\r\n crypt: ");
|
||||
uart_hexdump(block,8);
|
||||
}
|
||||
|
||||
void testdecrypt(uint8_t* block, uint8_t* key){
|
||||
uart_putstr("\r\n==testy-decrypt==\r\n key: ");
|
||||
uart_hexdump(key,8);
|
||||
uart_putstr("\r\n crypt: ");
|
||||
uart_hexdump(block,8);
|
||||
des_decrypt(block,block,key);
|
||||
uart_putstr("\r\n plain: ");
|
||||
uart_hexdump(block,8);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void testrun_des(void){
|
||||
|
||||
/* uint8_t key[]= { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; */
|
||||
/* uint8_t data[]={ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; */
|
||||
|
||||
|
||||
uint8_t key[] = { 0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e };
|
||||
uint8_t data[]= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
|
||||
testencrypt(data,key);
|
||||
testdecrypt(data,key);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void nessie_testenc(uint8_t* data, uint8_t* key){
|
||||
uint16_t i;
|
||||
uart_putstr("\r\n\t key = \t"); uart_hexdump(key, 8);
|
||||
uart_putstr("\r\n\t plain = \t"); uart_hexdump(data, 8);
|
||||
des_encrypt(data,data,key);
|
||||
uart_putstr("\r\n\t cipher = \t"); uart_hexdump(data, 8);
|
||||
des_decrypt(data,data,key);
|
||||
uart_putstr("\r\n\t decrypted = \t"); uart_hexdump(data, 8);
|
||||
|
||||
for(i=0;i<100; ++i)
|
||||
des_encrypt(data,data,key);
|
||||
uart_putstr("\r\n\tIterated 100 times = \t"); uart_hexdump(data, 8);
|
||||
for(;i<1000; ++i)
|
||||
des_encrypt(data,data,key);
|
||||
uart_putstr("\r\n\tIterated 1000 times = \t"); uart_hexdump(data, 8);
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/*
|
||||
Set 8, vector# 0:
|
||||
key=0001020304050607
|
||||
cipher=0011223344556677
|
||||
plain=41AD068548809D02
|
||||
encrypted=0011223344556677
|
||||
*/
|
||||
void nessie_testdec(uint8_t* data, uint8_t* key){
|
||||
uint16_t i;
|
||||
uart_putstr("\r\n\t key = \t"); uart_hexdump(key, 8);
|
||||
uart_putstr("\r\n\t cipher = \t"); uart_hexdump(data, 8);
|
||||
des_decrypt(data,data,key);
|
||||
uart_putstr("\r\n\t plain = \t"); uart_hexdump(data, 8);
|
||||
des_encrypt(data,data,key);
|
||||
uart_putstr("\r\n\t encrypted = \t"); uart_hexdump(data, 8);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void nessie_testrun(void){
|
||||
/*
|
||||
Set 1, vector# 0:
|
||||
key=8000000000000000
|
||||
plain=0000000000000000
|
||||
cipher=95A8D72813DAA94D
|
||||
decrypted=0000000000000000
|
||||
Iterated 100 times=F749E1F8DEFAF605
|
||||
Iterated 1000 times=F396DD0B33D04244
|
||||
*/
|
||||
uint8_t key[8];
|
||||
uint8_t data[8];
|
||||
uint16_t set=1, vector;
|
||||
/* set 1 */
|
||||
for(vector=0;vector<64;++vector){
|
||||
memset(key, 0, 8);
|
||||
memset(data, 0, 8);
|
||||
key[vector/8] = 1<<(7-vector%8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 1);
|
||||
nessie_testenc(data, key);
|
||||
}
|
||||
/* set 2 */
|
||||
set = 2;
|
||||
for(vector=0;vector<64;++vector){
|
||||
memset(key, 0, 8);
|
||||
memset(data, 0, 8);
|
||||
data[vector/8] = 1<<(7-vector%8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 1);
|
||||
nessie_testenc(data, key);
|
||||
}
|
||||
/* set 3 */
|
||||
set = 3;
|
||||
for(vector=0;vector<256;++vector){
|
||||
memset(key, vector, 8);
|
||||
memset(data, vector, 8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 2);
|
||||
nessie_testenc(data, key);
|
||||
}
|
||||
/* set 4 */
|
||||
set = 4;
|
||||
{ uint8_t lk[2][8] = { /* local keys */
|
||||
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 },
|
||||
{ 0x2B, 0xD6, 0x45, 0x9F, 0x82, 0xC5, 0xB3, 0x00 } };
|
||||
uint8_t ld[2][8] = { /* local data */
|
||||
{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
|
||||
{ 0xEA, 0x02, 0x47, 0x14, 0xAD, 0x5C, 0x4D, 0x84 } };
|
||||
|
||||
for(vector=0;vector<2;++vector){
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 2);
|
||||
nessie_testenc(ld[vector], lk[vector]);
|
||||
}
|
||||
}
|
||||
/* set 5 */
|
||||
set = 5;
|
||||
for(vector=0;vector<64;++vector){
|
||||
memset(key, 0, 8);
|
||||
memset(data, 0, 8);
|
||||
key[vector/8] = 1<<(7-vector%8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 1);
|
||||
nessie_testdec(data, key);
|
||||
}
|
||||
/* set 6 */
|
||||
set = 6;
|
||||
for(vector=0;vector<64;++vector){
|
||||
memset(key, 0, 8);
|
||||
memset(data, 0, 8);
|
||||
data[vector/8] = 1<<(7-vector%8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 1);
|
||||
nessie_testdec(data, key);
|
||||
}
|
||||
/* set 7 */
|
||||
set = 7;
|
||||
for(vector=0;vector<256;++vector){
|
||||
memset(key, vector, 8);
|
||||
memset(data, vector, 8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 2);
|
||||
nessie_testdec(data, key);
|
||||
}
|
||||
/* set 8 */
|
||||
set = 8;
|
||||
{ uint8_t lk[2][8] = { /* local keys */
|
||||
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 },
|
||||
{ 0x2B, 0xD6, 0x45, 0x9F, 0x82, 0xC5, 0xB3, 0x00 } };
|
||||
uint8_t ld[2][8] = { /* local data */
|
||||
{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
|
||||
{ 0xEA, 0x02, 0x47, 0x14, 0xAD, 0x5C, 0x4D, 0x84 } };
|
||||
|
||||
for(vector=0;vector<2;++vector){
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 2);
|
||||
nessie_testdec(ld[vector], lk[vector]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* main *
|
||||
*****************************************************************************/
|
||||
|
||||
int main (void){
|
||||
char str[20];
|
||||
|
||||
DEBUG_INIT();
|
||||
uart_putstr("\r\n");
|
||||
|
||||
uart_putstr("\r\n\r\nCrypto-VS (DES; ");
|
||||
uart_putstr(__DATE__);uart_putstr(", ");uart_putstr(__TIME__);
|
||||
uart_putstr(")\r\nloaded and running\r\n");
|
||||
|
||||
restart:
|
||||
while(1){
|
||||
if (!getnextwordn(str,20)) {DEBUG_S("DBG: W1\r\n"); goto error;}
|
||||
if (!strcmp(str, "test")) { testrun_des(); }
|
||||
else if (!strcmp(str, "nessie")) { nessie_testrun();}
|
||||
else {DEBUG_S("DBG: 1b\r\n"); goto error;}
|
||||
|
||||
goto restart;
|
||||
continue;
|
||||
error:
|
||||
uart_putstr("ERROR\r\n");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,115 @@
|
|||
/**
|
||||
* \file main-seed-test.c
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-01
|
||||
* \brief test suit for SEED
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "serial-tools.h"
|
||||
#include "uart.h"
|
||||
#include "debug.h"
|
||||
|
||||
#include "seed.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
/*****************************************************************************
|
||||
* additional validation-functions *
|
||||
*****************************************************************************/
|
||||
|
||||
/*****************************************************************************
|
||||
* self tests *
|
||||
*****************************************************************************/
|
||||
|
||||
void testencrypt(uint8_t* block, uint8_t* key){
|
||||
seed_ctx_t ctx;
|
||||
uart_putstr("\r\n==testy-encrypt==\r\n key: ");
|
||||
uart_hexdump(key,16);
|
||||
seed_init(&ctx, key);
|
||||
uart_putstr("\r\n plain: ");
|
||||
uart_hexdump(block,16);
|
||||
_delay_ms(50);
|
||||
seed_encrypt(&ctx, block);
|
||||
uart_putstr("\r\n crypt: ");
|
||||
uart_hexdump(block,16);
|
||||
// uart_putstr("\r\n post-state: ");
|
||||
// uart_hexdump(ctx.k,16);
|
||||
}
|
||||
|
||||
void testdecrypt(uint8_t* block, uint8_t* key){
|
||||
seed_ctx_t ctx;
|
||||
uart_putstr("\r\n==testy-decrypt==\r\n key: ");
|
||||
uart_hexdump(key,16);
|
||||
seed_init(&ctx, key);
|
||||
uart_putstr("\r\n crypt: ");
|
||||
uart_hexdump(block,16);
|
||||
_delay_ms(50);
|
||||
seed_decrypt(&ctx, block);
|
||||
uart_putstr("\r\n plain: ");
|
||||
uart_hexdump(block,16);
|
||||
// uart_putstr("\r\n post-state: ");
|
||||
// uart_hexdump(ctx.k,16);
|
||||
}
|
||||
|
||||
void testrun_seed(void){
|
||||
uint8_t keys[4][16]=
|
||||
{ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
|
||||
{ 0x47, 0x06, 0x48, 0x08, 0x51, 0xE6, 0x1B, 0xE8,
|
||||
0x5D, 0x74, 0xBF, 0xB3, 0xFD, 0x95, 0x61, 0x85 },
|
||||
{ 0x28, 0xDB, 0xC3, 0xBC, 0x49, 0xFF, 0xD8, 0x7D,
|
||||
0xCF, 0xA5, 0x09, 0xB1, 0x1D, 0x42, 0x2B, 0xE7,}
|
||||
};
|
||||
uint8_t datas[4][16]=
|
||||
{ { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
|
||||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||
{ 0x83, 0xA2, 0xF8, 0xA2, 0x88, 0x64, 0x1F, 0xB9,
|
||||
0xA4, 0xE9, 0xA5, 0xCC, 0x2F, 0x13, 0x1C, 0x7D },
|
||||
{ 0xB4, 0x1E, 0x6B, 0xE2, 0xEB, 0xA8, 0x4A, 0x14,
|
||||
0x8E, 0x2E, 0xED, 0x84, 0x59, 0x3C, 0x5E, 0xC7 }
|
||||
};
|
||||
uint8_t i=0;
|
||||
for(i=0; i<4; ++i){
|
||||
testencrypt(datas[i],keys[i]);
|
||||
testdecrypt(datas[i],keys[i]);
|
||||
}
|
||||
// testdecrypt(data,key);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* main *
|
||||
*****************************************************************************/
|
||||
|
||||
int main (void){
|
||||
char str[20];
|
||||
|
||||
DEBUG_INIT();
|
||||
uart_putstr("\r\n");
|
||||
|
||||
uart_putstr("\r\n\r\nCrypto-VS (seed)\r\nloaded and running\r\n");
|
||||
|
||||
restart:
|
||||
while(1){
|
||||
if (!getnextwordn(str,20)) {DEBUG_S("DBG: W1\r\n"); goto error;}
|
||||
if (strcmp(str, "test")) {DEBUG_S("DBG: 1b\r\n"); goto error;}
|
||||
testrun_seed();
|
||||
goto restart;
|
||||
continue;
|
||||
error:
|
||||
uart_putstr("ERROR\r\n");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
/**
|
||||
* \file main-shabea-test.c
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-07
|
||||
* \brief test suit for SHABEA
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "serial-tools.h"
|
||||
#include "uart.h"
|
||||
#include "debug.h"
|
||||
|
||||
#include "shabea.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
/*****************************************************************************
|
||||
* additional validation-functions *
|
||||
*****************************************************************************/
|
||||
|
||||
/*****************************************************************************
|
||||
* self tests *
|
||||
*****************************************************************************/
|
||||
|
||||
void testencrypt(uint8_t* block, uint8_t* key){
|
||||
uart_putstr("\r\n==testy-encrypt==\r\n key: ");
|
||||
uart_hexdump(key,16);
|
||||
uart_putstr("\r\n plain: ");
|
||||
uart_hexdump(block,16);
|
||||
_delay_ms(50);
|
||||
shabea128(block,key,128,1,16);
|
||||
uart_putstr("\r\n crypt: ");
|
||||
uart_hexdump(block,16);
|
||||
}
|
||||
|
||||
void testdecrypt(uint8_t* block, uint8_t* key){
|
||||
|
||||
uart_putstr("\r\n==testy-decrypt==\r\n key: ");
|
||||
uart_hexdump(key,16);
|
||||
uart_putstr("\r\n crypt: ");
|
||||
uart_hexdump(block,16);
|
||||
_delay_ms(50);
|
||||
shabea128(block,key,128,0,16);
|
||||
uart_putstr("\r\n plain: ");
|
||||
uart_hexdump(block,16);
|
||||
}
|
||||
|
||||
void testrun_shabea(void){
|
||||
uint8_t keys[4][16]=
|
||||
{ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
|
||||
{ 0x47, 0x06, 0x48, 0x08, 0x51, 0xE6, 0x1B, 0xE8,
|
||||
0x5D, 0x74, 0xBF, 0xB3, 0xFD, 0x95, 0x61, 0x85 },
|
||||
{ 0x28, 0xDB, 0xC3, 0xBC, 0x49, 0xFF, 0xD8, 0x7D,
|
||||
0xCF, 0xA5, 0x09, 0xB1, 0x1D, 0x42, 0x2B, 0xE7,}
|
||||
};
|
||||
uint8_t datas[4][16]=
|
||||
{ { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
|
||||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||
{ 0x83, 0xA2, 0xF8, 0xA2, 0x88, 0x64, 0x1F, 0xB9,
|
||||
0xA4, 0xE9, 0xA5, 0xCC, 0x2F, 0x13, 0x1C, 0x7D },
|
||||
{ 0xB4, 0x1E, 0x6B, 0xE2, 0xEB, 0xA8, 0x4A, 0x14,
|
||||
0x8E, 0x2E, 0xED, 0x84, 0x59, 0x3C, 0x5E, 0xC7 }
|
||||
};
|
||||
uint8_t i=0;
|
||||
for(i=0; i<4; ++i){
|
||||
testencrypt(datas[i],keys[i]);
|
||||
testdecrypt(datas[i],keys[i]);
|
||||
}
|
||||
// testdecrypt(data,key);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* main *
|
||||
*****************************************************************************/
|
||||
|
||||
int main (void){
|
||||
char str[20];
|
||||
|
||||
DEBUG_INIT();
|
||||
uart_putstr("\r\n");
|
||||
|
||||
uart_putstr("\r\n\r\nCrypto-VS (shabea)\r\nloaded and running\r\n");
|
||||
|
||||
restart:
|
||||
while(1){
|
||||
if (!getnextwordn(str,20)) {DEBUG_S("DBG: W1\r\n"); goto error;}
|
||||
if (strcmp(str, "test")) {DEBUG_S("DBG: 1b\r\n"); goto error;}
|
||||
testrun_shabea();
|
||||
goto restart;
|
||||
continue;
|
||||
error:
|
||||
uart_putstr("ERROR\r\n");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,245 @@
|
|||
/**
|
||||
* \file main-tdes-test.c
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-17
|
||||
* \brief test suit for TDES/TDEA
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "serial-tools.h"
|
||||
#include "uart.h"
|
||||
#include "debug.h"
|
||||
|
||||
#include "des.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* additional validation-functions *
|
||||
*****************************************************************************/
|
||||
|
||||
/*****************************************************************************
|
||||
* self tests *
|
||||
*****************************************************************************/
|
||||
|
||||
void testencrypt(uint8_t* block, uint8_t* key){
|
||||
uart_putstr("\r\n==testy-encrypt==\r\n key: ");
|
||||
uart_hexdump(key,8);
|
||||
uart_putstr("\r\n plain: ");
|
||||
uart_hexdump(block,8);
|
||||
tdes_encrypt(block,block,key);
|
||||
uart_putstr("\r\n crypt: ");
|
||||
uart_hexdump(block,8);
|
||||
}
|
||||
|
||||
void testdecrypt(uint8_t* block, uint8_t* key){
|
||||
uart_putstr("\r\n==testy-decrypt==\r\n key: ");
|
||||
uart_hexdump(key,8);
|
||||
uart_putstr("\r\n crypt: ");
|
||||
uart_hexdump(block,8);
|
||||
tdes_decrypt(block,block,key);
|
||||
uart_putstr("\r\n plain: ");
|
||||
uart_hexdump(block,8);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void testrun_des(void){
|
||||
|
||||
/* uint8_t key[]= { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; */
|
||||
/* uint8_t data[]={ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; */
|
||||
|
||||
|
||||
uint8_t key[] = { 0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e,
|
||||
0x92, 0x2f, 0xb5, 0x10, 0xc7, 0x1f, 0x43, 0x6e,
|
||||
0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e
|
||||
};
|
||||
uint8_t data[]= { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
|
||||
testencrypt(data,key);
|
||||
testdecrypt(data,key);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void nessie_testenc(uint8_t* data, uint8_t* key){
|
||||
uint16_t i;
|
||||
uart_putstr("\r\n\t key = \t"); uart_hexdump(key, 24);
|
||||
uart_putstr("\r\n\t plain = \t"); uart_hexdump(data, 8);
|
||||
tdes_encrypt(data,data,key);
|
||||
uart_putstr("\r\n\t cipher = \t"); uart_hexdump(data, 8);
|
||||
tdes_decrypt(data,data,key);
|
||||
uart_putstr("\r\n\t decrypted = \t"); uart_hexdump(data, 8);
|
||||
|
||||
for(i=0;i<100; ++i)
|
||||
tdes_encrypt(data,data,key);
|
||||
uart_putstr("\r\n\tIterated 100 times = \t"); uart_hexdump(data, 8);
|
||||
for(;i<1000; ++i)
|
||||
tdes_encrypt(data,data,key);
|
||||
uart_putstr("\r\n\tIterated 1000 times = \t"); uart_hexdump(data, 8);
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/*
|
||||
Set 8, vector# 0:
|
||||
key=0001020304050607
|
||||
cipher=0011223344556677
|
||||
plain=41AD068548809D02
|
||||
encrypted=0011223344556677
|
||||
*/
|
||||
void nessie_testdec(uint8_t* data, uint8_t* key){
|
||||
uart_putstr("\r\n\t key = \t"); uart_hexdump(key, 24);
|
||||
uart_putstr("\r\n\t cipher = \t"); uart_hexdump(data, 8);
|
||||
tdes_decrypt(data,data,key);
|
||||
uart_putstr("\r\n\t plain = \t"); uart_hexdump(data, 8);
|
||||
tdes_encrypt(data,data,key);
|
||||
uart_putstr("\r\n\t encrypted = \t"); uart_hexdump(data, 8);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void nessie_testrun(void){
|
||||
/*
|
||||
Set 1, vector# 0:
|
||||
key=8000000000000000
|
||||
plain=0000000000000000
|
||||
cipher=95A8D72813DAA94D
|
||||
decrypted=0000000000000000
|
||||
Iterated 100 times=F749E1F8DEFAF605
|
||||
Iterated 1000 times=F396DD0B33D04244
|
||||
*/
|
||||
uint8_t key[24];
|
||||
uint8_t data[8];
|
||||
uint16_t set=1, vector;
|
||||
/* set 1 */
|
||||
for(vector=0;vector<192;++vector){
|
||||
memset(key, 0, 24);
|
||||
memset(data, 0, 8);
|
||||
key[vector/8] = 1<<(7-vector%8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 1);
|
||||
nessie_testenc(data, key);
|
||||
}
|
||||
/* set 2 */
|
||||
set = 2;
|
||||
for(vector=0;vector<64;++vector){
|
||||
memset(key, 0, 24);
|
||||
memset(data, 0, 8);
|
||||
data[vector/8] = 1<<(7-vector%8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 1);
|
||||
nessie_testenc(data, key);
|
||||
}
|
||||
/* set 3 */
|
||||
set = 3;
|
||||
for(vector=0;vector<256;++vector){
|
||||
memset(key, vector, 24);
|
||||
memset(data, vector, 8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 2);
|
||||
nessie_testenc(data, key);
|
||||
}
|
||||
/* set 4 */
|
||||
set = 4;
|
||||
{ uint8_t lk[2][24] = { /* local keys */
|
||||
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
|
||||
{ 0x2B, 0xD6, 0x45, 0x9F, 0x82, 0xC5, 0xB3, 0x00,
|
||||
0x95, 0x2C, 0x49, 0x10, 0x48, 0x81, 0xFF, 0x48,
|
||||
0x2B, 0xD6, 0x45, 0x9F, 0x82, 0xC5, 0xB3, 0x00 } };
|
||||
uint8_t ld[2][8] = { /* local data */
|
||||
{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
|
||||
{ 0xEA, 0x02, 0x47, 0x14, 0xAD, 0x5C, 0x4D, 0x84 } };
|
||||
|
||||
for(vector=0;vector<2;++vector){
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 2);
|
||||
nessie_testenc(ld[vector], lk[vector]);
|
||||
}
|
||||
}
|
||||
/* set 5 */
|
||||
set = 5;
|
||||
for(vector=0;vector<192;++vector){
|
||||
memset(key, 0, 24);
|
||||
memset(data, 0, 8);
|
||||
key[vector/8] = 1<<(7-vector%8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 1);
|
||||
nessie_testdec(data, key);
|
||||
}
|
||||
/* set 6 */
|
||||
set = 6;
|
||||
for(vector=0;vector<64;++vector){
|
||||
memset(key, 0, 24);
|
||||
memset(data, 0, 8);
|
||||
data[vector/8] = 1<<(7-vector%8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 1);
|
||||
nessie_testdec(data, key);
|
||||
}
|
||||
/* set 7 */
|
||||
set = 7;
|
||||
for(vector=0;vector<256;++vector){
|
||||
memset(key, vector, 24);
|
||||
memset(data, vector, 8);
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 2);
|
||||
nessie_testdec(data, key);
|
||||
}
|
||||
/* set 8 */
|
||||
set = 8;
|
||||
{ uint8_t lk[2][24] = {
|
||||
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
|
||||
{ 0x2B, 0xD6, 0x45, 0x9F, 0x82, 0xC5, 0xB3, 0x00,
|
||||
0x95, 0x2C, 0x49, 0x10, 0x48, 0x81, 0xFF, 0x48,
|
||||
0x2B, 0xD6, 0x45, 0x9F, 0x82, 0xC5, 0xB3, 0x00 } };
|
||||
uint8_t ld[2][8] = { /* local data */
|
||||
{ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
|
||||
{ 0xEA, 0x02, 0x47, 0x14, 0xAD, 0x5C, 0x4D, 0x84 } };
|
||||
|
||||
for(vector=0;vector<2;++vector){
|
||||
uart_putstr("\r\n Set "); uart_hexdump(&set, 1);
|
||||
uart_putstr(", vector# "); uart_hexdump(&vector, 2);
|
||||
nessie_testdec(ld[vector], lk[vector]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* main *
|
||||
*****************************************************************************/
|
||||
|
||||
int main (void){
|
||||
char str[20];
|
||||
|
||||
DEBUG_INIT();
|
||||
uart_putstr("\r\n");
|
||||
|
||||
uart_putstr("\r\n\r\nCrypto-VS (TDES/TDEA; ");
|
||||
uart_putstr(__DATE__);uart_putstr(", ");uart_putstr(__TIME__);
|
||||
uart_putstr(")\r\nloaded and running\r\n");
|
||||
|
||||
restart:
|
||||
while(1){
|
||||
if (!getnextwordn(str,20)) {DEBUG_S("DBG: W1\r\n"); goto error;}
|
||||
if (!strcmp(str, "test")) { testrun_des(); }
|
||||
else if (!strcmp(str, "nessie")) { nessie_testrun();}
|
||||
else {DEBUG_S("DBG: 1b\r\n"); goto error;}
|
||||
|
||||
goto restart;
|
||||
continue;
|
||||
error:
|
||||
uart_putstr("ERROR\r\n");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
10
main.c
10
main.c
|
@ -83,6 +83,16 @@ void testrun_sha256(void){
|
|||
sha256((void*)block, (void*)"\x00", 0);
|
||||
uart_hexdump(block, SHA256_HASH_BITS/8);
|
||||
|
||||
|
||||
uart_putstr("\r\nsha256(0x80, 8)= ");
|
||||
sha256((void*)block, (void*)"\x80", 8);
|
||||
uart_hexdump(block, SHA256_HASH_BITS/8);
|
||||
|
||||
uart_putstr("\r\nsha256(0x02, 8)= ");
|
||||
sha256((void*)block, (void*)"\x02", 8);
|
||||
uart_hexdump(block, SHA256_HASH_BITS/8);
|
||||
|
||||
|
||||
uart_putstr("\r\nsha256(\"abc\", 24)= ");
|
||||
sha256((void*)block, (void*)"abc", 24);
|
||||
uart_hexdump(block, SHA256_HASH_BITS/8);
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
/**
|
||||
* \file seed-asm.S
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-1
|
||||
* \brief SEED parts in assembler for AVR
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
*/
|
||||
SPL = 0x3D
|
||||
SPH = 0x3E
|
||||
SREG = 0x3F
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
void changeendian32(uint32_t * a){
|
||||
*a = (*a & 0x000000FF) << 24 |
|
||||
(*a & 0x0000FF00) << 8 |
|
||||
(*a & 0x00FF0000) >> 8 |
|
||||
(*a & 0xFF000000) >> 24;
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
.global changeendian32
|
||||
; === change_endian32 ===
|
||||
; function that changes the endianess of a 32-bit word
|
||||
; param1: the 32-bit word
|
||||
; given in r25,r24,r23,22 (r25 is most significant)
|
||||
; modifys: r21, r22
|
||||
changeendian32:
|
||||
movw r20, r22 ; (r22,r23) --> (r20,r21)
|
||||
mov r22, r25
|
||||
mov r23, r24
|
||||
mov r24, r21
|
||||
mov r25, r20
|
||||
ret
|
||||
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
uint32_t bigendian_sum32(uint32_t a, uint32_t b){
|
||||
changeendian32(&a);
|
||||
changeendian32(&b);
|
||||
a += b;
|
||||
changeendian32(&a);
|
||||
return a;
|
||||
}
|
||||
*/
|
||||
|
||||
.global bigendian_sum32
|
||||
; === bigendian_sum32 ===
|
||||
; function that adds two 32-bit words in the bigendian way and returns the result
|
||||
; param1: the first 32-bit word
|
||||
; given in r25,r24,r23,22 (r25 is most significant for little endian)
|
||||
; param2: the second 32-bit word
|
||||
; given in r21,r20,r19,18 (r21 is most significant for little endian)
|
||||
; modifys:
|
||||
bigendian_sum32:
|
||||
add r25, r21
|
||||
adc r24, r20
|
||||
adc r23, r19
|
||||
adc r22, r18
|
||||
ret
|
||||
|
||||
.global bigendian_sub32
|
||||
; === bigendian_sub32 ===
|
||||
; function that subtracts a 32-bit words from another in the bigendian way and returns the result
|
||||
; param1: the minuend 32-bit word
|
||||
; given in r25,r24,r23,22 (r25 is most significant for little endian)
|
||||
; param2: the subtrahend 32-bit word
|
||||
; given in r21,r20,r19,18 (r21 is most significant for little endian)
|
||||
; modifys:
|
||||
bigendian_sub32:
|
||||
sub r25, r21
|
||||
sbc r24, r20
|
||||
sbc r23, r19
|
||||
sbc r22, r18
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,282 @@
|
|||
/**
|
||||
* \file seed.c
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-1
|
||||
* \brief SEED parts in C for AVR
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
*/
|
||||
#include <stdint.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include <string.h>
|
||||
#include "seed_sbox.h"
|
||||
#include "uart.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
static uint64_t f_function(uint64_t a, uint32_t k0, uint32_t k1);
|
||||
static uint32_t g_function(uint32_t x);
|
||||
|
||||
/******************************************************************************/
|
||||
/*
|
||||
void changeendian32(uint32_t * a){
|
||||
*a = (*a & 0x000000FF) << 24 |
|
||||
(*a & 0x0000FF00) << 8 |
|
||||
(*a & 0x00FF0000) >> 8 |
|
||||
(*a & 0xFF000000) >> 24;
|
||||
}
|
||||
*/
|
||||
/******************************************************************************/
|
||||
/*
|
||||
void changeendian64(uint64_t * a){
|
||||
*a = (*a & 0x00000000000000FFLL) << 56 |
|
||||
(*a & 0x000000000000FF00LL) << 40 |
|
||||
(*a & 0x0000000000FF0000LL) << 24 |
|
||||
(*a & 0x00000000FF000000LL) << 8 |
|
||||
(*a & 0x000000FF00000000LL) >> 8 |
|
||||
(*a & 0x0000FF0000000000LL) >> 24 |
|
||||
(*a & 0x00FF000000000000LL) >> 40 |
|
||||
(*a & 0xFF00000000000000LL) >> 56 ;
|
||||
}
|
||||
*/
|
||||
/******************************************************************************/
|
||||
|
||||
uint32_t bigendian_sum32(uint32_t a, uint32_t b);/*{
|
||||
changeendian32(&a);
|
||||
changeendian32(&b);
|
||||
a += b;
|
||||
changeendian32(&a);
|
||||
return a;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static
|
||||
uint32_t bigendian_sub32(uint32_t a, uint32_t b);/*{
|
||||
changeendian32(&a);
|
||||
changeendian32(&b);
|
||||
a -= b;
|
||||
changeendian32(&a);
|
||||
return a;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static inline
|
||||
uint64_t bigendian_rotl8_64(uint64_t a){
|
||||
/*
|
||||
changeendian64(&a);
|
||||
a = (a<<8) | (a>>(64-8));
|
||||
changeendian64(&a);
|
||||
*/
|
||||
a = (a>>8) | (a<<(64-8));
|
||||
return a;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static inline
|
||||
uint64_t bigendian_rotr8_64(uint64_t a){
|
||||
/*
|
||||
changeendian64(&a);
|
||||
a = (a>>8) | (a<<(64-8));
|
||||
changeendian64(&a);
|
||||
*/
|
||||
a = (a<<8) | (a>>(64-8));
|
||||
return a;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static
|
||||
uint64_t f_function(uint64_t a, uint32_t k0, uint32_t k1){
|
||||
uint32_t c,d;
|
||||
|
||||
c = a & 0x00000000FFFFFFFFLL;
|
||||
d = (a>>32) & 0x00000000FFFFFFFFLL;
|
||||
|
||||
c ^= k0; d ^= k1;
|
||||
d ^= c;
|
||||
d = g_function(d);
|
||||
c = bigendian_sum32(c,d);
|
||||
c = g_function(c);
|
||||
d = bigendian_sum32(c,d);
|
||||
d = g_function(d);
|
||||
c = bigendian_sum32(c,d);
|
||||
a = ((uint64_t)d << 32) | c;
|
||||
return a;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
#define M0 0xfc
|
||||
#define M1 0xf3
|
||||
#define M2 0xcf
|
||||
#define M3 0x3f
|
||||
|
||||
#define X3 (((uint8_t*)(&x))[0])
|
||||
#define X2 (((uint8_t*)(&x))[1])
|
||||
#define X1 (((uint8_t*)(&x))[2])
|
||||
#define X0 (((uint8_t*)(&x))[3])
|
||||
|
||||
#define Z3 (((uint8_t*)(&z))[0])
|
||||
#define Z2 (((uint8_t*)(&z))[1])
|
||||
#define Z1 (((uint8_t*)(&z))[2])
|
||||
#define Z0 (((uint8_t*)(&z))[3])
|
||||
|
||||
static
|
||||
uint32_t g_function(uint32_t x){
|
||||
uint32_t z;
|
||||
/* sbox substitution */
|
||||
X3 = pgm_read_byte(&(seed_sbox2[X3]));
|
||||
X2 = pgm_read_byte(&(seed_sbox1[X2]));
|
||||
X1 = pgm_read_byte(&(seed_sbox2[X1]));
|
||||
X0 = pgm_read_byte(&(seed_sbox1[X0]));
|
||||
/* now the permutation */
|
||||
Z0 = (X0 & M0) ^ (X1 & M1) ^ (X2 & M2) ^ (X3 & M3);
|
||||
Z1 = (X0 & M1) ^ (X1 & M2) ^ (X2 & M3) ^ (X3 & M0);
|
||||
Z2 = (X0 & M2) ^ (X1 & M3) ^ (X2 & M0) ^ (X3 & M1);
|
||||
Z3 = (X0 & M3) ^ (X1 & M0) ^ (X2 & M1) ^ (X3 & M2);
|
||||
return z;
|
||||
}
|
||||
/******************************************************************************/
|
||||
typedef struct {
|
||||
uint32_t k0, k1;
|
||||
} keypair_t;
|
||||
|
||||
keypair_t getnextkeys(uint32_t *keystate, uint8_t curround){
|
||||
keypair_t ret;
|
||||
if (curround>15){
|
||||
/* ERROR */
|
||||
} else {
|
||||
/* ret.k0 = g_function(keystate[0] + keystate[2] - pgm_read_dword(&(seed_kc[curround])));
|
||||
ret.k1 = g_function(keystate[1] - keystate[3] + pgm_read_dword(&(seed_kc[curround]))); */
|
||||
ret.k0 = bigendian_sum32(keystate[0], keystate[2]);
|
||||
ret.k0 = bigendian_sub32(ret.k0, pgm_read_dword(&(seed_kc[curround])));
|
||||
ret.k0 = g_function(ret.k0);
|
||||
ret.k1 = bigendian_sub32(keystate[1], keystate[3]);
|
||||
ret.k1 = bigendian_sum32(ret.k1, pgm_read_dword(&(seed_kc[curround])));
|
||||
ret.k1 = g_function(ret.k1);
|
||||
|
||||
if (curround & 1){
|
||||
/* odd round (1,3,5, ...) */
|
||||
((uint64_t*)keystate)[1] = bigendian_rotl8_64( ((uint64_t*)keystate)[1] );
|
||||
} else {
|
||||
/* even round (0,2,4, ...) */
|
||||
((uint64_t*)keystate)[0] = bigendian_rotr8_64(((uint64_t*)keystate)[0]);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
keypair_t getprevkeys(uint32_t *keystate, uint8_t curround){
|
||||
keypair_t ret;
|
||||
if (curround>15){
|
||||
/* ERROR */
|
||||
} else {
|
||||
if (curround & 1){
|
||||
/* odd round (1,3,5, ..., 15) */
|
||||
((uint64_t*)keystate)[1] = bigendian_rotr8_64( ((uint64_t*)keystate)[1] );
|
||||
} else {
|
||||
/* even round (0,2,4, ..., 14) */
|
||||
((uint64_t*)keystate)[0] = bigendian_rotl8_64(((uint64_t*)keystate)[0]);
|
||||
}
|
||||
/* ret.k0 = g_function(keystate[0] + keystate[2] - pgm_read_dword(&(seed_kc[curround])));
|
||||
ret.k1 = g_function(keystate[1] - keystate[3] + pgm_read_dword(&(seed_kc[curround]))); */
|
||||
ret.k0 = bigendian_sum32(keystate[0], keystate[2]);
|
||||
ret.k0 = bigendian_sub32(ret.k0, pgm_read_dword(&(seed_kc[curround])));
|
||||
ret.k0 = g_function(ret.k0);
|
||||
ret.k1 = bigendian_sub32(keystate[1], keystate[3]);
|
||||
ret.k1 = bigendian_sum32(ret.k1, pgm_read_dword(&(seed_kc[curround])));
|
||||
ret.k1 = g_function(ret.k1);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
typedef struct{
|
||||
uint32_t k[4];
|
||||
} seed_ctx_t;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void seed_init(seed_ctx_t * ctx, uint8_t * key){
|
||||
memcpy(ctx->k, key, 128/8);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#define L (((uint64_t*)buffer)[0])
|
||||
#define R (((uint64_t*)buffer)[1])
|
||||
|
||||
void seed_encrypt(seed_ctx_t * ctx, void * buffer){
|
||||
uint8_t r;
|
||||
keypair_t k;
|
||||
for(r=0; r<8; ++r){
|
||||
k = getnextkeys(ctx->k, 2*r);
|
||||
/*
|
||||
DEBUG_S("\r\n\tDBG ka,0: "); uart_hexdump(&k.k0, 4);
|
||||
DEBUG_S("\r\n\tDBG ka,1: "); uart_hexdump(&k.k1, 4);
|
||||
DEBUG_S("\r\n\t DBG L: "); uart_hexdump((uint8_t*)buffer+0, 8);
|
||||
DEBUG_S("\r\n\t DBG R: "); uart_hexdump((uint8_t*)buffer+8, 8);
|
||||
*/
|
||||
L ^= f_function(R,k.k0,k.k1);
|
||||
|
||||
k = getnextkeys(ctx->k, 2*r+1);
|
||||
/*
|
||||
DEBUG_S("\r\n\tDBG kb,0: "); uart_hexdump(&k.k0, 4);
|
||||
DEBUG_S("\r\n\tDBG kb,1: "); uart_hexdump(&k.k1, 4);
|
||||
DEBUG_S("\r\n\t DBG L: "); uart_hexdump((uint8_t*)buffer+8, 8);
|
||||
DEBUG_S("\r\n\t DBG R: "); uart_hexdump((uint8_t*)buffer+0, 8);
|
||||
*/
|
||||
R ^= f_function(L,k.k0,k.k1);
|
||||
}
|
||||
/* just an exchange without temp. variable */
|
||||
L ^= R;
|
||||
R ^= L;
|
||||
L ^= R;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#define L (((uint64_t*)buffer)[0])
|
||||
#define R (((uint64_t*)buffer)[1])
|
||||
|
||||
void seed_decrypt(seed_ctx_t * ctx, void * buffer){
|
||||
int8_t r;
|
||||
keypair_t k;
|
||||
for(r=7; r>=0; --r){
|
||||
k = getprevkeys(ctx->k, 2*r+1);
|
||||
/*
|
||||
DEBUG_S("\r\n\tDBG ka,0: "); uart_hexdump(&k.k0, 4);
|
||||
DEBUG_S("\r\n\tDBG ka,1: "); uart_hexdump(&k.k1, 4);
|
||||
DEBUG_S("\r\n\t DBG L: "); uart_hexdump((uint8_t*)buffer+0, 8);
|
||||
DEBUG_S("\r\n\t DBG R: "); uart_hexdump((uint8_t*)buffer+8, 8);
|
||||
*/
|
||||
L ^= f_function(R,k.k0,k.k1);
|
||||
|
||||
k = getprevkeys(ctx->k, 2*r+0);
|
||||
/*
|
||||
DEBUG_S("\r\n\tDBG kb,0: "); uart_hexdump(&k.k0, 4);
|
||||
DEBUG_S("\r\n\tDBG kb,1: "); uart_hexdump(&k.k1, 4);
|
||||
DEBUG_S("\r\n\t DBG L: "); uart_hexdump((uint8_t*)buffer+8, 8);
|
||||
DEBUG_S("\r\n\t DBG R: "); uart_hexdump((uint8_t*)buffer+0, 8);
|
||||
*/
|
||||
R ^= f_function(L,k.k0,k.k1);
|
||||
}
|
||||
/* just an exchange without temp. variable */
|
||||
L ^= R;
|
||||
R ^= L;
|
||||
L ^= R;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
/**
|
||||
* \file seed.h
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-1
|
||||
* \brief declarations for seed
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
*/
|
||||
#ifndef SEED_H_
|
||||
#define SEED_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct{
|
||||
uint32_t k[4];
|
||||
} seed_ctx_t;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void seed_init(seed_ctx_t * ctx, uint8_t * key);
|
||||
void seed_encrypt(seed_ctx_t * ctx, void * buffer);
|
||||
void seed_decrypt(seed_ctx_t * ctx, void * buffer);
|
||||
|
||||
#endif /*SEED_H_*/
|
|
@ -0,0 +1,129 @@
|
|||
/**
|
||||
* \file seed_sbox.h
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-1
|
||||
* \brief sboxes and constants for seed
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SEED_SBOX_H_
|
||||
#define SEED_SBOX_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
uint8_t seed_sbox1[256] PROGMEM ={
|
||||
169, 133, 214, 211, 84, 29, 172, 37,
|
||||
93, 67, 24, 30, 81, 252, 202, 99,
|
||||
40, 68, 32, 157, 224, 226, 200, 23,
|
||||
165, 143, 3, 123, 187, 19, 210, 238,
|
||||
112, 140, 63, 168, 50, 221, 246, 116,
|
||||
236, 149, 11, 87, 92, 91, 189, 1,
|
||||
36, 28, 115, 152, 16, 204, 242, 217,
|
||||
44, 231, 114, 131, 155, 209, 134, 201,
|
||||
96, 80, 163, 235, 13, 182, 158, 79,
|
||||
183, 90, 198, 120, 166, 18, 175, 213,
|
||||
97, 195, 180, 65, 82, 125, 141, 8,
|
||||
31, 153, 0, 25, 4, 83, 247, 225,
|
||||
253, 118, 47, 39, 176, 139, 14, 171,
|
||||
162, 110, 147, 77, 105, 124, 9, 10,
|
||||
191, 239, 243, 197, 135, 20, 254, 100,
|
||||
222, 46, 75, 26, 6, 33, 107, 102,
|
||||
2, 245, 146, 138, 12, 179, 126, 208,
|
||||
122, 71, 150, 229, 38, 128, 173, 223,
|
||||
161, 48, 55, 174, 54, 21, 34, 56,
|
||||
244, 167, 69, 76, 129, 233, 132, 151,
|
||||
53, 203, 206, 60, 113, 17, 199, 137,
|
||||
117, 251, 218, 248, 148, 89, 130, 196,
|
||||
255, 73, 57, 103, 192, 207, 215, 184,
|
||||
15, 142, 66, 35, 145, 108, 219, 164,
|
||||
52, 241, 72, 194, 111, 61, 45, 64,
|
||||
190, 62, 188, 193, 170, 186, 78, 85,
|
||||
59, 220, 104, 127, 156, 216, 74, 86,
|
||||
119, 160, 237, 70, 181, 43, 101, 250,
|
||||
227, 185, 177, 159, 94, 249, 230, 178,
|
||||
49, 234, 109, 95, 228, 240, 205, 136,
|
||||
22, 58, 88, 212, 98, 41, 7, 51,
|
||||
232, 27, 5, 121, 144, 106, 42, 154
|
||||
};
|
||||
|
||||
uint8_t seed_sbox2[256] PROGMEM ={
|
||||
56, 232, 45, 166, 207, 222, 179, 184,
|
||||
175, 96, 85, 199, 68, 111, 107, 91,
|
||||
195, 98, 51, 181, 41, 160, 226, 167,
|
||||
211, 145, 17, 6, 28, 188, 54, 75,
|
||||
239, 136, 108, 168, 23, 196, 22, 244,
|
||||
194, 69, 225, 214, 63, 61, 142, 152,
|
||||
40, 78, 246, 62, 165, 249, 13, 223,
|
||||
216, 43, 102, 122, 39, 47, 241, 114,
|
||||
66, 212, 65, 192, 115, 103, 172, 139,
|
||||
247, 173, 128, 31, 202, 44, 170, 52,
|
||||
210, 11, 238, 233, 93, 148, 24, 248,
|
||||
87, 174, 8, 197, 19, 205, 134, 185,
|
||||
255, 125, 193, 49, 245, 138, 106, 177,
|
||||
209, 32, 215, 2, 34, 4, 104, 113,
|
||||
7, 219, 157, 153, 97, 190, 230, 89,
|
||||
221, 81, 144, 220, 154, 163, 171, 208,
|
||||
129, 15, 71, 26, 227, 236, 141, 191,
|
||||
150, 123, 92, 162, 161, 99, 35, 77,
|
||||
200, 158, 156, 58, 12, 46, 186, 110,
|
||||
159, 90, 242, 146, 243, 73, 120, 204,
|
||||
21, 251, 112, 117, 127, 53, 16, 3,
|
||||
100, 109, 198, 116, 213, 180, 234, 9,
|
||||
118, 25, 254, 64, 18, 224, 189, 5,
|
||||
250, 1, 240, 42, 94, 169, 86, 67,
|
||||
133, 20, 137, 155, 176, 229, 72, 121,
|
||||
151, 252, 30, 130, 33, 140, 27, 95,
|
||||
119, 84, 178, 29, 37, 79, 0, 70,
|
||||
237, 88, 82, 235, 126, 218, 201, 253,
|
||||
48, 149, 101, 60, 182, 228, 187, 124,
|
||||
14, 80, 57, 38, 50, 132, 105, 147,
|
||||
55, 231, 36, 164, 203, 83, 10, 135,
|
||||
217, 76, 131, 143, 206, 59, 74, 183
|
||||
};
|
||||
|
||||
/* key constants */
|
||||
/*
|
||||
uint32_t seed_kc[16] PROGMEM ={
|
||||
0x9e3779b9,
|
||||
0x3c6ef373,
|
||||
0x78dde6e6,
|
||||
0xf1bbcdcc,
|
||||
0xe3779b99,
|
||||
0xc6ef3733,
|
||||
0x8dde6e67,
|
||||
0x1bbcdccf,
|
||||
0x3779b99e,
|
||||
0x6ef3733c,
|
||||
0xdde6e678,
|
||||
0xbbcdccf1,
|
||||
0x779b99e3,
|
||||
0xef3733c6,
|
||||
0xde6e678d,
|
||||
0xbcdccf1b
|
||||
};
|
||||
// */
|
||||
/* key constants (mal andersrum) */
|
||||
// /*
|
||||
uint32_t seed_kc[16] PROGMEM ={
|
||||
0xb979379e,
|
||||
0x73f36e3c,
|
||||
0xe6e6dd78,
|
||||
0xcccdbbf1,
|
||||
0x999b77e3,
|
||||
0x3337efc6,
|
||||
0x676ede8d,
|
||||
0xcfdcbc1b,
|
||||
0x9eb97937,
|
||||
0x3c73f36e,
|
||||
0x78e6e6dd,
|
||||
0xf1cccdbb,
|
||||
0xe3999b77,
|
||||
0xc63337ef,
|
||||
0x8d676ede,
|
||||
0x1bcfdcbc
|
||||
};
|
||||
// */
|
||||
#endif /*SEED_SBOX_H_*/
|
8
sha256.h
8
sha256.h
|
@ -1,7 +1,7 @@
|
|||
/**
|
||||
* \file sha256-asm.h
|
||||
* \author Daniel Otte
|
||||
* \date 16.05.2006
|
||||
* \author Daniel Otte
|
||||
* \date 2006-05-16
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
|
@ -36,6 +36,10 @@ void sha256_nextBlock (sha256_ctx_t *state, void* block);
|
|||
void sha256_lastBlock(sha256_ctx_t *state, void* block, uint16_t length);
|
||||
|
||||
void sha256_ctx2hash(sha256_hash_t *dest, sha256_ctx_t *state);
|
||||
|
||||
/*
|
||||
* length in bits!
|
||||
*/
|
||||
void sha256(sha256_hash_t *dest, void* msg, uint32_t length);
|
||||
uint32_t change_endian32(uint32_t x);
|
||||
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
/**
|
||||
* \file shabea.c
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-07
|
||||
* \brief SHABEA - a SHA Based Encrytion Algorithm implementation
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
* SHABEAn-r where n is the blocksize and r the number of round used
|
||||
*
|
||||
*
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "sha256.h"
|
||||
|
||||
#include "config.h"
|
||||
#include "uart.h"
|
||||
#include "debug.h"
|
||||
/*
|
||||
*
|
||||
*/
|
||||
static
|
||||
void memxor(uint8_t * dest, uint8_t * src, uint8_t length){
|
||||
while(length--){
|
||||
*dest++ ^= *src++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* SHABEA128-16
|
||||
*/
|
||||
#define L ((uint8_t*)block+0)
|
||||
#define R ((uint8_t*)block+8)
|
||||
void shabea128(void * block, void * key, uint16_t keysize, uint8_t enc, uint8_t rounds){
|
||||
int8_t r; /**/
|
||||
uint8_t *tb; /**/
|
||||
uint16_t kbs; /* bytes used for the key / temporary block */
|
||||
sha256_hash_t hash;
|
||||
|
||||
r = (enc?0:(rounds-1));
|
||||
kbs = keysize/8 + ((keysize&7)?1:0);
|
||||
tb = malloc(8+2+kbs);
|
||||
memcpy(tb+8+2, key, kbs);
|
||||
tb[8+0] = 0;
|
||||
|
||||
for(;r!=(enc?(rounds):-1);enc?r++:r--){ /* enc: 0..(rounds-1) ; !enc: (rounds-1)..0 */
|
||||
memcpy(tb, R, 8); /* copy right half into tb */
|
||||
tb[8+1] = r;
|
||||
sha256(hash, tb, 64+16+keysize);
|
||||
if(!(r==(enc?(rounds-1):0))){
|
||||
/* swap */
|
||||
memxor(hash, L, 8);
|
||||
memcpy(L, R, 8);
|
||||
memcpy(R, hash, 8);
|
||||
} else {
|
||||
/* no swap */
|
||||
memxor(L, hash, 8);
|
||||
}
|
||||
}
|
||||
free(tb);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* \file shabea.h
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-07
|
||||
* \brief SHABEA - a SHA Based Encrytion Algorithm declarations
|
||||
* \par License
|
||||
* GPL
|
||||
*
|
||||
* SHABEAn-r where n is the blocksize and r the number of round used
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SHABEA_H_
|
||||
#define SHABEA_H_
|
||||
|
||||
void shabea128(void * block, void * key, uint16_t keysize, uint8_t enc, uint8_t rounds);
|
||||
#endif /*SHABEA_H_*/
|
2
uart.c
2
uart.c
|
@ -132,7 +132,7 @@ void uart_hexdump(void* buf, int len)
|
|||
uart_putc(table[((*((char*)buf))>>4)&0xf]);
|
||||
uart_putc(table[(*((char*)buf))&0xf]);
|
||||
uart_putc(' ');
|
||||
++buf;
|
||||
buf=(char*)buf+1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
10
uart.h
10
uart.h
|
@ -27,11 +27,13 @@ void uart_putstr_P(PGM_P str);
|
|||
void uart_hexdump(void* buf, int len);
|
||||
|
||||
char uart_getc(void);
|
||||
char uart_getc_nb(char *c); // returns 1 on success
|
||||
char uart_getc_nb(char *c); /* returns 1 on success */
|
||||
|
||||
//get one Cariage return terminated line
|
||||
//echo charakters back on Uart
|
||||
//returns buffer with zero terminated line on success, 0 pointer otherwise
|
||||
/*
|
||||
get one Cariage return terminated line
|
||||
echo charakters back on Uart
|
||||
returns buffer with zero terminated line on success, 0 pointer otherwise
|
||||
*/
|
||||
char * uart_getline_nb(void);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue