new AES in C, happy new year

This commit is contained in:
bg 2008-12-31 19:51:55 +00:00
parent 5ea7340f82
commit d6a35f05fd
31 changed files with 26974 additions and 2 deletions

40
aes.c Normal file
View File

@ -0,0 +1,40 @@
/* aes.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes.c
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-29
* \license GPLv3 or later
*
*/
#include <stdint.h>
#include "aes.h"
void aes_buffer2state(void* dest, void* src){
uint8_t i,j;
for(i=0;i<4;++i){
for(j=0;j<4;++j){
((uint8_t*)dest)[i*4+j] = ((uint8_t*)src)[j*4+i];
}
}
}

58
aes.h Normal file
View File

@ -0,0 +1,58 @@
/* aes.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#ifndef AES_H_
#define AES_H_
#include <stdint.h>
typedef struct{
uint8_t ks[16];
} aes_roundkey_t;
typedef struct{
aes_roundkey_t key[10+1];
} aes128_ctx_t;
typedef struct{
aes_roundkey_t key[12+1];
} aes192_ctx_t;
typedef struct{
aes_roundkey_t key[14+1];
} aes256_ctx_t;
typedef struct{
aes_roundkey_t key[1]; /* just to avoid the warning */
} aes_genctx_t;
typedef struct{
uint8_t s[16];
} aes_cipher_state_t;
void aes_buffer2state(void* dest, void* src);
#endif

37
aes128_dec.c Normal file
View File

@ -0,0 +1,37 @@
/* aes128_dec.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes128_dec.c
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#include "aes.h"
#include "aes_dec.h"
void aes128_dec(void* buffer, aes128_ctx_t* ctx){
aes_cipher_state_t state;
aes_buffer2state(state.s, buffer);
aes_decrypt_core(&state, (aes_genctx_t*)ctx, 10);
aes_buffer2state(buffer, state.s);
}

38
aes128_dec.h Normal file
View File

@ -0,0 +1,38 @@
/* aes128_dec.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes128_dec.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#ifndef AES128_DEC_H_
#define AES128_DEC_H_
#include "aes.h"
#include "aes_dec.h"
void aes128_dec(void* buffer, aes128_ctx_t* ctx);
#endif /* AES128_DEC_H_ */

37
aes128_enc.c Normal file
View File

@ -0,0 +1,37 @@
/* aes128_enc.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes128_enc.c
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#include "aes.h"
#include "aes_enc.h"
void aes128_enc(void* buffer, aes128_ctx_t* ctx){
aes_cipher_state_t state;
aes_buffer2state(state.s, buffer);
aes_encrypt_core(&state, (aes_genctx_t*)ctx, 10);
aes_buffer2state(buffer, state.s);
}

38
aes128_enc.h Normal file
View File

@ -0,0 +1,38 @@
/* aes128_enc.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes128_enc.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#ifndef AES128_ENC_H_
#define AES128_ENC_H_
#include "aes.h"
#include "aes_enc.h"
void aes128_enc(void* buffer, aes128_ctx_t* ctx);
#endif /* AES128_ENC_H_ */

37
aes192_dec.c Normal file
View File

@ -0,0 +1,37 @@
/* aes192_dec.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes192_dec.c
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-31
* \license GPLv3 or later
*
*/
#include "aes.h"
#include "aes_dec.h"
void aes192_dec(void* buffer, aes192_ctx_t* ctx){
aes_cipher_state_t state;
aes_buffer2state(state.s, buffer);
aes_decrypt_core(&state, (aes_genctx_t*)ctx, 12);
aes_buffer2state(buffer, state.s);
}

38
aes192_dec.h Normal file
View File

@ -0,0 +1,38 @@
/* aes192_dec.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes128_dec.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-31
* \license GPLv3 or later
*
*/
#ifndef AES192_DEC_H_
#define AES192_DEC_H_
#include "aes.h"
#include "aes_dec.h"
void aes192_dec(void* buffer, aes192_ctx_t* ctx);
#endif /* AES192_DEC_H_ */

