10a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*	$NetBSD: rijndael-api-fst.h,v 1.4 2006/09/09 16:22:36 manu Exp $	*/
20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*	$KAME: rijndael-api-fst.h,v 1.1.1.1 2001/08/08 09:56:27 sakane Exp $	*/
40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * rijndael-api-fst.h   v2.3   April '2000
70a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *
80a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Optimised ANSI C code
90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *
100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * #define INTERMEDIATE_VALUE_KAT to generate the Intermediate Value Known Answer Test.
110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifndef __RIJNDAEL_API_FST_H
140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define __RIJNDAEL_API_FST_H
150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <crypto/rijndael/rijndael-alg-fst.h>
170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*  Defines:
190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	Add any additional defines you need
200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/
210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     DIR_ENCRYPT           0 /*  Are we encrpyting?  */
230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     DIR_DECRYPT           1 /*  Are we decrpyting?  */
240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     MODE_ECB              1 /*  Are we ciphering in ECB mode?   */
250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     MODE_CBC              2 /*  Are we ciphering in CBC mode?   */
260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     MODE_CFB1             3 /*  Are we ciphering in 1-bit CFB mode? */
270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     TRUE                  1
280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     FALSE                 0
290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     BITSPERBLOCK        128 /* Default number of bits in a cipher block */
300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*  Error Codes - CHANGE POSSIBLE: inclusion of additional error codes  */
320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     BAD_KEY_DIR          -1 /*  Key direction is invalid, e.g., unknown value */
330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     BAD_KEY_MAT          -2 /*  Key material not of correct length */
340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     BAD_KEY_INSTANCE     -3 /*  Key passed is not valid */
350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     BAD_CIPHER_MODE      -4 /*  Params struct passed to cipherInit invalid */
360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     BAD_CIPHER_STATE     -5 /*  Cipher in wrong state (e.g., not initialized) */
370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     BAD_BLOCK_LENGTH     -6
380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     BAD_CIPHER_INSTANCE  -7
390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     BAD_DATA             -8 /*  Data contents are invalid, e.g., invalid padding */
400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     BAD_OTHER            -9 /*  Unknown error */
410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*  CHANGE POSSIBLE:  inclusion of algorithm specific defines  */
430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     MAX_KEY_SIZE         64 /* # of ASCII char's needed to represent a key */
440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define     MAX_IV_SIZE          16 /* # bytes needed to represent an IV  */
450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*  Typedefs:
470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	Typedef'ed data storage elements.  Add any algorithm specific
490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangparameters at the bottom of the structs as appropriate.
500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/
510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*  The structure for key information */
530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangtypedef struct {
540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    u_int8_t  direction;            /* Key used for encrypting or decrypting? */
550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    int   keyLen;                   /* Length of the key  */
560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    char  keyMaterial[MAX_KEY_SIZE+1];  /* Raw key data in ASCII, e.g., user input or KAT values */
570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang        /*  The following parameters are algorithm dependent, replace or add as necessary  */
580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int   ROUNDS;                   /* key-length-dependent number of rounds */
590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    int   blockLen;                 /* block length */
600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    union {
610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    	u_int8_t xkS8[RIJNDAEL_MAXROUNDS+1][4][4];	/* key schedule		*/
620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    	u_int32_t xkS32[RIJNDAEL_MAXROUNDS+1][4];	/* key schedule		*/
630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    } xKeySched;
640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define	keySched	xKeySched.xkS8
650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} keyInstance;
660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*  The structure for cipher information */
680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangtypedef struct {                    /* changed order of the components */
690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    u_int8_t mode;                  /* MODE_ECB, MODE_CBC, or MODE_CFB1 */
700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    u_int8_t IV[MAX_IV_SIZE];       /* A possible Initialization Vector for ciphering */
710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang        /*  Add any algorithm specific parameters needed here  */
720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    int   blockLen;                 /* Sample: Handles non-128 bit block sizes (if available) */
730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} cipherInstance;
740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*  Function prototypes  */
760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*  CHANGED: nothing
770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	TODO: implement the following extensions to setup 192-bit and 256-bit block lengths:
780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang        makeKeyEx():    parameter blockLen added
790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang                        -- this parameter is absolutely necessary if you want to
800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang                        setup the round keys in a variable block length setting
810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	    cipherInitEx(): parameter blockLen added (for obvious reasons)
820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint rijndael_makeKey(keyInstance *key, u_int8_t direction, int keyLen, char *keyMaterial);
850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint rijndael_cipherInit(cipherInstance *cipher, u_int8_t mode, char *IV);
870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint rijndael_blockEncrypt(cipherInstance *cipher, keyInstance *key,
890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang        u_int8_t *input, int inputLen, u_int8_t *outBuffer);
900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint rijndael_padEncrypt(cipherInstance *cipher, keyInstance *key,
920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		u_int8_t *input, int inputOctets, u_int8_t *outBuffer);
930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint rijndael_blockDecrypt(cipherInstance *cipher, keyInstance *key,
950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang        u_int8_t *input, int inputLen, u_int8_t *outBuffer);
960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint rijndael_padDecrypt(cipherInstance *cipher, keyInstance *key,
980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		u_int8_t *input, int inputOctets, u_int8_t *outBuffer);
990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef INTERMEDIATE_VALUE_KAT
1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint rijndael_cipherUpdateRounds(cipherInstance *cipher, keyInstance *key,
1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang        u_int8_t *input, int inputLen, u_int8_t *outBuffer, int Rounds);
1030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /* INTERMEDIATE_VALUE_KAT */
1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /*  __RIJNDAEL_API_FST_H */
106