1/* 2 * rijndaelApi.h - AES API layer 3 * 4 * Based on rijndael-api-ref.h v2.0 written by Paulo Barreto 5 * and Vincent Rijmen 6 */ 7 8#ifndef _RIJNDAEL_API_REF_H_ 9#define _RIJNDAEL_API_REF_H_ 10 11#include <stdio.h> 12#include "rijndael-alg-ref.h" 13 14#ifdef __cplusplus 15extern "C" { 16#endif 17 18#define DIR_ENCRYPT 0 /* Are we encrpyting? */ 19#define DIR_DECRYPT 1 /* Are we decrpyting? */ 20#define MODE_ECB 1 /* Are we ciphering in ECB mode? */ 21#define MODE_CBC 2 /* Are we ciphering in CBC mode? */ 22 23#define TRUE 1 24#define FALSE 0 25 26/* Error Codes */ 27#define BAD_KEY_DIR -1 /* Key direction is invalid, e.g., 28 unknown value */ 29#define BAD_KEY_MAT -2 /* Key material not of correct 30 length */ 31#define BAD_KEY_INSTANCE -3 /* Key passed is not valid */ 32#define BAD_CIPHER_MODE -4 /* Params struct passed to 33 cipherInit invalid */ 34#define BAD_CIPHER_STATE -5 /* Cipher in wrong state (e.g., not 35 initialized) */ 36#define BAD_CIPHER_INSTANCE -7 37 38#define MAX_AES_KEY_SIZE (MAX_AES_KEY_BITS / 8) 39#define MAX_AES_BLOCK_SIZE (MAX_AES_BLOCK_BITS / 8) 40#define MAX_AES_IV_SIZE MAX_AES_BLOCK_SIZE 41 42typedef unsigned char BYTE; 43 44/* The structure for key information */ 45typedef struct { 46 BYTE direction; /* Key used for encrypting or decrypting? */ 47 int keyLen; /* Length of the key in bits */ 48 int blockLen; /* Length of block in bits */ 49 word8 keySched[MAXROUNDS+1][4][MAXBC]; /* key schedule */ 50 } keyInstance; 51 52/* The structure for cipher information */ 53typedef struct { 54 BYTE mode; /* MODE_ECB, MODE_CBC, or MODE_CFB1 */ 55 word8 chainBlock[4][MAXBC]; 56 int blockLen; /* block length in bits */ 57 } cipherInstance; 58 59 60int _makeKey( 61 keyInstance *key, 62 BYTE direction, 63 int keyLen, // in BITS 64 int blockLen, // in BITS 65 BYTE *keyMaterial); 66 67int _cipherInit( 68 cipherInstance *cipher, 69 BYTE mode, 70 int blockLen, // in BITS 71 BYTE *IV); 72 73int _blockEncrypt( 74 cipherInstance *cipher, 75 keyInstance *key, 76 BYTE *input, 77 int inputLen, // in BITS 78 BYTE *outBuffer); 79 80int _blockDecrypt( 81 cipherInstance *cipher, 82 keyInstance *key, 83 BYTE *input, 84 int inputLen, // in BITS 85 BYTE *outBuffer); 86 87/* 88 * Apple addenda 3/28/2001: simplified single-block encrypt/decrypt. 89 * Used when chaining and padding is done in elsewhere. 90 */ 91int _rijndaelBlockEncrypt( 92 cipherInstance *cipher, 93 keyInstance *key, 94 BYTE *input, 95 BYTE *outBuffer); 96int _rijndaelBlockDecrypt( 97 cipherInstance *cipher, 98 keyInstance *key, 99 BYTE *input, 100 BYTE *outBuffer); 101 102#ifdef __cplusplus 103} 104#endif // cplusplus 105 106#endif // RIJNDAEL_API_REF 107 108 109