37
aes192_enc.c Normal file
View File

@ -0,0 +1,37 @@
/* aes192_enc.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes192_enc.c
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-31
* \license GPLv3 or later
*
*/
#include "aes.h"
#include "aes_enc.h"
void aes192_enc(void* buffer, aes192_ctx_t* ctx){
aes_cipher_state_t state;
aes_buffer2state(state.s, buffer);
aes_encrypt_core(&state, (aes_genctx_t*)ctx, 12);
aes_buffer2state(buffer, state.s);
}

38
aes192_enc.h Normal file
View File

@ -0,0 +1,38 @@
/* aes192_enc.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes192_enc.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-31
* \license GPLv3 or later
*
*/
#ifndef AES192_ENC_H_
#define AES192_ENC_H_
#include "aes.h"
#include "aes_enc.h"
void aes192_enc(void* buffer, aes192_ctx_t* ctx);
#endif /* AES192_ENC_H_ */

37
aes256_dec.c Normal file
View File

@ -0,0 +1,37 @@
/* aes256_dec.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes256_dec.c
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-31
* \license GPLv3 or later
*
*/
#include "aes.h"
#include "aes_dec.h"
void aes256_dec(void* buffer, aes256_ctx_t* ctx){
aes_cipher_state_t state;
aes_buffer2state(state.s, buffer);
aes_decrypt_core(&state, (aes_genctx_t*)ctx, 14);
aes_buffer2state(buffer, state.s);
}

38
aes256_dec.h Normal file
View File

@ -0,0 +1,38 @@
/* aes256_dec.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes256_dec.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-31
* \license GPLv3 or later
*
*/
#ifndef AES256_DEC_H_
#define AES256_DEC_H_
#include "aes.h"
#include "aes_dec.h"
void aes256_dec(void* buffer, aes256_ctx_t* ctx);
#endif /* AES256_DEC_H_ */

37
aes256_enc.c Normal file
View File

@ -0,0 +1,37 @@
/* aes256_enc.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes256_enc.c
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-31
* \license GPLv3 or later
*
*/
#include "aes.h"
#include "aes_enc.h"
void aes256_enc(void* buffer, aes256_ctx_t* ctx){
aes_cipher_state_t state;
aes_buffer2state(state.s, buffer);
aes_encrypt_core(&state, (aes_genctx_t*)ctx, 14);
aes_buffer2state(buffer, state.s);
}

38
aes256_enc.h Normal file
View File

@ -0,0 +1,38 @@
/* aes256_enc.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes256_enc.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-31
* \license GPLv3 or later
*
*/
#ifndef AES256_ENC_H_
#define AES256_ENC_H_
#include "aes.h"
#include "aes_enc.h"
void aes256_enc(void* buffer, aes256_ctx_t* ctx);
#endif /* AES256_ENC_H_ */

106
aes_dec.c Normal file
View File

