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