1
from openid.test import datadriven
5
from openid.message import Message, BARE_NS, OPENID_NS, OPENID2_NS
6
from openid import association
8
from openid import cryptutil
11
class AssociationSerializationTest(unittest.TestCase):
12
def test_roundTrip(self):
13
issued = int(time.time())
15
assoc = association.Association(
16
'handle', 'secret', issued, lifetime, 'HMAC-SHA1')
18
assoc2 = association.Association.deserialize(s)
19
self.failUnlessEqual(assoc.handle, assoc2.handle)
20
self.failUnlessEqual(assoc.issued, assoc2.issued)
21
self.failUnlessEqual(assoc.secret, assoc2.secret)
22
self.failUnlessEqual(assoc.lifetime, assoc2.lifetime)
23
self.failUnlessEqual(assoc.assoc_type, assoc2.assoc_type)
25
from openid.server.server import \
26
DiffieHellmanSHA1ServerSession, \
27
DiffieHellmanSHA256ServerSession, \
28
PlainTextServerSession
30
from openid.consumer.consumer import \
31
DiffieHellmanSHA1ConsumerSession, \
32
DiffieHellmanSHA256ConsumerSession, \
33
PlainTextConsumerSession
35
from openid.dh import DiffieHellman
37
def createNonstandardConsumerDH():
38
nonstandard_dh = DiffieHellman(1315291, 2)
39
return DiffieHellmanSHA1ConsumerSession(nonstandard_dh)
41
class DiffieHellmanSessionTest(datadriven.DataDrivenTestCase):
46
'This is a secret....',
50
(DiffieHellmanSHA1ConsumerSession, DiffieHellmanSHA1ServerSession),
51
(createNonstandardConsumerDH, DiffieHellmanSHA1ServerSession),
52
(PlainTextConsumerSession, PlainTextServerSession),
55
def generateCases(cls):
57
for c, s in cls.session_factories
58
for sec in cls.secrets]
60
generateCases = classmethod(generateCases)
62
def __init__(self, csess_fact, ssess_fact, secret):
63
datadriven.DataDrivenTestCase.__init__(self, csess_fact.__name__)
65
self.csess_fact = csess_fact
66
self.ssess_fact = ssess_fact
69
csess = self.csess_fact()
70
msg = Message.fromOpenIDArgs(csess.getRequest())
71
ssess = self.ssess_fact.fromMessage(msg)
72
check_secret = csess.extractSecret(
73
Message.fromOpenIDArgs(ssess.answer(self.secret)))
74
self.failUnlessEqual(self.secret, check_secret)
78
class TestMakePairs(unittest.TestCase):
79
"""Check the key-value formatting methods of associations.
83
self.message = m = Message(OPENID2_NS)
84
m.updateArgs(OPENID2_NS, {
86
'identifier': '=example',
87
'signed': 'identifier,mode',
90
m.updateArgs(BARE_NS, {'xey': 'value'})
91
self.assoc = association.Association.fromExpiresIn(
92
3600, '{sha1}', 'very_secret', "HMAC-SHA1")
95
def testMakePairs(self):
96
"""Make pairs using the OpenID 1.x type signed list."""
97
pairs = self.assoc._makePairs(self.message)
99
('identifier', '=example'),
102
self.failUnlessEqual(pairs, expected)
106
class TestMac(unittest.TestCase):
108
self.pairs = [('key1', 'value1'),
113
assoc = association.Association.fromExpiresIn(
114
3600, '{sha1}', 'very_secret', "HMAC-SHA1")
115
expected = ('\xe0\x1bv\x04\xf1G\xc0\xbb\x7f\x9a\x8b'
116
'\xe9\xbc\xee}\\\xe5\xbb7*')
117
sig = assoc.sign(self.pairs)
118
self.failUnlessEqual(sig, expected)
120
if cryptutil.SHA256_AVAILABLE:
121
def test_sha256(self):
122
assoc = association.Association.fromExpiresIn(
123
3600, '{sha256SA}', 'very_secret', "HMAC-SHA256")
124
expected = ('\xfd\xaa\xfe;\xac\xfc*\x988\xad\x05d6-\xeaVy'
125
'\xd5\xa5Z.<\xa9\xed\x18\x82\\$\x95x\x1c&')
126
sig = assoc.sign(self.pairs)
127
self.failUnlessEqual(sig, expected)
131
class TestMessageSigning(unittest.TestCase):
133
self.message = m = Message(OPENID2_NS)
134
m.updateArgs(OPENID2_NS, {'mode': 'id_res',
135
'identifier': '=example'})
136
m.updateArgs(BARE_NS, {'xey': 'value'})
137
self.args = {'openid.mode': 'id_res',
138
'openid.identifier': '=example',
142
def test_signSHA1(self):
143
assoc = association.Association.fromExpiresIn(
144
3600, '{sha1}', 'very_secret', "HMAC-SHA1")
145
signed = assoc.signMessage(self.message)
146
self.failUnless(signed.getArg(OPENID_NS, "sig"))
147
self.failUnlessEqual(signed.getArg(OPENID_NS, "signed"),
148
"assoc_handle,identifier,mode,ns,signed")
149
self.failUnlessEqual(signed.getArg(BARE_NS, "xey"), "value",
152
if cryptutil.SHA256_AVAILABLE:
153
def test_signSHA256(self):
154
assoc = association.Association.fromExpiresIn(
155
3600, '{sha1}', 'very_secret', "HMAC-SHA256")
156
signed = assoc.signMessage(self.message)
157
self.failUnless(signed.getArg(OPENID_NS, "sig"))
158
self.failUnlessEqual(signed.getArg(OPENID_NS, "signed"),
159
"assoc_handle,identifier,mode,ns,signed")
160
self.failUnlessEqual(signed.getArg(BARE_NS, "xey"), "value",
164
class TestCheckMessageSignature(unittest.TestCase):
165
def test_aintGotSignedList(self):
166
m = Message(OPENID2_NS)
167
m.updateArgs(OPENID2_NS, {'mode': 'id_res',
168
'identifier': '=example',
171
m.updateArgs(BARE_NS, {'xey': 'value'})
172
assoc = association.Association.fromExpiresIn(
173
3600, '{sha1}', 'very_secret', "HMAC-SHA1")
174
self.failUnlessRaises(ValueError, assoc.checkMessageSignature, m)
178
return datadriven.loadTests(__name__)
180
if __name__ == '__main__':
181
suite = pyUnitTests()
182
runner = unittest.TextTestRunner()