/* rijndael-api-ref.h v2.0 August '99 * Reference ANSI C code * * $Id: rijndael-api-ref.h,v 1.1 2002/01/21 21:37:35 f Exp $ * */ /* AES Cipher header file for ANSI C Submissions Lawrence E. Bassham III Computer Security Division National Institute of Standards and Technology April 15, 1998 This sample is to assist implementers developing to the Cryptographic API Profile for AES Candidate Algorithm Submissions. Please consult this document as a cross-reference. ANY CHANGES, WHERE APPROPRIATE, TO INFORMATION PROVIDED IN THIS FILE MUST BE DOCUMENTED. CHANGES ARE ONLY APPROPRIATE WHERE SPECIFIED WITH THE STRING "CHANGE POSSIBLE". FUNCTION CALLS AND THEIR PARAMETERS CANNOT BE CHANGED. STRUCTURES CAN BE ALTERED TO ALLOW IMPLEMENTERS TO INCLUDE IMPLEMENTATION SPECIFIC INFORMATION. */ /* Includes: Standard include files */ #include #include "rijndael-alg-ref.h" /* Defines: Add any additional defines you need */ #define DIR_ENCRYPT 0 /* Are we encrpyting? */ #define DIR_DECRYPT 1 /* Are we decrpyting? */ #define MODE_ECB 1 /* Are we ciphering in ECB mode? */ #define MODE_CBC 2 /* Are we ciphering in CBC mode? */ #define MODE_CFB1 3 /* Are we ciphering in 1-bit CFB mode? */ #define TRUE 1 #define FALSE 0 #define BITSPERBLOCK 128 /* Default number of bits in a cipher block */ /* Error Codes - CHANGE POSSIBLE: inclusion of additional error codes */ #define BAD_KEY_DIR -1 /* Key direction is invalid, e.g., unknown value */ #define BAD_KEY_MAT -2 /* Key material not of correct length */ #define BAD_KEY_INSTANCE -3 /* Key passed is not valid */ #define BAD_CIPHER_MODE -4 /* Params struct passed to cipherInit invalid */ #define BAD_CIPHER_STATE -5 /* Cipher in wrong state (e.g., not initialized) */ #define BAD_CIPHER_INSTANCE -7 /* CHANGE POSSIBLE: inclusion of algorithm specific defines */ #define MAX_KEY_SIZE 64 /* # of ASCII char's needed to represent a key */ #define MAX_IV_SIZE BITSPERBLOCK/8 /* # bytes needed to represent an IV */ /* Typedefs: Typedef'ed data storage elements. Add any algorithm specific parameters at the bottom of the structs as appropriate. */ typedef unsigned char BYTE; /* The structure for key information */ typedef struct { BYTE direction; /* Key used for encrypting or decrypting? */ int keyLen; /* Length of the key */ char keyMaterial[MAX_KEY_SIZE+1]; /* Raw key data in ASCII, e.g., user input or KAT values */ /* The following parameters are algorithm dependent, replace or add as necessary */ int blockLen; /* block length */ word8 keySched[MAXROUNDS+1][4][MAXBC]; /* key schedule */ } rijndael_keyInstance; /* The structure for cipher information */ typedef struct { BYTE mode; /* MODE_ECB, MODE_CBC, or MODE_CFB1 */ BYTE IV[MAX_IV_SIZE]; /* A possible Initialization Vector for ciphering */ /* Add any algorithm specific parameters needed here */ int blockLen; /* Sample: Handles non-128 bit block sizes (if available) */ } rijndael_cipherInstance; /* Function protoypes */ /* CHANGED: makeKey(): parameter blockLen added this parameter is absolutely necessary if you want to setup the round keys in a variable block length setting cipherInit(): parameter blockLen added (for obvious reasons) */ int rijndael_makeKey(rijndael_keyInstance *key, BYTE direction, int keyLen, char *keyMaterial); int rijndael_cipherInit(rijndael_cipherInstance *cipher, BYTE mode, char *IV); int rijndael_blockEncrypt(rijndael_cipherInstance *cipher, rijndael_keyInstance *key, BYTE *input, int inputLen, BYTE *outBuffer); int rijndael_blockDecrypt(rijndael_cipherInstance *cipher, rijndael_keyInstance *key, BYTE *input, int inputLen, BYTE *outBuffer); int rijndael_cipherUpdateRounds(rijndael_cipherInstance *cipher, rijndael_keyInstance *key, BYTE *input, int inputLen, BYTE *outBuffer, int Rounds);