test_asn1.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  1. #
  2. # SelfTest/Util/test_asn.py: Self-test for the Crypto.Util.asn1 module
  3. #
  4. # ===================================================================
  5. #
  6. # Copyright (c) 2014, Legrandin <helderijs@gmail.com>
  7. # All rights reserved.
  8. #
  9. # Redistribution and use in source and binary forms, with or without
  10. # modification, are permitted provided that the following conditions
  11. # are met:
  12. #
  13. # 1. Redistributions of source code must retain the above copyright
  14. # notice, this list of conditions and the following disclaimer.
  15. # 2. Redistributions in binary form must reproduce the above copyright
  16. # notice, this list of conditions and the following disclaimer in
  17. # the documentation and/or other materials provided with the
  18. # distribution.
  19. #
  20. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  23. # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  24. # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  25. # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  26. # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  27. # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  28. # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  30. # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  31. # POSSIBILITY OF SUCH DAMAGE.
  32. # ===================================================================
  33. """Self-tests for Crypto.Util.asn1"""
  34. import unittest
  35. from Crypto.Util.py3compat import *
  36. from Crypto.Util.asn1 import (DerObject, DerSetOf, DerInteger,
  37. DerBitString,
  38. DerObjectId, DerNull, DerOctetString,
  39. DerSequence, DerBoolean)
  40. class DerObjectTests(unittest.TestCase):
  41. def testObjInit1(self):
  42. # Fail with invalid tag format (must be 1 byte)
  43. self.assertRaises(ValueError, DerObject, b('\x00\x99'))
  44. # Fail with invalid implicit tag (must be <0x1F)
  45. self.assertRaises(ValueError, DerObject, 0x1F)
  46. # ------
  47. def testObjEncode1(self):
  48. # No payload
  49. der = DerObject(b('\x02'))
  50. self.assertEqual(der.encode(), b('\x02\x00'))
  51. # Small payload (primitive)
  52. der.payload = b('\x45')
  53. self.assertEqual(der.encode(), b('\x02\x01\x45'))
  54. # Invariant
  55. self.assertEqual(der.encode(), b('\x02\x01\x45'))
  56. # Initialize with numerical tag
  57. der = DerObject(0x04)
  58. der.payload = b('\x45')
  59. self.assertEqual(der.encode(), b('\x04\x01\x45'))
  60. # Initialize with constructed type
  61. der = DerObject(b('\x10'), constructed=True)
  62. self.assertEqual(der.encode(), b('\x30\x00'))
  63. def testObjEncode2(self):
  64. # Initialize with payload
  65. der = DerObject(0x03, b('\x12\x12'))
  66. self.assertEqual(der.encode(), b('\x03\x02\x12\x12'))
  67. def testObjEncode3(self):
  68. # Long payload
  69. der = DerObject(b('\x10'))
  70. der.payload = b("0")*128
  71. self.assertEqual(der.encode(), b('\x10\x81\x80' + "0"*128))
  72. def testObjEncode4(self):
  73. # Implicit tags (constructed)
  74. der = DerObject(0x10, implicit=1, constructed=True)
  75. der.payload = b('ppll')
  76. self.assertEqual(der.encode(), b('\xa1\x04ppll'))
  77. # Implicit tags (primitive)
  78. der = DerObject(0x02, implicit=0x1E, constructed=False)
  79. der.payload = b('ppll')
  80. self.assertEqual(der.encode(), b('\x9E\x04ppll'))
  81. def testObjEncode5(self):
  82. # Encode type with explicit tag
  83. der = DerObject(0x10, explicit=5)
  84. der.payload = b("xxll")
  85. self.assertEqual(der.encode(), b("\xa5\x06\x10\x04xxll"))
  86. # -----
  87. def testObjDecode1(self):
  88. # Decode short payload
  89. der = DerObject(0x02)
  90. der.decode(b('\x02\x02\x01\x02'))
  91. self.assertEqual(der.payload, b("\x01\x02"))
  92. self.assertEqual(der._tag_octet, 0x02)
  93. def testObjDecode2(self):
  94. # Decode long payload
  95. der = DerObject(0x02)
  96. der.decode(b('\x02\x81\x80' + "1"*128))
  97. self.assertEqual(der.payload, b("1")*128)
  98. self.assertEqual(der._tag_octet, 0x02)
  99. def testObjDecode3(self):
  100. # Decode payload with too much data gives error
  101. der = DerObject(0x02)
  102. self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02\xFF'))
  103. # Decode payload with too little data gives error
  104. der = DerObject(0x02)
  105. self.assertRaises(ValueError, der.decode, b('\x02\x02\x01'))
  106. def testObjDecode4(self):
  107. # Decode implicit tag (primitive)
  108. der = DerObject(0x02, constructed=False, implicit=0xF)
  109. self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02'))
  110. der.decode(b('\x8F\x01\x00'))
  111. self.assertEqual(der.payload, b('\x00'))
  112. # Decode implicit tag (constructed)
  113. der = DerObject(0x02, constructed=True, implicit=0xF)
  114. self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02'))
  115. der.decode(b('\xAF\x01\x00'))
  116. self.assertEqual(der.payload, b('\x00'))
  117. def testObjDecode5(self):
  118. # Decode payload with unexpected tag gives error
  119. der = DerObject(0x02)
  120. self.assertRaises(ValueError, der.decode, b('\x03\x02\x01\x02'))
  121. def testObjDecode6(self):
  122. # Arbitrary DER object
  123. der = DerObject()
  124. der.decode(b('\x65\x01\x88'))
  125. self.assertEqual(der._tag_octet, 0x65)
  126. self.assertEqual(der.payload, b('\x88'))
  127. def testObjDecode7(self):
  128. # Decode explicit tag
  129. der = DerObject(0x10, explicit=5)
  130. der.decode(b("\xa5\x06\x10\x04xxll"))
  131. self.assertEqual(der._inner_tag_octet, 0x10)
  132. self.assertEqual(der.payload, b('xxll'))
  133. # Explicit tag may be 0
  134. der = DerObject(0x10, explicit=0)
  135. der.decode(b("\xa0\x06\x10\x04xxll"))
  136. self.assertEqual(der._inner_tag_octet, 0x10)
  137. self.assertEqual(der.payload, b('xxll'))
  138. def testObjDecode8(self):
  139. # Verify that decode returns the object
  140. der = DerObject(0x02)
  141. self.assertEqual(der, der.decode(b('\x02\x02\x01\x02')))
  142. class DerIntegerTests(unittest.TestCase):
  143. def testInit1(self):
  144. der = DerInteger(1)
  145. self.assertEqual(der.encode(), b('\x02\x01\x01'))
  146. def testEncode1(self):
  147. # Single-byte integers
  148. # Value 0
  149. der = DerInteger(0)
  150. self.assertEqual(der.encode(), b('\x02\x01\x00'))
  151. # Value 1
  152. der = DerInteger(1)
  153. self.assertEqual(der.encode(), b('\x02\x01\x01'))
  154. # Value 127
  155. der = DerInteger(127)
  156. self.assertEqual(der.encode(), b('\x02\x01\x7F'))
  157. def testEncode2(self):
  158. # Multi-byte integers
  159. # Value 128
  160. der = DerInteger(128)
  161. self.assertEqual(der.encode(), b('\x02\x02\x00\x80'))
  162. # Value 0x180
  163. der = DerInteger(0x180)
  164. self.assertEqual(der.encode(), b('\x02\x02\x01\x80'))
  165. # One very long integer
  166. der = DerInteger(2**2048)
  167. self.assertEqual(der.encode(),
  168. b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  169. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  170. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  171. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  172. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  173. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  174. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  175. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  176. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  177. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  178. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  179. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  180. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  181. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  182. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  183. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  184. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  185. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  186. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
  187. def testEncode3(self):
  188. # Negative integers
  189. # Value -1
  190. der = DerInteger(-1)
  191. self.assertEqual(der.encode(), b('\x02\x01\xFF'))
  192. # Value -128
  193. der = DerInteger(-128)
  194. self.assertEqual(der.encode(), b('\x02\x01\x80'))
  195. # Value
  196. der = DerInteger(-87873)
  197. self.assertEqual(der.encode(), b('\x02\x03\xFE\xA8\xBF'))
  198. def testEncode4(self):
  199. # Explicit encoding
  200. number = DerInteger(0x34, explicit=3)
  201. self.assertEqual(number.encode(), b('\xa3\x03\x02\x01\x34'))
  202. # -----
  203. def testDecode1(self):
  204. # Single-byte integer
  205. der = DerInteger()
  206. # Value 0
  207. der.decode(b('\x02\x01\x00'))
  208. self.assertEqual(der.value, 0)
  209. # Value 1
  210. der.decode(b('\x02\x01\x01'))
  211. self.assertEqual(der.value, 1)
  212. # Value 127
  213. der.decode(b('\x02\x01\x7F'))
  214. self.assertEqual(der.value, 127)
  215. def testDecode2(self):
  216. # Multi-byte integer
  217. der = DerInteger()
  218. # Value 0x180L
  219. der.decode(b('\x02\x02\x01\x80'))
  220. self.assertEqual(der.value,0x180)
  221. # One very long integer
  222. der.decode(
  223. b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  224. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  225. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  226. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  227. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  228. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  229. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  230. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  231. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  232. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  233. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  234. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  235. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  236. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  237. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  238. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  239. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  240. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  241. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
  242. self.assertEqual(der.value,2**2048)
  243. def testDecode3(self):
  244. # Negative integer
  245. der = DerInteger()
  246. # Value -1
  247. der.decode(b('\x02\x01\xFF'))
  248. self.assertEqual(der.value, -1)
  249. # Value -32768
  250. der.decode(b('\x02\x02\x80\x00'))
  251. self.assertEqual(der.value, -32768)
  252. def testDecode5(self):
  253. # We still accept BER integer format
  254. der = DerInteger()
  255. # Redundant leading zeroes
  256. der.decode(b('\x02\x02\x00\x01'))
  257. self.assertEqual(der.value, 1)
  258. # Redundant leading 0xFF
  259. der.decode(b('\x02\x02\xFF\xFF'))
  260. self.assertEqual(der.value, -1)
  261. # Empty payload
  262. der.decode(b('\x02\x00'))
  263. self.assertEqual(der.value, 0)
  264. def testDecode6(self):
  265. # Explicit encoding
  266. number = DerInteger(explicit=3)
  267. number.decode(b('\xa3\x03\x02\x01\x34'))
  268. self.assertEqual(number.value, 0x34)
  269. def testDecode7(self):
  270. # Verify decode returns the DerInteger
  271. der = DerInteger()
  272. self.assertEqual(der, der.decode(b('\x02\x01\x7F')))
  273. ###
  274. def testStrict1(self):
  275. number = DerInteger()
  276. number.decode(b'\x02\x02\x00\x01')
  277. number.decode(b'\x02\x02\x00\x7F')
  278. self.assertRaises(ValueError, number.decode, b'\x02\x02\x00\x01', strict=True)
  279. self.assertRaises(ValueError, number.decode, b'\x02\x02\x00\x7F', strict=True)
  280. ###
  281. def testErrDecode1(self):
  282. # Wide length field
  283. der = DerInteger()
  284. self.assertRaises(ValueError, der.decode, b('\x02\x81\x01\x01'))
  285. class DerSequenceTests(unittest.TestCase):
  286. def testInit1(self):
  287. der = DerSequence([1, DerInteger(2), b('0\x00')])
  288. self.assertEqual(der.encode(), b('0\x08\x02\x01\x01\x02\x01\x020\x00'))
  289. def testEncode1(self):
  290. # Empty sequence
  291. der = DerSequence()
  292. self.assertEqual(der.encode(), b('0\x00'))
  293. self.assertFalse(der.hasOnlyInts())
  294. # One single-byte integer (zero)
  295. der.append(0)
  296. self.assertEqual(der.encode(), b('0\x03\x02\x01\x00'))
  297. self.assertEqual(der.hasInts(),1)
  298. self.assertEqual(der.hasInts(False),1)
  299. self.assertTrue(der.hasOnlyInts())
  300. self.assertTrue(der.hasOnlyInts(False))
  301. # Invariant
  302. self.assertEqual(der.encode(), b('0\x03\x02\x01\x00'))
  303. def testEncode2(self):
  304. # Indexing
  305. der = DerSequence()
  306. der.append(0)
  307. der[0] = 1
  308. self.assertEqual(len(der),1)
  309. self.assertEqual(der[0],1)
  310. self.assertEqual(der[-1],1)
  311. self.assertEqual(der.encode(), b('0\x03\x02\x01\x01'))
  312. #
  313. der[:] = [1]
  314. self.assertEqual(len(der),1)
  315. self.assertEqual(der[0],1)
  316. self.assertEqual(der.encode(), b('0\x03\x02\x01\x01'))
  317. def testEncode3(self):
  318. # One multi-byte integer (non-zero)
  319. der = DerSequence()
  320. der.append(0x180)
  321. self.assertEqual(der.encode(), b('0\x04\x02\x02\x01\x80'))
  322. def testEncode4(self):
  323. # One very long integer
  324. der = DerSequence()
  325. der.append(2**2048)
  326. self.assertEqual(der.encode(), b('0\x82\x01\x05')+
  327. b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  328. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  329. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  330. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  331. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  332. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  333. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  334. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  335. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  336. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  337. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  338. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  339. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  340. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  341. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  342. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  343. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  344. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  345. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
  346. def testEncode5(self):
  347. der = DerSequence()
  348. der += 1
  349. der += b('\x30\x00')
  350. self.assertEqual(der.encode(), b('\x30\x05\x02\x01\x01\x30\x00'))
  351. def testEncode6(self):
  352. # Two positive integers
  353. der = DerSequence()
  354. der.append(0x180)
  355. der.append(0xFF)
  356. self.assertEqual(der.encode(), b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff'))
  357. self.assertTrue(der.hasOnlyInts())
  358. self.assertTrue(der.hasOnlyInts(False))
  359. # Two mixed integers
  360. der = DerSequence()
  361. der.append(2)
  362. der.append(-2)
  363. self.assertEqual(der.encode(), b('0\x06\x02\x01\x02\x02\x01\xFE'))
  364. self.assertEqual(der.hasInts(), 1)
  365. self.assertEqual(der.hasInts(False), 2)
  366. self.assertFalse(der.hasOnlyInts())
  367. self.assertTrue(der.hasOnlyInts(False))
  368. #
  369. der.append(0x01)
  370. der[1:] = [9,8]
  371. self.assertEqual(len(der),3)
  372. self.assertEqual(der[1:],[9,8])
  373. self.assertEqual(der[1:-1],[9])
  374. self.assertEqual(der.encode(), b('0\x09\x02\x01\x02\x02\x01\x09\x02\x01\x08'))
  375. def testEncode7(self):
  376. # One integer and another type (already encoded)
  377. der = DerSequence()
  378. der.append(0x180)
  379. der.append(b('0\x03\x02\x01\x05'))
  380. self.assertEqual(der.encode(), b('0\x09\x02\x02\x01\x800\x03\x02\x01\x05'))
  381. self.assertFalse(der.hasOnlyInts())
  382. def testEncode8(self):
  383. # One integer and another type (yet to encode)
  384. der = DerSequence()
  385. der.append(0x180)
  386. der.append(DerSequence([5]))
  387. self.assertEqual(der.encode(), b('0\x09\x02\x02\x01\x800\x03\x02\x01\x05'))
  388. self.assertFalse(der.hasOnlyInts())
  389. ####
  390. def testDecode1(self):
  391. # Empty sequence
  392. der = DerSequence()
  393. der.decode(b('0\x00'))
  394. self.assertEqual(len(der),0)
  395. # One single-byte integer (zero)
  396. der.decode(b('0\x03\x02\x01\x00'))
  397. self.assertEqual(len(der),1)
  398. self.assertEqual(der[0],0)
  399. # Invariant
  400. der.decode(b('0\x03\x02\x01\x00'))
  401. self.assertEqual(len(der),1)
  402. self.assertEqual(der[0],0)
  403. def testDecode2(self):
  404. # One single-byte integer (non-zero)
  405. der = DerSequence()
  406. der.decode(b('0\x03\x02\x01\x7f'))
  407. self.assertEqual(len(der),1)
  408. self.assertEqual(der[0],127)
  409. def testDecode4(self):
  410. # One very long integer
  411. der = DerSequence()
  412. der.decode(b('0\x82\x01\x05')+
  413. b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  414. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  415. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  416. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  417. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  418. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  419. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  420. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  421. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  422. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  423. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  424. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  425. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  426. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  427. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  428. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  429. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  430. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  431. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
  432. self.assertEqual(len(der),1)
  433. self.assertEqual(der[0],2**2048)
  434. def testDecode6(self):
  435. # Two integers
  436. der = DerSequence()
  437. der.decode(b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff'))
  438. self.assertEqual(len(der),2)
  439. self.assertEqual(der[0],0x180)
  440. self.assertEqual(der[1],0xFF)
  441. def testDecode7(self):
  442. # One integer and 2 other types
  443. der = DerSequence()
  444. der.decode(b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00'))
  445. self.assertEqual(len(der),3)
  446. self.assertEqual(der[0],0x180)
  447. self.assertEqual(der[1],b('\x24\x02\xb6\x63'))
  448. self.assertEqual(der[2],b('\x12\x00'))
  449. def testDecode8(self):
  450. # Only 2 other types
  451. der = DerSequence()
  452. der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00'))
  453. self.assertEqual(len(der),2)
  454. self.assertEqual(der[0],b('\x24\x02\xb6\x63'))
  455. self.assertEqual(der[1],b('\x12\x00'))
  456. self.assertEqual(der.hasInts(), 0)
  457. self.assertEqual(der.hasInts(False), 0)
  458. self.assertFalse(der.hasOnlyInts())
  459. self.assertFalse(der.hasOnlyInts(False))
  460. def testDecode9(self):
  461. # Verify that decode returns itself
  462. der = DerSequence()
  463. self.assertEqual(der, der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00')))
  464. ###
  465. def testErrDecode1(self):
  466. # Not a sequence
  467. der = DerSequence()
  468. self.assertRaises(ValueError, der.decode, b(''))
  469. self.assertRaises(ValueError, der.decode, b('\x00'))
  470. self.assertRaises(ValueError, der.decode, b('\x30'))
  471. def testErrDecode2(self):
  472. der = DerSequence()
  473. # Too much data
  474. self.assertRaises(ValueError, der.decode, b('\x30\x00\x00'))
  475. def testErrDecode3(self):
  476. # Wrong length format
  477. der = DerSequence()
  478. # Missing length in sub-item
  479. self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x01\x01\x00'))
  480. # Valid BER, but invalid DER length
  481. self.assertRaises(ValueError, der.decode, b('\x30\x81\x03\x02\x01\x01'))
  482. self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x81\x01\x01'))
  483. def test_expected_nr_elements(self):
  484. der_bin = DerSequence([1, 2, 3]).encode()
  485. DerSequence().decode(der_bin, nr_elements=3)
  486. DerSequence().decode(der_bin, nr_elements=(2,3))
  487. self.assertRaises(ValueError, DerSequence().decode, der_bin, nr_elements=1)
  488. self.assertRaises(ValueError, DerSequence().decode, der_bin, nr_elements=(4,5))
  489. def test_expected_only_integers(self):
  490. der_bin1 = DerSequence([1, 2, 3]).encode()
  491. der_bin2 = DerSequence([1, 2, DerSequence([3, 4])]).encode()
  492. DerSequence().decode(der_bin1, only_ints_expected=True)
  493. DerSequence().decode(der_bin1, only_ints_expected=False)
  494. DerSequence().decode(der_bin2, only_ints_expected=False)
  495. self.assertRaises(ValueError, DerSequence().decode, der_bin2, only_ints_expected=True)
  496. class DerOctetStringTests(unittest.TestCase):
  497. def testInit1(self):
  498. der = DerOctetString(b('\xFF'))
  499. self.assertEqual(der.encode(), b('\x04\x01\xFF'))
  500. def testEncode1(self):
  501. # Empty sequence
  502. der = DerOctetString()
  503. self.assertEqual(der.encode(), b('\x04\x00'))
  504. # Small payload
  505. der.payload = b('\x01\x02')
  506. self.assertEqual(der.encode(), b('\x04\x02\x01\x02'))
  507. ####
  508. def testDecode1(self):
  509. # Empty sequence
  510. der = DerOctetString()
  511. der.decode(b('\x04\x00'))
  512. self.assertEqual(der.payload, b(''))
  513. # Small payload
  514. der.decode(b('\x04\x02\x01\x02'))
  515. self.assertEqual(der.payload, b('\x01\x02'))
  516. def testDecode2(self):
  517. # Verify that decode returns the object
  518. der = DerOctetString()
  519. self.assertEqual(der, der.decode(b('\x04\x00')))
  520. def testErrDecode1(self):
  521. # No leftovers allowed
  522. der = DerOctetString()
  523. self.assertRaises(ValueError, der.decode, b('\x04\x01\x01\xff'))
  524. class DerNullTests(unittest.TestCase):
  525. def testEncode1(self):
  526. der = DerNull()
  527. self.assertEqual(der.encode(), b('\x05\x00'))
  528. ####
  529. def testDecode1(self):
  530. # Empty sequence
  531. der = DerNull()
  532. self.assertEqual(der, der.decode(b('\x05\x00')))
  533. class DerObjectIdTests(unittest.TestCase):
  534. def testInit1(self):
  535. der = DerObjectId("1.1")
  536. self.assertEqual(der.encode(), b'\x06\x01)')
  537. def testEncode1(self):
  538. der = DerObjectId('1.2.840.113549.1.1.1')
  539. self.assertEqual(der.encode(), b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01')
  540. der = DerObjectId()
  541. der.value = '1.2.840.113549.1.1.1'
  542. self.assertEqual(der.encode(), b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01')
  543. der = DerObjectId('2.999.1234')
  544. self.assertEqual(der.encode(), b'\x06\x04\x88\x37\x89\x52')
  545. def testEncode2(self):
  546. der = DerObjectId('3.4')
  547. self.assertRaises(ValueError, der.encode)
  548. der = DerObjectId('1.40')
  549. self.assertRaises(ValueError, der.encode)
  550. ####
  551. def testDecode1(self):
  552. # Empty sequence
  553. der = DerObjectId()
  554. der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01')
  555. self.assertEqual(der.value, '1.2.840.113549.1.1.1')
  556. def testDecode2(self):
  557. # Verify that decode returns the object
  558. der = DerObjectId()
  559. self.assertEqual(der,
  560. der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01'))
  561. def testDecode3(self):
  562. der = DerObjectId()
  563. der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x00\x01')
  564. self.assertEqual(der.value, '1.2.840.113549.1.0.1')
  565. def testDecode4(self):
  566. der = DerObjectId()
  567. der.decode(b'\x06\x04\x88\x37\x89\x52')
  568. self.assertEqual(der.value, '2.999.1234')
  569. class DerBitStringTests(unittest.TestCase):
  570. def testInit1(self):
  571. der = DerBitString(b("\xFF"))
  572. self.assertEqual(der.encode(), b('\x03\x02\x00\xFF'))
  573. def testInit2(self):
  574. der = DerBitString(DerInteger(1))
  575. self.assertEqual(der.encode(), b('\x03\x04\x00\x02\x01\x01'))
  576. def testEncode1(self):
  577. # Empty sequence
  578. der = DerBitString()
  579. self.assertEqual(der.encode(), b('\x03\x01\x00'))
  580. # Small payload
  581. der = DerBitString(b('\x01\x02'))
  582. self.assertEqual(der.encode(), b('\x03\x03\x00\x01\x02'))
  583. # Small payload
  584. der = DerBitString()
  585. der.value = b('\x01\x02')
  586. self.assertEqual(der.encode(), b('\x03\x03\x00\x01\x02'))
  587. ####
  588. def testDecode1(self):
  589. # Empty sequence
  590. der = DerBitString()
  591. der.decode(b('\x03\x00'))
  592. self.assertEqual(der.value, b(''))
  593. # Small payload
  594. der.decode(b('\x03\x03\x00\x01\x02'))
  595. self.assertEqual(der.value, b('\x01\x02'))
  596. def testDecode2(self):
  597. # Verify that decode returns the object
  598. der = DerBitString()
  599. self.assertEqual(der, der.decode(b('\x03\x00')))
  600. class DerSetOfTests(unittest.TestCase):
  601. def testInit1(self):
  602. der = DerSetOf([DerInteger(1), DerInteger(2)])
  603. self.assertEqual(der.encode(), b('1\x06\x02\x01\x01\x02\x01\x02'))
  604. def testEncode1(self):
  605. # Empty set
  606. der = DerSetOf()
  607. self.assertEqual(der.encode(), b('1\x00'))
  608. # One single-byte integer (zero)
  609. der.add(0)
  610. self.assertEqual(der.encode(), b('1\x03\x02\x01\x00'))
  611. # Invariant
  612. self.assertEqual(der.encode(), b('1\x03\x02\x01\x00'))
  613. def testEncode2(self):
  614. # Two integers
  615. der = DerSetOf()
  616. der.add(0x180)
  617. der.add(0xFF)
  618. self.assertEqual(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80'))
  619. # Initialize with integers
  620. der = DerSetOf([0x180, 0xFF])
  621. self.assertEqual(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80'))
  622. def testEncode3(self):
  623. # One integer and another type (no matter what it is)
  624. der = DerSetOf()
  625. der.add(0x180)
  626. self.assertRaises(ValueError, der.add, b('\x00\x02\x00\x00'))
  627. def testEncode4(self):
  628. # Only non integers
  629. der = DerSetOf()
  630. der.add(b('\x01\x00'))
  631. der.add(b('\x01\x01\x01'))
  632. self.assertEqual(der.encode(), b('1\x05\x01\x00\x01\x01\x01'))
  633. ####
  634. def testDecode1(self):
  635. # Empty sequence
  636. der = DerSetOf()
  637. der.decode(b('1\x00'))
  638. self.assertEqual(len(der),0)
  639. # One single-byte integer (zero)
  640. der.decode(b('1\x03\x02\x01\x00'))
  641. self.assertEqual(len(der),1)
  642. self.assertEqual(list(der),[0])
  643. def testDecode2(self):
  644. # Two integers
  645. der = DerSetOf()
  646. der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff'))
  647. self.assertEqual(len(der),2)
  648. l = list(der)
  649. self.assertTrue(0x180 in l)
  650. self.assertTrue(0xFF in l)
  651. def testDecode3(self):
  652. # One integer and 2 other types
  653. der = DerSetOf()
  654. #import pdb; pdb.set_trace()
  655. self.assertRaises(ValueError, der.decode,
  656. b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00'))
  657. def testDecode4(self):
  658. # Verify that decode returns the object
  659. der = DerSetOf()
  660. self.assertEqual(der,
  661. der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff')))
  662. ###
  663. def testErrDecode1(self):
  664. # No leftovers allowed
  665. der = DerSetOf()
  666. self.assertRaises(ValueError, der.decode,
  667. b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff\xAA'))
  668. class DerBooleanTests(unittest.TestCase):
  669. def testEncode1(self):
  670. der = DerBoolean(False)
  671. self.assertEqual(der.encode(), b'\x01\x01\x00')
  672. def testEncode2(self):
  673. der = DerBoolean(True)
  674. self.assertEqual(der.encode(), b'\x01\x01\xFF')
  675. def testEncode3(self):
  676. der = DerBoolean(False, implicit=0x12)
  677. self.assertEqual(der.encode(), b'\x92\x01\x00')
  678. def testEncode4(self):
  679. der = DerBoolean(False, explicit=0x05)
  680. self.assertEqual(der.encode(), b'\xA5\x03\x01\x01\x00')
  681. ####
  682. def testDecode1(self):
  683. der = DerBoolean()
  684. der.decode(b'\x01\x01\x00')
  685. self.assertEqual(der.value, False)
  686. def testDecode2(self):
  687. der = DerBoolean()
  688. der.decode(b'\x01\x01\xFF')
  689. self.assertEqual(der.value, True)
  690. def testDecode3(self):
  691. der = DerBoolean(implicit=0x12)
  692. der.decode(b'\x92\x01\x00')
  693. self.assertEqual(der.value, False)
  694. def testDecode4(self):
  695. der = DerBoolean(explicit=0x05)
  696. der.decode(b'\xA5\x03\x01\x01\x00')
  697. self.assertEqual(der.value, False)
  698. def testErrorDecode1(self):
  699. der = DerBoolean()
  700. # Wrong tag
  701. self.assertRaises(ValueError, der.decode, b'\x02\x01\x00')
  702. def testErrorDecode2(self):
  703. der = DerBoolean()
  704. # Payload too long
  705. self.assertRaises(ValueError, der.decode, b'\x01\x01\x00\xFF')
  706. def get_tests(config={}):
  707. from Crypto.SelfTest.st_common import list_test_cases
  708. listTests = []
  709. listTests += list_test_cases(DerObjectTests)
  710. listTests += list_test_cases(DerIntegerTests)
  711. listTests += list_test_cases(DerSequenceTests)
  712. listTests += list_test_cases(DerOctetStringTests)
  713. listTests += list_test_cases(DerNullTests)
  714. listTests += list_test_cases(DerObjectIdTests)
  715. listTests += list_test_cases(DerBitStringTests)
  716. listTests += list_test_cases(DerSetOfTests)
  717. listTests += list_test_cases(DerBooleanTests)
  718. return listTests
  719. if __name__ == '__main__':
  720. suite = lambda: unittest.TestSuite(get_tests())
  721. unittest.main(defaultTest='suite')
  722. # vim:set ts=4 sw=4 sts=4 expandtab: