forsyth20110126-23199c32d4d15 years agoHistory
1348 lines · 22.6 KB · C
RawDownload
#include "lib9.h"#include "kernel.h"#include <isa.h>#include "interp.h"#include "runt.h"#include "cryptmod.h"#include <mp.h>#include <libsec.h>#include "pool.h"#include "raise.h"#include "ipint.h" #define	MPX(x)	checkIPint((void*)(x)) static Type*	TDigestState;static Type*	TAESstate;static Type*	TDESstate;static Type*	TIDEAstate;static Type*	TBFstate;static Type*	TRC4state; static Type*	TSKdsa;static Type*	TPKdsa;static Type*	TPKsigdsa;static Type*	TSKeg;static Type*	TPKeg;static Type*	TPKsigeg;static Type*	TSKrsa;static Type*	TPKrsa;static Type*	TPKsigrsa; static uchar DigestStatemap[] = Crypt_DigestState_map;static uchar AESstatemap[] = Crypt_AESstate_map;static uchar DESstatemap[] = Crypt_DESstate_map;static uchar IDEAstatemap[] = Crypt_IDEAstate_map;static uchar BFstatemap[] = Crypt_BFstate_map;static uchar RC4statemap[] = Crypt_RC4state_map; static uchar DSAskmap[] = Crypt_SK_DSA_map;static uchar DSApkmap[] = Crypt_PK_DSA_map;static uchar DSAsigmap[] = Crypt_PKsig_DSA_map;static uchar EGskmap[] = Crypt_SK_Elgamal_map;static uchar EGpkmap[] = Crypt_PK_Elgamal_map;static uchar EGsigmap[] = Crypt_PKsig_Elgamal_map;static uchar RSAskmap[] = Crypt_SK_RSA_map;static uchar RSApkmap[] = Crypt_PK_RSA_map;static uchar RSAsigmap[] = Crypt_PKsig_RSA_map; static char exBadBsize[]	= "data not multiple of block size";static char exBadKey[]	= "bad encryption key";static char exBadDigest[]	= "bad digest value";static char exBadIvec[]	= "bad ivec";static char exBadState[] = "bad encryption state"; /* * these structures reveal the C state of Limbo adts in crypt.m */ typedef struct XDigestState XDigestState;typedef struct XAESstate XAESstate;typedef struct XDESstate XDESstate;typedef struct XIDEAstate XIDEAstate;typedef struct XBFstate XBFstate;typedef struct XRC4state XRC4state; /* digest state */struct XDigestState{	Crypt_DigestState	x;	DigestState	state;}; /* AES state */struct XAESstate{	Crypt_AESstate	x;	AESstate	state;}; /* DES state */struct XDESstate{	Crypt_DESstate	x;	DESstate	state;}; /* IDEA state */struct XIDEAstate{	Crypt_IDEAstate	x;	IDEAstate	state;}; /* BF state */struct XBFstate{	Crypt_BFstate	x;	BFstate	state;}; /* RC4 state */struct XRC4state{	Crypt_RC4state	x;	RC4state	state;}; static Crypt_PK*newPK(Type *t, int pick){	Heap *h;	Crypt_PK *sk; 	h = heap(t);	sk = H2D(Crypt_PK*, h);	sk->pick = pick;	return sk;} static Crypt_SK*newSK(Crypt_SK** ret, Type *t, int pick){	Heap *h;	Crypt_SK *sk; 	h = heap(t);	sk = H2D(Crypt_SK*, h);	sk->pick = pick;	if(ret != nil)		*ret = sk;	switch(pick){	case Crypt_PK_RSA:		sk->u.RSA.pk = newPK(TPKrsa, Crypt_PK_RSA);		break;	case Crypt_PK_Elgamal:		sk->u.Elgamal.pk = newPK(TPKeg, Crypt_PK_Elgamal);		break;	case Crypt_PK_DSA:		sk->u.DSA.pk = newPK(TPKdsa, Crypt_PK_DSA);		break;	default:		error(exType);	}	return sk;} static Crypt_PKsig*newPKsig(Type *t, int pick){	Heap *h;	Crypt_PKsig *s; 	h = heap(t);	s = H2D(Crypt_PKsig*, h);	s->pick = pick;	return s;} static IPints_IPint*ipcopymp(mpint* b){	if(b == nil)		return H;	return newIPint(mpcopy(b));} /* *  digests */voidDigestState_copy(void *fp){	F_DigestState_copy *f;	Heap *h;	XDigestState *ds, *ods;	void *r; 	f = fp;	r = *f->ret;	*f->ret = H;	destroy(r); 	if(f->d != H){		ods = checktype(f->d, TDigestState, "DigestState", 0);		h = heap(TDigestState);		ds = H2D(XDigestState*, h); 			memmove(&ds->state, &ods->state, sizeof(ds->state)); 		*f->ret = (Crypt_DigestState*)ds;	}} static Crypt_DigestState*crypt_digest_x(Array *buf, int n, Array *digest, int dlen, Crypt_DigestState *state, DigestState* (*fn)(uchar*, ulong, uchar*, DigestState*)){	Heap *h;	XDigestState *ds;	uchar *cbuf, *cdigest; 	if(buf != H){		if(n > buf->len)			n = buf->len;		cbuf = buf->data;	}else{		if(n != 0)			error(exInval);		cbuf = nil;	} 	if(digest != H){		if(digest->len < dlen)			error(exBadDigest);		cdigest = digest->data;	} else		cdigest = nil; 	if(state == H){		h = heap(TDigestState);		ds = H2D(XDigestState*, h);		memset(&ds->state, 0, sizeof(ds->state));	} else		ds = checktype(state, TDigestState, "DigestState", 1); 	(*fn)(cbuf, n, cdigest, &ds->state); 	return (Crypt_DigestState*)ds;} voidCrypt_sha1(void *fp){	F_Crypt_sha1 *f;	void *r; 	f = fp;	r = *f->ret;	*f->ret = H;	destroy(r); 	*f->ret = crypt_digest_x(f->buf, f->n, f->digest, SHA1dlen, f->state, sha1);} voidCrypt_sha224(void *fp){	F_Crypt_sha224 *f;	void *r; 	f = fp;	r = *f->ret;	*f->ret = H;	destroy(r); 	*f->ret = crypt_digest_x(f->buf, f->n, f->digest, SHA224dlen, f->state, sha224);} voidCrypt_sha256(void *fp){	F_Crypt_sha256 *f;	void *r; 	f = fp;	r = *f->ret;	*f->ret = H;	destroy(r); 	*f->ret = crypt_digest_x(f->buf, f->n, f->digest, SHA256dlen, f->state, sha256);} voidCrypt_sha384(void *fp){	F_Crypt_sha384 *f;	void *r; 	f = fp;	r = *f->ret;	*f->ret = H;	destroy(r); 	*f->ret = crypt_digest_x(f->buf, f->n, f->digest, SHA384dlen, f->state, sha384);} voidCrypt_sha512(void *fp){	F_Crypt_sha512 *f;	void *r; 	f = fp;	r = *f->ret;	*f->ret = H;	destroy(r); 	*f->ret = crypt_digest_x(f->buf, f->n, f->digest, SHA512dlen, f->state, sha512);} voidCrypt_md5(void *fp){	F_Crypt_md5 *f;	void *r; 	f = fp;	r = *f->ret;	*f->ret = H;	destroy(r); 	*f->ret = crypt_digest_x(f->buf, f->n, f->digest, MD5dlen, f->state, md5);} voidCrypt_md4(void *fp){	F_Crypt_md4 *f;	void *r; 	f = fp;	r = *f->ret;	*f->ret = H;	destroy(r); 	*f->ret = crypt_digest_x(f->buf, f->n, f->digest, MD4dlen, f->state, md4);} static Crypt_DigestState*crypt_hmac_x(Array *data, int n, Array *key, Array *digest, int dlen, Crypt_DigestState *state, DigestState* (*fn)(uchar*, ulong, uchar*, ulong, uchar*, DigestState*)){	Heap *h;	XDigestState *ds;	uchar *cdata, *cdigest; 	if(data != H){		if(n > data->len)			n = data->len;		cdata = data->data;	}else{		if(n != 0)			error(exInval);		cdata = nil;	} 	if(key == H || key->len > 64)		error(exBadKey); 	if(digest != H){		if(digest->len < dlen)			error(exBadDigest);		cdigest = digest->data;	} else		cdigest = nil; 	if(state == H){		h = heap(TDigestState);		ds = H2D(XDigestState*, h);		memset(&ds->state, 0, sizeof(ds->state));	} else		ds = checktype(state, TDigestState, "DigestState", 1); 	(*fn)(cdata, n, key->data, key->len, cdigest, &ds->state); 	return (Crypt_DigestState*)ds;} voidCrypt_hmac_sha1(void *fp){	F_Crypt_hmac_sha1 *f;	void *r; 	f = fp;	r = *f->ret;	*f->ret = H;	destroy(r);	*f->ret = crypt_hmac_x(f->data, f->n, f->key, f->digest, SHA1dlen, f->state, hmac_sha1);} voidCrypt_hmac_md5(void *fp){	F_Crypt_hmac_md5 *f;	void *r; 	f = fp;	r = *f->ret;	*f->ret = H;	destroy(r);	*f->ret = crypt_hmac_x(f->data, f->n, f->key, f->digest, MD5dlen, f->state, hmac_md5);} voidCrypt_dhparams(void *fp){	F_Crypt_dhparams *f;	mpint *p, *alpha;	void *v; 	f = fp;	v = f->ret->t0;	f->ret->t0 = H;	destroy(v);	v = f->ret->t1;	f->ret->t1 = H;	destroy(v); 	p = mpnew(0);	alpha = mpnew(0);	release();	if(f->nbits == 1024)		DSAprimes(alpha, p, nil);	else		gensafeprime(p, alpha, f->nbits, 0);	acquire();	f->ret->t0 = newIPint(alpha);	f->ret->t1 = newIPint(p);} voidcryptmodinit(void){	ipintsmodinit();	/* TIPint */ 	TDigestState = dtype(freeheap, sizeof(XDigestState), DigestStatemap, sizeof(DigestStatemap));	TAESstate = dtype(freeheap, sizeof(XAESstate), AESstatemap, sizeof(AESstatemap));	TDESstate = dtype(freeheap, sizeof(XDESstate), DESstatemap, sizeof(DESstatemap));	TIDEAstate = dtype(freeheap, sizeof(XIDEAstate), IDEAstatemap, sizeof(IDEAstatemap));	TBFstate = dtype(freeheap, sizeof(XBFstate), BFstatemap, sizeof(BFstatemap));	TRC4state = dtype(freeheap, sizeof(XRC4state), RC4statemap, sizeof(RC4statemap)); 	TSKdsa = dtype(freeheap, Crypt_SK_DSA_size, DSAskmap, sizeof(DSAskmap));	TPKdsa = dtype(freeheap, Crypt_PK_DSA_size, DSApkmap, sizeof(DSApkmap));	TPKsigdsa = dtype(freeheap, Crypt_PKsig_DSA_size, DSAsigmap, sizeof(DSAsigmap));	TSKeg = dtype(freeheap, Crypt_SK_Elgamal_size, EGskmap, sizeof(EGskmap));	TPKeg = dtype(freeheap, Crypt_PK_Elgamal_size, EGpkmap, sizeof(EGpkmap));	TPKsigeg = dtype(freeheap, Crypt_PKsig_Elgamal_size, EGsigmap, sizeof(EGsigmap));	TSKrsa = dtype(freeheap, Crypt_SK_RSA_size, RSAskmap, sizeof(RSAskmap));	TPKrsa = dtype(freeheap, Crypt_PK_RSA_size, RSApkmap, sizeof(RSApkmap));	TPKsigrsa = dtype(freeheap, Crypt_PKsig_RSA_size, RSAsigmap, sizeof(RSAsigmap)); 	builtinmod("$Crypt", Cryptmodtab, Cryptmodlen);} voidCrypt_dessetup(void *fp){	F_Crypt_dessetup *f;	Heap *h;	XDESstate *ds;	uchar *ivec;	void *v; 	f = fp;	v = *f->ret;	*f->ret = H;	destroy(v); 	if(f->key == H)		error(exNilref);	if(f->key->len < 8)		error(exBadKey);	if(f->ivec != H){		if(f->ivec->len < 8)			error(exBadIvec);		ivec = f->ivec->data;	}else		ivec = nil; 	h = heap(TDESstate);	ds = H2D(XDESstate*, h);	setupDESstate(&ds->state, f->key->data, ivec); 	*f->ret = (Crypt_DESstate*)ds;} voidCrypt_desecb(void *fp){	F_Crypt_desecb *f;	XDESstate *ds;	int i;	uchar *p; 	f = fp; 	if(f->buf == H)		return;	if(f->n < 0 || f->n > f->buf->len)		error(exBounds);	if(f->n & 7)		error(exBadBsize); 	ds = checktype(f->state, TDESstate, exBadState, 0);	p = f->buf->data; 	for(i = 8; i <= f->n; i += 8, p += 8)		block_cipher(ds->state.expanded, p, f->direction);} voidCrypt_descbc(void *fp)

Lines 1–500 of 1348.