/*
 esign.h - ESIGN 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 MD_MD5                   1
#define MD_SHA                   2


/* ESIGN public and private key */
typedef struct {
	mpz_t n;
	mpz_t e;
	BYTE Hid;
	WORD pLen;
} ESIGN_PUB_KEY;

typedef struct {
	mpz_t p;
	mpz_t q;
} ESIGN_PRIV_KEY;


/* key-pair generation */
BYTE ESIGN_GenerateKeys (
	WORD           k,             /* desired key length */
	ESIGN_PUB_KEY  *publicKey,    /* new ESIGN public key */
	ESIGN_PRIV_KEY *privateKey    /* new ESIGN private key */
);


/* signature generation */
BYTE ESIGN_Sign (
	BYTE             *message,    /* plaintext */
	WORD             mLen,        /* length of the message in bits */
	ESIGN_PUB_KEY    *publicKey,  /* ESIGN public key */
	ESIGN_PRIV_KEY   *privateKey, /* ESIGN private key */
	BYTE             *signature
);


/* signature verification */
BYTE ESIGN_SignVer (
	BYTE             *signature,
	BYTE             *message,
	WORD             mLen,
	ESIGN_PUB_KEY    *publicKey
);

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