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

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

security/python/ndg.security.test/ndg/security/test/ndg-test-ca.crt,
security/python/ndg.security.test/ndg/security/test/test.crt,
security/python/ndg.security.test/ndg/security/test/test.key,
security/python/ndg.security.test/ndg/security/test/attCertTest.cfg: added certs from test CA.
security/python/ndg.security.test/ndg/security/test/AttCertTest.py: modified tests 9 and 13 for correct handling of no password set.
security/python/ndg.security.test/setup.py: corrret inclusion of test certs in egg.

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