Small AES_ECB with T-box
Dependents: BLE_LED_ADC_BBC BLE_BBC_LSM303 BLE_BBC_LSM303_MAG BLE_BBC_LSM303_MAG ... more
Diff: small_aes.h
- Revision:
- 0:27d3a972ad80
- Child:
- 1:0075ec28b9dd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/small_aes.h Wed Oct 10 14:09:25 2012 +0000 @@ -0,0 +1,131 @@ +/* small_aes.h + * + * Copyright (c) 2012 Rafael Azuero Hurtado - German Londoño Paez + * + * 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 small_aes.h +* @brief Small AES with T-box +*/ + +#ifndef _SMALL_AES_H_ +#define _SMALL_AES_H_ + +#include "mbed.h" + +#ifdef __cplusplus + extern "C" { +#endif + +enum { + SMALL_AES_ENCRYPTION = 0, + SMALL_AES_DECRYPTION = 1, + SMALL_AES_BLOCK_SIZE = 16 +}; + +typedef struct AES { + unsigned int key[60]; + unsigned int rounds; + + unsigned int reg[SMALL_AES_BLOCK_SIZE / sizeof(unsigned int)]; +} AES; + +/** +* @fn int aesSetKey(AES* aes, const unsigned char *key, unsigned int len, int dir) +* @brief Sets AES key +* @param aes The AES struct +* @param key The key bytes +* @param len The Key length +* @param dir If encrypt or decrypt +*/ +int aesSetKey(AES* aes, const unsigned char *key, unsigned int len, int dir); + +/** +* @fn void aesEncrypt(AES* aes, const unsigned char *inBlock, unsigned char *outBlock) +* @brief Encrypts a 16-byte block +* @param aes The AES struct +* @param inBlock The 16-byte input block +* @param outBlock The 16-byte output block +*/ +void aesEncrypt(AES* aes, const unsigned char *inBlock, unsigned char *outBlock); + +/** +* @fn void aesDecrypt(AES* aes, const unsigned char *inBlock, unsigned char *outBlock) +* @brief Decrypts a 16-byte block +* @param aes The AES struct +* @param inBlock The 16-byte input block +* @param outBlock The 16-byte output block +*/ +void aesDecrypt(AES* aes, const unsigned char *inBlock, unsigned char *outBlock); + +/** +* @fn void aesEcbEncrypt(AES* aes, unsigned char *output, const unsigned char *input, unsigned int inputSize) +* @brief Encrypts a n-byte block with AES-ECB +* @param aes The AES struct +* @param output The input data +* @param input The output data +* @param inputSize The input data size in bytes +*/ +void aesEcbEncrypt(AES* aes, unsigned char *output, const unsigned char *input, unsigned int inputSize); + +/** +* @fn void aesEcbDecrypt(AES* aes, unsigned char *output, const unsigned char *input, unsigned int inputSize) +* @brief Decrypts a n-bytes block with AES-ECB +* @param aes The AES struct +* @param output The input data +* @param input The output data +* @param inputSize The input data size in bytes +*/ +void aesEcbDecrypt(AES* aes, unsigned char *output, const unsigned char *input, unsigned int inputSize); + +/** +* @fn unsigned int byteReverseWord32(unsigned int value) +* @brief Converts a big-endian 32-bit word to little-endian format +* @param value The big-endian 32-bit word +*/ +unsigned int byteReverseWord32(unsigned int value); + +/** +* @fn void byteReverseWords(unsigned int *out, const unsigned int *in, unsigned int byteCount) +* @brief Converts a big-endian block to little-endian format +* @param out The output block +* @param in The input block +* @param byteCount The Number of bytes +*/ +void byteReverseWords(unsigned int *out, const unsigned int *in, unsigned int byteCount); + +/** +* @fn unsigned int rotlFixed(unsigned int x, unsigned int y) +* @brief Rotates a 32-bit word n-bytes to the left +* @param x The32-bit word +* @param y The number of bytes to rotate +*/ +unsigned int rotlFixed(unsigned int x, unsigned int y); + +/** +* @fn unsigned int rotrFixed(unsigned int x, unsigned int y) +* @brief Rotates a 32-bit word n-bytes to the right +* @param x The 32-bit word +* @param y The number of bytes to rotate +*/ +unsigned int rotrFixed(unsigned int x, unsigned int y); + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif \ No newline at end of file