@ -0,0 +1,106 @@
/* aes.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <string.h>
#include "gf256mul.h"
#include "aes.h"
#include "aes_invsbox.h"
#include "aes_dec.h"
#include <avr/pgmspace.h>
void aes_invshiftrow(void* data, uint8_t shift){
uint8_t tmp[4];
tmp[0] = ((uint8_t*)data)[(4+0-shift)&3];
tmp[1] = ((uint8_t*)data)[(4+1-shift)&3];
tmp[2] = ((uint8_t*)data)[(4+2-shift)&3];
tmp[3] = ((uint8_t*)data)[(4+3-shift)&3];
memcpy(data, tmp, 4);
}
static
void aes_dec_round(aes_cipher_state_t* state, const aes_roundkey_t* k){
uint8_t tmp[16];
uint8_t i;
/* keyAdd */
for(i=0; i<16; ++i){
tmp[i] = state->s[i] ^ k->ks[i];
}
/* mixColums */
for(i=0; i<4; ++i){
state->s[4*0+i] =
gf256mul(0xe, tmp[4*0+i], 0x1b)
^ gf256mul(0xb, tmp[4*1+i], 0x1b)
^ gf256mul(0xd, tmp[4*2+i], 0x1b)
^ gf256mul(0x9, tmp[4*3+i], 0x1b);
state->s[4*1+i] =
gf256mul(0x9, tmp[4*0+i], 0x1b)
^ gf256mul(0xe, tmp[4*1+i], 0x1b)
^ gf256mul(0xb, tmp[4*2+i], 0x1b)
^ gf256mul(0xd, tmp[4*3+i], 0x1b);
state->s[4*2+i] =
gf256mul(0xd, tmp[4*0+i], 0x1b)
^ gf256mul(0x9, tmp[4*1+i], 0x1b)
^ gf256mul(0xe, tmp[4*2+i], 0x1b)
^ gf256mul(0xb, tmp[4*3+i], 0x1b);
state->s[4*3+i] =
gf256mul(0xb, tmp[4*0+i], 0x1b)
^ gf256mul(0xd, tmp[4*1+i], 0x1b)
^ gf256mul(0x9, tmp[4*2+i], 0x1b)
^ gf256mul(0xe, tmp[4*3+i], 0x1b);
}
/* shiftRows */
aes_invshiftrow(state->s+4, 1);
aes_invshiftrow(state->s+8, 2);
aes_invshiftrow(state->s+12, 3);
/* subBytes */
for(i=0; i<16; ++i){
state->s[i] = pgm_read_byte(aes_invsbox+state->s[i]);
}
}
static
void aes_dec_firstround(aes_cipher_state_t* state, const aes_roundkey_t* k){
uint8_t i;
/* keyAdd */
for(i=0; i<16; ++i){
state->s[i] ^= k->ks[i];
}
/* shiftRows */
aes_invshiftrow(state->s+4, 1);
aes_invshiftrow(state->s+8, 2);
aes_invshiftrow(state->s+12, 3);
/* subBytes */
for(i=0; i<16; ++i){
state->s[i] = pgm_read_byte(aes_invsbox+state->s[i]);
}
}
void aes_decrypt_core(aes_cipher_state_t* state, const aes_genctx_t* ks, uint8_t rounds){
uint8_t i;
aes_dec_firstround(state, &(ks->key[i=rounds]));
for(;rounds>1;--rounds){
--i;
aes_dec_round(state, &(ks->key[i]));
}
for(i=0; i<16; ++i){
state->s[i] ^= ks->key[0].ks[i];
}
}

36
aes_dec.h Normal file
View File

