]> Cypherpunks.ru repositories - pygost.git/blob - pygost/test_gost341194.py
52905543442ee498b376f6422272e5680355c17d
[pygost.git] / pygost / test_gost341194.py
1 # coding: utf-8
2 # PyGOST -- Pure Python GOST cryptographic functions library
3 # Copyright (C) 2015-2018 Sergey Matveev <stargrave@stargrave.org>
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 from unittest import skip
19 from unittest import TestCase
20 import hmac
21
22 from pygost import gost341194
23 from pygost.gost341194 import GOST341194
24 from pygost.gost341194 import pbkdf2
25 from pygost.utils import hexenc
26
27
28 class TestCopy(TestCase):
29     def runTest(self):
30         m = GOST341194()
31         c = m.copy()
32         m.update(b"foobar")
33         c.update(b"foo")
34         c.update(b"bar")
35         self.assertEqual(m.digest(), c.digest())
36
37
38 class TestHMACPEP247(TestCase):
39     def runTest(self):
40         h = hmac.new(b"foo", digestmod=gost341194)
41         h.update(b"foobar")
42         h.digest()
43
44
45 class TestVectors(TestCase):
46     def test_empty(self):
47         self.assertEqual(
48             GOST341194(b"", "GostR3411_94_TestParamSet").hexdigest(),
49             "ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8d",
50         )
51
52     def test_a(self):
53         self.assertEqual(
54             GOST341194(b"a", "GostR3411_94_TestParamSet").hexdigest(),
55             "d42c539e367c66e9c88a801f6649349c21871b4344c6a573f849fdce62f314dd",
56         )
57
58     def test_abc(self):
59         self.assertEqual(
60             GOST341194(b"abc", "GostR3411_94_TestParamSet").hexdigest(),
61             "f3134348c44fb1b2a277729e2285ebb5cb5e0f29c975bc753b70497c06a4d51d",
62         )
63
64     def test_message_digest(self):
65         self.assertEqual(
66             GOST341194(b"message digest", "GostR3411_94_TestParamSet").hexdigest(),
67             "ad4434ecb18f2c99b60cbe59ec3d2469582b65273f48de72db2fde16a4889a4d",
68         )
69
70     def test_Us(self):
71         self.assertEqual(
72             GOST341194(128 * b"U", "GostR3411_94_TestParamSet").hexdigest(),
73             "53a3a3ed25180cef0c1d85a074273e551c25660a87062a52d926a9e8fe5733a4",
74         )
75
76     def test_dog(self):
77         self.assertEqual(
78             GOST341194(b"The quick brown fox jumps over the lazy dog", "GostR3411_94_TestParamSet",).hexdigest(),
79             "77b7fa410c9ac58a25f49bca7d0468c9296529315eaca76bd1a10f376d1f4294",
80         )
81
82     def test_cog(self):
83         self.assertEqual(
84             GOST341194(b"The quick brown fox jumps over the lazy cog", "GostR3411_94_TestParamSet",).hexdigest(),
85             "a3ebc4daaab78b0be131dab5737a7f67e602670d543521319150d2e14eeec445",
86         )
87
88     def test_rfc32(self):
89         self.assertEqual(
90             GOST341194(b"This is message, length=32 bytes", "GostR3411_94_TestParamSet",).hexdigest(),
91             "b1c466d37519b82e8319819ff32595e047a28cb6f83eff1c6916a815a637fffa",
92         )
93
94     def test_rfc50(self):
95         self.assertEqual(
96             GOST341194(b"Suppose the original message has length = 50 bytes", "GostR3411_94_TestParamSet",).hexdigest(),
97             "471aba57a60a770d3a76130635c1fbea4ef14de51f78b4ae57dd893b62f55208",
98         )
99
100
101 class TestVectorsCryptoPro(TestCase):
102     """ CryptoPro S-box test vectors
103     """
104     def test_empty(self):
105         self.assertEqual(
106             GOST341194(b"", "GostR3411_94_CryptoProParamSet").hexdigest(),
107             "981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0",
108         )
109
110     def test_a(self):
111         self.assertEqual(
112             GOST341194(b"a", "GostR3411_94_CryptoProParamSet").hexdigest(),
113             "e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011",
114         )
115
116     def test_abc(self):
117         self.assertEqual(
118             GOST341194(b"abc", "GostR3411_94_CryptoProParamSet").hexdigest(),
119             "b285056dbf18d7392d7677369524dd14747459ed8143997e163b2986f92fd42c",
120         )
121
122     def test_message_digest(self):
123         self.assertEqual(
124             GOST341194(b"message digest", "GostR3411_94_CryptoProParamSet",).hexdigest(),
125             "bc6041dd2aa401ebfa6e9886734174febdb4729aa972d60f549ac39b29721ba0",
126         )
127
128     def test_dog(self):
129         self.assertEqual(
130             GOST341194(b"The quick brown fox jumps over the lazy dog", "GostR3411_94_CryptoProParamSet",).hexdigest(),
131             "9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76",
132         )
133
134     def test_32(self):
135         self.assertEqual(
136             GOST341194(b"This is message, length=32 bytes", "GostR3411_94_CryptoProParamSet",).hexdigest(),
137             "2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48eb",
138         )
139
140     def test_50(self):
141         self.assertEqual(
142             GOST341194(b"Suppose the original message has length = 50 bytes", "GostR3411_94_CryptoProParamSet",).hexdigest(),
143             "c3730c5cbccacf915ac292676f21e8bd4ef75331d9405e5f1a61dc3130a65011",
144         )
145
146     def test_Us(self):
147         self.assertEqual(
148             GOST341194(128 * b"U", "GostR3411_94_CryptoProParamSet").hexdigest(),
149             "1c4ac7614691bbf427fa2316216be8f10d92edfd37cd1027514c1008f649c4e8",
150         )
151
152
153 class TestPBKDF2(TestCase):
154     """http://tc26.ru/methods/containers_v1/Addition_to_PKCS5_v1_0.pdf test vectors
155     """
156     def test_1(self):
157         self.assertEqual(
158             hexenc(pbkdf2(b"password", b"salt", 1, 32)),
159             "7314e7c04fb2e662c543674253f68bd0b73445d07f241bed872882da21662d58",
160         )
161
162     def test_2(self):
163         self.assertEqual(
164             hexenc(pbkdf2(b"password", b"salt", 2, 32)),
165             "990dfa2bd965639ba48b07b792775df79f2db34fef25f274378872fed7ed1bb3",
166         )
167
168     def test_3(self):
169         self.assertEqual(
170             hexenc(pbkdf2(b"password", b"salt", 4096, 32)),
171             "1f1829a94bdff5be10d0aeb36af498e7a97467f3b31116a5a7c1afff9deadafe",
172         )
173
174     @skip("it takes too long")
175     def test_4(self):
176         self.assertEqual(
177             hexenc(pbkdf2(b"password", b"salt", 16777216, 32)),
178             "a57ae5a6088396d120850c5c09de0a525100938a59b1b5c3f7810910d05fcd97",
179         )
180
181     def test_5(self):
182         self.assertEqual(
183             hexenc(pbkdf2(
184                 b"passwordPASSWORDpassword",
185                 b"saltSALTsaltSALTsaltSALTsaltSALTsalt",
186                 4096,
187                 40,
188             )),
189             "788358c69cb2dbe251a7bb17d5f4241f265a792a35becde8d56f326b49c85047b7638acb4764b1fd",
190         )
191
192     def test_6(self):
193         self.assertEqual(
194             hexenc(pbkdf2(
195                 b"pass\x00word",
196                 b"sa\x00lt",
197                 4096,
198                 20,
199             )),
200             "43e06c5590b08c0225242373127edf9c8e9c3291",
201         )