test_asn1.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. #
  2. # SelfTest/Util/test_asn.py: Self-test for the Cryptodome.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 Cryptodome.Util.asn1"""
  34. import unittest
  35. from Cryptodome.Util.py3compat import *
  36. from Cryptodome.Util.asn1 import (DerObject, DerSetOf, DerInteger,
  37. DerBitString,
  38. DerObjectId, DerNull, DerOctetString,
  39. DerSequence)
  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.assertEquals(der.encode(), b('\x02\x00'))
  51. # Small payload (primitive)
  52. der.payload = b('\x45')
  53. self.assertEquals(der.encode(), b('\x02\x01\x45'))
  54. # Invariant
  55. self.assertEquals(der.encode(), b('\x02\x01\x45'))
  56. # Initialize with numerical tag
  57. der = DerObject(0x04)
  58. der.payload = b('\x45')
  59. self.assertEquals(der.encode(), b('\x04\x01\x45'))
  60. # Initialize with constructed type
  61. der = DerObject(b('\x10'), constructed=True)
  62. self.assertEquals(der.encode(), b('\x30\x00'))
  63. def testObjEncode2(self):
  64. # Initialize with payload
  65. der = DerObject(0x03, b('\x12\x12'))
  66. self.assertEquals(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.assertEquals(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.assertEquals(der.encode(), b('\xa1\x04ppll'))
  77. # Implicit tags (primitive)
  78. der = DerObject(0x02, implicit=0x1E, constructed=False)
  79. der.payload = b('ppll')
  80. self.assertEquals(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.assertEquals(der.payload, b("\x01\x02"))
  92. self.assertEquals(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.assertEquals(der.payload, b("1")*128)
  98. self.assertEquals(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.assertEquals(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.assertEquals(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.assertEquals(der._tag_octet, 0x65)
  126. self.assertEquals(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.assertEquals(der._inner_tag_octet, 0x10)
  132. self.assertEquals(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.assertEquals(der._inner_tag_octet, 0x10)
  137. self.assertEquals(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.assertEquals(der.encode(), b('\x02\x01\x01'))
  146. def testEncode1(self):
  147. # Single-byte integers
  148. # Value 0
  149. der = DerInteger(0)
  150. self.assertEquals(der.encode(), b('\x02\x01\x00'))
  151. # Value 1
  152. der = DerInteger(1)
  153. self.assertEquals(der.encode(), b('\x02\x01\x01'))
  154. # Value 127
  155. der = DerInteger(127)
  156. self.assertEquals(der.encode(), b('\x02\x01\x7F'))
  157. def testEncode2(self):
  158. # Multi-byte integers
  159. # Value 128
  160. der = DerInteger(128)
  161. self.assertEquals(der.encode(), b('\x02\x02\x00\x80'))
  162. # Value 0x180
  163. der = DerInteger(0x180)
  164. self.assertEquals(der.encode(), b('\x02\x02\x01\x80'))
  165. # One very long integer
  166. der = DerInteger(2**2048)
  167. self.assertEquals(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.assertEquals(der.encode(), b('\x02\x01\xFF'))
  192. # Value -128
  193. der = DerInteger(-128)
  194. self.assertEquals(der.encode(), b('\x02\x01\x80'))
  195. # Value
  196. der = DerInteger(-87873)
  197. self.assertEquals(der.encode(), b('\x02\x03\xFE\xA8\xBF'))
  198. def testEncode4(self):
  199. # Explicit encoding
  200. number = DerInteger(0x34, explicit=3)
  201. self.assertEquals(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.assertEquals(der.value, 0)
  209. # Value 1
  210. der.decode(b('\x02\x01\x01'))
  211. self.assertEquals(der.value, 1)
  212. # Value 127
  213. der.decode(b('\x02\x01\x7F'))
  214. self.assertEquals(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.assertEquals(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.assertEquals(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.assertEquals(der.value, -1)
  249. # Value -32768
  250. der.decode(b('\x02\x02\x80\x00'))
  251. self.assertEquals(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.assertEquals(der.value, 1)
  258. # Redundant leading 0xFF
  259. der.decode(b('\x02\x02\xFF\xFF'))
  260. self.assertEquals(der.value, -1)
  261. # Empty payload
  262. der.decode(b('\x02\x00'))
  263. self.assertEquals(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.assertEquals(number.value, 0x34)
  269. def testDecode7(self):
  270. # Verify decode returns the DerInteger
  271. der = DerInteger()
  272. self.assertEquals(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.assertEquals(der.encode(), b('0\x08\x02\x01\x01\x02\x01\x020\x00'))
  289. def testEncode1(self):
  290. # Empty sequence
  291. der = DerSequence()
  292. self.assertEquals(der.encode(), b('0\x00'))
  293. self.failIf(der.hasOnlyInts())
  294. # One single-byte integer (zero)
  295. der.append(0)
  296. self.assertEquals(der.encode(), b('0\x03\x02\x01\x00'))
  297. self.assertEquals(der.hasInts(),1)
  298. self.assertEquals(der.hasInts(False),1)
  299. self.failUnless(der.hasOnlyInts())
  300. self.failUnless(der.hasOnlyInts(False))
  301. # Invariant
  302. self.assertEquals(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.assertEquals(len(der),1)
  309. self.assertEquals(der[0],1)
  310. self.assertEquals(der[-1],1)
  311. self.assertEquals(der.encode(), b('0\x03\x02\x01\x01'))
  312. #
  313. der[:] = [1]
  314. self.assertEquals(len(der),1)
  315. self.assertEquals(der[0],1)
  316. self.assertEquals(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.assertEquals(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.assertEquals(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.assertEquals(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.assertEquals(der.encode(), b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff'))
  357. self.failUnless(der.hasOnlyInts())
  358. self.failUnless(der.hasOnlyInts(False))
  359. # Two mixed integers
  360. der = DerSequence()
  361. der.append(2)
  362. der.append(-2)
  363. self.assertEquals(der.encode(), b('0\x06\x02\x01\x02\x02\x01\xFE'))
  364. self.assertEquals(der.hasInts(), 1)
  365. self.assertEquals(der.hasInts(False), 2)
  366. self.failIf(der.hasOnlyInts())
  367. self.failUnless(der.hasOnlyInts(False))
  368. #
  369. der.append(0x01)
  370. der[1:] = [9,8]
  371. self.assertEquals(len(der),3)
  372. self.assertEqual(der[1:],[9,8])
  373. self.assertEqual(der[1:-1],[9])
  374. self.assertEquals(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.assertEquals(der.encode(), b('0\x09\x02\x02\x01\x800\x03\x02\x01\x05'))
  381. self.failIf(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.assertEquals(der.encode(), b('0\x09\x02\x02\x01\x800\x03\x02\x01\x05'))
  388. self.failIf(der.hasOnlyInts())
  389. ####
  390. def testDecode1(self):
  391. # Empty sequence
  392. der = DerSequence()
  393. der.decode(b('0\x00'))
  394. self.assertEquals(len(der),0)
  395. # One single-byte integer (zero)
  396. der.decode(b('0\x03\x02\x01\x00'))
  397. self.assertEquals(len(der),1)
  398. self.assertEquals(der[0],0)
  399. # Invariant
  400. der.decode(b('0\x03\x02\x01\x00'))
  401. self.assertEquals(len(der),1)
  402. self.assertEquals(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.assertEquals(len(der),1)
  408. self.assertEquals(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.assertEquals(len(der),1)
  433. self.assertEquals(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.assertEquals(len(der),2)
  439. self.assertEquals(der[0],0x180)
  440. self.assertEquals(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.assertEquals(len(der),3)
  446. self.assertEquals(der[0],0x180)
  447. self.assertEquals(der[1],b('\x24\x02\xb6\x63'))
  448. self.assertEquals(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.assertEquals(len(der),2)
  454. self.assertEquals(der[0],b('\x24\x02\xb6\x63'))
  455. self.assertEquals(der[1],b('\x12\x00'))
  456. self.assertEquals(der.hasInts(), 0)
  457. self.assertEquals(der.hasInts(False), 0)
  458. self.failIf(der.hasOnlyInts())
  459. self.failIf(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.assertEquals(der.encode(), b('\x04\x01\xFF'))
  500. def testEncode1(self):
  501. # Empty sequence
  502. der = DerOctetString()
  503. self.assertEquals(der.encode(), b('\x04\x00'))
  504. # Small payload
  505. der.payload = b('\x01\x02')
  506. self.assertEquals(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.assertEquals(der.payload, b(''))
  513. # Small payload
  514. der.decode(b('\x04\x02\x01\x02'))
  515. self.assertEquals(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.assertEquals(der.encode(), b('\x05\x00'))
  528. ####
  529. def testDecode1(self):
  530. # Empty sequence
  531. der = DerNull()
  532. self.assertEquals(der, der.decode(b('\x05\x00')))
  533. class DerObjectIdTests(unittest.TestCase):
  534. def testInit1(self):
  535. der = DerObjectId("1.1")
  536. self.assertEquals(der.encode(), b('\x06\x01)'))
  537. def testEncode1(self):
  538. der = DerObjectId('1.2.840.113549.1.1.1')
  539. self.assertEquals(der.encode(), b('\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01'))
  540. #
  541. der = DerObjectId()
  542. der.value = '1.2.840.113549.1.1.1'
  543. self.assertEquals(der.encode(), b('\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01'))
  544. ####
  545. def testDecode1(self):
  546. # Empty sequence
  547. der = DerObjectId()
  548. der.decode(b('\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01'))
  549. self.assertEquals(der.value, '1.2.840.113549.1.1.1')
  550. def testDecode2(self):
  551. # Verify that decode returns the object
  552. der = DerObjectId()
  553. self.assertEquals(der,
  554. der.decode(b('\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01')))
  555. def testDecode3(self):
  556. der = DerObjectId()
  557. der.decode(b('\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x00\x01'))
  558. self.assertEquals(der.value, '1.2.840.113549.1.0.1')
  559. class DerBitStringTests(unittest.TestCase):
  560. def testInit1(self):
  561. der = DerBitString(b("\xFF"))
  562. self.assertEquals(der.encode(), b('\x03\x02\x00\xFF'))
  563. def testInit2(self):
  564. der = DerBitString(DerInteger(1))
  565. self.assertEquals(der.encode(), b('\x03\x04\x00\x02\x01\x01'))
  566. def testEncode1(self):
  567. # Empty sequence
  568. der = DerBitString()
  569. self.assertEquals(der.encode(), b('\x03\x01\x00'))
  570. # Small payload
  571. der = DerBitString(b('\x01\x02'))
  572. self.assertEquals(der.encode(), b('\x03\x03\x00\x01\x02'))
  573. # Small payload
  574. der = DerBitString()
  575. der.value = b('\x01\x02')
  576. self.assertEquals(der.encode(), b('\x03\x03\x00\x01\x02'))
  577. ####
  578. def testDecode1(self):
  579. # Empty sequence
  580. der = DerBitString()
  581. der.decode(b('\x03\x00'))
  582. self.assertEquals(der.value, b(''))
  583. # Small payload
  584. der.decode(b('\x03\x03\x00\x01\x02'))
  585. self.assertEquals(der.value, b('\x01\x02'))
  586. def testDecode2(self):
  587. # Verify that decode returns the object
  588. der = DerBitString()
  589. self.assertEquals(der, der.decode(b('\x03\x00')))
  590. class DerSetOfTests(unittest.TestCase):
  591. def testInit1(self):
  592. der = DerSetOf([DerInteger(1), DerInteger(2)])
  593. self.assertEquals(der.encode(), b('1\x06\x02\x01\x01\x02\x01\x02'))
  594. def testEncode1(self):
  595. # Empty set
  596. der = DerSetOf()
  597. self.assertEquals(der.encode(), b('1\x00'))
  598. # One single-byte integer (zero)
  599. der.add(0)
  600. self.assertEquals(der.encode(), b('1\x03\x02\x01\x00'))
  601. # Invariant
  602. self.assertEquals(der.encode(), b('1\x03\x02\x01\x00'))
  603. def testEncode2(self):
  604. # Two integers
  605. der = DerSetOf()
  606. der.add(0x180)
  607. der.add(0xFF)
  608. self.assertEquals(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80'))
  609. # Initialize with integers
  610. der = DerSetOf([0x180, 0xFF])
  611. self.assertEquals(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80'))
  612. def testEncode3(self):
  613. # One integer and another type (no matter what it is)
  614. der = DerSetOf()
  615. der.add(0x180)
  616. self.assertRaises(ValueError, der.add, b('\x00\x02\x00\x00'))
  617. def testEncode4(self):
  618. # Only non integers
  619. der = DerSetOf()
  620. der.add(b('\x01\x00'))
  621. der.add(b('\x01\x01\x01'))
  622. self.assertEquals(der.encode(), b('1\x05\x01\x00\x01\x01\x01'))
  623. ####
  624. def testDecode1(self):
  625. # Empty sequence
  626. der = DerSetOf()
  627. der.decode(b('1\x00'))
  628. self.assertEquals(len(der),0)
  629. # One single-byte integer (zero)
  630. der.decode(b('1\x03\x02\x01\x00'))
  631. self.assertEquals(len(der),1)
  632. self.assertEquals(list(der),[0])
  633. def testDecode2(self):
  634. # Two integers
  635. der = DerSetOf()
  636. der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff'))
  637. self.assertEquals(len(der),2)
  638. l = list(der)
  639. self.failUnless(0x180 in l)
  640. self.failUnless(0xFF in l)
  641. def testDecode3(self):
  642. # One integer and 2 other types
  643. der = DerSetOf()
  644. #import pdb; pdb.set_trace()
  645. self.assertRaises(ValueError, der.decode,
  646. b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00'))
  647. def testDecode4(self):
  648. # Verify that decode returns the object
  649. der = DerSetOf()
  650. self.assertEquals(der,
  651. der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff')))
  652. ###
  653. def testErrDecode1(self):
  654. # No leftovers allowed
  655. der = DerSetOf()
  656. self.assertRaises(ValueError, der.decode,
  657. b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff\xAA'))
  658. def get_tests(config={}):
  659. from Cryptodome.SelfTest.st_common import list_test_cases
  660. listTests = []
  661. listTests += list_test_cases(DerObjectTests)
  662. listTests += list_test_cases(DerIntegerTests)
  663. listTests += list_test_cases(DerSequenceTests)
  664. listTests += list_test_cases(DerOctetStringTests)
  665. listTests += list_test_cases(DerNullTests)
  666. listTests += list_test_cases(DerObjectIdTests)
  667. listTests += list_test_cases(DerBitStringTests)
  668. listTests += list_test_cases(DerSetOfTests)
  669. return listTests
  670. if __name__ == '__main__':
  671. suite = lambda: unittest.TestSuite(get_tests())
  672. unittest.main(defaultTest='suite')
  673. # vim:set ts=4 sw=4 sts=4 expandtab: