#!/usr/bin/env python import unittest, sys, sha, base64 from ZSI import _get_element_nsuri_name from ZSI.parse import ParsedSoap from ZSI.wstools.c14n import Canonicalize from ZSI.wstools.Namespaces import WSA200403, SOAP from cStringIO import StringIO class CanonicalizeFromTestCase(unittest.TestCase): "c14n tests, this has nothing to do with ws-addressing." def setUp(self): self.ps = ParsedSoap(XML_INST1) self.el = filter(lambda el: _get_element_nsuri_name(el) == (WSA200403.ADDRESS, "From"), self.ps.header_elements)[0] def tearDown(self): del self.ps del self.el def check_c14n(self): """http://www.w3.org/TR/xml-c14n """ s = StringIO() Canonicalize(self.el, s, unsuppressedPrefixes=None) cxml = s.getvalue() d1 = base64.encodestring(sha.sha(C14N_INC1).digest()).strip() d2 = base64.encodestring(sha.sha(cxml).digest()).strip() self.assertEqual(d1, d2) self.assertEqual(d1, C14N_INC1_DIGEST) def check_c14n_exc(self): """http://www.w3.org/TR/xml-exc-c14n/ """ s = StringIO() Canonicalize(self.el, s, unsuppressedPrefixes=[]) cxml = s.getvalue() d1 = base64.encodestring(sha.sha(C14N_EXCL1).digest()).strip() d2 = base64.encodestring(sha.sha(cxml).digest()).strip() self.assertEqual(d1, C14N_EXCL1_DIGEST) self.assertEqual(d1, d2) def check_c14n_exc2_unsuppressed(self): """http://www.w3.org/TR/xml-exc-c14n/ The method of canonicalization described in this specification receives an InclusiveNamespaces PrefixList parameter, which lists namespace prefixes that are handled in the manner described by the Canonical XML Recommendation """ s = StringIO() Canonicalize(self.el, s, unsuppressedPrefixes=['xsi', 'xsd']) cxml = s.getvalue() d1 = base64.encodestring(sha.sha(C14N_EXCL2).digest()).strip() d2 = base64.encodestring(sha.sha(cxml).digest()).strip() self.assertEqual(d1, C14N_EXCL2_DIGEST) self.assertEqual(d1, d2) def check_c14n_exc3(self): """http://www.w3.org/TR/xml-exc-c14n/ tests if a namespace defined in a parent node to the top node to be canonicalized is added when discovered that this namespace is used. """ self.ps = ParsedSoap(XML_INST2) self.el = self.ps.body s = StringIO() Canonicalize(self.el, s, unsuppressedPrefixes=[]) cxml = s.getvalue() print cxml d1 = base64.encodestring(sha.sha(C14N_EXCL3).digest()).strip() d2 = base64.encodestring(sha.sha(cxml).digest()).strip() self.assertEqual(d1, C14N_EXCL3_DIGEST) self.assertEqual(d1, d2) def xcheck_c14n_exc4(self): RCVDIGEST = "jhTbi7gWlY9oLqsRr+EZ0bokRFA=" CALDIGEST = "IkMyI4zCDlK41qE7sZxvkFHJioU=" d1 = base64.encodestring(sha.sha(WRONG).digest()).strip() d2 = base64.encodestring(sha.sha(CORRECT).digest()).strip() ps = ParsedSoap(XML_INST4) el = filter(lambda el: _get_element_nsuri_name(el) == (WSA200403.ADDRESS, "MessageID"), ps.header_elements)[0] s = StringIO() Canonicalize(el, s, unsuppressedPrefixes=[]) cxml = s.getvalue() print "-- "*20 print cxml print "-- "*20 d3 = base64.encodestring(sha.sha(cxml).digest()).strip() self.assertEqual(d1, RCVDIGEST) self.assertEqual(d2, CALDIGEST) self.assertEqual(d3, CALDIGEST) def makeTestSuite(): suite = unittest.TestSuite() #suite.addTest(unittest.makeSuite(CanonicalizeFromTestCase, "check")) suite.addTest(unittest.makeSuite(CanonicalizeFromTestCase, "xcheck")) return suite C14N_EXCL1_DIGEST = "xSOXT+dlQwo5uT9PbK08of6W9PM=" C14N_EXCL1 = """http://bosshog.lbl.gov:9999/wsrf/services/SecureCounterService10577413""" C14N_INC1_DIGEST = "qdU4f7/+BeHV/JlVGIPM90fNeV8=" C14N_INC1 = """http://bosshog.lbl.gov:9999/wsrf/services/SecureCounterService10577413""" C14N_EXCL2_DIGEST = "+IEqF6DRo36Bh93A06S7C4Cmcuo=" C14N_EXCL2 = """http://bosshog.lbl.gov:9999/wsrf/services/SecureCounterService10577413""" C14N_EXCL3_DIGEST = "VJvTr+Mx3TeWsQY6iwGbhAJ9/eA=" C14N_EXCL3 = """http://131.243.2.147:8888/wsrf/services/DelegationService8adaa710-ba01-11da-bc99-cbed73daa755""" XML_INST1 = """ m9pihAqIBdcdk7ytDvccj89eWi8= ofD+Ket5kzR2u/5jWKbFTMtmigk= SoQ7RlJa3r94weDWBuWAg/BvydQ= z6sCEkkRJrCuY/C0S5b+46WfyMs= +IEqF6DRo36Bh93A06S7C4Cmcuo= NFltkKAJpmMkPbJQj5MW1qVceto= AAAAAAAAAAMAAAvZTrXlZjRSO7tP12tId+lehprEKgk= 3b1ef410-ab3d-11da-9436-88b687faed94uuid:3d592ca0-ab3d-11da-9436-88b687faed94http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymoushttp://counter.com/CounterPortType/addResponsehttp://bosshog.lbl.gov:9999/wsrf/services/SecureCounterService10577413uuid:1141449047.0513""" XML_INST2 = """ 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 xqoPUGjk97yY+StAheOFmeaHgbw= VJvTr+Mx3TeWsQY6iwGbhAJ9/eA= W1PrEK32GMCbF6FTEmlYiYwqAeQ= lWhqYlKqBnB4LwkRWyXMwHy18hc= 2Zjgz4McHaxMLfpBbqelAqWvRsU= knsi7QmfOvjrn5mWClmsbCpZ32A= /yBXQ0yxPqpgSGYym/DA08k0dXM= LuGNfoVBzUIoF0AU0lzJkH9kAOi+PQVG8hMrCIEjWh1lifSG/bquhu/qZVq78x3UR+tGK411hWuQ nGle1GvY0A== 2006-03-23T00:11:14Z2006-03-23T00:16:14Zuuid:8aec8160-ba01-11da-bc99-cbed73daa755http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymoushttp://www.globus.org/08/2004/delegationService/DelegationFactoryPortType/RequestSecurityTokenResponsehttp://bosshog.lbl.gov:8888/wsrf/services/DelegationFactoryServiceuuid:1143072675.25http://131.243.2.147:8888/wsrf/services/DelegationService8adaa710-ba01-11da-bc99-cbed73daa755""" CORRECT = """uuid:1143760705.98""" WRONG = """uuid:1143760705.98""" XML_INST4 = """ uuid:1143760705.98http://counter.com/CounterPortType/createCounterRequesthttp://131.243.2.159:9080/wsrf/services/SecureCounterServicehttp://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous IkMyI4zCDlK41qE7sZxvkFHJioU= DyEF6Pa7w3SSEVJ98LIoX2LW85k= p/2PhmYP+/1UPcpwsRcdlvLmOAg= KFLeYjf5ohGUIoPoZV/oew9SuUM= 7Gg0SC1wltHVAwiOfdgZsGM9W5g= AAAAAAAAAAEAAAdrBxzrHLZG4NglRglL9F3rKQu0658= 1000""" def main(): unittest.main(defaultTest="makeTestSuite") if __name__ == '__main__': main()