source: TI12-security/trunk/python/ndg.security.test/ndg/security/test/attCert/AttCertTest.py @ 3202

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/ndg.security.test/ndg/security/test/attCert/AttCertTest.py@3202
Revision 3202, 11.5 KB checked in by pjkersha, 12 years ago (diff)

security/python/ndg.security.test/ndg/security/test/attCert/AttCertTest.py: fix output path for test files in test13IsValidStressTest.

  • Property svn:executable set to *
  • Property svn:keywords set to Id
Line 
1#!/usr/bin/env python
2"""NDG AttCert class unit tests
3
4NERC 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$'
14
15import unittest
16import os
17import sys
18import getpass
19import traceback
20
21from ConfigParser import SafeConfigParser
22from ndg.security.common.AttCert import AttCert
23
24xpdVars = os.path.expandvars
25jnPath = os.path.join
26mkPath = lambda file: jnPath(os.environ['NDGSEC_ATTCERT_UNITTEST_DIR'], file)
27
28class AttCertTestCase(unittest.TestCase):
29   
30    def setUp(self):
31       
32        if 'NDGSEC_INT_DEBUG' in os.environ:
33            import pdb
34            pdb.set_trace()
35       
36        if 'NDGSEC_ATTCERT_UNITTEST_DIR' not in os.environ:
37            os.environ['NDGSEC_ATTCERT_UNITTEST_DIR'] = \
38                os.path.abspath(os.path.dirname(__file__))
39
40        configParser = SafeConfigParser()
41        configFilePath = jnPath(os.environ['NDGSEC_ATTCERT_UNITTEST_DIR'],
42                                'attCertTest.cfg')
43        configParser.read(configFilePath)
44       
45        self.cfg = {}
46        for section in configParser.sections():
47            self.cfg[section] = dict(configParser.items(section))
48
49        self.attCert = AttCert()
50           
51           
52    def test1AttCert4NonZero(self):
53        'test1AttCert4NonZero: check if test yields True'
54        if not self.attCert:
55            self.fail("AttCert instance yields 0")
56
57       
58    def test2SetProvenance(self):
59        'test2SetProvenance'
60        self.attCert['provenance'] = AttCert.origProvenance
61        print "test2SetProvenance - set to: %s" % self.attCert['provenance']
62       
63       
64    def test3TryToAlterProvenance(self):
65        'test3TryToAlterProvenance'
66        try:
67            AttCert.origProvenance = 'Another provenance setting'
68        except AttributeError, e:
69            print \
70        "test3TryToAlterProvenance - PASSED - expected exception: \"%s\"" % e
71        except:
72            self.fail('Original provenance should be read-only')
73           
74           
75    def test4SetValidityTime(self):
76        'test4SetValidityTime'
77        self.attCert.setValidityTime(lifetime=60*60*8.)
78       
79        print 'test4SetValidityTime: %s' % self.attCert['validity']
80
81       
82    def test5SetDefaultValidityTime(self):
83        'test5SetDefaultValidityTime: use default settings'
84        self.attCert.setValidityTime()
85       
86        print 'test5SetDefaultValidityTime: %s' % self.attCert['validity']
87
88 
89    def test6AddRoles(self):
90        'test6AddRoles: add extra roles'
91        self.attCert.addRoles(['government', 'acsoe'])
92        self.attCert.addRoles('atsr')
93       
94        print "test6AddRoles: " + ', '.join(self.attCert.roles)
95
96 
97    def test6aSet(self):
98        'test6aSet: test __setitem__ and property methods'
99        self.attCert.version = "1.0"
100        self.attCert['issuer'] = '/O=NDG/OU=BADC/CN=Attribute Authority'
101        self.attCert['issuerName'] = 'BADC'
102        self.attCert.issuerSerialNumber = 1234
103        self.attCert['holder'] = '/O=NDG/OU=BADC/CN=server.cert.ac.uk'
104        self.attCert.userId = '/O=NDG/OU=BADC/CN=pjkershaw'
105       
106        try:
107            self.attCert['validity'] = 'invalid'
108        except KeyError, e:
109            print "test6aSet: PASSED - %s" % e
110           
111        try:
112            self.attCert['attributes'] = 'roleSet'
113        except KeyError, e:
114            print "test6aSet: PASSED - %s" % e
115           
116        try:
117            self.attCert['attributes']['roleSet'] = ['role1', 'role2']
118        except KeyError, e:
119            print "test6aSet: PASSED - %s" % e
120
121    def test6bGet(self):
122        'test6bGet: test __getitem__ and property methods'
123        print "test6bGet ..."
124        self.test2SetProvenance()
125        self.test4SetValidityTime()
126        self.test6AddRoles()
127        self.test6aSet()
128
129        print "self.attCert['version'] = %s" % self.attCert['version']
130        print "self.attCert.version = %s" % self.attCert.version
131       
132        print "self.attCert['issuer'] = %s" % self.attCert['issuer']
133        print "self.attCert.issuer = %s" % self.attCert.issuer
134        print "self.attCert.issuerDN = %s" % self.attCert.issuerDN
135
136        print "self.attCert['issuerName'] = %s" % self.attCert['issuerName']
137        print "self.attCert.issuerName = %s" % self.attCert.issuerName
138       
139        print "self.attCert['issuerSerialNumber'] = %s" % \
140                                            self.attCert['issuerSerialNumber']
141        print "self.attCert.issuerSerialNumber = %s" % \
142                                            self.attCert.issuerSerialNumber
143       
144        print "self.attCert['holder'] = %s" % self.attCert['holder']
145        print "self.attCert.holder = %s" % self.attCert.holder
146        print "self.attCert.holderDN = %s" % self.attCert.holderDN
147
148        print "self.attCert['userId'] = %s" % self.attCert['userId']
149        print "self.attCert.userId = %s" % self.attCert.userId
150       
151        print "self.attCert['validity'] = %s" % self.attCert['validity']
152        print "self.attCert.validityNotBefore = %s" % \
153                                                self.attCert.validityNotBefore
154        print "self.attCert.validityNotAfter = %s" % \
155                                                self.attCert.validityNotAfter
156                                               
157        print "self.attCert.getValidityNotBefore(asDatetime=True) = %s" % \
158                            self.attCert.getValidityNotBefore(asDatetime=True)
159        print "self.attCert.getValidityNotAfter(asDatetime=True) = %s" % \
160                            self.attCert.getValidityNotAfter(asDatetime=True)
161       
162        print "self.attCert['attributes'] = %s" % self.attCert['attributes']
163        print "self.attCert['attributes']['roleSet'] %s: " % \
164                                        self.attCert['attributes']['roleSet'] 
165        print "self.attCert.roleSet = %s" % self.attCert.roleSet
166        print "self.attCert.roles = %s" % self.attCert.roles
167
168    def test7CreateXML(self):
169        'test7CreateXML: check for correct formatted string'
170        self.test2SetProvenance()
171        self.test5SetDefaultValidityTime()
172        self.test6AddRoles()
173        print 'test7CreateXML:\n\n' + self.attCert.createXML()
174
175   
176    def test8Parse(self):
177        '''test8Parse: parse an XML document''' 
178        self.attCert.parse(self.attCert.createXML())
179        print 'test8Parse:\n\n' + repr(self.attCert)
180
181    def test9Sign(self): 
182        '''test9Sign: sign document'''
183        self.test2SetProvenance()
184        self.test5SetDefaultValidityTime()
185        self.test6AddRoles()
186        self.test6aSet()   
187       
188        self.attCert.filePath = xpdVars(self.cfg['test9Sign']['filepath'])
189        self.attCert.certFilePathList = \
190            xpdVars(self.cfg['test9Sign']['certfile'])
191        self.attCert.signingKeyFilePath = \
192            xpdVars(self.cfg['test9Sign']['keyfile'])
193       
194        signingKeyPwd = self.cfg['test9Sign'].get('keypwd')
195        if signingKeyPwd is None:
196            try:
197                self.attCert.signingKeyPwd = \
198                getpass.getpass(prompt="\ntest9Sign private key password: ")
199            except KeyboardInterrupt:
200                self.fail("test9Sign: Aborting test")
201                return
202        else:
203            self.attCert.signingKeyPwd = signingKeyPwd
204           
205        self.attCert.applyEnvelopedSignature()
206        print 'test9Sign: \n\n%s' % self.attCert
207   
208   
209    def test10Write(self):
210        '''test10Write: write document'''
211           
212        self.test9Sign()
213        self.attCert.filePath = xpdVars(self.cfg['test10Write']['filepath'])
214        self.attCert.write()
215     
216       
217    def test11Read(self):
218        '''test11Read: read document'''
219           
220        self.attCert.filePath = xpdVars(self.cfg['test11Read']['filepath'])
221        self.attCert.read()
222        print 'test11Read: \n\n%s' % self.attCert
223       
224
225    def test12IsValid(self):
226        '''test12IsValid: check signature of XML document'''           
227        self.test11Read()
228        self.attCert.certFilePathList = [xpdVars(file) for file in \
229                    self.cfg['test12IsValid']['certfilepathlist'].split()]
230        self.attCert.isValid(raiseExcep=True)
231        print 'test12IsValid: passed'
232       
233
234    def test13IsValidStressTest(self):
235        '''test13IsValidStressTest: check signature of XML document'''           
236        self.test2SetProvenance()
237        self.test5SetDefaultValidityTime()
238        self.test6aSet()   
239       
240        self.attCert.certFilePathList = [xpdVars(file) for file in \
241            self.cfg['test13IsValidStressTest']['certfilepathlist'].split()]
242        self.attCert.signingKeyFilePath = \
243                        xpdVars(self.cfg['test13IsValidStressTest']['keyfile'])
244       
245        signingKeyPwd = self.cfg['test13IsValidStressTest'].get('keypwd')
246        if signingKeyPwd is None:
247            try:
248                self.attCert.signingKeyPwd = getpass.getpass(\
249                    prompt="\ntest13IsValidStressTest private key password: ")
250            except KeyboardInterrupt:
251                self.fail("test13IsValidStressTest: Aborting test")
252                return
253        else:
254            self.attCert.signingKeyPwd = signingKeyPwd
255           
256        import base64
257        for i in range(0, int(self.cfg['test13IsValidStressTest']['nruns'])):
258            # Generate a range of random role names to try to trip up the
259            # signature validation
260            roles = [base64.encodestring(os.urandom(i)).strip() \
261                     for role in range(0, i)]
262            self.attCert.addRoles(roles)
263           
264            # Write AC file names by index
265            self.attCert.filePath = mkPath("stress-test-ac-%03d.xml" % i)
266           
267            self.attCert.applyEnvelopedSignature()
268            self.attCert.write()
269
270            try:
271                self.attCert.isValid(raiseExcep=True)
272            except Exception, e:
273                msg = "Verification failed for %s: %s" % \
274                    (self.attCert.filePath, str(e))
275                print msg
276                open('%03d.msg' % i, 'w').write(msg)   
277
278    def test14IsValidSignature(self):
279        '''test14IsValidSignature: check signature of XML document'''           
280        self.attCert.filePath = \
281            xpdVars(self.cfg['test14IsValidSignature']['filepath'])
282        self.attCert.read()
283       
284        certFilePathList = [xpdVars(file) for file in \
285                self.cfg['test14IsValidSignature']['certfilepathlist'].split()]
286       
287        self.attCert.certFilePathList = certFilePathList
288        self.attCert.verifyEnvelopedSignature()
289       
290        print 'test14IsValidSignature: \n\n%s' % self.attCert
291       
292class AttCertTestSuite(unittest.TestSuite):
293    def __init__(self):
294        map = map(AttCertTestCase,
295                  (
296                    "test1AttCert4NonZero",
297                    "test2SetProvenance",
298                    "test3TryToAlterProvenance",
299                    "test4SetValidityTime",
300                    "test5SetDefaultValidityTime",
301                    "test6AddRoles",
302                    "test7CreateXML",
303                    "test8Parse",
304                    "test9Sign",
305                    "test10Write",
306                    "test11Read",
307                    "test12IsValid",
308                  ))
309        unittest.TestSuite.__init__(self, map)
310 
311                                       
312if __name__ == "__main__":
313    unittest.main()
Note: See TracBrowser for help on using the repository browser.