@ -0,0 +1,36 @@
/* aes_dec.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes_dec.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#ifndef AES_DEC_H_
#define AES_DEC_H_
#include "aes.h"
#include <stdint.h>
void aes_decrypt_core(aes_cipher_state_t* state,const aes_genctx_t* ks, uint8_t rounds);
#endif

123
aes_enc.c Normal file
View File

@ -0,0 +1,123 @@
/* aes_enc.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes_enc.c
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#include <stdint.h>
#include <string.h>
#include "aes.h"
#include "gf256mul.h"
#include "aes_sbox.h"
#include "aes_enc.h"
#include <avr/pgmspace.h>
void aes_shiftrow(void* data, uint8_t shift){
uint8_t tmp[4];
tmp[0] = ((uint8_t*)data)[(0+shift)&3];
tmp[1] = ((uint8_t*)data)[(1+shift)&3];
tmp[2] = ((uint8_t*)data)[(2+shift)&3];
tmp[3] = ((uint8_t*)data)[(3+shift)&3];
memcpy(data, tmp, 4);
}
#define GF256MUL_1(a) (a)
#define GF256MUL_2(a) (gf256mul(2, (a), 0x1b))
#define GF256MUL_3(a) (gf256mul(3, (a), 0x1b))
static
void aes_enc_round(aes_cipher_state_t* state, const aes_roundkey_t* k){
uint8_t tmp[16];
uint8_t i;
/* subBytes */
for(i=0; i<16; ++i){
tmp[i] = pgm_read_byte(aes_sbox+state->s[i]);
}
/* shiftRows */
aes_shiftrow(tmp+4, 1);
aes_shiftrow(tmp+8, 2);
aes_shiftrow(tmp+12, 3);
/* mixColums */
for(i=0; i<4; ++i){
state->s[4*0+i] =
GF256MUL_2(tmp[4*0+i])
^ GF256MUL_3(tmp[4*1+i])
^ GF256MUL_1(tmp[4*2+i])
^ GF256MUL_1(tmp[4*3+i]);
state->s[4*1+i] =
GF256MUL_1(tmp[4*0+i])
^ GF256MUL_2(tmp[4*1+i])
^ GF256MUL_3(tmp[4*2+i])
^ GF256MUL_1(tmp[4*3+i]);
state->s[4*2+i] =
GF256MUL_1(tmp[4*0+i])
^ GF256MUL_1(tmp[4*1+i])
^ GF256MUL_2(tmp[4*2+i])
^ GF256MUL_3(tmp[4*3+i]);
state->s[4*3+i] =
GF256MUL_3(tmp[4*0+i])
^ GF256MUL_1(tmp[4*1+i])
^ GF256MUL_1(tmp[4*2+i])
^ GF256MUL_2(tmp[4*3+i]);
}
/* addKey */
for(i=0; i<16; ++i){
state->s[i] ^= k->ks[i];
}
}
static
void aes_enc_lastround(aes_cipher_state_t* state,const aes_roundkey_t* k){
uint8_t i;
/* subBytes */
for(i=0; i<16; ++i){
state->s[i] = pgm_read_byte(aes_sbox+state->s[i]);
}
/* shiftRows */
aes_shiftrow(state->s+4, 1);
aes_shiftrow(state->s+8, 2);
aes_shiftrow(state->s+12, 3);
/* keyAdd */
for(i=0; i<16; ++i){
state->s[i] ^= k->ks[i];
}
}
void aes_encrypt_core(aes_cipher_state_t* state, const aes_genctx_t* ks, uint8_t rounds){
uint8_t i;
for(i=0; i<16; ++i){
state->s[i] ^= ks->key[0].ks[i];
}
i=1;
for(;rounds>1;--rounds){
aes_enc_round(state, &(ks->key[i]));
++i;
}
aes_enc_lastround(state, &(ks->key[i]));
}

36
aes_enc.h Normal file
View File

@ -0,0 +1,36 @@
/* aes_enc.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes_enc.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#ifndef AES_ENC_H_
#define AES_ENC_H_
#include "aes.h"
#include <stdint.h>
void aes_encrypt_core(aes_cipher_state_t* state, const aes_genctx_t* ks, uint8_t rounds);
#endif

22
aes_invsbox.c Normal file
View File

@ -0,0 +1,22 @@
/* aes inverted sbox */
#include <stdint.h>
#include <avr/pgmspace.h>
uint8_t aes_invsbox[256] PROGMEM = {
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
};

33
aes_invsbox.h Normal file
View File

