Changeset 6098 for TI12-security


Ignore:
Timestamp:
08/12/09 17:20:40 (10 years ago)
Author:
pjkersha
Message:

Altered MyProxyClient?.logon to accept externally generated request and public key pair

Location:
TI12-security/trunk/python
Files:
2 added
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/MyProxyClient/myproxy/client.py

    r6069 r6098  
    187187    or None      
    188188     
     189    PRIKEY_NBITS = 2048 
     190    MESSAGE_DIGEST_TYPE = "md5" 
     191    SERVER_RESP_BLK_SIZE = 8192 
     192     
    189193    # valid configuration property keywords 
    190194    propertyDefaults = { 
     
    500504         
    501505        return conn 
    502      
    503              
    504     def _createCertReq(self, CN, nBitsForKey=1024, messageDigest="md5"): 
    505         """ 
    506         Create a certificate request. 
     506         
     507    def _createKeys(self, nBitsForKey=PRIKEY_NBITS): 
     508        """Generate keys and return as PEM encoded string 
     509        @type nBitsForKey: int 
     510        @param nBitsForKey: number of bits for private key generation -  
     511        default is 2048 
     512        @rtype: string 
     513        @return: public/private key pair 
     514        """ 
     515        keys = RSA.gen_key(nBitsForKey, m2.RSA_F4) 
     516         
     517        return keys 
     518             
     519    def _createCertReq(self, CN, keys, messageDigest=MESSAGE_DIGEST_TYPE): 
     520        """Create a certificate request. 
    507521         
    508522        @type CN: basestring 
    509523        @param CN: Common Name for certificate - effectively the same as the 
    510524        username for the MyProxy credential 
    511         @type nBitsForKey: int 
    512         @param nBitsForKey: number of bits for private key generation -  
    513         default is 1024 
     525        @type keys: string/None 
     526        @param keys: public/private key pair 
    514527        @type messageDigest: basestring 
    515528        @param messageDigest: message digest type - default is MD5 
     
    521534        # Create certificate request 
    522535        req = X509.Request() 
    523      
    524         # Generate keys 
    525         key = RSA.gen_key(nBitsForKey, m2.RSA_F4) 
    526      
     536         
    527537        # Create public key object 
    528538        pubKey = EVP.PKey() 
    529         pubKey.assign_rsa(key) 
     539        pubKey.assign_rsa(keys) 
    530540         
    531541        # Add the public key to the request 
     
    547557        req.sign(pubKey, messageDigest) 
    548558 
    549         return (req.as_der(), key.as_pem(cipher=None)) 
     559        return req.as_der() 
    550560     
    551561     
     
    738748     
    739749        # process server response 
    740         dat = conn.recv(8192) 
     750        dat = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
    741751          
    742752        # Pass in the names of fields to return in the dictionary 'field'  
     
    803813     
    804814        # process server response 
    805         dat = conn.recv(8192) 
     815        dat = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
    806816             
    807817        respCode, errorTxt = self._deserializeResponse(dat) 
     
    858868     
    859869        # process server response 
    860         dat = conn.recv(8192) 
     870        dat = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
    861871             
    862872        respCode, errorTxt = self._deserializeResponse(dat) 
     
    957967     
    958968        # process server response 
    959         dat = conn.recv(8192) 
     969        dat = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
    960970             
    961971        respCode, errorTxt = self._deserializeResponse(dat) 
     
    971981     
    972982        # process server response 
    973         resp = conn.recv(8192) 
     983        resp = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
    974984        respCode, errorTxt = self._deserializeResponse(resp) 
    975985        if respCode: 
     
    977987         
    978988          
    979     def logon(self, username, passphrase, lifetime=None): 
     989    def logon(self, username, passphrase, lifetime=None, keys=None,  
     990              certReq=None, nBitsForKey=PRIKEY_NBITS): 
    980991        """Retrieve a proxy credential from a MyProxy server 
    981992         
     
    10051016        # - The client will generate a public/private key pair and send a  
    10061017        #   NULL-terminated PKCS#10 certificate request to the server. 
    1007         certReq, priKey = self._createCertReq(username) 
    1008  
     1018        if keys is None: 
     1019            if certReq is not None: 
     1020                raise MyProxyClientConfigError("'certReq' key must not be set " 
     1021                                               "without the 'keys' keyword") 
     1022            keys = self._createKeys(nBitsForKey=nBitsForKey) 
     1023             
     1024        if certReq is None: 
     1025            certReq = self._createCertReq(username, keys) 
     1026         
    10091027        # Set-up SSL connection 
    10101028        conn = self._initConnection() 
     
    10191037     
    10201038        # process server response 
    1021         dat = conn.recv(8192) 
     1039        dat = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
    10221040        respCode, errorTxt = self._deserializeResponse(dat) 
    10231041        if respCode: 
     
    10331051         
    10341052        # - n certs 
    1035         dat = conn.recv(8192) 
     1053        dat = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
    10361054     
    10371055        # process server response 
    1038         resp = conn.recv(8192) 
     1056        resp = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
    10391057        respCode, errorTxt = self._deserializeResponse(resp) 
    10401058        if respCode: 
     
    10511069        # - private key 
    10521070        # - rest of cert chain 
    1053         creds = [pemCerts[0], priKey] 
     1071        pemKey = key.as_pem(cipher=None) 
     1072        creds = [pemCerts[0], pemKey] 
    10541073        creds.extend(pemCerts[1:]) 
    10551074         
Note: See TracChangeset for help on using the changeset viewer.