/*
 epoc3.h - EPOC-3 software specification

 Copyright NTT MCL, 2000.

 Duncan S Wong   
 Security Group, NTT MCL
 July 2000
*/


typedef unsigned char  BYTE;
typedef unsigned long  WORD;

#define MAX_PRIME_LEN            768
#define MAX_MODULUS_LEN          (MAX_PRIME_LEN*3)

#define TRUE                     1
#define FALSE                    0

#define MAX_IV_SIZE              16          /* # bytes */
#define ENCRYPT_BLOCK_LEN        128
#define MAX_ROUNDS               24

#define MODE_UNSPECIFIED         0
#define MODE_ECB                 1
#define MODE_CBC                 2
#define MODE_CFB                 3

#define ENCRYPT_ALG_XOR          1    /* one-time pad */
#define DIR_ENCRYPT              0
#define DIR_DECRYPT              1

#define MD_MD5                   1
#define MD_SHA                   2


/* EPOC-3 public and private key */
typedef struct {
	mpz_t n;
	mpz_t g;
	mpz_t h;
	BYTE Gid;   /* an identifier for the primitive hash function of G */
	BYTE Hid;
	WORD pLen;
	WORD hLen;
	WORD gLen;
	WORD RLen;
	WORD rLen;
} EPOC3_PUB_KEY;

typedef struct {
	mpz_t p;
	mpz_t g_p;
} EPOC3_PRIV_KEY;

/* Symmetric-key cipher information */
typedef struct {
	BYTE algorithmID;
	BYTE mode;
	BYTE direction;               /* encrypting or decrypting */
	WORD mLen;
	BYTE IV[MAX_IV_SIZE];         /* initialization vector */
	WORD S[MAX_ROUNDS];           /* key schedule */
} CIPHER_INFO;

/* EPOC-3 ciphertext */
typedef struct {
	mpz_t c1;
	BYTE *c2;
	WORD cipherLen;               /* ciphertext length in # bytes */
   BYTE *c3;
} EPOC3_CIPHERTEXT;


/* key-pair generation */
BYTE EPOC3_GenerateKeys (
	WORD           k,             /* desired key length */
	EPOC3_PUB_KEY  *publicKey,    /* new EPOC3 public key */
	EPOC3_PRIV_KEY *privateKey    /* new EPOC3 private key */
);

/* encryption */
BYTE EPOC3_Encryption (
	BYTE             *message,
	EPOC3_PUB_KEY    *publicKey,  /* EPOC3 public key */
	CIPHER_INFO      *cipherInfo, /* cipher and key information */
	EPOC3_CIPHERTEXT *ciphertext  /* returned ciphertext */
);

/* decryption */
BYTE EPOC3_Decryption (
	EPOC3_CIPHERTEXT *ciphertext,
	EPOC3_PRIV_KEY   *privateKey,
	EPOC3_PUB_KEY    *publicKey,
	CIPHER_INFO      *cipherInfo,
	BYTE             *message
);

#define ABS(x) (x >= 0 ? x : -x)