@ -0,0 +1,33 @@
/* aes_invsbox.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes_invsbox.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#ifndef AES_INVSBOX_H_
#define AES_INVSBOX_H_
#include <stdint.h>
extern uint8_t aes_invsbox[];
#endif

105
aes_keyschedule.c Normal file
View File

@ -0,0 +1,105 @@
/* aes_keyschedule.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes_keyschedule.c
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#include <stdint.h>
#include "gf256mul.h"
#include "aes.h"
#include "aes_keyschedule.h"
#include "aes_sbox.h"
#include <string.h>
#include <avr/pgmspace.h>
static
void aes_rotword(void* a){
uint8_t t;
t=((uint8_t*)a)[0];
((uint8_t*)a)[0] = ((uint8_t*)a)[1];
((uint8_t*)a)[1] = ((uint8_t*)a)[2];
((uint8_t*)a)[2] = ((uint8_t*)a)[3];
((uint8_t*)a)[3] = t;
}
#include "uart.h"
void aes_init(const void* key, uint16_t keysize_b, aes_genctx_t* ctx){
uint8_t hi,i,nk;
uint8_t rc=1;
uint8_t tmp[4];
nk=keysize_b/32;
hi=4*(nk+6+1);
memcpy(ctx, key, keysize_b/8);
i=keysize_b/32;
for(i=nk;i<hi;++i){
*((uint32_t*)tmp) = ((uint32_t*)(ctx->key[0].ks))[i-1];
// uart_putstr_P(PSTR("\r\nDBG: tmp = "));
// uart_hexdump(tmp, 4);
if(i%nk){
if(nk>6 && i%nk==4){
tmp[0] = pgm_read_byte(aes_sbox+tmp[0]);
tmp[1] = pgm_read_byte(aes_sbox+tmp[1]);
tmp[2] = pgm_read_byte(aes_sbox+tmp[2]);
tmp[3] = pgm_read_byte(aes_sbox+tmp[3]);
// uart_putstr_P(PSTR("\r\nDBG: after sub = "));
// uart_hexdump(tmp, 4);
}
} else {
aes_rotword(tmp);
// uart_putstr_P(PSTR("\r\nDBG: after rot = "));
// uart_hexdump(tmp, 4);
tmp[0] = pgm_read_byte(aes_sbox+tmp[0]);
tmp[1] = pgm_read_byte(aes_sbox+tmp[1]);
tmp[2] = pgm_read_byte(aes_sbox+tmp[2]);
tmp[3] = pgm_read_byte(aes_sbox+tmp[3]);
// uart_putstr_P(PSTR("\r\nDBG: after sub = "));
// uart_hexdump(tmp, 4);
tmp[0] ^= rc;
// uart_putstr_P(PSTR("\r\nDBG: after xor RC = "));
// uart_hexdump(tmp, 4);
rc = gf256mul(2,rc,0x1b);
}
((uint32_t*)(ctx->key[0].ks))[i] = ((uint32_t*)(ctx->key[0].ks))[i-nk]
^ *((uint32_t*)tmp);
}
uint8_t buffer[16];
for(i=0; i<nk+7; ++i){
memcpy(buffer, ctx->key[i].ks, 16);
aes_buffer2state(ctx->key[i].ks, buffer);
}
}
void aes128_init(const void* key, aes128_ctx_t* ctx){
aes_init(key, 128, (aes_genctx_t*)ctx);
}
void aes192_init(const void* key, aes192_ctx_t* ctx){
aes_init(key, 192, (aes_genctx_t*)ctx);
}
void aes256_init(const void* key, aes256_ctx_t* ctx){
aes_init(key, 256, (aes_genctx_t*)ctx);
}

40
aes_keyschedule.h Normal file
View File

@ -0,0 +1,40 @@
/* aes_keyschedule.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes_keyschedule.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#ifndef AES_KEYSCHEDULE_H_
#define AES_KEYSCHEDULE_H_
#include "aes.h"
void aes_init(const void* key, uint16_t keysize_b, aes_genctx_t* ctx);
void aes128_init(const void* key, aes128_ctx_t* ctx);
void aes192_init(const void* key, aes192_ctx_t* ctx);
void aes256_init(const void* key, aes256_ctx_t* ctx);
#endif /* AES_KEYSCHEDULE_H_ */

23
aes_sbox.c Normal file
View File

@ -0,0 +1,23 @@
/* aes sbox */
#include <stdint.h>
#include <avr/pgmspace.h>
uint8_t aes_sbox[256] PROGMEM = {
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
};

33
aes_sbox.h Normal file
View File

