/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef _RIJNDAEL_H_ #define _RIJNDAEL_H_ 1 #include "blapii.h" #define RIJNDAEL_MIN_BLOCKSIZE 16 /* bytes */ #define RIJNDAEL_MAX_BLOCKSIZE 32 /* bytes */ typedef SECStatus AESBlockFunc(AESContext *cx, unsigned char *output, const unsigned char *input); /* RIJNDAEL_NUM_ROUNDS * * Number of rounds per execution * Nk - number of key bytes * Nb - blocksize (in bytes) */ #define RIJNDAEL_NUM_ROUNDS(Nk, Nb) \ (PR_MAX(Nk, Nb) + 6) /* RIJNDAEL_MAX_STATE_SIZE * * Maximum number of bytes in the state (spec includes up to 256-bit block * size) */ #define RIJNDAEL_MAX_STATE_SIZE 32 /* * This magic number is (Nb_max * (Nr_max + 1)) * where Nb_max is the maximum block size in 32-bit words, * Nr_max is the maximum number of rounds, which is Nb_max + 6 */ #define RIJNDAEL_MAX_EXP_KEY_SIZE (8 * 15) /* AESContextStr * * Values which maintain the state for Rijndael encryption/decryption. * * iv - initialization vector for CBC mode * Nb - the number of bytes in a block, specified by user * Nr - the number of rounds, specified by a table * expandedKey - the round keys in 4-byte words, the length is Nr * Nb * worker - the encryption/decryption function to use with worker_cx * destroy - if not NULL, the destroy function to use with worker_cx * worker_cx - the context for worker and destroy * isBlock - is the mode of operation a block cipher or a stream cipher? */ struct AESContextStr { unsigned int Nb; unsigned int Nr; freeblCipherFunc worker; /* NOTE: The offsets of iv and expandedKey are hardcoded in intel-aes.s. * Don't add new members before them without updating intel-aes.s. */ unsigned char iv[RIJNDAEL_MAX_BLOCKSIZE]; PRUint32 expandedKey[RIJNDAEL_MAX_EXP_KEY_SIZE]; freeblDestroyFunc destroy; void *worker_cx; PRBool isBlock; }; #endif /* _RIJNDAEL_H_ */