#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. Load more
#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 */ void DigestState_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; } void Crypt_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); } void Crypt_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); } void Crypt_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); } void Crypt_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); } void Crypt_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); } void Crypt_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); } void Crypt_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; } void Crypt_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); } void Crypt_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); } void Crypt_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); } void cryptmodinit(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); } void Crypt_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; } void Crypt_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); } void Crypt_descbc(void *fp)