diff --git a/.gitattributes b/.gitattributes index f288c19e761eed4db9e0b9a7466530f6177ddf0e..b2acb968d5fb6ea115a6e3ab1786f632ea34e193 100644 --- a/.gitattributes +++ b/.gitattributes @@ -172,7 +172,6 @@ testfont binary /lib/modules/SSL.pmod/Constants.pmod foreign_ident /lib/modules/SSL.pmod/TODO foreign_ident /lib/modules/SSL.pmod/alert.pike foreign_ident -/lib/modules/SSL.pmod/cipher.pike foreign_ident /lib/modules/SSL.pmod/connection.pike foreign_ident /lib/modules/SSL.pmod/context.pike foreign_ident /lib/modules/SSL.pmod/handshake.pike foreign_ident diff --git a/lib/modules/SSL.pmod/cipher.pike b/lib/modules/SSL.pmod/cipher.pike deleted file mode 100644 index 2be582f6573e4c0ba0ffef9ded7f0028c2e30296..0000000000000000000000000000000000000000 --- a/lib/modules/SSL.pmod/cipher.pike +++ /dev/null @@ -1,450 +0,0 @@ -#pike __REAL_VERSION__ - -/* $Id: cipher.pike,v 1.23 2003/01/27 19:10:25 nilsson Exp $ - * - */ - -#pragma dont_save_parent -// Override if someone set __pragma_save_parent__ globally. Other code -// assumes the constants can be indexed out of this class directly. It -// should probably be a pmod instead. /mast - -//! Encryption and MAC algorithms used in SSL. - -inherit .Constants; - -class CipherSpec { - program bulk_cipher_algorithm; - int cipher_type; - program mac_algorithm; - int is_exportable; - int hash_size; - int key_material; - int iv_size; - int key_bits; - function sign; - function verify; -} - -#if 0 -class mac_none -{ - /* Dummy MAC algorithm */ -// string hash_raw(string data) { return ""; } - string hash(string data, object seq_num) { return ""; } -} -#endif - -class mac_sha -{ - constant pad_1 = "6666666666666666666666666666666666666666"; - constant pad_2 = ("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" - "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"); - - constant algorithm = Crypto.sha; - - string secret; - - string hash_raw(string data) - { -#ifdef SSL3_DEBUG_CRYPT - werror("SSL.cipher: hash_raw(%O)\n", data); -#endif - - object h = algorithm(); - string res = h->update(data)->digest(); -#ifdef SSL3_DEBUG_CRYPT - werror("SSL.cipher: hash_raw->%O\n",res); -#endif - - return res; - } - - string hash(object packet, object seq_num) - { - string s = sprintf("%~8s%c%2c%s", - "\0\0\0\0\0\0\0\0", seq_num->digits(256), - packet->content_type, sizeof(packet->fragment), - packet->fragment); -#ifdef SSL3_DEBUG_CRYPT -// werror("SSL.cipher: hashing %O\n", s); -#endif - return hash_raw(secret + pad_2 + - hash_raw(secret + pad_1 + s)); - } - - string hash_master(string data, string|void s) - { - s = s || secret; - return hash_raw(s + pad_2 + - hash_raw(data + s + pad_1)); - } - - void create (string|void s) - { - secret = s || ""; - } -} - -class mac_md5 { - inherit mac_sha; - - constant pad_1 = "666666666666666666666666666666666666666666666666"; - constant pad_2 = ("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" - "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"); - - constant algorithm = Crypto.md5; -} - -class mac_hmac_sha { - - string secret; - object hmac; - - string hash(object packet,object seq_num) { - - string s = sprintf("%~8s%c%c%c%2c%s", - "\0\0\0\0\0\0\0\0", seq_num->digits(256), - packet->content_type, - packet->protocol_version[0],packet->protocol_version[1], - sizeof(packet->fragment), - packet->fragment); - - return hmac(secret)(s); - } - - void create(string|void s) { - secret = s || ""; - hmac=Crypto.hmac(Crypto.sha); - } -} - -class mac_hmac_md5 { - inherit mac_hmac_sha; - - void create(string|void s) { - secret = s || ""; - hmac=Crypto.hmac(Crypto.md5); - } -} - -// Hashfn is either a Crypto.md5 or Crypto.sha -static string P_hash(object hashfn,int hlen,string secret,string seed,int len) { - - Crypto.hmac hmac=Crypto.hmac(hashfn); - string temp=seed; - string res=""; - - int noblocks=(int)ceil((1.0*len)/hlen); - - for(int i=0 ; i<noblocks ; i++) { - temp=hmac(secret)(temp); - res+=hmac(secret)(temp+seed); - } - return res[..(len-1)]; -} - -string prf(string secret,string label,string seed,int len) { - - string s1=secret[..(int)(ceil(sizeof(secret)/2.0)-1)]; - string s2=secret[(int)(floor(sizeof(secret)/2.0))..]; - - string a=P_hash(Crypto.md5,16,s1,label+seed,len); - string b=P_hash(Crypto.sha,20,s2,label+seed,len); - - return a ^ b; -} - - -class des -{ - inherit Crypto.des_cbc : c; - - object set_encrypt_key(string k) - { - c::set_encrypt_key(Crypto.des_parity(k)); - return this_object(); - } - - object set_decrypt_key(string k) - { - c::set_decrypt_key(Crypto.des_parity(k)); - return this_object(); - } -} - -class des3 -{ - inherit Crypto.des3_cbc : c; - - object set_encrypt_key(string k) - { - c::set_encrypt_key(Crypto.des_parity(k)); - return this_object(); - } - - object set_decrypt_key(string k) - { - c::set_decrypt_key(Crypto.des_parity(k)); - return this_object(); - } -} - -object rsa_sign(object context, string cookie, object struct) -{ - /* Exactly how is the signature process defined? */ - - string params = cookie + struct->contents(); - string digest = Crypto.md5()->update(params)->digest() - + Crypto.sha()->update(params)->digest(); - - object s = context->rsa->raw_sign(digest); -#ifdef SSL3_DEBUG_CRYPT - werror(" Digest: '%O'\n" - " Signature: '%O'\n", - digest, s->digits(256)); -#endif - - struct->put_bignum(s); - return struct; -} - -int rsa_verify(object context, string cookie, object struct, - object(Gmp.mpz) signature) -{ - /* Exactly how is the signature process defined? */ - - string params = cookie + struct->contents(); - string digest = Crypto.md5()->update(params)->digest() - + Crypto.sha()->update(params)->digest(); - - return context->rsa->raw_verify(digest, signature); -} - -object dsa_sign(object context, string cookie, object struct) -{ - /* NOTE: The details are not described in the SSL 3 spec. */ - string s = context->dsa->sign_ssl(cookie + struct->contents()); - struct->put_var_string(s, 2); - return struct; -} - -object anon_sign(object context, string cookie, object struct) -{ - return struct; -} - -class dh_parameters -{ - object p, g, order; - - /* Default prime and generator, taken from the ssh2 spec: - * - * "This group was taken from the ISAKMP/Oakley specification, and was - * originally generated by Richard Schroeppel at the University of Arizona. - * Properties of this prime are described in [Orm96]. - *... - * [Orm96] Orman, H., "The Oakley Key Determination Protocol", version 1, - * TR97-92, Department of Computer Science Technical Report, University of - * Arizona." - */ - - /* p = 2^1024 - 2^960 - 1 + 2^64 * floor( 2^894 Pi + 129093 ) */ - - object orm96() - { - p = Gmp.mpz("FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" - "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" - "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" - "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" - "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381" - "FFFFFFFF FFFFFFFF", 16); - order = (p-1) / 2; - - g = Gmp.mpz(2); - - return this_object(); - } - - void create(object ... args) - { - switch (sizeof(args)) - { - case 0: - orm96(); - break; - case 3: -#if 0 - [p, g, order] = args; -#else - p = args[0]; g = args[1]; order = args[2]; -#endif - break; - default: - error( "Wrong number of arguments.\n" ); - } - } -} - -class dh_key_exchange -{ - /* Public parameters */ - object parameters; - - object our; /* Our value */ - object other; /* Other party's value */ - object secret; /* our = g ^ secret mod p */ - - void create(object p) - { - parameters = p; - } - - object new_secret(function random) - { - secret = Gmp.mpz(random( (parameters->order->size() + 10 / 8)), 256) - % (parameters->order - 1) + 1; - - our = parameters->g->powm(secret, parameters->p); - return this_object(); - } - - object set_other(object o) - { - other = o; - return this_object(); - } - - object get_shared() - { - return other->powm(secret, parameters->p); - } -} - -/* Return array of auth_method, cipher_spec */ -array lookup(int suite,int version) -{ - object res = CipherSpec(); - int ke_method; - - array algorithms = CIPHER_SUITES[suite]; - if (!algorithms) - return 0; - - ke_method = algorithms[0]; - - switch(ke_method) - { - case KE_rsa: - case KE_dhe_rsa: - res->sign = rsa_sign; - res->verify = rsa_verify; - break; - case KE_dhe_dss: - res->sign = dsa_sign; - break; - case KE_dh_anon: - res->sign = anon_sign; - break; - default: - error( "Internal error.\n" ); - } - - switch(algorithms[1]) - { - case CIPHER_rc4_40: -#if constant(Crypto.arcfour) - res->bulk_cipher_algorithm = Crypto.arcfour; -#else /* !constant(Crypto.arcfour) */ - res->bulk_cipher_algorithm = Crypto.rc4; -#endif /* constant(Crypto.arcfour) */ - res->cipher_type = CIPHER_stream; - res->is_exportable = 1; - res->key_material = 16; - res->iv_size = 0; - res->key_bits = 40; - break; - case CIPHER_des40: - res->bulk_cipher_algorithm = des; - res->cipher_type = CIPHER_block; - res->is_exportable = 1; - res->key_material = 8; - res->iv_size = 8; - res->key_bits = 40; - break; - case CIPHER_null: - res->bulk_cipher_algorithm = 0; - res->cipher_type = CIPHER_stream; - res->is_exportable = 1; - res->key_material = 0; - res->iv_size = 0; - res->key_bits = 0; - break; -#ifndef WEAK_CRYPTO_40BIT - case CIPHER_rc4: -#if constant(Crypto.arcfour) - res->bulk_cipher_algorithm = Crypto.arcfour; -#else /* !constant(Crypto.arcfour) */ - res->bulk_cipher_algorithm = Crypto.rc4; -#endif /* constant(Crypto.arcfour) */ - res->cipher_type = CIPHER_stream; - res->is_exportable = 0; - res->key_material = 16; - res->iv_size = 0; - res->key_bits = 128; - break; - case CIPHER_des: - res->bulk_cipher_algorithm = des; - res->cipher_type = CIPHER_block; - res->is_exportable = 0; - res->key_material = 8; - res->iv_size = 8; - res->key_bits = 56; - break; - case CIPHER_3des: - res->bulk_cipher_algorithm = des3; - res->cipher_type = CIPHER_block; - res->is_exportable = 0; - res->key_material = 24; - res->iv_size = 8; - res->key_bits = 168; - break; - case CIPHER_idea: - res->bulk_cipher_algorithm = Crypto.idea_cbc; - res->cipher_type = CIPHER_block; - res->is_exportable = 0; - res->key_material = 16; - res->iv_size = 8; - res->key_bits = 128; - break; -#endif /* !WEAK_CRYPTO_40BIT (magic comment) */ - default: - return 0; - } - - switch(algorithms[2]) - { - case HASH_sha: - if(version==1) - res->mac_algorithm = mac_hmac_sha; - else - res->mac_algorithm = mac_sha; - res->hash_size = 20; - break; - case HASH_md5: - if(version==1) - res->mac_algorithm = mac_hmac_md5; - else - res->mac_algorithm = mac_md5; - res->hash_size = 16; - break; - case 0: - res->mac_algorithm = 0; - res->hash_size = 0; - break; - default: - return 0; - } - - return ({ ke_method, res }); -} diff --git a/lib/modules/SSL.pmod/constants.pmod b/lib/modules/SSL.pmod/constants.pmod deleted file mode 100644 index 6b58603e8695e4c86a1293d5755822b2adf5841f..0000000000000000000000000000000000000000 --- a/lib/modules/SSL.pmod/constants.pmod +++ /dev/null @@ -1,5 +0,0 @@ -#pike __REAL_VERSION__ - -// Compatibility -inherit .Constants; -