| /* |
| --------------------------------------------------------------------------- |
| Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. |
| |
| LICENSE TERMS |
| |
| The redistribution and use of this software (with or without changes) |
| is allowed without the payment of fees or royalties provided that: |
| |
| 1. source code distributions include the above copyright notice, this |
| list of conditions and the following disclaimer; |
| |
| 2. binary distributions include the above copyright notice, this list |
| of conditions and the following disclaimer in their documentation; |
| |
| 3. the name of the copyright holder is not used to endorse products |
| built using this software without specific written permission. |
| |
| DISCLAIMER |
| |
| This software is provided 'as is' with no explicit or implied warranties |
| in respect of its properties, including, but not limited to, correctness |
| and/or fitness for purpose. |
| --------------------------------------------------------------------------- |
| Issue 09/09/2006 |
| |
| This is an AES implementation that uses only 8-bit byte operations on the |
| cipher state. |
| */ |
| |
| #ifndef AES_H |
| #define AES_H |
| |
| #if 1 |
| #define AES_ENC_PREKEYED /* AES encryption with a precomputed key schedule */ |
| #endif |
| #if 1 |
| #define AES_DEC_PREKEYED /* AES decryption with a precomputed key schedule */ |
| #endif |
| #if 1 |
| #define AES_ENC_128_OTFK /* AES encryption with 'on the fly' 128 bit keying */ |
| #endif |
| #if 1 |
| #define AES_DEC_128_OTFK /* AES decryption with 'on the fly' 128 bit keying */ |
| #endif |
| #if 1 |
| #define AES_ENC_256_OTFK /* AES encryption with 'on the fly' 256 bit keying */ |
| #endif |
| #if 1 |
| #define AES_DEC_256_OTFK /* AES decryption with 'on the fly' 256 bit keying */ |
| #endif |
| |
| #define N_ROW 4 |
| #define N_COL 4 |
| #define N_BLOCK (N_ROW * N_COL) |
| #define N_MAX_ROUNDS 14 |
| |
| typedef unsigned char uint_8t; |
| |
| typedef uint_8t return_type; |
| |
| /* Warning: The key length for 256 bit keys overflows a byte |
| (see comment below) |
| */ |
| |
| typedef uint_8t length_type; |
| |
| typedef struct { |
| uint_8t ksch[(N_MAX_ROUNDS + 1) * N_BLOCK]; |
| uint_8t rnd; |
| } aes_context; |
| |
| /* The following calls are for a precomputed key schedule |
| |
| NOTE: If the length_type used for the key length is an |
| unsigned 8-bit character, a key length of 256 bits must |
| be entered as a length in bytes (valid inputs are hence |
| 128, 192, 16, 24 and 32). |
| */ |
| |
| #if defined(AES_ENC_PREKEYED) || defined(AES_DEC_PREKEYED) |
| |
| return_type aes_set_key(const unsigned char key[], length_type keylen, |
| aes_context ctx[1]); |
| #endif |
| |
| #if defined(AES_ENC_PREKEYED) |
| |
| return_type aes_encrypt(const unsigned char in[N_BLOCK], |
| unsigned char out[N_BLOCK], const aes_context ctx[1]); |
| |
| return_type aes_cbc_encrypt(const unsigned char* in, unsigned char* out, |
| int n_block, unsigned char iv[N_BLOCK], |
| const aes_context ctx[1]); |
| #endif |
| |
| #if defined(AES_DEC_PREKEYED) |
| |
| return_type aes_decrypt(const unsigned char in[N_BLOCK], |
| unsigned char out[N_BLOCK], const aes_context ctx[1]); |
| |
| return_type aes_cbc_decrypt(const unsigned char* in, unsigned char* out, |
| int n_block, unsigned char iv[N_BLOCK], |
| const aes_context ctx[1]); |
| #endif |
| |
| /* The following calls are for 'on the fly' keying. In this case the |
| encryption and decryption keys are different. |
| |
| The encryption subroutines take a key in an array of bytes in |
| key[L] where L is 16, 24 or 32 bytes for key lengths of 128, |
| 192, and 256 bits respectively. They then encrypts the input |
| data, in[] with this key and put the reult in the output array |
| out[]. In addition, the second key array, o_key[L], is used |
| to output the key that is needed by the decryption subroutine |
| to reverse the encryption operation. The two key arrays can |
| be the same array but in this case the original key will be |
| overwritten. |
| |
| In the same way, the decryption subroutines output keys that |
| can be used to reverse their effect when used for encryption. |
| |
| Only 128 and 256 bit keys are supported in these 'on the fly' |
| modes. |
| */ |
| |
| #if defined(AES_ENC_128_OTFK) |
| void aes_encrypt_128(const unsigned char in[N_BLOCK], |
| unsigned char out[N_BLOCK], |
| const unsigned char key[N_BLOCK], uint_8t o_key[N_BLOCK]); |
| #endif |
| |
| #if defined(AES_DEC_128_OTFK) |
| void aes_decrypt_128(const unsigned char in[N_BLOCK], |
| unsigned char out[N_BLOCK], |
| const unsigned char key[N_BLOCK], |
| unsigned char o_key[N_BLOCK]); |
| #endif |
| |
| #if defined(AES_ENC_256_OTFK) |
| void aes_encrypt_256(const unsigned char in[N_BLOCK], |
| unsigned char out[N_BLOCK], |
| const unsigned char key[2 * N_BLOCK], |
| unsigned char o_key[2 * N_BLOCK]); |
| #endif |
| |
| #if defined(AES_DEC_256_OTFK) |
| void aes_decrypt_256(const unsigned char in[N_BLOCK], |
| unsigned char out[N_BLOCK], |
| const unsigned char key[2 * N_BLOCK], |
| unsigned char o_key[2 * N_BLOCK]); |
| #endif |
| |
| #endif |