Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/planix-v0/sys/include/ape/libsec.h – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#ifndef _PLAN9_SOURCE
2
  This header file is an extension to ANSI/POSIX
3
#endif
4
 
5
#ifndef __LIBSEC_H_
6
#define __LIBSEC_H_
7
#pragma	src	"/sys/src/ape/lib/sec"
8
#pragma	lib	"/$M/lib/ape/libsec.a"
9
 
10
#ifndef _MPINT
11
typedef struct mpint mpint;
12
#endif
13
 
14
/*
15
 * AES definitions
16
 */
17
 
18
enum
19
{
20
	AESbsize=	16,
21
	AESmaxkey=	32,
22
	AESmaxrounds=	14
23
};
24
 
25
typedef struct AESstate AESstate;
26
struct AESstate
27
{
28
	ulong	setup;
29
	int	rounds;
30
	int	keybytes;
31
	uint	ctrsz;
32
	uchar	key[AESmaxkey];			/* unexpanded key */
33
	ulong	ekey[4*(AESmaxrounds + 1)];	/* encryption key */
34
	ulong	dkey[4*(AESmaxrounds + 1)];	/* decryption key */
35
	uchar	ivec[AESbsize];			/* initialization vector */
36
	uchar	mackey[3 * AESbsize];		/* 3 XCBC mac 96 keys */
37
};
38
 
39
/* block ciphers */
40
void	aes_encrypt(ulong rk[], int Nr, uchar pt[16], uchar ct[16]);
41
void	aes_decrypt(ulong rk[], int Nr, uchar ct[16], uchar pt[16]);
42
 
43
void	setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec);
44
void	aesCBCencrypt(uchar *p, int len, AESstate *s);
45
void	aesCBCdecrypt(uchar *p, int len, AESstate *s);
46
void	aesCTRdecrypt(uchar *p, int len, AESstate *s);
47
void	aesCTRencrypt(uchar *p, int len, AESstate *s);
48
 
49
void	setupAESXCBCstate(AESstate *s);
50
uchar*	aesXCBCmac(uchar *p, int len, AESstate *s);
51
 
52
/*
53
 * Blowfish Definitions
54
 */
55
 
56
enum
57
{
58
	BFbsize	= 8,
59
	BFrounds= 16
60
};
61
 
62
/* 16-round Blowfish */
63
typedef struct BFstate BFstate;
64
struct BFstate
65
{
66
	ulong	setup;
67
 
68
	uchar	key[56];
69
	uchar	ivec[8];
70
 
71
	u32int 	pbox[BFrounds+2];
72
	u32int	sbox[1024];
73
};
74
 
75
void	setupBFstate(BFstate *s, uchar key[], int keybytes, uchar *ivec);
76
void	bfCBCencrypt(uchar*, int, BFstate*);
77
void	bfCBCdecrypt(uchar*, int, BFstate*);
78
void	bfECBencrypt(uchar*, int, BFstate*);
79
void	bfECBdecrypt(uchar*, int, BFstate*);
80
 
81
/*
82
 * DES definitions
83
 */
84
 
85
enum
86
{
87
	DESbsize=	8
88
};
89
 
90
/* single des */
91
typedef struct DESstate DESstate;
92
struct DESstate
93
{
94
	ulong	setup;
95
	uchar	key[8];		/* unexpanded key */
96
	ulong	expanded[32];	/* expanded key */
97
	uchar	ivec[8];	/* initialization vector */
98
};
99
 
100
void	setupDESstate(DESstate *s, uchar key[8], uchar *ivec);
101
void	des_key_setup(uchar[8], ulong[32]);
102
void	block_cipher(ulong*, uchar*, int);
103
void	desCBCencrypt(uchar*, int, DESstate*);
104
void	desCBCdecrypt(uchar*, int, DESstate*);
105
void	desECBencrypt(uchar*, int, DESstate*);
106
void	desECBdecrypt(uchar*, int, DESstate*);
107
 
