test_asn1.py 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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. """Self-tests for Crypto.Util.asn1"""
  23. __revision__ = "$Id$"
  24. import unittest
  25. import sys
  26. from Crypto.Util.py3compat import *
  27. from Crypto.Util.asn1 import DerSequence, DerObject
  28. class DerObjectTests(unittest.TestCase):
  29. def testObjEncode1(self):
  30. # No payload
  31. der = DerObject(b('\x33'))
  32. self.assertEquals(der.encode(), b('\x33\x00'))
  33. # Small payload
  34. der.payload = b('\x45')
  35. self.assertEquals(der.encode(), b('\x33\x01\x45'))
  36. # Invariant
  37. self.assertEquals(der.encode(), b('\x33\x01\x45'))
  38. # Initialize with numerical tag
  39. der = DerObject(b(0x33))
  40. der.payload = b('\x45')
  41. self.assertEquals(der.encode(), b('\x33\x01\x45'))
  42. def testObjEncode2(self):
  43. # Known types
  44. der = DerObject('SEQUENCE')
  45. self.assertEquals(der.encode(), b('\x30\x00'))
  46. der = DerObject('BIT STRING')
  47. self.assertEquals(der.encode(), b('\x03\x00'))
  48. def testObjEncode3(self):
  49. # Long payload
  50. der = DerObject(b('\x34'))
  51. der.payload = b("0")*128
  52. self.assertEquals(der.encode(), b('\x34\x81\x80' + "0"*128))
  53. def testObjDecode1(self):
  54. # Decode short payload
  55. der = DerObject()
  56. der.decode(b('\x20\x02\x01\x02'))
  57. self.assertEquals(der.payload, b("\x01\x02"))
  58. self.assertEquals(der.typeTag, 0x20)
  59. def testObjDecode2(self):
  60. # Decode short payload
  61. der = DerObject()
  62. der.decode(b('\x22\x81\x80' + "1"*128))
  63. self.assertEquals(der.payload, b("1")*128)
  64. self.assertEquals(der.typeTag, 0x22)
  65. class DerSequenceTests(unittest.TestCase):
  66. def testEncode1(self):
  67. # Empty sequence
  68. der = DerSequence()
  69. self.assertEquals(der.encode(), b('0\x00'))
  70. self.failIf(der.hasOnlyInts())
  71. # One single-byte integer (zero)
  72. der.append(0)
  73. self.assertEquals(der.encode(), b('0\x03\x02\x01\x00'))
  74. self.failUnless(der.hasOnlyInts())
  75. # Invariant
  76. self.assertEquals(der.encode(), b('0\x03\x02\x01\x00'))
  77. def testEncode2(self):
  78. # One single-byte integer (non-zero)
  79. der = DerSequence()
  80. der.append(127)
  81. self.assertEquals(der.encode(), b('0\x03\x02\x01\x7f'))
  82. # Indexing
  83. der[0] = 1
  84. self.assertEquals(len(der),1)
  85. self.assertEquals(der[0],1)
  86. self.assertEquals(der[-1],1)
  87. self.assertEquals(der.encode(), b('0\x03\x02\x01\x01'))
  88. #
  89. der[:] = [1]
  90. self.assertEquals(len(der),1)
  91. self.assertEquals(der[0],1)
  92. self.assertEquals(der.encode(), b('0\x03\x02\x01\x01'))
  93. def testEncode3(self):
  94. # One multi-byte integer (non-zero)
  95. der = DerSequence()
  96. der.append(0x180L)
  97. self.assertEquals(der.encode(), b('0\x04\x02\x02\x01\x80'))
  98. def testEncode4(self):
  99. # One very long integer
  100. der = DerSequence()
  101. der.append(2**2048)
  102. self.assertEquals(der.encode(), b('0\x82\x01\x05')+
  103. b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  104. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  105. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  106. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  107. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  108. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  109. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  110. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  111. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  112. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  113. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  114. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  115. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  116. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  117. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  118. b('\x00\x00\x00\x00\x00\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'))
  122. def testEncode5(self):
  123. # One single-byte integer (looks negative)
  124. der = DerSequence()
  125. der.append(0xFFL)
  126. self.assertEquals(der.encode(), b('0\x04\x02\x02\x00\xff'))
  127. def testEncode6(self):
  128. # Two integers
  129. der = DerSequence()
  130. der.append(0x180L)
  131. der.append(0xFFL)
  132. self.assertEquals(der.encode(), b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff'))
  133. self.failUnless(der.hasOnlyInts())
  134. #
  135. der.append(0x01)
  136. der[1:] = [9,8]
  137. self.assertEquals(len(der),3)
  138. self.assertEqual(der[1:],[9,8])
  139. self.assertEqual(der[1:-1],[9])
  140. self.assertEquals(der.encode(), b('0\x0A\x02\x02\x01\x80\x02\x01\x09\x02\x01\x08'))
  141. def testEncode6(self):
  142. # One integer and another type (no matter what it is)
  143. der = DerSequence()
  144. der.append(0x180L)
  145. der.append(b('\x00\x02\x00\x00'))
  146. self.assertEquals(der.encode(), b('0\x08\x02\x02\x01\x80\x00\x02\x00\x00'))
  147. self.failIf(der.hasOnlyInts())
  148. ####
  149. def testDecode1(self):
  150. # Empty sequence
  151. der = DerSequence()
  152. der.decode(b('0\x00'))
  153. self.assertEquals(len(der),0)
  154. # One single-byte integer (zero)
  155. der.decode(b('0\x03\x02\x01\x00'))
  156. self.assertEquals(len(der),1)
  157. self.assertEquals(der[0],0)
  158. # Invariant
  159. der.decode(b('0\x03\x02\x01\x00'))
  160. self.assertEquals(len(der),1)
  161. self.assertEquals(der[0],0)
  162. def testDecode2(self):
  163. # One single-byte integer (non-zero)
  164. der = DerSequence()
  165. der.decode(b('0\x03\x02\x01\x7f'))
  166. self.assertEquals(len(der),1)
  167. self.assertEquals(der[0],127)
  168. def testDecode3(self):
  169. # One multi-byte integer (non-zero)
  170. der = DerSequence()
  171. der.decode(b('0\x04\x02\x02\x01\x80'))
  172. self.assertEquals(len(der),1)
  173. self.assertEquals(der[0],0x180L)
  174. def testDecode4(self):
  175. # One very long integer
  176. der = DerSequence()
  177. der.decode(b('0\x82\x01\x05')+
  178. b('\x02\x82\x01\x01\x01\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\x00\x00\x00\x00\x00')+
  187. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  188. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  189. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  190. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  191. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  192. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  193. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  194. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  195. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+
  196. b('\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
  197. self.assertEquals(len(der),1)
  198. self.assertEquals(der[0],2**2048)
  199. def testDecode5(self):
  200. # One single-byte integer (looks negative)
  201. der = DerSequence()
  202. der.decode(b('0\x04\x02\x02\x00\xff'))
  203. self.assertEquals(len(der),1)
  204. self.assertEquals(der[0],0xFFL)
  205. def testDecode6(self):
  206. # Two integers
  207. der = DerSequence()
  208. der.decode(b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff'))
  209. self.assertEquals(len(der),2)
  210. self.assertEquals(der[0],0x180L)
  211. self.assertEquals(der[1],0xFFL)
  212. def testDecode7(self):
  213. # One integer and 2 other types
  214. der = DerSequence()
  215. der.decode(b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00'))
  216. self.assertEquals(len(der),3)
  217. self.assertEquals(der[0],0x180L)
  218. self.assertEquals(der[1],b('\x24\x02\xb6\x63'))
  219. self.assertEquals(der[2],b('\x12\x00'))
  220. def testDecode8(self):
  221. # Only 2 other types
  222. der = DerSequence()
  223. der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00'))
  224. self.assertEquals(len(der),2)
  225. self.assertEquals(der[0],b('\x24\x02\xb6\x63'))
  226. self.assertEquals(der[1],b('\x12\x00'))
  227. def testErrDecode1(self):
  228. # Not a sequence
  229. der = DerSequence()
  230. self.assertRaises(ValueError, der.decode, b(''))
  231. self.assertRaises(ValueError, der.decode, b('\x00'))
  232. self.assertRaises(ValueError, der.decode, b('\x30'))
  233. def testErrDecode2(self):
  234. # Wrong payload type
  235. der = DerSequence()
  236. self.assertRaises(ValueError, der.decode, b('\x30\x00\x00'), True)
  237. def testErrDecode3(self):
  238. # Wrong length format
  239. der = DerSequence()
  240. self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x01\x01\x00'))
  241. self.assertRaises(ValueError, der.decode, b('\x30\x81\x03\x02\x01\x01'))
  242. self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x81\x01\x01'))
  243. def testErrDecode4(self):
  244. # Wrong integer format
  245. der = DerSequence()
  246. # Multi-byte encoding for zero
  247. #self.assertRaises(ValueError, der.decode, '\x30\x04\x02\x02\x00\x00')
  248. # Negative integer
  249. self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x01\xFF'))
  250. def get_tests(config={}):
  251. from Crypto.SelfTest.st_common import list_test_cases
  252. listTests = []
  253. listTests += list_test_cases(DerObjectTests)
  254. listTests += list_test_cases(DerSequenceTests)
  255. return listTests
  256. if __name__ == '__main__':
  257. suite = lambda: unittest.TestSuite(get_tests())
  258. unittest.main(defaultTest='suite')
  259. # vim:set ts=4 sw=4 sts=4 expandtab: