Changeset 2953


Ignore:
Timestamp:
15/10/07 14:45:07 (12 years ago)
Author:
pjkersha
Message:
 
File:
1 copied

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttCert/X509Test.py

    • Property svn:keywords set to Id
    r2437 r2953  
    11#!/usr/bin/env python 
    2 """NDG XML Security unit tests 
     2"""NDG X509 Module unit tests 
    33 
    44NERC Data Grid Project 
     5""" 
     6__author__ = "P J Kershaw" 
     7__date__ = "03/01/07" 
     8__copyright__ = "(C) 2007 STFC & NERC" 
     9__license__ = \ 
     10"""This software may be distributed under the terms of the Q Public  
     11License, version 1.0 or later.""" 
     12__contact__ = "P.J.Kershaw@rl.ac.uk" 
     13__revision__ = '$Id$' 
    514 
    6 @author P J Kershaw 03/01/07 
    7  
    8 @copyright (C) 2007 CCLRC & NERC 
    9  
    10 @license This software may be distributed under the terms of the Q Public  
    11 License, version 1.0 or later. 
    12 """ 
    1315import unittest 
    1416import os 
     
    1820 
    1921from ConfigParser import SafeConfigParser 
    20 from ndg.security.common.AttCert import AttCert 
     22from ndg.security.common.X509 import * 
    2123 
    22 class AttCertTestCase(unittest.TestCase): 
     24class X509TestCase(unittest.TestCase): 
    2325     
    2426    def setUp(self): 
    2527         
    2628        configParser = SafeConfigParser() 
    27         configParser.read("./attCertTest.cfg") 
     29        configParser.read("./x509Test.cfg") 
    2830         
    2931        self.cfg = {} 
    3032        for section in configParser.sections(): 
    3133            self.cfg[section] = dict(configParser.items(section)) 
    32  
    33         self.attCert = AttCert() 
    3434             
    3535             
    36     def test1AttCert4NonZero(self): 
    37         'test1AttCert4NonZero: check if test yields True' 
    38         if not self.attCert: 
    39             self.fail("AttCert instance yields 0") 
     36    def test1X509CertRead(self): 
     37        'test1X509CertRead: read in a cert from file' 
     38        print self.test1X509CertRead.__doc__ 
     39        self.X509Cert=X509CertRead(self.cfg['test1X509CertRead']['certfile']) 
     40        assert(self.X509Cert) 
    4041 
     42    def test2X509CertAsPEM(self): 
     43        'test2X509CertAsPEM: display as a PEM format string' 
     44        self.test1X509CertRead() 
     45        print self.test2X509CertAsPEM.__doc__ 
     46        self.pemString = self.X509Cert.asPEM() 
     47        print self.pemString 
     48 
     49 
     50    def test3X509CertParse(self): 
     51        'test3X509CertParse: parse from a PEM format string' 
     52        self.test2X509CertAsPEM() 
     53        print self.test3X509CertParse.__doc__ 
     54        assert(X509CertParse(self.pemString)) 
     55 
     56 
     57    def test4GetDN(self): 
     58        'test4GetDN: extract distinguished name' 
     59        self.test1X509CertRead() 
     60        print self.test4GetDN.__doc__ 
     61        self.dn = self.X509Cert.dn 
     62        print self.dn 
    4163         
    42     def test2SetProvenance(self): 
    43         'test2SetProvenance' 
    44         self.attCert['provenance'] = AttCert.origProvenance 
    45         print "test2SetProvenance - set to: %s" % self.attCert['provenance'] 
     64    def test5DN(self): 
     65        'test5DN: test X.500 Distinguished Name attributes' 
     66        print self.test5DN.__doc__ 
     67        self.test4GetDN() 
     68        for item in self.dn.items(): 
     69            print "%s=%s" % item 
    4670         
     71    def test6DNCmp(self): 
     72        '''test6DNCmp: test X.500 Distinguished Name comparison 
     73        operators''' 
     74        print self.test6DNCmp.__doc__ 
     75        self.test4GetDN() 
     76        testDN = X500DN(dn="/O=a/OU=b/CN=c") 
     77 
     78        assert(not(testDN == self.dn)) 
     79        assert(testDN != self.dn) 
     80        assert(self.dn == self.dn) 
     81        assert(not(self.dn != self.dn)) 
     82             
    4783         
    48     def test3TryToAlterProvenance(self): 
    49         'test3TryToAlterProvenance' 
    50         try: 
    51             AttCert.origProvenance = 'Another provenance setting' 
    52         except AttributeError, e: 
    53             print \ 
    54         "test3TryToAlterProvenance - PASSED - expected exception: \"%s\"" % e 
    55         except: 
    56             self.fail('Original provenance should be read-only') 
    57              
    58              
    59     def test4SetValidityTime(self): 
    60         'test4SetValidityTime' 
    61         self.attCert.setValidityTime(lifetime=60*60*8.) 
    62          
    63         print 'test4SetValidityTime: %s' % self.attCert['validity'] 
    64  
    65          
    66     def test5SetDefaultValidityTime(self): 
    67         'test5SetDefaultValidityTime: use default settings' 
    68         self.attCert.setValidityTime() 
    69          
    70         print 'test5SetDefaultValidityTime: %s' % self.attCert['validity'] 
    71  
    72   
    73     def test6AddRoles(self): 
    74         'test6AddRoles: add extra roles' 
    75         self.attCert.addRoles(['government', 'acsoe']) 
    76         self.attCert.addRoles('atsr') 
    77          
    78         print "test6AddRoles: " + ', '.join(self.attCert.roles) 
    79  
    80   
    81     def test6aSet(self): 
    82         'test6aSet: test __setitem__ and property methods' 
    83         self.attCert.version = "1.0" 
    84         self.attCert['issuer'] = '/O=NDG/OU=BADC/CN=Attribute Authority' 
    85         self.attCert['issuerName'] = 'BADC' 
    86         self.attCert.issuerSerialNumber = 1234 
    87         self.attCert['holder'] = '/O=NDG/OU=BADC/CN=server.cert.ac.uk' 
    88         self.attCert.userId = '/O=NDG/OU=BADC/CN=pjkershaw' 
    89          
    90         try: 
    91             self.attCert['validity'] = 'invalid' 
    92         except KeyError, e: 
    93             print "test6aSet: PASSED - %s" % e 
    94              
    95         try: 
    96             self.attCert['attributes'] = 'roleSet' 
    97         except KeyError, e: 
    98             print "test6aSet: PASSED - %s" % e 
    99              
    100         try: 
    101             self.attCert['attributes']['roleSet'] = ['role1', 'role2'] 
    102         except KeyError, e: 
    103             print "test6aSet: PASSED - %s" % e 
    104  
    105     def test6bGet(self): 
    106         'test6bGet: test __getitem__ and property methods' 
    107         print "test6bGet ..." 
    108         self.test2SetProvenance() 
    109         self.test4SetValidityTime() 
    110         self.test6AddRoles() 
    111         self.test6aSet() 
    112  
    113         print "self.attCert['version'] = %s" % self.attCert['version'] 
    114         print "self.attCert.version = %s" % self.attCert.version 
    115          
    116         print "self.attCert['issuer'] = %s" % self.attCert['issuer'] 
    117         print "self.attCert.issuer = %s" % self.attCert.issuer 
    118         print "self.attCert.issuerDN = %s" % self.attCert.issuerDN 
    119  
    120         print "self.attCert['issuerName'] = %s" % self.attCert['issuerName'] 
    121         print "self.attCert.issuerName = %s" % self.attCert.issuerName 
    122          
    123         print "self.attCert['issuerSerialNumber'] = %s" % \ 
    124                                             self.attCert['issuerSerialNumber'] 
    125         print "self.attCert.issuerSerialNumber = %s" % \ 
    126                                             self.attCert.issuerSerialNumber 
    127          
    128         print "self.attCert['holder'] = %s" % self.attCert['holder'] 
    129         print "self.attCert.holder = %s" % self.attCert.holder 
    130         print "self.attCert.holderDN = %s" % self.attCert.holderDN 
    131  
    132         print "self.attCert['userId'] = %s" % self.attCert['userId'] 
    133         print "self.attCert.userId = %s" % self.attCert.userId 
    134          
    135         print "self.attCert['validity'] = %s" % self.attCert['validity'] 
    136         print "self.attCert.validityNotBefore = %s" % \ 
    137                                                 self.attCert.validityNotBefore 
    138         print "self.attCert.validityNotAfter = %s" % \ 
    139                                                 self.attCert.validityNotAfter 
    140                                                  
    141         print "self.attCert.getValidityNotBefore(asDatetime=True) = %s" % \ 
    142                             self.attCert.getValidityNotBefore(asDatetime=True) 
    143         print "self.attCert.getValidityNotAfter(asDatetime=True) = %s" % \ 
    144                             self.attCert.getValidityNotAfter(asDatetime=True) 
    145          
    146         print "self.attCert['attributes'] = %s" % self.attCert['attributes'] 
    147         print "self.attCert['attributes']['roleSet'] %s: " % \ 
    148                                         self.attCert['attributes']['roleSet']  
    149         print "self.attCert.roleSet = %s" % self.attCert.roleSet 
    150         print "self.attCert.roles = %s" % self.attCert.roles 
    151  
    152     def test7CreateXML(self): 
    153         'test7CreateXML: check for correct formatted string' 
    154         self.test2SetProvenance() 
    155         self.test5SetDefaultValidityTime() 
    156         self.test6AddRoles() 
    157         print 'test7CreateXML:\n\n' + self.attCert.createXML() 
    158  
    159      
    160     def test8Parse(self): 
    161         '''test8Parse: parse an XML document'''   
    162         self.attCert.parse(self.attCert.createXML()) 
    163         print 'test8Parse:\n\n' + repr(self.attCert) 
    164  
    165     def test9Sign(self):  
    166         '''test9Sign: sign document''' 
    167         self.test2SetProvenance() 
    168         self.test5SetDefaultValidityTime() 
    169         self.test6AddRoles() 
    170         self.test6aSet()     
    171          
    172         self.attCert.filePath = self.cfg['test9Sign']['filepath'] 
    173         self.attCert.certFilePathList=self.cfg['test9Sign']['certfile'] 
    174         self.attCert.signingKeyFilePath=self.cfg['test9Sign']['keyfile'] 
    175          
    176         try: 
    177             self.attCert.signingKeyPwd=self.cfg['test9Sign'].get('keypwd') or\ 
    178             getpass.getpass(prompt="\ntest9Sign private key password: ") 
    179         except KeyboardInterrupt: 
    180             self.fail("test9Sign: Aborting test") 
    181             return 
    182          
    183         self.attCert.applyEnvelopedSignature() 
    184         print 'test9Sign: \n\n%s' % self.attCert 
    185      
    186      
    187     def test10Write(self): 
    188         '''test10Write: write document''' 
    189              
    190         self.test9Sign() 
    191         self.attCert.filePath = self.cfg['test10Write']['filepath'] 
    192         self.attCert.write() 
    193        
    194          
    195     def test11Read(self): 
    196         '''test11Read: read document''' 
    197              
    198         self.attCert.filePath = self.cfg['test11Read']['filepath'] 
    199         self.attCert.read() 
    200         print 'test11Read: \n\n%s' % self.attCert 
    201          
    202  
    203     def test12IsValid(self): 
    204         '''test12IsValid: check signature of XML document'''             
    205         self.test11Read() 
    206         self.attCert.certFilePathList=self.cfg['test12IsValid']['certfile'] 
    207         self.attCert.isValid(raiseExcep=True) 
    208          
    209  
    210     def test13IsValidStressTest(self): 
    211         '''test13IsValidStressTest: check signature of XML document'''             
    212         self.test2SetProvenance() 
    213         self.test5SetDefaultValidityTime() 
    214         self.test6aSet()     
    215          
    216         self.attCert.certFilePathList = \ 
    217                             self.cfg['test13IsValidStressTest']['certfile'] 
    218         self.attCert.signingKeyFilePath = \ 
    219                             self.cfg['test13IsValidStressTest']['keyfile'] 
    220          
    221         try: 
    222             self.attCert.signingKeyPwd = \ 
    223                         self.cfg['test13IsValidStressTest'].get('keypwd') or \ 
    224                         getpass.getpass(\ 
    225                     prompt="\ntest13IsValidStressTest private key password: ") 
    226         except KeyboardInterrupt: 
    227             self.fail("test13IsValidStressTest: Aborting test") 
    228             return 
    229  
    230         import base64 
    231         for i in range(0, int(self.cfg['test13IsValidStressTest']['nruns'])): 
    232             # Generate a range of random role names to try to trip up the 
    233             # signature validation 
    234             roles = [base64.encodestring(os.urandom(i)).strip() \ 
    235                      for role in range(0, i)] 
    236             self.attCert.addRoles(roles) 
    237              
    238             # Write AC file names by index 
    239             self.attCert.filePath = "%03d.xml" % i 
    240              
    241             self.attCert.applyEnvelopedSignature() 
    242             self.attCert.write() 
    243  
    244             self.attCert.certFilePathList = \ 
    245                             self.cfg['test13IsValidStressTest']['certfile'] 
    246  
    247             try: 
    248                 self.attCert.isValid(raiseExcep=True) 
    249             except Exception, e: 
    250                 msg = "Verification failed for %s: %s" % \ 
    251                     (self.attCert.filePath, str(e)) 
    252                 print msg 
    253                 open('%03d.msg' % i, 'w').write(msg)     
    254  
    255     def test14IsValidSignature(self): 
    256         '''test14IsValidSignature: check signature of XML document'''             
    257         self.attCert.filePath = self.cfg['test14IsValidSignature']['filepath'] 
    258         self.attCert.read() 
    259          
    260         self.attCert.certFilePathList=self.cfg['test14IsValidSignature']['certfile'] 
    261         import pdb;pdb.set_trace() 
    262         self.attCert.verifyEnvelopedSignature() 
    263          
    264         print 'test14IsValidSignature: \n\n%s' % self.attCert 
    265          
    266 class AttCertTestSuite(unittest.TestSuite): 
     84class X509TestSuite(unittest.TestSuite): 
    26785    def __init__(self): 
    268         map = map(AttCertTestCase, 
     86        map = map(X509TestCase, 
    26987                  ( 
    270                     "test1AttCert4NonZero", 
    271                     "test2SetProvenance", 
    272                     "test3TryToAlterProvenance", 
    273                     "test4SetValidityTime", 
    274                     "test5SetDefaultValidityTime", 
    275                     "test6AddRoles", 
    276                     "test7CreateXML", 
    277                     "test8Parse", 
    278                     "test9Sign", 
    279                     "test10Write", 
    280                     "test11Read", 
    281                     "test12IsValid", 
     88                    "test1X509CertRead", 
     89                    "test2X509CertAsPEM", 
     90                    "test3X509CertParse", 
     91                    "test4GetDN", 
     92                    "test5DN", 
     93                    "test6DNCmp" 
    28294                  )) 
    28395        unittest.TestSuite.__init__(self, map) 
Note: See TracChangeset for help on using the changeset viewer.