108
/* for backward compatibility with 7-byte DES key format */
109
void	des56to64(uchar *k56, uchar *k64);
110
void	des64to56(uchar *k64, uchar *k56);
111
void	key_setup(uchar[7], ulong[32]);
112
 
113
/* triple des encrypt/decrypt orderings */
114
enum {
115
	DES3E=		0,
116
	DES3D=		1,
117
	DES3EEE=	0,
118
	DES3EDE=	2,
119
	DES3DED=	5,
120
	DES3DDD=	7
121
};
122
 
123
typedef struct DES3state DES3state;
124
struct DES3state
125
{
126
	ulong	setup;
127
	uchar	key[3][8];		/* unexpanded key */
128
	ulong	expanded[3][32];	/* expanded key */
129
	uchar	ivec[8];		/* initialization vector */
130
};
131
 
132
void	setupDES3state(DES3state *s, uchar key[3][8], uchar *ivec);
133
void	triple_block_cipher(ulong keys[3][32], uchar*, int);
134
void	des3CBCencrypt(uchar*, int, DES3state*);
135
void	des3CBCdecrypt(uchar*, int, DES3state*);
136
void	des3ECBencrypt(uchar*, int, DES3state*);
137
void	des3ECBdecrypt(uchar*, int, DES3state*);
138
 
139
/*
140
 * digests
141
 */
142
 
143
enum
144
{
145
	SHA1dlen=	20,	/* SHA digest length */
146
	SHA2_224dlen=	28,	/* SHA-224 digest length */
147
	SHA2_256dlen=	32,	/* SHA-256 digest length */
148
	SHA2_384dlen=	48,	/* SHA-384 digest length */
149
	SHA2_512dlen=	64,	/* SHA-512 digest length */
150
	MD4dlen=	16,	/* MD4 digest length */
151
	MD5dlen=	16,	/* MD5 digest length */
152
	AESdlen=	16,	/* TODO: see rfc */
153
 
154
	Hmacblksz	= 64,	/* in bytes; from rfc2104 */
155
};
156
 
157
typedef struct DigestState DigestState;
158
struct DigestState
159
{
160
	uvlong	len;
161
	union {
162
		u32int	state[8];
163
		u64int	bstate[8];
164
	};
165
	uchar	buf[256];
166
	int	blen;
167
	char	malloced;
168
	char	seeded;
169
};
170
typedef struct DigestState SHAstate;	/* obsolete name */
171
typedef struct DigestState SHA1state;
172
typedef struct DigestState SHA2_224state;
173
typedef struct DigestState SHA2_256state;
174
typedef struct DigestState SHA2_384state;
175
typedef struct DigestState SHA2_512state;
176
typedef struct DigestState MD5state;
177
typedef struct DigestState MD4state;
178
typedef struct DigestState AEShstate;
179
 
180
DigestState*	md4(uchar*, ulong, uchar*, DigestState*);
181
DigestState*	md5(uchar*, ulong, uchar*, DigestState*);
182
DigestState*	sha1(uchar*, ulong, uchar*, DigestState*);
183
DigestState*	sha2_224(uchar*, ulong, uchar*, DigestState*);
184
DigestState*	sha2_256(uchar*, ulong, uchar*, DigestState*);
185
DigestState*	sha2_384(uchar*, ulong, uchar*, DigestState*);
186
DigestState*	sha2_512(uchar*, ulong, uchar*, DigestState*);
187
DigestState*	aes(uchar*, ulong, uchar*, DigestState*);
188
DigestState*	hmac_x(uchar *p, ulong len, uchar *key, ulong klen,
189
			uchar *digest, DigestState *s,
190
			DigestState*(*x)(uchar*, ulong, uchar*, DigestState*),
191
			int xlen);
