xref: /plan9/sys/include/libsec.h (revision 6ca6a3e703ee2ec4aed99c2177f71d7f127da6d9)
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 /*
77c02046c4SDavid du Colombier  * DES definitions
78c02046c4SDavid du Colombier  */
797dd7cddfSDavid du Colombier 
807dd7cddfSDavid du Colombier enum
817dd7cddfSDavid du Colombier {
8259cc4ca5SDavid du Colombier 	DESbsize=	8
837dd7cddfSDavid du Colombier };
847dd7cddfSDavid du Colombier 
85c02046c4SDavid du Colombier /* single des */
867dd7cddfSDavid du Colombier typedef struct DESstate DESstate;
877dd7cddfSDavid du Colombier struct DESstate
887dd7cddfSDavid du Colombier {
897dd7cddfSDavid du Colombier 	ulong	setup;
907dd7cddfSDavid du Colombier 	uchar	key[8];		/* unexpanded key */
917dd7cddfSDavid du Colombier 	ulong	expanded[32];	/* expanded key */
927dd7cddfSDavid du Colombier 	uchar	ivec[8];	/* initialization vector */
937dd7cddfSDavid du Colombier };
947dd7cddfSDavid du Colombier 
957dd7cddfSDavid du Colombier void	setupDESstate(DESstate *s, uchar key[8], uchar *ivec);
967dd7cddfSDavid du Colombier void	des_key_setup(uchar[8], ulong[32]);
977dd7cddfSDavid du Colombier void	block_cipher(ulong*, uchar*, int);
987dd7cddfSDavid du Colombier void	desCBCencrypt(uchar*, int, DESstate*);
997dd7cddfSDavid du Colombier void	desCBCdecrypt(uchar*, int, DESstate*);
1007dd7cddfSDavid du Colombier void	desECBencrypt(uchar*, int, DESstate*);
1017dd7cddfSDavid du Colombier void	desECBdecrypt(uchar*, int, DESstate*);
1027dd7cddfSDavid du Colombier 
103c02046c4SDavid du Colombier /* for backward compatibility with 7-byte DES key format */
1047dd7cddfSDavid du Colombier void	des56to64(uchar *k56, uchar *k64);
1057dd7cddfSDavid du Colombier void	des64to56(uchar *k64, uchar *k56);
1067dd7cddfSDavid du Colombier void	key_setup(uchar[7], ulong[32]);
1077dd7cddfSDavid du Colombier 
108c02046c4SDavid du Colombier /* triple des encrypt/decrypt orderings */
1097dd7cddfSDavid du Colombier enum {
1107dd7cddfSDavid du Colombier 	DES3E=		0,
1117dd7cddfSDavid du Colombier 	DES3D=		1,
1127dd7cddfSDavid du Colombier 	DES3EEE=	0,
1137dd7cddfSDavid du Colombier 	DES3EDE=	2,
1147dd7cddfSDavid du Colombier 	DES3DED=	5,
11559cc4ca5SDavid du Colombier 	DES3DDD=	7
1167dd7cddfSDavid du Colombier };
1177dd7cddfSDavid du Colombier 
1187dd7cddfSDavid du Colombier typedef struct DES3state DES3state;
1197dd7cddfSDavid du Colombier struct DES3state
1207dd7cddfSDavid du Colombier {
1217dd7cddfSDavid du Colombier 	ulong	setup;
1227dd7cddfSDavid du Colombier 	uchar	key[3][8];		/* unexpanded key */
1237dd7cddfSDavid du Colombier 	ulong	expanded[3][32];	/* expanded key */
1247dd7cddfSDavid du Colombier 	uchar	ivec[8];		/* initialization vector */
1257dd7cddfSDavid du Colombier };
1267dd7cddfSDavid du Colombier 
1277dd7cddfSDavid du Colombier void	setupDES3state(DES3state *s, uchar key[3][8], uchar *ivec);
1287dd7cddfSDavid du Colombier void	triple_block_cipher(ulong keys[3][32], uchar*, int);
1297dd7cddfSDavid du Colombier void	des3CBCencrypt(uchar*, int, DES3state*);
1307dd7cddfSDavid du Colombier void	des3CBCdecrypt(uchar*, int, DES3state*);
1317dd7cddfSDavid du Colombier void	des3ECBencrypt(uchar*, int, DES3state*);
1327dd7cddfSDavid du Colombier void	des3ECBdecrypt(uchar*, int, DES3state*);
1337dd7cddfSDavid du Colombier 
134c02046c4SDavid du Colombier /*
135c02046c4SDavid du Colombier  * digests
136c02046c4SDavid du Colombier  */
1377dd7cddfSDavid du Colombier 
1387dd7cddfSDavid du Colombier enum
1397dd7cddfSDavid du Colombier {
1407dd7cddfSDavid du Colombier 	SHA1dlen=	20,	/* SHA digest length */
141345fff32SDavid du Colombier 	SHA2_224dlen=	28,	/* SHA-224 digest length */
142345fff32SDavid du Colombier 	SHA2_256dlen=	32,	/* SHA-256 digest length */
143345fff32SDavid du Colombier 	SHA2_384dlen=	48,	/* SHA-384 digest length */
144345fff32SDavid du Colombier 	SHA2_512dlen=	64,	/* SHA-512 digest length */
1457dd7cddfSDavid du Colombier 	MD4dlen=	16,	/* MD4 digest length */
146ff55b41dSDavid du Colombier 	MD5dlen=	16,	/* MD5 digest length */
147ff55b41dSDavid du Colombier 	AESdlen=	16,	/* TODO: see rfc */
148ff55b41dSDavid du Colombier 
149ff55b41dSDavid du Colombier 	Hmacblksz	= 64,	/* in bytes; from rfc2104 */
1507dd7cddfSDavid du Colombier };
1517dd7cddfSDavid du Colombier 
1527dd7cddfSDavid du Colombier typedef struct DigestState DigestState;
1537dd7cddfSDavid du Colombier struct DigestState
1547dd7cddfSDavid du Colombier {
15528495efeSDavid du Colombier 	uvlong	len;
156345fff32SDavid du Colombier 	union {
157345fff32SDavid du Colombier 		u32int	state[8];
158345fff32SDavid du Colombier 		u64int	bstate[8];
159345fff32SDavid du Colombier 	};
160345fff32SDavid du Colombier 	uchar	buf[256];
1617dd7cddfSDavid du Colombier 	int	blen;
1627dd7cddfSDavid du Colombier 	char	malloced;
1637dd7cddfSDavid du Colombier 	char	seeded;
1647dd7cddfSDavid du Colombier };
16559cc4ca5SDavid du Colombier typedef struct DigestState SHAstate;	/* obsolete name */
16659cc4ca5SDavid du Colombier typedef struct DigestState SHA1state;
167345fff32SDavid du Colombier typedef struct DigestState SHA2_224state;
168345fff32SDavid du Colombier typedef struct DigestState SHA2_256state;
169345fff32SDavid du Colombier typedef struct DigestState SHA2_384state;
170345fff32SDavid du Colombier typedef struct DigestState SHA2_512state;
1717dd7cddfSDavid du Colombier typedef struct DigestState MD5state;
1727dd7cddfSDavid du Colombier typedef struct DigestState MD4state;
173ff55b41dSDavid du Colombier typedef struct DigestState AEShstate;
1747dd7cddfSDavid du Colombier 
1757dd7cddfSDavid du Colombier DigestState*	md4(uchar*, ulong, uchar*, DigestState*);
1767dd7cddfSDavid du Colombier DigestState*	md5(uchar*, ulong, uchar*, DigestState*);
1777dd7cddfSDavid du Colombier DigestState*	sha1(uchar*, ulong, uchar*, DigestState*);
178345fff32SDavid du Colombier DigestState*	sha2_224(uchar*, ulong, uchar*, DigestState*);
179345fff32SDavid du Colombier DigestState*	sha2_256(uchar*, ulong, uchar*, DigestState*);
180345fff32SDavid du Colombier DigestState*	sha2_384(uchar*, ulong, uchar*, DigestState*);
181345fff32SDavid du Colombier DigestState*	sha2_512(uchar*, ulong, uchar*, DigestState*);
182ff55b41dSDavid du Colombier DigestState*	aes(uchar*, ulong, uchar*, DigestState*);
183ff55b41dSDavid du Colombier DigestState*	hmac_x(uchar *p, ulong len, uchar *key, ulong klen,
184ff55b41dSDavid du Colombier 			uchar *digest, DigestState *s,
185ff55b41dSDavid du Colombier 			DigestState*(*x)(uchar*, ulong, uchar*, DigestState*),
186ff55b41dSDavid du Colombier 			int xlen);
1877dd7cddfSDavid du Colombier DigestState*	hmac_md5(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
1887dd7cddfSDavid du Colombier DigestState*	hmac_sha1(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
189345fff32SDavid du Colombier DigestState*	hmac_sha2_224(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
190345fff32SDavid du Colombier DigestState*	hmac_sha2_256(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
191345fff32SDavid du Colombier DigestState*	hmac_sha2_384(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
192345fff32SDavid du Colombier DigestState*	hmac_sha2_512(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
193ff55b41dSDavid du Colombier DigestState*	hmac_aes(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
194e0d6d19cSDavid du Colombier char*		md5pickle(MD5state*);
195e0d6d19cSDavid du Colombier MD5state*	md5unpickle(char*);
1969a747e4fSDavid du Colombier char*		sha1pickle(SHA1state*);
1979a747e4fSDavid du Colombier SHA1state*	sha1unpickle(char*);
1987dd7cddfSDavid du Colombier 
199c02046c4SDavid du Colombier /*
200c02046c4SDavid du Colombier  * random number generation
201c02046c4SDavid du Colombier  */
2027dd7cddfSDavid du Colombier void	genrandom(uchar *buf, int nbytes);
2037dd7cddfSDavid du Colombier void	prng(uchar *buf, int nbytes);
204d9306527SDavid du Colombier ulong	fastrand(void);
205d9306527SDavid du Colombier ulong	nfastrand(ulong);
2067dd7cddfSDavid du Colombier 
207c02046c4SDavid du Colombier /*
208c02046c4SDavid du Colombier  * primes
209c02046c4SDavid du Colombier  */
210c02046c4SDavid du Colombier void	genprime(mpint *p, int n, int accuracy); /* generate n-bit probable prime */
211c02046c4SDavid du Colombier void	gensafeprime(mpint *p, mpint *alpha, int n, int accuracy); /* prime & generator */
212c02046c4SDavid du Colombier void	genstrongprime(mpint *p, int n, int accuracy); /* generate n-bit strong prime */
2137dd7cddfSDavid du Colombier void	DSAprimes(mpint *q, mpint *p, uchar seed[SHA1dlen]);
214c02046c4SDavid du Colombier int	probably_prime(mpint *n, int nrep);	/* miller-rabin test */
215c02046c4SDavid du Colombier int	smallprimetest(mpint *p);  /* returns -1 if not prime, 0 otherwise */
2167dd7cddfSDavid du Colombier 
217c02046c4SDavid du Colombier /*
218c02046c4SDavid du Colombier  * rc4
219c02046c4SDavid du Colombier  */
2207dd7cddfSDavid du Colombier typedef struct RC4state RC4state;
2217dd7cddfSDavid du Colombier struct RC4state
2227dd7cddfSDavid du Colombier {
2237dd7cddfSDavid du Colombier 	 uchar	state[256];
2247dd7cddfSDavid du Colombier 	 uchar	x;
2257dd7cddfSDavid du Colombier 	 uchar	y;
2267dd7cddfSDavid du Colombier };
2277dd7cddfSDavid du Colombier 
2287dd7cddfSDavid du Colombier void	setupRC4state(RC4state*, uchar*, int);
2297dd7cddfSDavid du Colombier void	rc4(RC4state*, uchar*, int);
2307dd7cddfSDavid du Colombier void	rc4skip(RC4state*, int);
2317dd7cddfSDavid du Colombier void	rc4back(RC4state*, int);
2327dd7cddfSDavid du Colombier 
233c02046c4SDavid du Colombier /*
234c02046c4SDavid du Colombier  * rsa
235c02046c4SDavid du Colombier  */
2367dd7cddfSDavid du Colombier typedef struct RSApub RSApub;
2377dd7cddfSDavid du Colombier typedef struct RSApriv RSApriv;
23851711cb6SDavid du Colombier typedef struct PEMChain PEMChain;
2397dd7cddfSDavid du Colombier 
240c02046c4SDavid du Colombier /* public/encryption key */
2417dd7cddfSDavid du Colombier struct RSApub
2427dd7cddfSDavid du Colombier {
243c02046c4SDavid du Colombier 	mpint	*n;	/* modulus */
244c02046c4SDavid du Colombier 	mpint	*ek;	/* exp (encryption key) */
2457dd7cddfSDavid du Colombier };
2467dd7cddfSDavid du Colombier 
247c02046c4SDavid du Colombier /* private/decryption key */
2487dd7cddfSDavid du Colombier struct RSApriv
2497dd7cddfSDavid du Colombier {
2507dd7cddfSDavid du Colombier 	RSApub	pub;
2517dd7cddfSDavid du Colombier 
252c02046c4SDavid du Colombier 	mpint	*dk;	/* exp (decryption key) */
2537dd7cddfSDavid du Colombier 
254c02046c4SDavid du Colombier 	/* precomputed values to help with chinese remainder theorem calc */
2557dd7cddfSDavid du Colombier 	mpint	*p;
2567dd7cddfSDavid du Colombier 	mpint	*q;
257c02046c4SDavid du Colombier 	mpint	*kp;	/* dk mod p-1 */
258c02046c4SDavid du Colombier 	mpint	*kq;	/* dk mod q-1 */
259c02046c4SDavid du Colombier 	mpint	*c2;	/* (inv p) mod q */
2607dd7cddfSDavid du Colombier };
2617dd7cddfSDavid du Colombier 
26251711cb6SDavid du Colombier struct PEMChain{
26351711cb6SDavid du Colombier 	PEMChain*next;
26451711cb6SDavid du Colombier 	uchar	*pem;
26551711cb6SDavid du Colombier 	int	pemlen;
26651711cb6SDavid du Colombier };
26751711cb6SDavid du Colombier 
2687dd7cddfSDavid du Colombier RSApriv*	rsagen(int nlen, int elen, int rounds);
269ef9eff0bSDavid du Colombier RSApriv*	rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q);
2707dd7cddfSDavid du Colombier mpint*		rsaencrypt(RSApub *k, mpint *in, mpint *out);
2717dd7cddfSDavid du Colombier mpint*		rsadecrypt(RSApriv *k, mpint *in, mpint *out);
2727dd7cddfSDavid du Colombier RSApub*		rsapuballoc(void);
2737dd7cddfSDavid du Colombier void		rsapubfree(RSApub*);
2747dd7cddfSDavid du Colombier RSApriv*	rsaprivalloc(void);
2757dd7cddfSDavid du Colombier void		rsaprivfree(RSApriv*);
2767dd7cddfSDavid du Colombier RSApub*		rsaprivtopub(RSApriv*);
27780ee5cbfSDavid du Colombier RSApub*		X509toRSApub(uchar*, int, char*, int);
278*6ca6a3e7SDavid du Colombier uchar*		RSApubtoasn1(RSApub*, int*);
279*6ca6a3e7SDavid du Colombier RSApub*		asn1toRSApub(uchar*, int);
2809a747e4fSDavid du Colombier RSApriv*	asn1toRSApriv(uchar*, int);
281ef9eff0bSDavid du Colombier void		asn1dump(uchar *der, int len);
28251711cb6SDavid du Colombier uchar*		decodePEM(char *s, char *type, int *len, char **new_s);
28351711cb6SDavid du Colombier PEMChain*	decodepemchain(char *s, char *type);
284d9306527SDavid du Colombier uchar*		X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen);
285fb7f0c93SDavid du Colombier uchar*		X509req(RSApriv *priv, char *subj, int *certlen);
286ef9eff0bSDavid du Colombier char*		X509verify(uchar *cert, int ncert, RSApub *pk);
287fb7f0c93SDavid du Colombier void		X509dump(uchar *cert, int ncert);
28851711cb6SDavid du Colombier 
289c02046c4SDavid du Colombier /*
290c02046c4SDavid du Colombier  * elgamal
291c02046c4SDavid du Colombier  */
2927dd7cddfSDavid du Colombier typedef struct EGpub EGpub;
2937dd7cddfSDavid du Colombier typedef struct EGpriv EGpriv;
2947dd7cddfSDavid du Colombier typedef struct EGsig EGsig;
2957dd7cddfSDavid du Colombier 
296c02046c4SDavid du Colombier /* public/encryption key */
2977dd7cddfSDavid du Colombier struct EGpub
2987dd7cddfSDavid du Colombier {
299c02046c4SDavid du Colombier 	mpint	*p;	/* modulus */
300c02046c4SDavid du Colombier 	mpint	*alpha;	/* generator */
301c02046c4SDavid du Colombier 	mpint	*key;	/* (encryption key) alpha**secret mod p */
3027dd7cddfSDavid du Colombier };
3037dd7cddfSDavid du Colombier 
304c02046c4SDavid du Colombier /* private/decryption key */
3057dd7cddfSDavid du Colombier struct EGpriv
3067dd7cddfSDavid du Colombier {
3077dd7cddfSDavid du Colombier 	EGpub	pub;
308c02046c4SDavid du Colombier 	mpint	*secret;	/* (decryption key) */
3097dd7cddfSDavid du Colombier };
3107dd7cddfSDavid du Colombier 
311c02046c4SDavid du Colombier /* signature */
3127dd7cddfSDavid du Colombier struct EGsig
3137dd7cddfSDavid du Colombier {
3147dd7cddfSDavid du Colombier 	mpint	*r, *s;
3157dd7cddfSDavid du Colombier };
3167dd7cddfSDavid du Colombier 
3177dd7cddfSDavid du Colombier EGpriv*		eggen(int nlen, int rounds);
318c02046c4SDavid du Colombier mpint*		egencrypt(EGpub *k, mpint *in, mpint *out);	/* deprecated */
3197dd7cddfSDavid du Colombier mpint*		egdecrypt(EGpriv *k, mpint *in, mpint *out);
3207dd7cddfSDavid du Colombier EGsig*		egsign(EGpriv *k, mpint *m);
3217dd7cddfSDavid du Colombier int		egverify(EGpub *k, EGsig *sig, mpint *m);
3227dd7cddfSDavid du Colombier EGpub*		egpuballoc(void);
3237dd7cddfSDavid du Colombier void		egpubfree(EGpub*);
3247dd7cddfSDavid du Colombier EGpriv*		egprivalloc(void);
3257dd7cddfSDavid du Colombier void		egprivfree(EGpriv*);
3267dd7cddfSDavid du Colombier EGsig*		egsigalloc(void);
3277dd7cddfSDavid du Colombier void		egsigfree(EGsig*);
3287dd7cddfSDavid du Colombier EGpub*		egprivtopub(EGpriv*);
3299a747e4fSDavid du Colombier 
330c02046c4SDavid du Colombier /*
331c02046c4SDavid du Colombier  * dsa
332c02046c4SDavid du Colombier  */
3333ff48bf5SDavid du Colombier typedef struct DSApub DSApub;
3343ff48bf5SDavid du Colombier typedef struct DSApriv DSApriv;
3353ff48bf5SDavid du Colombier typedef struct DSAsig DSAsig;
3363ff48bf5SDavid du Colombier 
337c02046c4SDavid du Colombier /* public/encryption key */
3383ff48bf5SDavid du Colombier struct DSApub
3393ff48bf5SDavid du Colombier {
340c02046c4SDavid du Colombier 	mpint	*p;	/* modulus */
341c02046c4SDavid du Colombier 	mpint	*q;	/* group order, q divides p-1 */
342c02046c4SDavid du Colombier 	mpint	*alpha;	/* group generator */
343c02046c4SDavid du Colombier 	mpint	*key;	/* (encryption key) alpha**secret mod p */
3443ff48bf5SDavid du Colombier };
3453ff48bf5SDavid du Colombier 
346c02046c4SDavid du Colombier /* private/decryption key */
3473ff48bf5SDavid du Colombier struct DSApriv
3483ff48bf5SDavid du Colombier {
3493ff48bf5SDavid du Colombier 	DSApub	pub;
350c02046c4SDavid du Colombier 	mpint	*secret;	/* (decryption key) */
3513ff48bf5SDavid du Colombier };
3523ff48bf5SDavid du Colombier 
353c02046c4SDavid du Colombier /* signature */
3543ff48bf5SDavid du Colombier struct DSAsig
3553ff48bf5SDavid du Colombier {
3563ff48bf5SDavid du Colombier 	mpint	*r, *s;
3573ff48bf5SDavid du Colombier };
3583ff48bf5SDavid du Colombier 
359c02046c4SDavid du Colombier DSApriv*	dsagen(DSApub *opub);	/* opub not checked for consistency! */
3603ff48bf5SDavid du Colombier DSAsig*		dsasign(DSApriv *k, mpint *m);
3613ff48bf5SDavid du Colombier int		dsaverify(DSApub *k, DSAsig *sig, mpint *m);
3623ff48bf5SDavid du Colombier DSApub*		dsapuballoc(void);
3633ff48bf5SDavid du Colombier void		dsapubfree(DSApub*);
3643ff48bf5SDavid du Colombier DSApriv*	dsaprivalloc(void);
3653ff48bf5SDavid du Colombier void		dsaprivfree(DSApriv*);
3663ff48bf5SDavid du Colombier DSAsig*		dsasigalloc(void);
3673ff48bf5SDavid du Colombier void		dsasigfree(DSAsig*);
3683ff48bf5SDavid du Colombier DSApub*		dsaprivtopub(DSApriv*);
3692d8b52e8SDavid du Colombier DSApriv*	asn1toDSApriv(uchar*, int);
3703ff48bf5SDavid du Colombier 
371c02046c4SDavid du Colombier /*
372c02046c4SDavid du Colombier  * TLS
373c02046c4SDavid du Colombier  */
3749a747e4fSDavid du Colombier typedef struct Thumbprint{
3759a747e4fSDavid du Colombier 	struct Thumbprint *next;
3769a747e4fSDavid du Colombier 	uchar	sha1[SHA1dlen];
3779a747e4fSDavid du Colombier } Thumbprint;
3789a747e4fSDavid du Colombier 
3799a747e4fSDavid du Colombier typedef struct TLSconn{
380c02046c4SDavid du Colombier 	char	dir[40];	/* connection directory */
381c02046c4SDavid du Colombier 	uchar	*cert;	/* certificate (local on input, remote on output) */
3829a747e4fSDavid du Colombier 	uchar	*sessionID;
383c02046c4SDavid du Colombier 	int	certlen;
384c02046c4SDavid du Colombier 	int	sessionIDlen;
3859a747e4fSDavid du Colombier 	int	(*trace)(char*fmt, ...);
386c02046c4SDavid du Colombier 	PEMChain*chain;	/* optional extra certificate evidence for servers to present */
3870d862726SDavid du Colombier 	char	*sessionType;
3880d862726SDavid du Colombier 	uchar	*sessionKey;
3890d862726SDavid du Colombier 	int	sessionKeylen;
3900d862726SDavid du Colombier 	char	*sessionConst;
3919a747e4fSDavid du Colombier } TLSconn;
3929a747e4fSDavid du Colombier 
393c02046c4SDavid du Colombier /* tlshand.c */
39451711cb6SDavid du Colombier int tlsClient(int fd, TLSconn *c);
39551711cb6SDavid du Colombier int tlsServer(int fd, TLSconn *c);
3969a747e4fSDavid du Colombier 
397c02046c4SDavid du Colombier /* thumb.c */
39851711cb6SDavid du Colombier Thumbprint* initThumbprints(char *ok, char *crl);
39951711cb6SDavid du Colombier void	freeThumbprints(Thumbprint *ok);
40051711cb6SDavid du Colombier int	okThumbprint(uchar *sha1, Thumbprint *ok);
4019a747e4fSDavid du Colombier 
402c02046c4SDavid du Colombier /* readcert.c */
40351711cb6SDavid du Colombier uchar	*readcert(char *filename, int *pcertlen);
40451711cb6SDavid du Colombier PEMChain*readcertchain(char *filename);
405