|
|
1.1 ! root 1: /* ! 2: --------------------------------------------------------------------------- ! 3: Copyright (c) 1998-2006, Brian Gladman, Worcester, UK. All rights reserved. ! 4: ! 5: LICENSE TERMS ! 6: ! 7: The free distribution and use of this software in both source and binary ! 8: form is allowed (with or without changes) provided that: ! 9: ! 10: 1. distributions of this source code include the above copyright ! 11: notice, this list of conditions and the following disclaimer; ! 12: ! 13: 2. distributions in binary form include the above copyright ! 14: notice, this list of conditions and the following disclaimer ! 15: in the documentation and/or other associated materials; ! 16: ! 17: 3. the copyright holder's name is not used to endorse products ! 18: built using this software without specific written permission. ! 19: ! 20: ALTERNATIVELY, provided that this notice is retained in full, this product ! 21: may be distributed under the terms of the GNU General Public License (GPL), ! 22: in which case the provisions of the GPL apply INSTEAD OF those given above. ! 23: ! 24: DISCLAIMER ! 25: ! 26: This software is provided 'as is' with no explicit or implied warranties ! 27: in respect of its properties, including, but not limited to, correctness ! 28: and/or fitness for purpose. ! 29: --------------------------------------------------------------------------- ! 30: Issue 09/09/2006 ! 31: ! 32: This is an AES implementation that uses only 8-bit byte operations on the ! 33: cipher state. ! 34: */ ! 35: ! 36: #ifndef AES_H ! 37: #define AES_H ! 38: ! 39: #if defined(__cplusplus) ! 40: extern "C" ! 41: { ! 42: #endif ! 43: ! 44: /* This provides speed optimisation opportunities if 32-bit word ! 45: operations are available ! 46: */ ! 47: #if 1 ! 48: # define HAVE_UINT_32T ! 49: #endif ! 50: ! 51: #if 1 ! 52: # define AES_ENC_PREKEYED /* AES encryption with a precomputed key schedule */ ! 53: #endif ! 54: #if 1 ! 55: # define AES_DEC_PREKEYED /* AES decryption with a precomputed key schedule */ ! 56: #endif ! 57: #if 0 ! 58: # define AES_ENC_128_OTFK /* AES encryption with 'on the fly' 128 bit keying */ ! 59: #endif ! 60: #if 0 ! 61: # define AES_DEC_128_OTFK /* AES decryption with 'on the fly' 128 bit keying */ ! 62: #endif ! 63: #if 0 ! 64: # define AES_ENC_256_OTFK /* AES encryption with 'on the fly' 256 bit keying */ ! 65: #endif ! 66: #if 0 ! 67: # define AES_DEC_256_OTFK /* AES decryption with 'on the fly' 256 bit keying */ ! 68: #endif ! 69: ! 70: #define N_ROW 4 ! 71: #define N_COL 4 ! 72: #define N_BLOCK (N_ROW * N_COL) ! 73: #define N_MAX_ROUNDS 14 ! 74: ! 75: typedef unsigned char uint_8t; ! 76: ! 77: typedef uint_8t return_type; ! 78: typedef uint_8t length_type; ! 79: typedef uint_8t uint_type; ! 80: ! 81: typedef unsigned char uint_8t; ! 82: ! 83: typedef struct ! 84: { uint_8t ksch[(N_MAX_ROUNDS + 1) * N_BLOCK]; ! 85: uint_8t rnd; ! 86: } aes_context; ! 87: ! 88: /* The following calls are for a precomputed key schedule ! 89: ! 90: NOTE: If the length_type used for the key length is an ! 91: unsigned 8-bit character, a key length of 256 bits must ! 92: be entered as a length in bytes (valid inputs are hence ! 93: 128, 192, 16, 24 and 32). ! 94: */ ! 95: ! 96: #if defined( AES_ENC_PREKEYED ) || defined( AES_DEC_PREKEYED ) ! 97: ! 98: return_type aes_set_key( const unsigned char key[], ! 99: length_type keylen, ! 100: aes_context ctx[1] ); ! 101: #endif ! 102: ! 103: #if defined( AES_ENC_PREKEYED ) ! 104: ! 105: return_type aes_encrypt( const unsigned char in[N_BLOCK], ! 106: unsigned char out[N_BLOCK], ! 107: const aes_context ctx[1] ); ! 108: #endif ! 109: ! 110: #if defined( AES_DEC_PREKEYED ) ! 111: ! 112: return_type aes_decrypt( const unsigned char in[N_BLOCK], ! 113: unsigned char out[N_BLOCK], ! 114: const aes_context ctx[1] ); ! 115: #endif ! 116: ! 117: /* The following calls are for 'on the fly' keying. In this case the ! 118: encryption and decryption keys are different. ! 119: ! 120: The encryption subroutines take a key in an array of bytes in ! 121: key[L] where L is 16, 24 or 32 bytes for key lengths of 128, ! 122: 192, and 256 bits respectively. They then encrypts the input ! 123: data, in[] with this key and put the reult in the output array ! 124: out[]. In addition, the second key array, o_key[L], is used ! 125: to output the key that is needed by the decryption subroutine ! 126: to reverse the encryption operation. The two key arrays can ! 127: be the same array but in this case the original key will be ! 128: overwritten. ! 129: ! 130: In the same way, the decryption subroutines output keys that ! 131: can be used to reverse their effect when used for encryption. ! 132: ! 133: Only 128 and 256 bit keys are supported in these 'on the fly' ! 134: modes. ! 135: */ ! 136: ! 137: #if defined( AES_ENC_128_OTFK ) ! 138: void aes_encrypt_128( const unsigned char in[N_BLOCK], ! 139: unsigned char out[N_BLOCK], ! 140: const unsigned char key[N_BLOCK], ! 141: uint_8t o_key[N_BLOCK] ); ! 142: #endif ! 143: ! 144: #if defined( AES_DEC_128_OTFK ) ! 145: void aes_decrypt_128( const unsigned char in[N_BLOCK], ! 146: unsigned char out[N_BLOCK], ! 147: const unsigned char key[N_BLOCK], ! 148: unsigned char o_key[N_BLOCK] ); ! 149: #endif ! 150: ! 151: #if defined( AES_ENC_256_OTFK ) ! 152: void aes_encrypt_256( const unsigned char in[N_BLOCK], ! 153: unsigned char out[N_BLOCK], ! 154: const unsigned char key[2 * N_BLOCK], ! 155: unsigned char o_key[2 * N_BLOCK] ); ! 156: #endif ! 157: ! 158: #if defined( AES_DEC_256_OTFK ) ! 159: void aes_decrypt_256( const unsigned char in[N_BLOCK], ! 160: unsigned char out[N_BLOCK], ! 161: const unsigned char key[2 * N_BLOCK], ! 162: unsigned char o_key[2 * N_BLOCK] ); ! 163: #endif ! 164: ! 165: #if defined(__cplusplus) ! 166: } ! 167: #endif ! 168: ! 169: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.