Changeset 414


Ignore:
Timestamp:
19/05/05 18:56:14 (14 years ago)
Author:
pjkersha
Message:

AttrAuthority?:

  • issuerSerialNumber is now extracted from the Attribute Authority's

certificate.

  • Tightened exception handling to catch more previously unhandled

exceptions.

X509:

  • Added get methods to X509Cert as wrappers to underlying M2Crypto.X509

equivalents.

  • X500DN fixed bugs in deserialise method for where DN is non standard

format.

Location:
security/trunk/python
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • security/trunk/python/NDG.BAK/AttAuthority.py

    r412 r414  
    102102            self.__cert.getDN().serialise(separator=self.__dnSeparator) 
    103103 
    104  
     104        self.__issuerSerialNumber = self.__cert.getSerialNumber() 
     105 
     106         
    105107        # Server name and port for user/role details 
    106108        # 
     
    135137 
    136138        # Read proxy certificate 
    137         usrProxyCert = X509Cert(usrProxyCertFilePath) 
    138         usrProxyCert.read() 
    139  
     139        try: 
     140            usrProxyCert = X509Cert(usrProxyCertFilePath) 
     141            usrProxyCert.read() 
     142 
     143        except X509CertError, x509CertErr: 
     144            raise AttrAuthorityError(\ 
     145                "User Proxy Certificate: %s" % str(x509CertErr)) 
     146 
     147         
    140148        # Get Distinguished name from certificate as an X500DN type 
    141149        usrDN = usrProxyCert.getDN() 
     
    154162 
    155163        # Set holder's (user's) Distinguished Name 
    156         usrDN = usrProxyCert.getDN() 
    157         attrCert['holder'] = usrDN.serialise(separator=self.__dnSeparator) 
     164        try: 
     165            attrCert['holder'] = usrDN.serialise(separator=self.__dnSeparator) 
     166             
     167        except X500DNError, x500dnErr: 
     168            raise AttrAuthorityError("User DN: %s" % str(x500dnErr)) 
     169 
    158170         
    159171        # Set Issuer details from Attribute Authority 
    160172        issuerDN = self.__cert.getDN() 
    161         attrCert['issuer'] = issuerDN.serialise(separator=self.__dnSeparator) 
     173        try: 
     174            attrCert['issuer'] = issuerDN.serialise(\ 
     175                                                separator=self.__dnSeparator) 
     176        except X500DNError, x500dnErr: 
     177            raise AttrAuthorityError("Issuer DN: %s" % str(x500dnErr)) 
    162178         
    163179        attrCert['issuerName'] = self.__issuerName 
     
    166182 
    167183        # Set validity time 
    168         attrCert.setValidityTime(lifeTime=self.__attrCertLifeTime) 
    169  
     184        try: 
     185            attrCert.setValidityTime(lifeTime=self.__attrCertLifeTime) 
     186 
     187        except AttrCertError, attrCertErr: 
     188            raise AttrAuthorityError(\ 
     189                "Error setting validity time: %s" % str(attrCertErr)) 
     190         
    170191 
    171192        # Check name is registered with this Attribute Authority - if no 
     
    264285            attrCert['provenance'] = 'mapped' 
    265286 
    266                
    267         # Digitally sign certificate using Attribute Authority's certificate 
    268         # and private key 
    269         attrCert.sign(signingKeyPwd=self.__keyPwd) 
    270  
    271  
    272         # Check the certificate is valid 
    273         try: 
     287            # End if mapped certificate block 
     288             
     289 
     290        try: 
     291            # Digitally sign certificate using Attribute Authority's 
     292            # certificate and private key 
     293            attrCert.sign(signingKeyPwd=self.__keyPwd) 
     294             
     295            # Check the certificate is valid 
    274296            attrCert.isValid(raiseExcep=True) 
     297             
     298            # Write out certificate 
     299            attrCert.write() 
    275300                 
    276301        except AttrCertError, excep: 
    277302            raise AttrAuthorityError("New Attribute Certificate \"%s\": %s" %\ 
    278                     (extAttrCertFilePath, excep)) 
    279  
    280          
    281         # Write out certificate 
    282         attrCert.write() 
     303                    (extAttrCertFilePath, str(excep))) 
    283304 
    284305     
     
    315336         
    316337        self.__issuerName = properties['name'] 
    317         self.__issuerSerialNumber = properties['serialNumber'] 
    318338        self.__keyFilePath = properties['keyFile'] 
    319339        self.__keyPwd = properties['keyPwd'] 
  • security/trunk/python/NDG.BAK/X509.py

    r412 r414  
    4444             
    4545        self.__filePath = filePath 
     46        self.__m2CryptoX509 = None 
    4647        self.__dn = None 
    4748         
     
    7374        return self 
    7475 
     76 
     77    def __str__(self): 
     78        """Override to display current certificate file setting.""" 
     79 
     80        if self.__filePath is None: 
     81            return '<X509 Cert>' 
     82        else: 
     83            return '<X509 Cert \'%s\'>' % self.__filePath 
     84 
     85 
     86    def __repr__(self): 
     87        """Override to display current certificate file setting.""" 
     88         
     89        return str(self) 
     90             
     91         
     92    def string(self, filePath=None): 
     93        """Return certificate file content as a string""" 
     94         
     95        # Check M2Crypto.X509 object has been instantiated - if not call 
     96        # read method 
     97        if self.__m2CryptoX509 is None: 
     98            self.read(filePath) 
     99             
     100        return self.__m2CryptoX509.Print() 
     101 
    75102     
    76103    def getDN(self): 
     
    78105        return self.__dn 
    79106 
     107 
     108    def getVersion(self): 
     109        """Get X.509 Certificate version""" 
     110        if self.__m2CryptoX509 is None: 
     111            return None 
     112         
     113        return self.__m2CryptoX509.get_version() 
     114         
     115         
     116    def getSerialNumber(self): 
     117        """Get Serial Number""" 
     118        if self.__m2CryptoX509 is None: 
     119            return None 
     120         
     121        return self.__m2CryptoX509.get_serial_number() 
     122         
     123 
     124    def getNotBefore(self): 
     125        """Get not before validity time""" 
     126        if self.__m2CryptoX509 is None: 
     127            return None 
     128         
     129        return self.__m2CryptoX509.get_not_before() 
     130         
     131         
     132    def getNotAfter(self): 
     133        """Get not after validity time""" 
     134        if self.__m2CryptoX509 is None: 
     135            return None 
     136         
     137        return self.__m2CryptoX509.get_not_after() 
     138         
     139         
     140    def getPubKey(self): 
     141        """Get public key""" 
     142        if self.__m2CryptoX509 is None: 
     143            return None 
     144         
     145        return self.__m2CryptoX509.get_pubkey() 
     146         
     147         
     148    def getIssuer(self): 
     149        """Get Certificate issuer""" 
     150        if self.__m2CryptoX509 is None: 
     151            return None 
     152         
     153        return self.__m2CryptoX509.get_issuer() 
     154         
     155     
     156    def getSubject(self): 
     157        """Get Certificate subject""" 
     158        if self.__m2CryptoX509 is None: 
     159            return None 
     160         
     161        return self.__m2CryptoX509.get_subject() 
     162         
    80163 
    81164 
     
    309392 
    310393 
     394 
    311395     
    312396    def serialise(self, separator=None): 
     
    320404            self.__separator = separator 
    321405 
    322  
    323         return self.__separator.join(["%s=%s" % field \ 
     406        else: 
     407            # Default to / if no separator is set 
     408            separator = '/' 
     409 
     410             
     411        return separator.join(["%s=%s" % field \ 
    324412                                for field in self.__dat.items() if field[1]]) 
    325413        
     
    343431            self.__separator = self.parseSeparator(dn) 
    344432 
    345          
    346         dnFields = dn.split(self.__separator) 
    347         if len(dnFields) < 2: 
    348             raise X500DNError("Error parsing DN string: \"%s\"" % dn) 
    349  
    350          
    351         # Split fields into key/value 
    352         keyVals = [field.split('=') for field in dnFields] 
    353  
    354         # Reset existing dictionary values 
    355         self.__dat.fromkeys(self.__dat, '') 
    356          
    357         # Strip leading and trailing space chars and convert into a dictionary 
    358         self.__dat.update(dict([(keyVal[0].strip(), keyVal[1].strip()) \ 
    359                           for keyVal in keyVals])) 
    360   
     433        try: 
     434            dnFields = dn.split(self.__separator) 
     435            if len(dnFields) < 2: 
     436                raise X500DNError("Error parsing DN string: \"%s\"" % dn) 
     437 
     438             
     439            # Split fields into key/value and also filter null fields if 
     440            # found e.g. a leading '/' in the DN would yield a null field 
     441            # when split 
     442            keyVals = [field.split('=') for field in dnFields if field] 
     443 
     444            # Reset existing dictionary values 
     445            self.__dat.fromkeys(self.__dat, '') 
     446             
     447            # Strip leading and trailing space chars and convert into a 
     448            # dictionary 
     449            parsedDN = dict([(keyVal[0].strip(), keyVal[1].strip()) \ 
     450                                                      for keyVal in keyVals]) 
     451 
     452            # Copy matching DN fields 
     453            for i in parsedDN.items(): 
     454                if not self.__dat.has_key(i[0]): 
     455                    raise X500DNError(\ 
     456                        "Invalid field \"%s\" in input DN string" % i[0]) 
     457 
     458                self.__dat[i[0]] = i[1] 
     459 
     460                 
     461        except Exception, excep: 
     462            raise X500DNError("Error de-serialising DN \"%s\": %s" % \ 
     463                              (dn, str(excep))) 
     464 
    361465 
    362466 
  • security/trunk/python/NDG/AttAuthority.py

    r412 r414  
    102102            self.__cert.getDN().serialise(separator=self.__dnSeparator) 
    103103 
    104  
     104        self.__issuerSerialNumber = self.__cert.getSerialNumber() 
     105 
     106         
    105107        # Server name and port for user/role details 
    106108        # 
     
    135137 
    136138        # Read proxy certificate 
    137         usrProxyCert = X509Cert(usrProxyCertFilePath) 
    138         usrProxyCert.read() 
    139  
     139        try: 
     140            usrProxyCert = X509Cert(usrProxyCertFilePath) 
     141            usrProxyCert.read() 
     142 
     143        except X509CertError, x509CertErr: 
     144            raise AttrAuthorityError(\ 
     145                "User Proxy Certificate: %s" % str(x509CertErr)) 
     146 
     147         
    140148        # Get Distinguished name from certificate as an X500DN type 
    141149        usrDN = usrProxyCert.getDN() 
     
    154162 
    155163        # Set holder's (user's) Distinguished Name 
    156         usrDN = usrProxyCert.getDN() 
    157         attrCert['holder'] = usrDN.serialise(separator=self.__dnSeparator) 
     164        try: 
     165            attrCert['holder'] = usrDN.serialise(separator=self.__dnSeparator) 
     166             
     167        except X500DNError, x500dnErr: 
     168            raise AttrAuthorityError("User DN: %s" % str(x500dnErr)) 
     169 
    158170         
    159171        # Set Issuer details from Attribute Authority 
    160172        issuerDN = self.__cert.getDN() 
    161         attrCert['issuer'] = issuerDN.serialise(separator=self.__dnSeparator) 
     173        try: 
     174            attrCert['issuer'] = issuerDN.serialise(\ 
     175                                                separator=self.__dnSeparator) 
     176        except X500DNError, x500dnErr: 
     177            raise AttrAuthorityError("Issuer DN: %s" % str(x500dnErr)) 
    162178         
    163179        attrCert['issuerName'] = self.__issuerName 
     
    166182 
    167183        # Set validity time 
    168         attrCert.setValidityTime(lifeTime=self.__attrCertLifeTime) 
    169  
     184        try: 
     185            attrCert.setValidityTime(lifeTime=self.__attrCertLifeTime) 
     186 
     187        except AttrCertError, attrCertErr: 
     188            raise AttrAuthorityError(\ 
     189                "Error setting validity time: %s" % str(attrCertErr)) 
     190         
    170191 
    171192        # Check name is registered with this Attribute Authority - if no 
     
    264285            attrCert['provenance'] = 'mapped' 
    265286 
    266                
    267         # Digitally sign certificate using Attribute Authority's certificate 
    268         # and private key 
    269         attrCert.sign(signingKeyPwd=self.__keyPwd) 
    270  
    271  
    272         # Check the certificate is valid 
    273         try: 
     287            # End if mapped certificate block 
     288             
     289 
     290        try: 
     291            # Digitally sign certificate using Attribute Authority's 
     292            # certificate and private key 
     293            attrCert.sign(signingKeyPwd=self.__keyPwd) 
     294             
     295            # Check the certificate is valid 
    274296            attrCert.isValid(raiseExcep=True) 
     297             
     298            # Write out certificate 
     299            attrCert.write() 
    275300                 
    276301        except AttrCertError, excep: 
    277302            raise AttrAuthorityError("New Attribute Certificate \"%s\": %s" %\ 
    278                     (extAttrCertFilePath, excep)) 
    279  
    280          
    281         # Write out certificate 
    282         attrCert.write() 
     303                    (extAttrCertFilePath, str(excep))) 
    283304 
    284305     
     
    315336         
    316337        self.__issuerName = properties['name'] 
    317         self.__issuerSerialNumber = properties['serialNumber'] 
    318338        self.__keyFilePath = properties['keyFile'] 
    319339        self.__keyPwd = properties['keyPwd'] 
  • security/trunk/python/NDG/X509.py

    r412 r414  
    4444             
    4545        self.__filePath = filePath 
     46        self.__m2CryptoX509 = None 
    4647        self.__dn = None 
    4748         
     
    7374        return self 
    7475 
     76 
     77    def __str__(self): 
     78        """Override to display current certificate file setting.""" 
     79 
     80        if self.__filePath is None: 
     81            return '<X509 Cert>' 
     82        else: 
     83            return '<X509 Cert \'%s\'>' % self.__filePath 
     84 
     85 
     86    def __repr__(self): 
     87        """Override to display current certificate file setting.""" 
     88         
     89        return str(self) 
     90             
     91         
     92    def string(self, filePath=None): 
     93        """Return certificate file content as a string""" 
     94         
     95        # Check M2Crypto.X509 object has been instantiated - if not call 
     96        # read method 
     97        if self.__m2CryptoX509 is None: 
     98            self.read(filePath) 
     99             
     100        return self.__m2CryptoX509.Print() 
     101 
    75102     
    76103    def getDN(self): 
     
    78105        return self.__dn 
    79106 
     107 
     108    def getVersion(self): 
     109        """Get X.509 Certificate version""" 
     110        if self.__m2CryptoX509 is None: 
     111            return None 
     112         
     113        return self.__m2CryptoX509.get_version() 
     114         
     115         
     116    def getSerialNumber(self): 
     117        """Get Serial Number""" 
     118        if self.__m2CryptoX509 is None: 
     119            return None 
     120         
     121        return self.__m2CryptoX509.get_serial_number() 
     122         
     123 
     124    def getNotBefore(self): 
     125        """Get not before validity time""" 
     126        if self.__m2CryptoX509 is None: 
     127            return None 
     128         
     129        return self.__m2CryptoX509.get_not_before() 
     130         
     131         
     132    def getNotAfter(self): 
     133        """Get not after validity time""" 
     134        if self.__m2CryptoX509 is None: 
     135            return None 
     136         
     137        return self.__m2CryptoX509.get_not_after() 
     138         
     139         
     140    def getPubKey(self): 
     141        """Get public key""" 
     142        if self.__m2CryptoX509 is None: 
     143            return None 
     144         
     145        return self.__m2CryptoX509.get_pubkey() 
     146         
     147         
     148    def getIssuer(self): 
     149        """Get Certificate issuer""" 
     150        if self.__m2CryptoX509 is None: 
     151            return None 
     152         
     153        return self.__m2CryptoX509.get_issuer() 
     154         
     155     
     156    def getSubject(self): 
     157        """Get Certificate subject""" 
     158        if self.__m2CryptoX509 is None: 
     159            return None 
     160         
     161        return self.__m2CryptoX509.get_subject() 
     162         
    80163 
    81164 
     
    309392 
    310393 
     394 
    311395     
    312396    def serialise(self, separator=None): 
     
    320404            self.__separator = separator 
    321405 
    322  
    323         return self.__separator.join(["%s=%s" % field \ 
     406        else: 
     407            # Default to / if no separator is set 
     408            separator = '/' 
     409 
     410             
     411        return separator.join(["%s=%s" % field \ 
    324412                                for field in self.__dat.items() if field[1]]) 
    325413        
     
    343431            self.__separator = self.parseSeparator(dn) 
    344432 
    345          
    346         dnFields = dn.split(self.__separator) 
    347         if len(dnFields) < 2: 
    348             raise X500DNError("Error parsing DN string: \"%s\"" % dn) 
    349  
    350          
    351         # Split fields into key/value 
    352         keyVals = [field.split('=') for field in dnFields] 
    353  
    354         # Reset existing dictionary values 
    355         self.__dat.fromkeys(self.__dat, '') 
    356          
    357         # Strip leading and trailing space chars and convert into a dictionary 
    358         self.__dat.update(dict([(keyVal[0].strip(), keyVal[1].strip()) \ 
    359                           for keyVal in keyVals])) 
    360   
     433        try: 
     434            dnFields = dn.split(self.__separator) 
     435            if len(dnFields) < 2: 
     436                raise X500DNError("Error parsing DN string: \"%s\"" % dn) 
     437 
     438             
     439            # Split fields into key/value and also filter null fields if 
     440            # found e.g. a leading '/' in the DN would yield a null field 
     441            # when split 
     442            keyVals = [field.split('=') for field in dnFields if field] 
     443 
     444            # Reset existing dictionary values 
     445            self.__dat.fromkeys(self.__dat, '') 
     446             
     447            # Strip leading and trailing space chars and convert into a 
     448            # dictionary 
     449            parsedDN = dict([(keyVal[0].strip(), keyVal[1].strip()) \ 
     450                                                      for keyVal in keyVals]) 
     451 
     452            # Copy matching DN fields 
     453            for i in parsedDN.items(): 
     454                if not self.__dat.has_key(i[0]): 
     455                    raise X500DNError(\ 
     456                        "Invalid field \"%s\" in input DN string" % i[0]) 
     457 
     458                self.__dat[i[0]] = i[1] 
     459 
     460                 
     461        except Exception, excep: 
     462            raise X500DNError("Error de-serialising DN \"%s\": %s" % \ 
     463                              (dn, str(excep))) 
     464 
    361465 
    362466 
Note: See TracChangeset for help on using the changeset viewer.