home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2012 January / maximum-cd-2012-01.iso / DiscContents / digsby_setup.exe / lib / digsby / digsbysasl.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-10-05  |  8.3 KB  |  206 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import traceback
  5. import logging
  6. from pyxmpp.utils import to_utf8
  7. from pyxmpp.sasl.core import ClientAuthenticator
  8. from pyxmpp.sasl.core import Success, Failure, Challenge, Response
  9. import struct
  10. import hashlib
  11. log = logging.getLogger('digsby.sasl')
  12. import M2Crypto
  13. import util.cryptography as util
  14. import util.cacheable as util
  15. import digsbyrsa
  16. ROOT_CERT_RAW = '-----BEGIN CERTIFICATE-----\nMIIEqjCCA5KgAwIBAgIJAIm6tjo3F7DQMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD\nVQQGEwJVUzERMA8GA1UECBMITmV3IFlvcmsxEjAQBgNVBAcTCVJvY2hlc3RlcjEX\nMBUGA1UEChMOZG90U3ludGF4LCBMTEMxDzANBgNVBAsTBkRpZ3NieTETMBEGA1UE\nAxMKZGlnc2J5Lm9yZzEfMB0GCSqGSIb3DQEJARYQYWRtaW5AZGlnc2J5LmNvbTAe\nFw0xMDEyMTUyMDUwNTZaFw0xMTEyMTUyMDUwNTZaMIGUMQswCQYDVQQGEwJVUzER\nMA8GA1UECBMITmV3IFlvcmsxEjAQBgNVBAcTCVJvY2hlc3RlcjEXMBUGA1UEChMO\nZG90U3ludGF4LCBMTEMxDzANBgNVBAsTBkRpZ3NieTETMBEGA1UEAxMKZGlnc2J5\nLm9yZzEfMB0GCSqGSIb3DQEJARYQYWRtaW5AZGlnc2J5LmNvbTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBALvRZBUWh9IhxNfajLc6gXA8OVArXp2XvxCf\nhHR/CznE4bqNSs8kGlkXZzGZlhRXDpMM4ytlktYN6Bu+RwR1BzjQSt/GpnuxCL5X\n+l9yukATrfBs/i7iHwmWREkvJXzgi3ToyZ/NsmjmA1CtzYn44D8Sc/lsui4EeGyb\nslno/ZYpCIniaHPnA1+A8u6Fbq/DgZkpLY8ZA/lgKRwtQMa216eBEhROjJVLjdN3\nGDenu/tGBIdKQLAJ1bLCswSamtmmTAIT4nqd5GH/p1PlZKpObn38+PV1Cth1ZA3R\nSnIxFSRUO5s2OxWTR694hEufrLV3ccK5NSW1tuMYeDaWUfo3MIECAwEAAaOB/DCB\n+TAdBgNVHQ4EFgQUq3dfcfI0E/07C6iZiyp1lwmdA24wgckGA1UdIwSBwTCBvoAU\nq3dfcfI0E/07C6iZiyp1lwmdA26hgZqkgZcwgZQxCzAJBgNVBAYTAlVTMREwDwYD\nVQQIEwhOZXcgWW9yazESMBAGA1UEBxMJUm9jaGVzdGVyMRcwFQYDVQQKEw5kb3RT\neW50YXgsIExMQzEPMA0GA1UECxMGRGlnc2J5MRMwEQYDVQQDEwpkaWdzYnkub3Jn\nMR8wHQYJKoZIhvcNAQkBFhBhZG1pbkBkaWdzYnkuY29tggkAibq2OjcXsNAwDAYD\nVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAJCsHm8osylNqfmNMTEL6Nczr\nhD95jl1D3a3hKlKHYPkZ5/pmGHV4C/ZYteSm9yWtWNQp/ZGTS+XG4I9NFQ6s6Cr1\nLLOoK52BVzal5LemAPyzXyIKuG2fwTMdBiL9fIoYDLWvjzp5SGHHc4K0mofetgxZ\nTdqQr7qWXY62zdkKSgwo9HPqrhtUzyfvDBJPjzeRbGguV3jCvodgV5D7aK18K1gz\nC9lIMQaWRzS80+a1dUtibwG4fTKSRaIrOmdhvI+YdTj4aNKcmq985CXD068hG09P\nArAEDrQEul9GOIqcx6RmtDSx1r+f1Iv+ef5boBu/04TZCCClDF7AYUwIErJCoQ==\n-----END CERTIFICATE-----\n'
  17. ROOT_CERT = M2Crypto.X509.load_cert_string(ROOT_CERT_RAW)
  18.  
  19. def _save_client_key_pem(key, uname, password):
  20.     
  21.     passfunc = lambda _dec_enc: hashlib.sha256(password + 'digsby' + uname.encode('utf-8')).digest()
  22.     key = key.as_pem(callback = passfunc)
  23.     if key is not None:
  24.         dec_key = key.decode('utf8')
  25.     else:
  26.         dec_key = key
  27.     return util.cacheable.save_cache_object('client_priv_key.key', dec_key, json = True, user = True)
  28.  
  29.  
  30. def _get_client_key_pem(uname, password):
  31.     
  32.     passfunc = lambda _dec_enc: hashlib.sha256(password + 'digsby' + uname.encode('utf-8')).digest()
  33.     key = util.cacheable.load_cache_object('client_priv_key.key', json = True, user = True)
  34.     if key is not None:
  35.         enc_key = key.encode('utf8')
  36.         
  37.         try:
  38.             ret_key = M2Crypto.RSA.load_key_string(enc_key, callback = passfunc)
  39.             if not ret_key.check_key():
  40.                 ret_key = None
  41.         except Exception:
  42.             (None, None)
  43.             (None, None)
  44.             ret_key = None
  45.         except:
  46.             (None, None)<EXCEPTION MATCH>Exception
  47.         
  48.  
  49.     (None, None)
  50.     ret_key = key
  51.     return ret_key
  52.  
  53.  
  54. def pstrI(s):
  55.     return struct.pack('!I', len(s)) + s
  56.  
  57.  
  58. def pstrIlist(l):
  59.     return [ pstrI(s) for s in l ]
  60.  
  61.  
  62. def pstrAES(key, s, iv = None):
  63.     p = pstrI(s)
  64.     return util.cryptography.encrypt(key, p, iv = iv, padchar = chr(256 + ~ord(p[-1])), mode = util.cryptography.Mode.CBC)
  65.  
  66.  
  67. def unpackpstrlist(s):
  68.     ret = []
  69.     while s:
  70.         l = struct.unpack('!I', s[:4])[0]
  71.         s = s[4:]
  72.         ret.append(s[:l])
  73.         s = s[l:]
  74.     return ret
  75.  
  76.  
  77. def unpackpstr(s):
  78.     l = struct.unpack('!I', s[:4])[0]
  79.     return (s[4:4 + l], s[4 + l:])
  80.  
  81.  
  82. class DigsbyAESClientAuthenticator(ClientAuthenticator):
  83.     
  84.     def __init__(self, password_manager):
  85.         ClientAuthenticator.__init__(self, password_manager)
  86.         self.username = None
  87.         self.password = None
  88.         self.key = None
  89.         self.step = 0
  90.         self.authzid = None
  91.         self._DigsbyAESClientAuthenticator__logger = logging.getLogger('digsby.sasl.AES')
  92.  
  93.     
  94.     def start(self, username, authzid):
  95.         self.username = username
  96.         if authzid:
  97.             self.authzid = authzid
  98.         else:
  99.             self.authzid = ''
  100.         self.step = 0
  101.         return self.challenge('')
  102.  
  103.     
  104.     def challenge(self, challenge):
  105.         if self.password is None:
  106.             (self.password, pformat) = self.password_manager.get_password(self.username)
  107.             if not (self.password) or pformat != 'plain':
  108.                 self._DigsbyAESClientAuthenticator__logger.debug("Couldn't retrieve plain password")
  109.                 return Failure('password-unavailable')
  110.         
  111.         if self.step == 0:
  112.             self.step = 1
  113.             return Response(''.join(pstrIlist([
  114.                 to_utf8(self.authzid),
  115.                 to_utf8(self.username)])))
  116.         if self.step == 1:
  117.             self.step = 2
  118.             srv_rsa_key = None
  119.             self._DigsbyAESClientAuthenticator__logger.critical('loading server certificate')
  120.             
  121.             try:
  122.                 srv_cert = M2Crypto.X509.load_cert_string(challenge)
  123.                 if srv_cert is not None:
  124.                     self._DigsbyAESClientAuthenticator__logger.critical('retrieving server pubkey')
  125.                     srv_key = srv_cert.get_pubkey()
  126.                     if srv_key is not None:
  127.                         self._DigsbyAESClientAuthenticator__logger.critical('retrieving server RSA pubkey')
  128.                         srv_rsa_key = srv_key.get_rsa()
  129.                     
  130.             except Exception:
  131.                 self.step == 0
  132.                 self.step == 0
  133.                 traceback.print_exc()
  134.             except:
  135.                 self.step == 0
  136.  
  137.             if srv_rsa_key is None:
  138.                 return Failure('bad-server-cert')
  139.             if not srv_cert.verify(ROOT_CERT.get_pubkey()):
  140.                 return Failure('bad-server-cert')
  141.             self.srv_rsa_key = srv_rsa_key
  142.             self._DigsbyAESClientAuthenticator__logger.critical('generating Nonce')
  143.             m2 = m2
  144.             import M2Crypto
  145.             nonce = m2.rand_bytes(16)
  146.             self._DigsbyAESClientAuthenticator__logger.critical('encrypting Nonce')
  147.             enonce = digsbyrsa.DIGSBY_RSA_public_encrypt(nonce, srv_rsa_key, M2Crypto.RSA.pkcs1_oaep_padding)
  148.             self._DigsbyAESClientAuthenticator__logger.critical('loading key')
  149.             
  150.             try:
  151.                 self.key = _get_client_key_pem(self.username, self.password)
  152.             except Exception:
  153.                 srv_cert.verify(ROOT_CERT.get_pubkey())
  154.                 srv_cert.verify(ROOT_CERT.get_pubkey())
  155.                 srv_rsa_key is None
  156.                 self.key = None
  157.             except:
  158.                 self.step == 0
  159.  
  160.             if self.key is None:
  161.                 self._DigsbyAESClientAuthenticator__logger.critical('generating new key')
  162.                 self.key = M2Crypto.RSA.gen_key(2048, 65537)
  163.                 self._DigsbyAESClientAuthenticator__logger.critical('saving new key')
  164.                 if not self.key.check_key():
  165.                     raise ValueError('failed to generate key')
  166.                 self.key.check_key()
  167.                 
  168.                 try:
  169.                     _save_client_key_pem(self.key, self.username, self.password)
  170.                 except Exception:
  171.                     self.step == 0
  172.                     self.step == 0
  173.                     traceback.print_exc()
  174.                 except:
  175.                     self.step == 0<EXCEPTION MATCH>Exception
  176.                 
  177.  
  178.             self.step == 0
  179.             self._DigsbyAESClientAuthenticator__logger.critical('creating buffer')
  180.             buff = M2Crypto.BIO.MemoryBuffer()
  181.             self._DigsbyAESClientAuthenticator__logger.critical('serializing client public key to buffer')
  182.             self.key.save_pub_key_bio(buff)
  183.             self._DigsbyAESClientAuthenticator__logger.critical_s('Nonce: %r', nonce)
  184.             genkey = buff.getvalue()
  185.             self._DigsbyAESClientAuthenticator__logger.critical_s('Key: %r', genkey)
  186.             eKey = pstrAES(nonce, genkey)
  187.             self._DigsbyAESClientAuthenticator__logger.critical('returning response')
  188.             return Response(''.join(pstrIlist([
  189.                 enonce,
  190.                 eKey])))
  191.         if self.step == 2:
  192.             self.step = 3
  193.             (package_nonce_C_userpub, package_C_AES_C_serverpriv) = unpackpstrlist(challenge)
  194.             package_nonce = digsbyrsa.DIGSBY_RSA_private_decrypt(package_nonce_C_userpub, self.key, M2Crypto.RSA.pkcs1_oaep_padding)
  195.             package_C_serverpriv = util.cryptography.decrypt(package_nonce, package_C_AES_C_serverpriv, padchar = None, mode = util.cryptography.Mode.CBC)
  196.             nonce = digsbyrsa.DIGSBY_RSA_public_decrypt(package_C_serverpriv, self.srv_rsa_key, M2Crypto.RSA.pkcs1_padding)
  197.             return Response(pstrAES(nonce, self.password))
  198.         return Failure('extra-challenge')
  199.  
  200.     
  201.     def finish(self, data):
  202.         _unused = data
  203.         return Success(self.username, None, self.authzid)
  204.  
  205.  
  206.