Skip to content
This repository was archived by the owner on Jan 13, 2023. It is now read-only.

Commit b7e0ce0

Browse files
committed
Made coding conventions consistent, added doc'n.
1 parent acdddb2 commit b7e0ce0

File tree

1 file changed

+195
-153
lines changed

1 file changed

+195
-153
lines changed

test/crypto/pycurl_test.py

Lines changed: 195 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -8,158 +8,200 @@
88
from iota.crypto import Curl
99

1010

11-
class TestCurl(TestCase):
11+
class CurlTestCase(TestCase):
12+
"""
13+
This is the test case for CURL-P hash function used in IOTA.
14+
15+
Note that this test case covers :py:data:`iota.crypto.Curl`, **not**
16+
:py:class:`iota.crypto.pycurl.Curl`.
17+
18+
This is intentional; it enables us to run unit tests for the C
19+
extension with the same code.
20+
21+
See https://github.com/todofixthis/pyota-ccurl/ for more information.
22+
"""
23+
24+
def test_happy_path(self):
25+
"""
26+
Typical use case.
27+
"""
28+
# noinspection SpellCheckingInspection
29+
input_ = (
30+
'EMIDYNHBWMBCXVDEFOFWINXTERALUKYYPPHKP9JJ'
31+
'FGJEIUY9MUDVNFZHMMWZUYUSWAIOWEVTHNWMHANBH'
32+
)
33+
34+
trits = TryteString(input_).as_trits()
35+
36+
curl = Curl()
37+
curl.absorb(trits)
38+
trits_out = []
39+
curl.squeeze(trits_out)
40+
41+
trits_out = TryteString.from_trits(trits_out)
42+
43+
# noinspection SpellCheckingInspection
44+
self.assertEqual(
45+
trits_out,
46+
47+
'AQBOPUMJMGVHFOXSMUAGZNACKUTISDPBSILMRAGI'
48+
'GRXXS9JJTLIKZUW9BCJWKSTFBDSBLNVEEGVGAMSSM',
49+
)
50+
51+
def test_length_greater_than_243(self):
52+
"""
53+
The input is longer than 1 hash.
54+
"""
55+
# noinspection SpellCheckingInspection
56+
input_ = (
57+
'G9JYBOMPUXHYHKSNRNMMSSZCSHOFYOYNZRSZMAAYWDYEIMVVOGKPJB'
58+
'VBM9TDPULSFUNMTVXRKFIDOHUXXVYDLFSZYZTWQYTE9SPYYWYTXJYQ'
59+
'9IFGYOLZXWZBKWZN9QOOTBQMWMUBLEWUEEASRHRTNIQWJQNDWRYLCA'
60+
)
61+
62+
trits = TryteString(input_).as_trits()
63+
64+
curl = Curl()
65+
curl.absorb(trits)
66+
trits_out = []
67+
curl.squeeze(trits_out)
68+
69+
trits_out = TryteString.from_trits(trits_out)
70+
71+
# noinspection SpellCheckingInspection
72+
self.assertEqual(
73+
trits_out,
74+
75+
'RWCBOLRFANOAYQWXXTFQJYQFAUTEEBSZWTIRSSDR'
76+
'EYGCNFRLHQVDZXYXSJKCQFQLJMMRHYAZKRRLQZDKR',
77+
)
78+
79+
def test_length(self):
80+
"""
81+
Specifying different values for the ``length`` argument.
82+
"""
83+
# noinspection SpellCheckingInspection
84+
input_ = (
85+
'G9JYBOMPUXHYHKSNRNMMSSZCSHOFYOYNZRSZMAAYWDYEIMVVOGKPJB'
86+
'VBM9TDPULSFUNMTVXRKFIDOHUXXVYDLFSZYZTWQYTE9SPYYWYTXJYQ'
87+
'9IFGYOLZXWZBKWZN9QOOTBQMWMUBLEWUEEASRHRTNIQWJQNDWRYLCA'
88+
)
89+
90+
trits = TryteString(input_).as_trits()
91+
92+
curl = Curl()
93+
curl.absorb(trits, offset=0, length=486)
94+
curl.absorb(trits, offset=0, length=243)
95+
trits_out = []
96+
curl.squeeze(trits_out)
97+
98+
trits_out = TryteString.from_trits(trits_out)
99+
100+
# noinspection SpellCheckingInspection
101+
self.assertEqual(
102+
trits_out,
103+
104+
'OTYHXEXJLCSMEY9LYCC9ASJXMORTLAYQEHRS9DAH'
105+
'9NR9DXLXYDGOVOBEL9LWRITLWPHPYPZDKXVPAPKUA',
106+
)
107+
108+
def test_absorb_offset(self):
109+
"""
110+
Passing an ``offset`` argument to :py:meth:`Curl.absorb`.
111+
"""
112+
# noinspection SpellCheckingInspection
113+
input_ = (
114+
'G9JYBOMPUXHYHKSNRNMMSSZCSHOFYOYNZRSZMAAYWDYEIMVVOGKPJB'
115+
'VBM9TDPULSFUNMTVXRKFIDOHUXXVYDLFSZYZTWQYTE9SPYYWYTXJYQ'
116+
'9IFGYOLZXWZBKWZN9QOOTBQMWMUBLEWUEEASRHRTNIQWJQNDWRYLCA'
117+
)
118+
119+
trits = TryteString(input_).as_trits()
120+
121+
curl = Curl()
122+
curl.absorb(trits, offset=243, length=486)
123+
curl.absorb(trits, offset=0, length=243)
124+
trits_out = []
125+
curl.squeeze(trits_out)
126+
127+
trits_out = TryteString.from_trits(trits_out)
128+
129+
# noinspection SpellCheckingInspection
130+
self.assertEqual(
131+
trits_out,
132+
133+
'ZWNF9YOCAKC9CXQFYZDKXSSAZOCAZLEVEB9OZDJQ'
134+
'GWEULHUDY9RAWAT9GIUXTTUSYJEGNGQDVJCGTQLN9',
135+
)
136+
137+
def test_squeeze_offset(self):
138+
"""
139+
Passing an ``offset`` argument to :py:meth:`Curl.squeeze`.
140+
141+
Example use case:
142+
https://github.com/iotaledger/iri/blob/v1.4.1.6/src/main/java/com/iota/iri/hash/ISS.java#L83
143+
"""
144+
# noinspection SpellCheckingInspection
145+
input_ = (
146+
'CDLFODMOGMQAWXDURDXTUAOO9BFESHYGZLBUWIIHPTLNZCUNHZAAXSUPUIBW'
147+
'IRLOVKCVWJSWEKRJQZUVRDZGZRNANUNCSGANCJWVHMZMVNJVUAZNFZKDAIVV'
148+
'LSMIM9SVGUHYECTGGIXTAMXXO9FIXUMQFZCGRQWAOWJPBTXNNQIRSTZEEAJV'
149+
'FSXWTHWBQJCWQNYYMHSPCYRA99ITVILYJPMFGOGOUOZUVABK9HMGABSORCVD'
150+
'FNGLMPJ9NFKBWCZMFPIWEAGRWPRNLLG9VYUUVLCTEWKGWQIRIJKERZWC9LVR'
151+
'XJEXNHBNUGEGGLMWGERKYFB9YEZCLXLKKMCGLRKQOGASDOUDYEDJLMV9BHPG'
152+
'GCXQIUVUOFFXKEIIINLVWLRYHHLKXPLSTWKIKNEJWEDFQQFXQVEHGRCIJC9T'
153+
'GVQNPPKGCFGPJNWSCPQZDDSIGAVZEIVYJDVPUOCTEMKTZFGXNGPQCOIBD9MX'
154+
'YTHJTX'
155+
)
156+
157+
trits = TryteString(input_).as_trits()
158+
curl = Curl()
159+
160+
trits_out = [0] * 243
161+
for i in range(6):
162+
curl.reset()
163+
curl.absorb(trits, i * 243, (i + 1) * 243)
164+
curl.squeeze(trits, i * 243)
165+
166+
curl.reset()
167+
curl.absorb(trits)
168+
curl.squeeze(trits_out)
169+
170+
trits_out = TryteString.from_trits(trits_out)
171+
172+
# noinspection SpellCheckingInspection
173+
self.assertEqual(
174+
trits_out,
175+
176+
'TAWDGNSEAD9ZRGBBVRVEKQYYVDOKHYQ9KEIYJKFT'
177+
'BQEYZDWZVMRFJQQGTMPHBZOGPIJCCVWLZVDKLAQVI',
178+
)
179+
180+
def test_squeeze_multiple_hashes(self):
12181
"""
13-
This is the test case for CURL-P hash function used in IOTA
182+
Squeezing more than 1 hash from the sponge.
14183
"""
15-
def test_correct_first(self):
16-
"""Test the inp tryte string will get the correct output"""
17-
inp = (
18-
'EMIDYNHBWMBCXVDEFOFWINXTERALUKYYPPHKP9JJ'
19-
'FGJEIUY9MUDVNFZHMMWZUYUSWAIOWEVTHNWMHANBH'
20-
)
21-
22-
trits = TryteString(inp).as_trits()
23-
24-
curl = Curl()
25-
curl.absorb(trits)
26-
trits_out = []
27-
curl.squeeze(trits_out)
28-
29-
trits_out = TryteString.from_trits(trits_out)
30-
31-
self.assertEqual(
32-
trits_out,
33-
'AQBOPUMJMGVHFOXSMUAGZNACKUTISDPBSILMRAGIG'
34-
'RXXS9JJTLIKZUW9BCJWKSTFBDSBLNVEEGVGAMSSM')
35-
36-
def test_input_length_greater_than_243(self):
37-
"""Test input trytes length greater than hash length should work"""
38-
inp = (
39-
'G9JYBOMPUXHYHKSNRNMMSSZCSHOFYOYNZRSZMAAYWDYEIMVVOGKPJB'
40-
'VBM9TDPULSFUNMTVXRKFIDOHUXXVYDLFSZYZTWQYTE9SPYYWYTXJYQ'
41-
'9IFGYOLZXWZBKWZN9QOOTBQMWMUBLEWUEEASRHRTNIQWJQNDWRYLCA'
42-
)
43-
44-
trits = TryteString(inp).as_trits()
45-
46-
curl = Curl()
47-
curl.absorb(trits)
48-
trits_out = []
49-
curl.squeeze(trits_out)
50-
51-
trits_out = TryteString.from_trits(trits_out)
52-
53-
self.assertEqual(
54-
trits_out,
55-
'RWCBOLRFANOAYQWXXTFQJYQFAUTEEBSZWTIRSSDR'
56-
'EYGCNFRLHQVDZXYXSJKCQFQLJMMRHYAZKRRLQZDKR')
57-
58-
def test_input_without_offset(self):
59-
"""Test input without offset should work"""
60-
inp = (
61-
'G9JYBOMPUXHYHKSNRNMMSSZCSHOFYOYNZRSZMAAYWDYEIMVVOGKPJB'
62-
'VBM9TDPULSFUNMTVXRKFIDOHUXXVYDLFSZYZTWQYTE9SPYYWYTXJYQ'
63-
'9IFGYOLZXWZBKWZN9QOOTBQMWMUBLEWUEEASRHRTNIQWJQNDWRYLCA'
64-
)
65-
66-
trits = TryteString(inp).as_trits()
67-
68-
curl = Curl()
69-
curl.absorb(trits, 0, length=486)
70-
curl.absorb(trits, 0, length=243)
71-
trits_out = []
72-
curl.squeeze(trits_out)
73-
74-
trits_out = TryteString.from_trits(trits_out)
75-
76-
self.assertEqual(
77-
trits_out,
78-
'OTYHXEXJLCSMEY9LYCC9ASJXMORTLAYQEHRS9DAH'
79-
'9NR9DXLXYDGOVOBEL9LWRITLWPHPYPZDKXVPAPKUA')
80-
81-
def test_input_with_offset(self):
82-
"""Test input with offset should work"""
83-
inp = (
84-
'G9JYBOMPUXHYHKSNRNMMSSZCSHOFYOYNZRSZMAAYWDYEIMVVOGKPJB'
85-
'VBM9TDPULSFUNMTVXRKFIDOHUXXVYDLFSZYZTWQYTE9SPYYWYTXJYQ'
86-
'9IFGYOLZXWZBKWZN9QOOTBQMWMUBLEWUEEASRHRTNIQWJQNDWRYLCA'
87-
)
88-
89-
trits = TryteString(inp).as_trits()
90-
91-
curl = Curl()
92-
curl.absorb(trits, 243, length=486)
93-
curl.absorb(trits, 0, length=243)
94-
trits_out = []
95-
curl.squeeze(trits_out)
96-
97-
trits_out = TryteString.from_trits(trits_out)
98-
99-
self.assertEqual(
100-
trits_out,
101-
'ZWNF9YOCAKC9CXQFYZDKXSSAZOCAZLEVEB9OZDJQG'
102-
'WEULHUDY9RAWAT9GIUXTTUSYJEGNGQDVJCGTQLN9')
103-
104-
def test_squeeze_with_offset(self):
105-
"""Test squeeze with offset, this only used in ISS
106-
GitHub IRI ISS: https://github.com/iotaledger/iri/blob/dev/src/main/java/com/iota/iri/hash/ISS.java#L83
107-
"""
108-
inp = (
109-
'CDLFODMOGMQAWXDURDXTUAOO9BFESHYGZLBUWIIHPTLNZCUNHZAAXSUPUIBW'
110-
'IRLOVKCVWJSWEKRJQZUVRDZGZRNANUNCSGANCJWVHMZMVNJVUAZNFZKDAIVV'
111-
'LSMIM9SVGUHYECTGGIXTAMXXO9FIXUMQFZCGRQWAOWJPBTXNNQIRSTZEEAJV'
112-
'FSXWTHWBQJCWQNYYMHSPCYRA99ITVILYJPMFGOGOUOZUVABK9HMGABSORCVD'
113-
'FNGLMPJ9NFKBWCZMFPIWEAGRWPRNLLG9VYUUVLCTEWKGWQIRIJKERZWC9LVR'
114-
'XJEXNHBNUGEGGLMWGERKYFB9YEZCLXLKKMCGLRKQOGASDOUDYEDJLMV9BHPG'
115-
'GCXQIUVUOFFXKEIIINLVWLRYHHLKXPLSTWKIKNEJWEDFQQFXQVEHGRCIJC9T'
116-
'GVQNPPKGCFGPJNWSCPQZDDSIGAVZEIVYJDVPUOCTEMKTZFGXNGPQCOIBD9MX'
117-
'YTHJTX'
118-
)
119-
120-
121-
d = [0] * 243
122-
trits = TryteString(inp).as_trits()
123-
curl = Curl()
124-
125-
for i in range(6):
126-
curl.reset()
127-
curl.absorb(trits, i * 243, (i + 1) * 243)
128-
curl.squeeze(trits, i * 243)
129-
130-
curl.reset()
131-
curl.absorb(trits)
132-
curl.squeeze(d)
133-
134-
trits_out = TryteString.from_trits(d)
135-
136-
self.assertEqual(
137-
trits_out,
138-
'TAWDGNSEAD9ZRGBBVRVEKQYYVDOKHYQ9KEIYJKFT'
139-
'BQEYZDWZVMRFJQQGTMPHBZOGPIJCCVWLZVDKLAQVI')
140-
141-
def test_squeeze_with_486_length_should_work(self):
142-
"""
143-
Test squeeze with 486 length should work as well, no one use this
144-
in real situation
145-
"""
146-
inp = (
147-
'EMIDYNHBWMBCXVDEFOFWINXTERALUKYYPPHKP9JJ'
148-
'FGJEIUY9MUDVNFZHMMWZUYUSWAIOWEVTHNWMHANBH'
149-
)
150-
151-
trits = TryteString(inp).as_trits()
152-
153-
curl = Curl()
154-
curl.absorb(trits)
155-
trits_out = []
156-
curl.squeeze(trits_out, length=486)
157-
158-
trits_out = TryteString.from_trits(trits_out)
159-
160-
self.assertEqual(
161-
trits_out,
162-
'AQBOPUMJMGVHFOXSMUAGZNACKUTISDPBSILMRAGIG'
163-
'RXXS9JJTLIKZUW9BCJWKSTFBDSBLNVEEGVGAMSSMQ'
164-
'GSJWCCFQRHWKTSMVPWWCEGOMCNWFYWDZBEDBLXIFB'
165-
'HOTCKUMCANLSXXTNKSYNBMOSDDEYFTDOYIKDRJM')
184+
# noinspection SpellCheckingInspection
185+
input_ = (
186+
'EMIDYNHBWMBCXVDEFOFWINXTERALUKYYPPHKP9JJ'
187+
'FGJEIUY9MUDVNFZHMMWZUYUSWAIOWEVTHNWMHANBH'
188+
)
189+
190+
trits = TryteString(input_).as_trits()
191+
192+
curl = Curl()
193+
curl.absorb(trits)
194+
trits_out = []
195+
curl.squeeze(trits_out, length=486)
196+
197+
trits_out = TryteString.from_trits(trits_out)
198+
199+
# noinspection SpellCheckingInspection
200+
self.assertEqual(
201+
trits_out,
202+
203+
'AQBOPUMJMGVHFOXSMUAGZNACKUTISDPBSILMRAGIG'
204+
'RXXS9JJTLIKZUW9BCJWKSTFBDSBLNVEEGVGAMSSMQ'
205+
'GSJWCCFQRHWKTSMVPWWCEGOMCNWFYWDZBEDBLXIFB'
206+
'HOTCKUMCANLSXXTNKSYNBMOSDDEYFTDOYIKDRJM',
207+
)

0 commit comments

Comments
 (0)