PageRenderTime 49ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/contrib/pycrypto/lib/Crypto/SelfTest/Util/test_asn1.py

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