Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(311)

Side by Side Diff: third_party/google-endpoints/Crypto/SelfTest/Util/test_asn1.py

Issue 2666783008: Add google-endpoints to third_party/. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 # -*- coding: utf-8 -*-
2 #
3 # SelfTest/Util/test_asn.py: Self-test for the Crypto.Util.asn1 module
4 #
5 # ===================================================================
6 # The contents of this file are dedicated to the public domain. To
7 # the extent that dedication to the public domain is not available,
8 # everyone is granted a worldwide, perpetual, royalty-free,
9 # non-exclusive license to exercise all rights associated with the
10 # contents of this file for any purpose whatsoever.
11 # No rights are reserved.
12 #
13 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
16 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
17 # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
18 # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 # SOFTWARE.
21 # ===================================================================
22
23 """Self-tests for Crypto.Util.asn1"""
24
25 __revision__ = "$Id$"
26
27 import unittest
28 import sys
29
30 from Crypto.Util.py3compat import *
31 from Crypto.Util.asn1 import DerSequence, DerObject
32
33 class DerObjectTests(unittest.TestCase):
34
35 def testObjEncode1(self):
36 # No payload
37 der = DerObject(b('\x33'))
38 self.assertEquals(der.encode(), b('\x33\x00'))
39 # Small payload
40 der.payload = b('\x45')
41 self.assertEquals(der.encode(), b('\x33\x01\x45'))
42 # Invariant
43 self.assertEquals(der.encode(), b('\x33\x01\x45'))
44 # Initialize with numerical tag
45 der = DerObject(b(0x33))
46 der.payload = b('\x45')
47 self.assertEquals(der.encode(), b('\x33\x01\x45'))
48
49 def testObjEncode2(self):
50 # Known types
51 der = DerObject('SEQUENCE')
52 self.assertEquals(der.encode(), b('\x30\x00'))
53 der = DerObject('BIT STRING')
54 self.assertEquals(der.encode(), b('\x03\x00'))
55
56 def testObjEncode3(self):
57 # Long payload
58 der = DerObject(b('\x34'))
59 der.payload = b("0")*128
60 self.assertEquals(der.encode(), b('\x34\x81\x80' + "0"*128))
61
62 def testObjDecode1(self):
63 # Decode short payload
64 der = DerObject()
65 der.decode(b('\x20\x02\x01\x02'))
66 self.assertEquals(der.payload, b("\x01\x02"))
67 self.assertEquals(der.typeTag, 0x20)
68
69 def testObjDecode2(self):
70 # Decode short payload
71 der = DerObject()
72 der.decode(b('\x22\x81\x80' + "1"*128))
73 self.assertEquals(der.payload, b("1")*128)
74 self.assertEquals(der.typeTag, 0x22)
75
76 class DerSequenceTests(unittest.TestCase):
77
78 def testEncode1(self):
79 # Empty sequence
80 der = DerSequence()
81 self.assertEquals(der.encode(), b('0\x00'))
82 self.failIf(der.hasOnlyInts())
83 # One single-byte integer (zero)
84 der.append(0)
85 self.assertEquals(der.encode(), b('0\x03\x02\x01\x00'))
86 self.failUnless(der.hasOnlyInts())
87 # Invariant
88 self.assertEquals(der.encode(), b('0\x03\x02\x01\x00'))
89
90 def testEncode2(self):
91 # One single-byte integer (non-zero)
92 der = DerSequence()
93 der.append(127)
94 self.assertEquals(der.encode(), b('0\x03\x02\x01\x7f'))
95 # Indexing
96 der[0] = 1
97 self.assertEquals(len(der),1)
98 self.assertEquals(der[0],1)
99 self.assertEquals(der[-1],1)
100 self.assertEquals(der.encode(), b('0\x03\x02\x01\x01'))
101 #
102 der[:] = [1]
103 self.assertEquals(len(der),1)
104 self.assertEquals(der[0],1)
105 self.assertEquals(der.encode(), b('0\x03\x02\x01\x01'))
106
107 def testEncode3(self):
108 # One multi-byte integer (non-zero)
109 der = DerSequence()
110 der.append(0x180L)
111 self.assertEquals(der.encode(), b('0\x04\x02\x02\x01\x80'))
112
113 def testEncode4(self):
114 # One very long integer
115 der = DerSequence()
116 der.append(2**2048)
117 self.assertEquals(der.encode(), b('0\x82\x01\x05')+
118 b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
119 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
120 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
121 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
122 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
123 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
124 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
125 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
126 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
127 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
128 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
129 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
130 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
131 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
132 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
133 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
134 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
135 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
136 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
137
138 def testEncode5(self):
139 # One single-byte integer (looks negative)
140 der = DerSequence()
141 der.append(0xFFL)
142 self.assertEquals(der.encode(), b('0\x04\x02\x02\x00\xff'))
143
144 def testEncode6(self):
145 # Two integers
146 der = DerSequence()
147 der.append(0x180L)
148 der.append(0xFFL)
149 self.assertEquals(der.encode(), b('0\x08\x02\x02\x01\x80\x02\x02 \x00\xff'))
150 self.failUnless(der.hasOnlyInts())
151 #
152 der.append(0x01)
153 der[1:] = [9,8]
154 self.assertEquals(len(der),3)
155 self.assertEqual(der[1:],[9,8])
156 self.assertEqual(der[1:-1],[9])
157 self.assertEquals(der.encode(), b('0\x0A\x02\x02\x01\x80\x02\x01 \x09\x02\x01\x08'))
158
159 def testEncode6(self):
160 # One integer and another type (no matter what it is)
161 der = DerSequence()
162 der.append(0x180L)
163 der.append(b('\x00\x02\x00\x00'))
164 self.assertEquals(der.encode(), b('0\x08\x02\x02\x01\x80\x00\x02 \x00\x00'))
165 self.failIf(der.hasOnlyInts())
166
167 ####
168
169 def testDecode1(self):
170 # Empty sequence
171 der = DerSequence()
172 der.decode(b('0\x00'))
173 self.assertEquals(len(der),0)
174 # One single-byte integer (zero)
175 der.decode(b('0\x03\x02\x01\x00'))
176 self.assertEquals(len(der),1)
177 self.assertEquals(der[0],0)
178 # Invariant
179 der.decode(b('0\x03\x02\x01\x00'))
180 self.assertEquals(len(der),1)
181 self.assertEquals(der[0],0)
182
183 def testDecode2(self):
184 # One single-byte integer (non-zero)
185 der = DerSequence()
186 der.decode(b('0\x03\x02\x01\x7f'))
187 self.assertEquals(len(der),1)
188 self.assertEquals(der[0],127)
189
190 def testDecode3(self):
191 # One multi-byte integer (non-zero)
192 der = DerSequence()
193 der.decode(b('0\x04\x02\x02\x01\x80'))
194 self.assertEquals(len(der),1)
195 self.assertEquals(der[0],0x180L)
196
197 def testDecode4(self):
198 # One very long integer
199 der = DerSequence()
200 der.decode(b('0\x82\x01\x05')+
201 b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
202 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
203 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
204 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
205 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
206 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
207 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
208 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
209 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
210 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
211 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
212 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
213 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
214 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
215 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
216 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
217 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
218 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
219 b('\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
220 self.assertEquals(len(der),1)
221 self.assertEquals(der[0],2**2048)
222
223 def testDecode5(self):
224 # One single-byte integer (looks negative)
225 der = DerSequence()
226 der.decode(b('0\x04\x02\x02\x00\xff'))
227 self.assertEquals(len(der),1)
228 self.assertEquals(der[0],0xFFL)
229
230 def testDecode6(self):
231 # Two integers
232 der = DerSequence()
233 der.decode(b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff'))
234 self.assertEquals(len(der),2)
235 self.assertEquals(der[0],0x180L)
236 self.assertEquals(der[1],0xFFL)
237
238 def testDecode7(self):
239 # One integer and 2 other types
240 der = DerSequence()
241 der.decode(b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00'))
242 self.assertEquals(len(der),3)
243 self.assertEquals(der[0],0x180L)
244 self.assertEquals(der[1],b('\x24\x02\xb6\x63'))
245 self.assertEquals(der[2],b('\x12\x00'))
246
247 def testDecode8(self):
248 # Only 2 other types
249 der = DerSequence()
250 der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00'))
251 self.assertEquals(len(der),2)
252 self.assertEquals(der[0],b('\x24\x02\xb6\x63'))
253 self.assertEquals(der[1],b('\x12\x00'))
254
255 def testErrDecode1(self):
256 # Not a sequence
257 der = DerSequence()
258 self.assertRaises(ValueError, der.decode, b(''))
259 self.assertRaises(ValueError, der.decode, b('\x00'))
260 self.assertRaises(ValueError, der.decode, b('\x30'))
261
262 def testErrDecode2(self):
263 # Wrong payload type
264 der = DerSequence()
265 self.assertRaises(ValueError, der.decode, b('\x30\x00\x00'), Tru e)
266
267 def testErrDecode3(self):
268 # Wrong length format
269 der = DerSequence()
270 self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x01\x0 1\x00'))
271 self.assertRaises(ValueError, der.decode, b('\x30\x81\x03\x02\x0 1\x01'))
272 self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x81\x0 1\x01'))
273
274 def testErrDecode4(self):
275 # Wrong integer format
276 der = DerSequence()
277 # Multi-byte encoding for zero
278 #self.assertRaises(ValueError, der.decode, '\x30\x04\x02\x02\x00 \x00')
279 # Negative integer
280 self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x01\xF F'))
281
282 def get_tests(config={}):
283 from Crypto.SelfTest.st_common import list_test_cases
284 listTests = []
285 listTests += list_test_cases(DerObjectTests)
286 listTests += list_test_cases(DerSequenceTests)
287 return listTests
288
289 if __name__ == '__main__':
290 suite = lambda: unittest.TestSuite(get_tests())
291 unittest.main(defaultTest='suite')
292
293 # vim:set ts=4 sw=4 sts=4 expandtab:
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698