192
DigestState*	hmac_md5(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
193
DigestState*	hmac_sha1(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
194
DigestState*	hmac_sha2_224(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
195
DigestState*	hmac_sha2_256(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
196
DigestState*	hmac_sha2_384(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
197
DigestState*	hmac_sha2_512(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
198
DigestState*	hmac_aes(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
199
char*		md5pickle(MD5state*);
200
MD5state*	md5unpickle(char*);
201
char*		sha1pickle(SHA1state*);
202
SHA1state*	sha1unpickle(char*);
203
 
204
/*
205
 * random number generation
206
 */
207
void	genrandom(uchar *buf, int nbytes);
208
void	prng(uchar *buf, int nbytes);
209
ulong	fastrand(void);
210
ulong	nfastrand(ulong);
211
 
212
/*
213
 * primes
214
 */
215
void	genprime(mpint *p, int n, int accuracy); /* generate n-bit probable prime */
216
void	gensafeprime(mpint *p, mpint *alpha, int n, int accuracy); /* prime & generator */
217
void	genstrongprime(mpint *p, int n, int accuracy); /* generate n-bit strong prime */
218
void	DSAprimes(mpint *q, mpint *p, uchar seed[SHA1dlen]);
219
int	probably_prime(mpint *n, int nrep);	/* miller-rabin test */
220
int	smallprimetest(mpint *p);  /* returns -1 if not prime, 0 otherwise */
221
 
222
/*
223
 * rc4
224
 */
225
typedef struct RC4state RC4state;
226
struct RC4state
227
{
228
	 uchar	state[256];
229
	 uchar	x;
230
	 uchar	y;
231
};
232
 
233
void	setupRC4state(RC4state*, uchar*, int);
234
void	rc4(RC4state*, uchar*, int);
235
void	rc4skip(RC4state*, int);
236
void	rc4back(RC4state*, int);
237
 
238
/*
239
 * rsa
240
 */
241
typedef struct RSApub RSApub;
242
typedef struct RSApriv RSApriv;
243
typedef struct PEMChain PEMChain;
244
 
245
/* public/encryption key */
246
struct RSApub
247
{
248
	mpint	*n;	/* modulus */
249
	mpint	*ek;	/* exp (encryption key) */
250
};
251
 
252
/* private/decryption key */
253
struct RSApriv
254
{
255
	RSApub	pub;
256
 
257
	mpint	*dk;	/* exp (decryption key) */
258
 
259
	/* precomputed values to help with chinese remainder theorem calc */
260
	mpint	*p;
261
	mpint	*q;
262
	mpint	*kp;	/* dk mod p-1 */
263
	mpint	*kq;	/* dk mod q-1 */
264
	mpint	*c2;	/* (inv p) mod q */
265
};
266
 
267
struct PEMChain{
268
	PEMChain*next;
269
	uchar	*pem;
270
	int	pemlen;
271
};
272
 
273
RSApriv*	rsagen(int nlen, int elen, int rounds);
274
RSApriv*	rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q);
275
mpint*		rsaencrypt(RSApub *k, mpint *in, mpint *out);
276
mpint*		rsadecrypt(RSApriv *k, mpint *in, mpint *out);
277
RSApub*		rsapuballoc(void);
278
void		rsapubfree(RSApub*);
279
RSApriv*	rsaprivalloc(void);
280
void		rsaprivfree(RSApriv*);
281
RSApub*		rsaprivtopub(RSApriv*);
282
RSApub*		X509toRSApub(uchar*, int, char*, int);
283
RSApriv*	asn1toRSApriv(uchar*, int);
284
void		asn1dump(uchar *der, int len);
285
uchar*		decodePEM(char *s, char *type, int *len, char **new_s);
286
PEMChain*	decodepemchain(char *s, char *type);
287
uchar*		X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen);
288
uchar*		X509req(RSApriv *priv, char *subj, int *certlen);
289
char*		X509verify(uchar *cert, int ncert, RSApub *pk);
290
void		X509dump(uchar *cert, int ncert);
291
 
292
/*
293
 * elgamal
294
 */
295
typedef struct EGpub EGpub;
296
typedef struct EGpriv EGpriv;
297
typedef struct EGsig EGsig;
298
 
299
/* public/encryption key */
300
struct EGpub
301
{
302
	mpint	*p;	/* modulus */
303
	mpint	*alpha;	/* generator */
304
	mpint	*key;	/* (encryption key) alpha**secret mod p */
305
};
306
 
307
/* private/decryption key */
308
struct EGpriv
309
{
310
	EGpub	pub;
311
	mpint	*secret;	/* (decryption key) */
312
};
313
 
314
/* signature */
315
struct EGsig
316
{
317
	mpint	*r, *s;
318
};
319
 
320
EGpriv*		eggen(int nlen, int rounds);
321
mpint*		egencrypt(EGpub *k, mpint *in, mpint *out);	/* deprecated */
322
mpint*		egdecrypt(EGpriv *k, mpint *in, mpint *out);
323
EGsig*		egsign(EGpriv *k, mpint *m);
324
int		egverify(EGpub *k, EGsig *sig, mpint *m);
325
EGpub*		egpuballoc(void);
326
void		egpubfree(EGpub*);
327
EGpriv*		egprivalloc(void);
328
void		egprivfree(EGpriv*);
329
EGsig*		egsigalloc(void);
330
void		egsigfree(EGsig*);
331
EGpub*		egprivtopub(EGpriv*);
332
 
333
/*
334
 * dsa
335
 */
336
typedef struct DSApub DSApub;
337
typedef struct DSApriv DSApriv;
338
typedef struct DSAsig DSAsig;
339
 
340
/* public/encryption key */
341
struct DSApub
342
{
343
	mpint	*p;	/* modulus */
344
	mpint	*q;	/* group order, q divides p-1 */
345
	mpint	*alpha;	/* group generator */
346
	mpint	*key;	/* (encryption key) alpha**secret mod p */
347
};
348
 
349
/* private/decryption key */
350
struct DSApriv
351
{
352
	DSApub	pub;
353
	mpint	*secret;	/* (decryption key) */
354
};
355
 
356
/* signature */
357
struct DSAsig
358
{
359
	mpint	*r, *s;
360
};
361
 
362
DSApriv*	dsagen(DSApub *opub);	/* opub not checked for consistency! */
363
DSAsig*		dsasign(DSApriv *k, mpint *m);
364
int		dsaverify(DSApub *k, DSAsig *sig, mpint *m);
365
DSApub*		dsapuballoc(void);
366
void		dsapubfree(DSApub*);
367
DSApriv*	dsaprivalloc(void);
368
void		dsaprivfree(DSApriv*);
369
DSAsig*		dsasigalloc(void);
370
void		dsasigfree(DSAsig*);
371
DSApub*		dsaprivtopub(DSApriv*);
372
DSApriv*	asn1toDSApriv(uchar*, int);
373
 
374
/*
375
 * TLS
376
 */
377
typedef struct Thumbprint{
378
	struct Thumbprint *next;
379
	uchar	sha1[SHA1dlen];
380
} Thumbprint;
381
 
382
typedef struct TLSconn{
383
	char	dir[40];	/* connection directory */
384
	uchar	*cert;	/* certificate (local on input, remote on output) */
385
	uchar	*sessionID;
386
	int	certlen;
387
	int	sessionIDlen;
388
	int	(*trace)(char*fmt, ...);
389
	PEMChain*chain;	/* optional extra certificate evidence for servers to present */
390
	char	*sessionType;
391
	uchar	*sessionKey;
392
	int	sessionKeylen;
393
	char	*sessionConst;
394
} TLSconn;
395
 
396
/* tlshand.c */
397
int tlsClient(int fd, TLSconn *c);
398
int tlsServer(int fd, TLSconn *c);
399
 
400
/* thumb.c */
401
Thumbprint* initThumbprints(char *ok, char *crl);
402
void	freeThumbprints(Thumbprint *ok);
403
int	okThumbprint(uchar *sha1, Thumbprint *ok);
404
 
405
/* readcert.c */
406
uchar	*readcert(char *filename, int *pcertlen);
407
PEMChain*readcertchain(char *filename);
408
 
409
#endif