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