@ -0,0 +1,33 @@
/* aes_sbox.h */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/**
* \file aes_sbox.h
* \email daniel.otte@rub.de
* \author Daniel Otte
* \date 2008-12-30
* \license GPLv3 or later
*
*/
#ifndef AES_SBOX_H_
#define AES_SBOX_H_
#include <stdint.h>
extern uint8_t aes_sbox[];
#endif

View File

@ -17,8 +17,9 @@ TESTPREFIX = nessie-
LIST_DIR = listings/
STAT_DIR = stats/
CC = avr-gcc
CSTD = c99
override CFLAGS = -MMD -MF$(DEP_DIR)$(patsubst %.c,%.d,$(patsubst $(TESTSRC_DIR)%,%,$<)) -I. -gdwarf-2 -pedantic -std=c99 -Wall -Wstrict-prototypes $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS)
override CFLAGS = -MMD -MF$(DEP_DIR)$(patsubst %.c,%.d,$(patsubst $(TESTSRC_DIR)%,%,$<)) -I. -gdwarf-2 -pedantic -std=$(CSTD) -Wall -Wstrict-prototypes $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS)
override LDFLAGS = -gdwarf-2 -Wl,-Map,
override ASFLAGS = -mmcu=$(MCU_TARGET) -Wa,--gdwarf-2

16
mkfiles/aes.mk Normal file
View File

@ -0,0 +1,16 @@
# Makefile for AES
ALGO_NAME := AES_C
# comment out the following line for removement of AES from the build process
BLOCK_CIPHERS += $(ALGO_NAME)
$(ALGO_NAME)_OBJ := aes_enc.o aes_dec.o aes_sbox.o aes_invsbox.o aes.o \
aes_keyschedule.o gf256mul.o \
aes128_enc.o aes128_dec.o aes192_enc.o aes192_dec.o \
aes256_enc.o aes256_dec.o
$(ALGO_NAME)_TEST_BIN := main-aes-test.o debug.o uart.o serial-tools.o \
nessie_bc_test.o nessie_common.o cli.o performance_test.o
$(ALGO_NAME)_NESSIE_TEST := test nessie
$(ALGO_NAME)_PERFORMANCE_TEST := performance

183
test_src/main-aes-test.c Normal file
View File

