xref: /plan9-contrib/sys/include/libsec.h (revision 59f1ab2eed2731678066f939e3f8a9647023435d)
17dd7cddfSDavid du Colombier #pragma	lib	"libsec.a"
27dd7cddfSDavid du Colombier #pragma	src	"/sys/src/libsec"
37dd7cddfSDavid du Colombier 
42d8b52e8SDavid du Colombier 
57dd7cddfSDavid du Colombier #ifndef _MPINT
67dd7cddfSDavid du Colombier typedef struct mpint mpint;
77dd7cddfSDavid du Colombier #endif
87dd7cddfSDavid du Colombier 
9c02046c4SDavid du Colombier /*
10c02046c4SDavid du Colombier  * AES definitions
11c02046c4SDavid du Colombier  */
129a747e4fSDavid du Colombier 
139a747e4fSDavid du Colombier enum
149a747e4fSDavid du Colombier {
159a747e4fSDavid du Colombier 	AESbsize=	16,
169a747e4fSDavid du Colombier 	AESmaxkey=	32,
179a747e4fSDavid du Colombier 	AESmaxrounds=	14
189a747e4fSDavid du Colombier };
199a747e4fSDavid du Colombier 
209a747e4fSDavid du Colombier typedef struct AESstate AESstate;
219a747e4fSDavid du Colombier struct AESstate
229a747e4fSDavid du Colombier {
239a747e4fSDavid du Colombier 	ulong	setup;
249a747e4fSDavid du Colombier 	int	rounds;
259a747e4fSDavid du Colombier 	int	keybytes;
26410ea80bSDavid du Colombier 	uint	ctrsz;
279a747e4fSDavid du Colombier 	uchar	key[AESmaxkey];			/* unexpanded key */
282d8b52e8SDavid du Colombier 	ulong	ekey[4*(AESmaxrounds + 1)];	/* encryption key */
292d8b52e8SDavid du Colombier 	ulong	dkey[4*(AESmaxrounds + 1)];	/* decryption key */
309a747e4fSDavid du Colombier 	uchar	ivec[AESbsize];			/* initialization vector */
31410ea80bSDavid du Colombier 	uchar	mackey[3 * AESbsize];		/* 3 XCBC mac 96 keys */
329a747e4fSDavid du Colombier };
339a747e4fSDavid du Colombier 
34410ea80bSDavid du Colombier /* block ciphers */
35410ea80bSDavid du Colombier void	aes_encrypt(ulong rk[], int Nr, uchar pt[16], uchar ct[16]);
36410ea80bSDavid du Colombier void	aes_decrypt(ulong rk[], int Nr, uchar ct[16], uchar pt[16]);
37410ea80bSDavid du Colombier 
389a747e4fSDavid du Colombier void	setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec);
399a747e4fSDavid du Colombier void	aesCBCencrypt(uchar *p, int len, AESstate *s);
409a747e4fSDavid du Colombier void	aesCBCdecrypt(uchar *p, int len, AESstate *s);
41410ea80bSDavid du Colombier void	aesCTRdecrypt(uchar *p, int len, AESstate *s);
42410ea80bSDavid du Colombier void	aesCTRencrypt(uchar *p, int len, AESstate *s);
43410ea80bSDavid du Colombier 
44410ea80bSDavid du Colombier void	setupAESXCBCstate(AESstate *s);
45410ea80bSDavid du Colombier uchar*	aesXCBCmac(uchar *p, int len, AESstate *s);
469a747e4fSDavid du Colombier 
47c02046c4SDavid du Colombier /*
48c02046c4SDavid du Colombier  * Blowfish Definitions
49c02046c4SDavid du Colombier  */
509a747e4fSDavid du Colombier 
519a747e4fSDavid du Colombier enum
529a747e4fSDavid du Colombier {
539a747e4fSDavid du Colombier 	BFbsize	= 8,
549a747e4fSDavid du Colombier 	BFrounds= 16
559a747e4fSDavid du Colombier };
569a747e4fSDavid du Colombier 
57c02046c4SDavid du Colombier /* 16-round Blowfish */
589a747e4fSDavid du Colombier typedef struct BFstate BFstate;
599a747e4fSDavid du Colombier struct BFstate
609a747e4fSDavid du Colombier {
619a747e4fSDavid du Colombier 	ulong	setup;
629a747e4fSDavid du Colombier 
639a747e4fSDavid du Colombier 	uchar	key[56];
649a747e4fSDavid du Colombier 	uchar	ivec[8];
659a747e4fSDavid du Colombier 
669a747e4fSDavid du Colombier 	u32int 	pbox[BFrounds+2];
679a747e4fSDavid du Colombier 	u32int	sbox[1024];
689a747e4fSDavid du Colombier };
699a747e4fSDavid du Colombier 
709a747e4fSDavid du Colombier void	setupBFstate(BFstate *s, uchar key[], int keybytes, uchar *ivec);
719a747e4fSDavid du Colombier void	bfCBCencrypt(uchar*, int, BFstate*);
729a747e4fSDavid du Colombier void	bfCBCdecrypt(uchar*, int, BFstate*);
739a747e4fSDavid du Colombier void	bfECBencrypt(uchar*, int, BFstate*);
749a747e4fSDavid du Colombier void	bfECBdecrypt(uchar*, int, BFstate*);
759a747e4fSDavid du Colombier 
76c02046c4SDavid du Colombier /*
77*59f1ab2eSDavid du Colombier  * Chacha definitions
78*59f1ab2eSDavid du Colombier  */
79*59f1ab2eSDavid du Colombier 
80*59f1ab2eSDavid du Colombier enum{
81*59f1ab2eSDavid du Colombier 	ChachaBsize=	64,
82*59f1ab2eSDavid du Colombier 	ChachaKeylen=	256/8,
83*59f1ab2eSDavid du Colombier 	ChachaIVlen=	96/8
84*59f1ab2eSDavid du Colombier };
85*59f1ab2eSDavid du Colombier 
86*59f1ab2eSDavid du Colombier typedef struct Chachastate Chachastate;
87*59f1ab2eSDavid du Colombier struct Chachastate
88*59f1ab2eSDavid du Colombier {
89*59f1ab2eSDavid du Colombier 	/*
90*59f1ab2eSDavid du Colombier 	 * 0-3:	a constant (sigma or tau)
91*59f1ab2eSDavid du Colombier 	 * 4-11:	the key
92*59f1ab2eSDavid du Colombier 	 * 12:	block counter
93*59f1ab2eSDavid du Colombier 	 * 13-15:	IV
94*59f1ab2eSDavid du Colombier 	 */
95*59f1ab2eSDavid du Colombier 	union{
96*59f1ab2eSDavid du Colombier 		u32int	input[16];
97*59f1ab2eSDavid du Colombier 		struct{
98*59f1ab2eSDavid du Colombier 			u32int	constant[4];
99*59f1ab2eSDavid du Colombier 			u32int	key[8];
100*59f1ab2eSDavid du Colombier 			u32int	counter;
101*59f1ab2eSDavid du Colombier 			u32int	iv[3];
102*59f1ab2eSDavid du Colombier 		};
103*59f1ab2eSDavid du Colombier 	};
104*59f1ab2eSDavid du Colombier 	int	rounds;
105*59f1ab2eSDavid du Colombier };
106*59f1ab2eSDavid du Colombier 
107*59f1ab2eSDavid du Colombier void	setupChachastate(Chachastate*, uchar*, usize, uchar*, int);
108*59f1ab2eSDavid du Colombier void	chacha_setblock(Chachastate*, u32int);
109*59f1ab2eSDavid du Colombier void	chacha_encrypt(uchar*, usize, Chachastate*);
110*59f1ab2eSDavid du Colombier void	chacha_encrypt2(uchar*, uchar*, usize, Chachastate*);
111*59f1ab2eSDavid du Colombier 
112*59f1ab2eSDavid du Colombier /*
113c02046c4SDavid du Colombier  * DES definitions
114c02046c4SDavid du Colombier  */
1157dd7cddfSDavid du Colombier 
1167dd7cddfSDavid du Colombier enum
1177dd7cddfSDavid du Colombier {
11859cc4ca5SDavid du Colombier 	DESbsize=	8
1197dd7cddfSDavid du Colombier };
1207dd7cddfSDavid du Colombier 
121c02046c4SDavid du Colombier /* single des */
1227dd7cddfSDavid du Colombier typedef struct DESstate DESstate;
1237dd7cddfSDavid du Colombier struct DESstate
1247dd7cddfSDavid du Colombier {
1257dd7cddfSDavid du Colombier 	ulong	setup;
1267dd7cddfSDavid du Colombier 	uchar	key[8];		/* unexpanded key */
1277dd7cddfSDavid du Colombier 	ulong	expanded[32];	/* expanded key */
1287dd7cddfSDavid du Colombier 	uchar	ivec[8];	/* initialization vector */
1297dd7cddfSDavid du Colombier };
1307dd7cddfSDavid du Colombier 
1317dd7cddfSDavid du Colombier void	setupDESstate(DESstate *s, uchar key[8], uchar *ivec);
1327dd7cddfSDavid du Colombier void	des_key_setup(uchar[8], ulong[32]);
1337dd7cddfSDavid du Colombier void	block_cipher(ulong*, uchar*, int);
1347dd7cddfSDavid du Colombier void	desCBCencrypt(uchar*, int, DESstate*);
1357dd7cddfSDavid du Colombier void	desCBCdecrypt(uchar*, int, DESstate*);
1367dd7cddfSDavid du Colombier void	desECBencrypt(uchar*, int, DESstate*);
1377dd7cddfSDavid du Colombier void	desECBdecrypt(uchar*, int, DESstate*);
1387dd7cddfSDavid du Colombier 
139c02046c4SDavid du Colombier /* for backward compatibility with 7-byte DES key format */
1407dd7cddfSDavid du Colombier void	des56to64(uchar *k56, uchar *k64);
1417dd7cddfSDavid du Colombier void	des64to56(uchar *k64, uchar *k56);
1427dd7cddfSDavid du Colombier void	key_setup(uchar[7], ulong[32]);
1437dd7cddfSDavid du Colombier 
144c02046c4SDavid du Colombier /* triple des encrypt/decrypt orderings */
1457dd7cddfSDavid du Colombier enum {
1467dd7cddfSDavid du Colombier 	DES3E=		0,
1477dd7cddfSDavid du Colombier 	DES3D=		1,
1487dd7cddfSDavid du Colombier 	DES3EEE=	0,
1497dd7cddfSDavid du Colombier 	DES3EDE=	2,
1507dd7cddfSDavid du Colombier 	DES3DED=	5,
15159cc4ca5SDavid du Colombier 	DES3DDD=	7
1527dd7cddfSDavid du Colombier };
1537dd7cddfSDavid du Colombier 
1547dd7cddfSDavid du Colombier typedef struct DES3state DES3state;
1557dd7cddfSDavid du Colombier struct DES3state
1567dd7cddfSDavid du Colombier {
1577dd7cddfSDavid du Colombier 	ulong	setup;
1587dd7cddfSDavid du Colombier 	uchar	key[3][8];		/* unexpanded key */
1597dd7cddfSDavid du Colombier 	ulong	expanded[3][32];	/* expanded key */
1607dd7cddfSDavid du Colombier 	uchar	ivec[8];		/* initialization vector */
1617dd7cddfSDavid du Colombier };
1627dd7cddfSDavid du Colombier 
1637dd7cddfSDavid du Colombier void	setupDES3state(DES3state *s, uchar key[3][8], uchar *ivec);
1647dd7cddfSDavid du Colombier void	triple_block_cipher(ulong keys[3][32], uchar*, int);
1657dd7cddfSDavid du Colombier void	des3CBCencrypt(uchar*, int, DES3state*);
1667dd7cddfSDavid du Colombier void	des3CBCdecrypt(uchar*, int, DES3state*);
1677dd7cddfSDavid du Colombier void	des3ECBencrypt(uchar*, int, DES3state*);
1687dd7cddfSDavid du Colombier void	des3ECBdecrypt(uchar*, int, DES3state*);
1697dd7cddfSDavid du Colombier 
170c02046c4SDavid du Colombier /*
171c02046c4SDavid du Colombier  * digests
172c02046c4SDavid du Colombier  */
1737dd7cddfSDavid du Colombier 
1747dd7cddfSDavid du Colombier enum
1757dd7cddfSDavid du Colombier {
1767dd7cddfSDavid du Colombier 	SHA1dlen=	20,	/* SHA digest length */
177345fff32SDavid du Colombier 	SHA2_224dlen=	28,	/* SHA-224 digest length */
178345fff32SDavid du Colombier 	SHA2_256dlen=	32,	/* SHA-256 digest length */
179345fff32SDavid du Colombier 	SHA2_384dlen=	48,	/* SHA-384 digest length */
180345fff32SDavid du Colombier 	SHA2_512dlen=	64,	/* SHA-512 digest length */
1817dd7cddfSDavid du Colombier 	MD4dlen=	16,	/* MD4 digest length */
182ff55b41dSDavid du Colombier 	MD5dlen=	16,	/* MD5 digest length */
183ff55b41dSDavid du Colombier 	AESdlen=	16,	/* TODO: see rfc */
184ff55b41dSDavid du Colombier 
185ff55b41dSDavid du Colombier 	Hmacblksz	= 64,	/* in bytes; from rfc2104 */
1867dd7cddfSDavid du Colombier };
1877dd7cddfSDavid du Colombier 
1887dd7cddfSDavid du Colombier typedef struct DigestState DigestState;
1897dd7cddfSDavid du Colombier struct DigestState
1907dd7cddfSDavid du Colombier {
19128495efeSDavid du Colombier 	uvlong	len;
192345fff32SDavid du Colombier 	union {
193345fff32SDavid du Colombier 		u32int	state[8];
194345fff32SDavid du Colombier 		u64int	bstate[8];
195345fff32SDavid du Colombier 	};
196345fff32SDavid du Colombier 	uchar	buf[256];
1977dd7cddfSDavid du Colombier 	int	blen;
1987dd7cddfSDavid du Colombier 	char	malloced;
1997dd7cddfSDavid du Colombier 	char	seeded;
2007dd7cddfSDavid du Colombier };
20159cc4ca5SDavid du Colombier typedef struct DigestState SHAstate;	/* obsolete name */
20259cc4ca5SDavid du Colombier typedef struct DigestState SHA1state;
203345fff32SDavid du Colombier typedef struct DigestState SHA2_224state;
204345fff32SDavid du Colombier typedef struct DigestState SHA2_256state;
205345fff32SDavid du Colombier typedef struct DigestState SHA2_384state;
206345fff32SDavid du Colombier typedef struct DigestState SHA2_512state;
2077dd7cddfSDavid du Colombier typedef struct DigestState MD5state;
2087dd7cddfSDavid du Colombier typedef struct DigestState MD4state;
209ff55b41dSDavid du Colombier typedef struct DigestState AEShstate;
2107dd7cddfSDavid du Colombier 
2117dd7cddfSDavid du Colombier DigestState*	md4(uchar*, ulong, uchar*, DigestState*);
2127dd7cddfSDavid du Colombier DigestState*	md5(uchar*, ulong, uchar*, DigestState*);
2137dd7cddfSDavid du Colombier DigestState*	sha1(uchar*, ulong, uchar*, DigestState*);
214345fff32SDavid du Colombier DigestState*	sha2_224(uchar*, ulong, uchar*, DigestState*);
215345fff32SDavid du Colombier DigestState*	sha2_256(uchar*, ulong, uchar*, DigestState*);
216345fff32SDavid du Colombier DigestState*	sha2_384(uchar*, ulong, uchar*, DigestState*);
217345fff32SDavid du Colombier DigestState*	sha2_512(uchar*, ulong, uchar*, DigestState*);
218ff55b41dSDavid du Colombier DigestState*	aes(uchar*, ulong, uchar*, DigestState*);
219ff55b41dSDavid du Colombier DigestState*	hmac_x(uchar *p, ulong len, uchar *key, ulong klen,
220ff55b41dSDavid du Colombier 			uchar *digest, DigestState *s,
221ff55b41dSDavid du Colombier 			DigestState*(*x)(uchar*, ulong, uchar*, DigestState*),
222ff55b41dSDavid du Colombier 			int xlen);
2237dd7cddfSDavid du Colombier DigestState*	hmac_md5(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
2247dd7cddfSDavid du Colombier DigestState*	hmac_sha1(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
225345fff32SDavid du Colombier DigestState*	hmac_sha2_224(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
226345fff32SDavid du Colombier DigestState*	hmac_sha2_256(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
227345fff32SDavid du Colombier DigestState*	hmac_sha2_384(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
228345fff32SDavid du Colombier DigestState*	hmac_sha2_512(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
229ff55b41dSDavid du Colombier DigestState*	hmac_aes(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
230e0d6d19cSDavid du Colombier char*		md5pickle(MD5state*);
231e0d6d19cSDavid du Colombier MD5state*	md5unpickle(char*);
2329a747e4fSDavid du Colombier char*		sha1pickle(SHA1state*);
2339a747e4fSDavid du Colombier SHA1state*	sha1unpickle(char*);
2347dd7cddfSDavid du Colombier 
235c02046c4SDavid du Colombier /*
236c02046c4SDavid du Colombier  * random number generation
237c02046c4SDavid du Colombier  */
2387dd7cddfSDavid du Colombier void	genrandom(uchar *buf, int nbytes);
2397dd7cddfSDavid du Colombier void	prng(uchar *buf, int nbytes);
240d9306527SDavid du Colombier ulong	fastrand(void);
241d9306527SDavid du Colombier ulong	nfastrand(ulong);
2427dd7cddfSDavid du Colombier 
243c02046c4SDavid du Colombier /*
244c02046c4SDavid du Colombier  * primes
245c02046c4SDavid du Colombier  */
246c02046c4SDavid du Colombier void	genprime(mpint *p, int n, int accuracy); /* generate n-bit probable prime */
247c02046c4SDavid du Colombier void	gensafeprime(mpint *p, mpint *alpha, int n, int accuracy); /* prime & generator */
248c02046c4SDavid du Colombier void	genstrongprime(mpint *p, int n, int accuracy); /* generate n-bit strong prime */
2497dd7cddfSDavid du Colombier void	DSAprimes(mpint *q, mpint *p, uchar seed[SHA1dlen]);
250c02046c4SDavid du Colombier int	probably_prime(mpint *n, int nrep);	/* miller-rabin test */
251c02046c4SDavid du Colombier int	smallprimetest(mpint *p);  /* returns -1 if not prime, 0 otherwise */
2527dd7cddfSDavid du Colombier 
253c02046c4SDavid du Colombier /*
254c02046c4SDavid du Colombier  * rc4
255c02046c4SDavid du Colombier  */
2567dd7cddfSDavid du Colombier typedef struct RC4state RC4state;
2577dd7cddfSDavid du Colombier struct RC4state
2587dd7cddfSDavid du Colombier {
2597dd7cddfSDavid du Colombier 	 uchar	state[256];
2607dd7cddfSDavid du Colombier 	 uchar	x;
2617dd7cddfSDavid du Colombier 	 uchar	y;
2627dd7cddfSDavid du Colombier };
2637dd7cddfSDavid du Colombier 
2647dd7cddfSDavid du Colombier void	setupRC4state(RC4state*, uchar*, int);
2657dd7cddfSDavid du Colombier void	rc4(RC4state*, uchar*, int);
2667dd7cddfSDavid du Colombier void	rc4skip(RC4state*, int);
2677dd7cddfSDavid du Colombier void	rc4back(RC4state*, int);
2687dd7cddfSDavid du Colombier 
269c02046c4SDavid du Colombier /*
270c02046c4SDavid du Colombier  * rsa
271c02046c4SDavid du Colombier  */
2727dd7cddfSDavid du Colombier typedef struct RSApub RSApub;
2737dd7cddfSDavid du Colombier typedef struct RSApriv RSApriv;
27451711cb6SDavid du Colombier typedef struct PEMChain PEMChain;
2757dd7cddfSDavid du Colombier 
276c02046c4SDavid du Colombier /* public/encryption key */
2777dd7cddfSDavid du Colombier struct RSApub
2787dd7cddfSDavid du Colombier {
279c02046c4SDavid du Colombier 	mpint	*n;	/* modulus */
280c02046c4SDavid du Colombier 	mpint	*ek;	/* exp (encryption key) */
2817dd7cddfSDavid du Colombier };
2827dd7cddfSDavid du Colombier 
283c02046c4SDavid du Colombier /* private/decryption key */
2847dd7cddfSDavid du Colombier struct RSApriv
2857dd7cddfSDavid du Colombier {
2867dd7cddfSDavid du Colombier 	RSApub	pub;
2877dd7cddfSDavid du Colombier 
288c02046c4SDavid du Colombier 	mpint	*dk;	/* exp (decryption key) */
2897dd7cddfSDavid du Colombier 
290c02046c4SDavid du Colombier 	/* precomputed values to help with chinese remainder theorem calc */
2917dd7cddfSDavid du Colombier 	mpint	*p;
2927dd7cddfSDavid du Colombier 	mpint	*q;
293c02046c4SDavid du Colombier 	mpint	*kp;	/* dk mod p-1 */
294c02046c4SDavid du Colombier 	mpint	*kq;	/* dk mod q-1 */
295c02046c4SDavid du Colombier 	mpint	*c2;	/* (inv p) mod q */
2967dd7cddfSDavid du Colombier };
2977dd7cddfSDavid du Colombier 
29851711cb6SDavid du Colombier struct PEMChain{
29951711cb6SDavid du Colombier 	PEMChain*next;
30051711cb6SDavid du Colombier 	uchar	*pem;
30151711cb6SDavid du Colombier 	int	pemlen;
30251711cb6SDavid du Colombier };
30351711cb6SDavid du Colombier 
3047dd7cddfSDavid du Colombier RSApriv*	rsagen(int nlen, int elen, int rounds);
305ef9eff0bSDavid du Colombier RSApriv*	rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q);
3067dd7cddfSDavid du Colombier mpint*		rsaencrypt(RSApub *k, mpint *in, mpint *out);
3077dd7cddfSDavid du Colombier mpint*		rsadecrypt(RSApriv *k, mpint *in, mpint *out);
3087dd7cddfSDavid du Colombier RSApub*		rsapuballoc(void);
3097dd7cddfSDavid du Colombier void		rsapubfree(RSApub*);
3107dd7cddfSDavid du Colombier RSApriv*	rsaprivalloc(void);
3117dd7cddfSDavid du Colombier void		rsaprivfree(RSApriv*);
3127dd7cddfSDavid du Colombier RSApub*		rsaprivtopub(RSApriv*);
31380ee5cbfSDavid du Colombier RSApub*		X509toRSApub(uchar*, int, char*, int);
3146ca6a3e7SDavid du Colombier uchar*		RSApubtoasn1(RSApub*, int*);
3156ca6a3e7SDavid du Colombier RSApub*		asn1toRSApub(uchar*, int);
3169a747e4fSDavid du Colombier RSApriv*	asn1toRSApriv(uchar*, int);
317ef9eff0bSDavid du Colombier void		asn1dump(uchar *der, int len);
31851711cb6SDavid du Colombier uchar*		decodePEM(char *s, char *type, int *len, char **new_s);
31951711cb6SDavid du Colombier PEMChain*	decodepemchain(char *s, char *type);
320d9306527SDavid du Colombier uchar*		X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen);
321fb7f0c93SDavid du Colombier uchar*		X509req(RSApriv *priv, char *subj, int *certlen);
322ef9eff0bSDavid du Colombier char*		X509verify(uchar *cert, int ncert, RSApub *pk);
323fb7f0c93SDavid du Colombier void		X509dump(uchar *cert, int ncert);
32451711cb6SDavid du Colombier 
325c02046c4SDavid du Colombier /*
326c02046c4SDavid du Colombier  * elgamal
327c02046c4SDavid du Colombier  */
3287dd7cddfSDavid du Colombier typedef struct EGpub EGpub;
3297dd7cddfSDavid du Colombier typedef struct EGpriv EGpriv;
3307dd7cddfSDavid du Colombier typedef struct EGsig EGsig;
3317dd7cddfSDavid du Colombier 
332c02046c4SDavid du Colombier /* public/encryption key */
3337dd7cddfSDavid du Colombier struct EGpub
3347dd7cddfSDavid du Colombier {
335c02046c4SDavid du Colombier 	mpint	*p;	/* modulus */
336c02046c4SDavid du Colombier 	mpint	*alpha;	/* generator */
337c02046c4SDavid du Colombier 	mpint	*key;	/* (encryption key) alpha**secret mod p */
3387dd7cddfSDavid du Colombier };
3397dd7cddfSDavid du Colombier 
340c02046c4SDavid du Colombier /* private/decryption key */
3417dd7cddfSDavid du Colombier struct EGpriv
3427dd7cddfSDavid du Colombier {
3437dd7cddfSDavid du Colombier 	EGpub	pub;
344c02046c4SDavid du Colombier 	mpint	*secret;	/* (decryption key) */
3457dd7cddfSDavid du Colombier };
3467dd7cddfSDavid du Colombier 
347c02046c4SDavid du Colombier /* signature */
3487dd7cddfSDavid du Colombier struct EGsig
3497dd7cddfSDavid du Colombier {
3507dd7cddfSDavid du Colombier 	mpint	*r, *s;
3517dd7cddfSDavid du Colombier };
3527dd7cddfSDavid du Colombier 
3537dd7cddfSDavid du Colombier EGpriv*		eggen(int nlen, int rounds);
354c02046c4SDavid du Colombier mpint*		egencrypt(EGpub *k, mpint *in, mpint *out);	/* deprecated */
3557dd7cddfSDavid du Colombier mpint*		egdecrypt(EGpriv *k, mpint *in, mpint *out);
3567dd7cddfSDavid du Colombier EGsig*		egsign(EGpriv *k, mpint *m);
3577dd7cddfSDavid du Colombier int		egverify(EGpub *k, EGsig *sig, mpint *m);
3587dd7cddfSDavid du Colombier EGpub*		egpuballoc(void);
3597dd7cddfSDavid du Colombier void		egpubfree(EGpub*);
3607dd7cddfSDavid du Colombier EGpriv*		egprivalloc(void);
3617dd7cddfSDavid du Colombier void		egprivfree(EGpriv*);
3627dd7cddfSDavid du Colombier EGsig*		egsigalloc(void);
3637dd7cddfSDavid du Colombier void		egsigfree(EGsig*);
3647dd7cddfSDavid du Colombier EGpub*		egprivtopub(EGpriv*);
3659a747e4fSDavid du Colombier 
366c02046c4SDavid du Colombier /*
367c02046c4SDavid du Colombier  * dsa
368c02046c4SDavid du Colombier  */
3693ff48bf5SDavid du Colombier typedef struct DSApub DSApub;
3703ff48bf5SDavid du Colombier typedef struct DSApriv DSApriv;
3713ff48bf5SDavid du Colombier typedef struct DSAsig DSAsig;
3723ff48bf5SDavid du Colombier 
373c02046c4SDavid du Colombier /* public/encryption key */
3743ff48bf5SDavid du Colombier struct DSApub
3753ff48bf5SDavid du Colombier {
376c02046c4SDavid du Colombier 	mpint	*p;	/* modulus */
377c02046c4SDavid du Colombier 	mpint	*q;	/* group order, q divides p-1 */
378c02046c4SDavid du Colombier 	mpint	*alpha;	/* group generator */
379c02046c4SDavid du Colombier 	mpint	*key;	/* (encryption key) alpha**secret mod p */
3803ff48bf5SDavid du Colombier };
3813ff48bf5SDavid du Colombier 
382c02046c4SDavid du Colombier /* private/decryption key */
3833ff48bf5SDavid du Colombier struct DSApriv
3843ff48bf5SDavid du Colombier {
3853ff48bf5SDavid du Colombier 	DSApub	pub;
386c02046c4SDavid du Colombier 	mpint	*secret;	/* (decryption key) */
3873ff48bf5SDavid du Colombier };
3883ff48bf5SDavid du Colombier 
389c02046c4SDavid du Colombier /* signature */
3903ff48bf5SDavid du Colombier struct DSAsig
3913ff48bf5SDavid du Colombier {
3923ff48bf5SDavid du Colombier 	mpint	*r, *s;
3933ff48bf5SDavid du Colombier };
3943ff48bf5SDavid du Colombier 
395c02046c4SDavid du Colombier DSApriv*	dsagen(DSApub *opub);	/* opub not checked for consistency! */
3963ff48bf5SDavid du Colombier DSAsig*		dsasign(DSApriv *k, mpint *m);
3973ff48bf5SDavid du Colombier int		dsaverify(DSApub *k, DSAsig *sig, mpint *m);
3983ff48bf5SDavid du Colombier DSApub*		dsapuballoc(void);
3993ff48bf5SDavid du Colombier void		dsapubfree(DSApub*);
4003ff48bf5SDavid du Colombier DSApriv*	dsaprivalloc(void);
4013ff48bf5SDavid du Colombier void		dsaprivfree(DSApriv*);
4023ff48bf5SDavid du Colombier DSAsig*		dsasigalloc(void);
4033ff48bf5SDavid du Colombier void		dsasigfree(DSAsig*);
4043ff48bf5SDavid du Colombier DSApub*		dsaprivtopub(DSApriv*);
4052d8b52e8SDavid du Colombier DSApriv*	asn1toDSApriv(uchar*, int);
4063ff48bf5SDavid du Colombier 
407c02046c4SDavid du Colombier /*
408c02046c4SDavid du Colombier  * TLS
409c02046c4SDavid du Colombier  */
4109a747e4fSDavid du Colombier typedef struct Thumbprint{
4119a747e4fSDavid du Colombier 	struct Thumbprint *next;
4129a747e4fSDavid du Colombier 	uchar	sha1[SHA1dlen];
4139a747e4fSDavid du Colombier } Thumbprint;
4149a747e4fSDavid du Colombier 
4159a747e4fSDavid du Colombier typedef struct TLSconn{
416c02046c4SDavid du Colombier 	char	dir[40];	/* connection directory */
417c02046c4SDavid du Colombier 	uchar	*cert;	/* certificate (local on input, remote on output) */
4189a747e4fSDavid du Colombier 	uchar	*sessionID;
419c02046c4SDavid du Colombier 	int	certlen;
420c02046c4SDavid du Colombier 	int	sessionIDlen;
4219a747e4fSDavid du Colombier 	int	(*trace)(char*fmt, ...);
422c02046c4SDavid du Colombier 	PEMChain*chain;	/* optional extra certificate evidence for servers to present */
4230d862726SDavid du Colombier 	char	*sessionType;
4240d862726SDavid du Colombier 	uchar	*sessionKey;
4250d862726SDavid du Colombier 	int	sessionKeylen;
4260d862726SDavid du Colombier 	char	*sessionConst;
4279a747e4fSDavid du Colombier } TLSconn;
4289a747e4fSDavid du Colombier 
429c02046c4SDavid du Colombier /* tlshand.c */
43051711cb6SDavid du Colombier int tlsClient(int fd, TLSconn *c);
43151711cb6SDavid du Colombier int tlsServer(int fd, TLSconn *c);
4329a747e4fSDavid du Colombier 
433c02046c4SDavid du Colombier /* thumb.c */
43451711cb6SDavid du Colombier Thumbprint* initThumbprints(char *ok, char *crl);
43551711cb6SDavid du Colombier void	freeThumbprints(Thumbprint *ok);
43651711cb6SDavid du Colombier int	okThumbprint(uchar *sha1, Thumbprint *ok);
4379a747e4fSDavid du Colombier 
438c02046c4SDavid du Colombier /* readcert.c */
43951711cb6SDavid du Colombier uchar	*readcert(char *filename, int *pcertlen);
44051711cb6SDavid du Colombier PEMChain*readcertchain(char *filename);
4415f0225f3SDavid du Colombier 
4425f0225f3SDavid du Colombier /* password-based key derivation function 2 (rfc2898) */
4435f0225f3SDavid du Colombier void pbkdf2_x(uchar *p, ulong plen, uchar *s, ulong slen, ulong rounds, uchar *d, ulong dlen,
4445f0225f3SDavid du Colombier 	DigestState* (*x)(uchar*, ulong, uchar*, ulong, uchar*, DigestState*), int xlen);
445