source: TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttCert/AttCertTest.py @ 2909

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttCert/AttCertTest.py@3030
Revision 2909, 10.4 KB checked in by pjkersha, 14 years ago (diff)

Updated for epydoc: added double underscore vars module info

  • 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        try:
179            self.attCert.signingKeyPwd=self.cfg['test9Sign'].get('keypwd') or\
180            getpass.getpass(prompt="\ntest9Sign private key password: ")
181        except KeyboardInterrupt:
182            self.fail("test9Sign: Aborting test")
183            return
184       
185        self.attCert.applyEnvelopedSignature()
186        print 'test9Sign: \n\n%s' % self.attCert
187   
188   
189    def test10Write(self):
190        '''test10Write: write document'''
191           
192        self.test9Sign()
193        self.attCert.filePath = self.cfg['test10Write']['filepath']
194        self.attCert.write()
195     
196       
197    def test11Read(self):
198        '''test11Read: read document'''
199           
200        self.attCert.filePath = self.cfg['test11Read']['filepath']
201        self.attCert.read()
202        print 'test11Read: \n\n%s' % self.attCert
203       
204
205    def test12IsValid(self):
206        '''test12IsValid: check signature of XML document'''           
207        self.test11Read()
208        self.attCert.certFilePathList = \
209                    self.cfg['test12IsValid']['certfilepathlist'].split()
210        self.attCert.isValid(raiseExcep=True)
211        print 'test12IsValid: passed'
212       
213
214    def test13IsValidStressTest(self):
215        '''test13IsValidStressTest: check signature of XML document'''           
216        self.test2SetProvenance()
217        self.test5SetDefaultValidityTime()
218        self.test6aSet()   
219       
220        self.attCert.certFilePathList = \
221            self.cfg['test13IsValidStressTest']['certfilepathlist'].split()
222        self.attCert.signingKeyFilePath = \
223                            self.cfg['test13IsValidStressTest']['keyfile']
224       
225        try:
226            self.attCert.signingKeyPwd = \
227                        self.cfg['test13IsValidStressTest'].get('keypwd') or \
228                        getpass.getpass(\
229                    prompt="\ntest13IsValidStressTest private key password: ")
230        except KeyboardInterrupt:
231            self.fail("test13IsValidStressTest: Aborting test")
232            return
233
234        import base64
235        for i in range(0, int(self.cfg['test13IsValidStressTest']['nruns'])):
236            # Generate a range of random role names to try to trip up the
237            # signature validation
238            roles = [base64.encodestring(os.urandom(i)).strip() \
239                     for role in range(0, i)]
240            self.attCert.addRoles(roles)
241           
242            # Write AC file names by index
243            self.attCert.filePath = "stress-test-ac-%03d.xml" % i
244           
245            self.attCert.applyEnvelopedSignature()
246            self.attCert.write()
247
248            try:
249                self.attCert.isValid(raiseExcep=True)
250            except Exception, e:
251                msg = "Verification failed for %s: %s" % \
252                    (self.attCert.filePath, str(e))
253                print msg
254                open('%03d.msg' % i, 'w').write(msg)   
255
256    def test14IsValidSignature(self):
257        '''test14IsValidSignature: check signature of XML document'''           
258        self.attCert.filePath = self.cfg['test14IsValidSignature']['filepath']
259        self.attCert.read()
260       
261        self.attCert.certFilePathList = \
262                self.cfg['test14IsValidSignature']['certfilepathlist'].split()
263        self.attCert.verifyEnvelopedSignature()
264       
265        print 'test14IsValidSignature: \n\n%s' % self.attCert
266       
267class AttCertTestSuite(unittest.TestSuite):
268    def __init__(self):
269        map = map(AttCertTestCase,
270                  (
271                    "test1AttCert4NonZero",
272                    "test2SetProvenance",
273                    "test3TryToAlterProvenance",
274                    "test4SetValidityTime",
275                    "test5SetDefaultValidityTime",
276                    "test6AddRoles",
277                    "test7CreateXML",
278                    "test8Parse",
279                    "test9Sign",
280                    "test10Write",
281                    "test11Read",
282                    "test12IsValid",
283                  ))
284        unittest.TestSuite.__init__(self, map)
285 
286                                       
287if __name__ == "__main__":
288    unittest.main()
Note: See TracBrowser for help on using the repository browser.