@ -0,0 +1,183 @@
/* main-aes-test.c */
/*
This file is part of the Crypto-avr-lib/microcrypt-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 <http://www.gnu.org/licenses/>.
*/
/*
* AES test-suit
*
*/
#include "config.h"
#include "serial-tools.h"
#include "uart.h"
#include "debug.h"
#include "aes.h"
#include "aes128_enc.h"
#include "aes128_dec.h"
#include "aes192_enc.h"
#include "aes192_dec.h"
#include "aes256_enc.h"
#include "aes256_dec.h"
#include "aes_keyschedule.h"
#include "nessie_bc_test.h"
#include "cli.h"
#include "performance_test.h"
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
char* cipher_name = "AES";
/*****************************************************************************
* additional validation-functions *
*****************************************************************************/
void testrun_nessie_aes(void){
nessie_bc_ctx.blocksize_B = 16;
nessie_bc_ctx.keysize_b = 128;
nessie_bc_ctx.name = cipher_name;
nessie_bc_ctx.ctx_size_B = sizeof(aes128_ctx_t);
nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)aes128_enc;
nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)aes128_dec;
nessie_bc_ctx.cipher_genctx = (nessie_bc_gen_fpt)aes_init;
nessie_bc_run();
nessie_bc_ctx.keysize_b = 192;
nessie_bc_ctx.ctx_size_B = sizeof(aes192_ctx_t);
nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)aes192_enc;
nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)aes192_dec;
nessie_bc_run();
nessie_bc_ctx.keysize_b = 256;
nessie_bc_ctx.ctx_size_B = sizeof(aes256_ctx_t);
nessie_bc_ctx.cipher_enc = (nessie_bc_enc_fpt)aes256_enc;
nessie_bc_ctx.cipher_dec = (nessie_bc_dec_fpt)aes256_dec;
nessie_bc_run();
}
void testrun_test_aes(void){
uint8_t key[16] = { 0x2b, 0x7e, 0x15, 0x16,
0x28, 0xae, 0xd2, 0xa6,
0xab, 0xf7, 0x15, 0x88,
0x09, 0xcf, 0x4f, 0x3c };
uint8_t data[16] = { 0x32, 0x43, 0xf6, 0xa8,
0x88, 0x5a, 0x30, 0x8d,
0x31, 0x31, 0x98, 0xa2,
0xe0, 0x37, 0x07, 0x34 };
aes128_ctx_t ctx;
aes128_init(key, &ctx);
uart_putstr_P(PSTR("\r\n\r\n cipher test (FIPS 197):\r\n key: "));
uart_hexdump(key, 16);
uart_putstr_P(PSTR("\r\n plaintext: "));
uart_hexdump(data, 16);
aes128_enc(data, &ctx);
uart_putstr_P(PSTR("\r\n ciphertext: "));
uart_hexdump(data, 16);
}
void testrun_testkey_aes(void){
uint8_t key[16] = { 0x2b, 0x7e, 0x15, 0x16,
0x28, 0xae, 0xd2, 0xa6,
0xab, 0xf7, 0x15, 0x88,
0x09, 0xcf, 0x4f, 0x3c};
aes128_ctx_t ctx;
uint8_t i;
aes128_init(key, &ctx);
uart_putstr_P(PSTR("\r\n\r\n keyschedule test (FIPS 197):\r\n key: "));
uart_hexdump(key, 16);
for(i=0; i<11; ++i){
uart_putstr_P(PSTR("\r\n index: "));
uart_putc('0'+i/10);
uart_putc('0'+i%10);
uart_putstr_P(PSTR(" roundkey "));
uart_hexdump(ctx.key[i].ks, 16);
}
}
void testrun_performance_aes(void){
uint64_t t;
char str[16];
uint8_t key[32], data[16];
aes128_ctx_t ctx;
calibrateTimer();
print_overhead();
memset(key, 0, 32);
memset(data, 0, 16);
startTimer(1);
aes128_init(key, &ctx);
t = stopTimer();
uart_putstr_P(PSTR("\r\n\tctx-gen time: "));
ultoa((unsigned long)t, str, 10);
uart_putstr(str);
startTimer(1);
aes128_enc(data, &ctx);
t = stopTimer();
uart_putstr_P(PSTR("\r\n\tencrypt time: "));
ultoa((unsigned long)t, str, 10);
uart_putstr(str);
startTimer(1);
aes128_dec(data, &ctx);
t = stopTimer();
uart_putstr_P(PSTR("\r\n\tdecrypt time: "));
ultoa((unsigned long)t, str, 10);
uart_putstr(str);
uart_putstr_P(PSTR("\r\n"));
}
/*****************************************************************************
* main *
*****************************************************************************/
int main (void){
char str[20];
DEBUG_INIT();
uart_putstr("\r\n");
uart_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
uart_putstr(cipher_name);
uart_putstr_P(PSTR(")\r\nloaded and running\r\n"));
PGM_P u = PSTR("nessie\0test\0testkey\0performance\0");
void_fpt v[] = {testrun_nessie_aes,
testrun_test_aes,
testrun_testkey_aes,
testrun_performance_aes};
while(1){
if (!getnextwordn(str,20)){DEBUG_S("DBG: W1\r\n"); goto error;}
if(execcommand_d0_P(str, u, v)<0){
uart_putstr_P(PSTR("\r\nunknown command\r\n"));
}
continue;
error:
uart_putstr("ERROR\r\n");
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -53,7 +53,6 @@ void twister_small_nextBlock(twister_state_t* ctx, void* msg){
void twister_small_lastBlock(twister_state_t* ctx, void* msg, uint16_t length_b){
uint8_t tmp[64];
uint8_t i;
while(length_b>512){
twister_small_nextBlock(ctx, msg);
msg = ((uint8_t*)msg)+64;