test_Padding.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #
  2. # SelfTest/Util/test_Padding.py: Self-test for padding functions
  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. import unittest
  34. from binascii import unhexlify as uh
  35. from tls.Crypto.Util.py3compat import *
  36. from tls.Crypto.SelfTest.st_common import list_test_cases
  37. from tls.Crypto.Util.Padding import pad, unpad
  38. class PKCS7_Tests(unittest.TestCase):
  39. def test1(self):
  40. padded = pad(b(""), 4)
  41. self.failUnless(padded == uh(b("04040404")))
  42. padded = pad(b(""), 4, 'pkcs7')
  43. self.failUnless(padded == uh(b("04040404")))
  44. back = unpad(padded, 4)
  45. self.failUnless(back == b(""))
  46. def test2(self):
  47. padded = pad(uh(b("12345678")), 4)
  48. self.failUnless(padded == uh(b("1234567804040404")))
  49. back = unpad(padded, 4)
  50. self.failUnless(back == uh(b("12345678")))
  51. def test3(self):
  52. padded = pad(uh(b("123456")), 4)
  53. self.failUnless(padded == uh(b("12345601")))
  54. back = unpad(padded, 4)
  55. self.failUnless(back == uh(b("123456")))
  56. def test4(self):
  57. padded = pad(uh(b("1234567890")), 4)
  58. self.failUnless(padded == uh(b("1234567890030303")))
  59. back = unpad(padded, 4)
  60. self.failUnless(back == uh(b("1234567890")))
  61. def testn1(self):
  62. self.assertRaises(ValueError, pad, uh(b("12")), 4, 'pkcs8')
  63. def testn2(self):
  64. self.assertRaises(ValueError, unpad, b("\0\0\0"), 4)
  65. def testn3(self):
  66. self.assertRaises(ValueError, unpad, b("123456\x02"), 4)
  67. self.assertRaises(ValueError, unpad, b("123456\x00"), 4)
  68. self.assertRaises(ValueError, unpad, b("123456\x05\x05\x05\x05\x05"), 4)
  69. class X923_Tests(unittest.TestCase):
  70. def test1(self):
  71. padded = pad(b(""), 4, 'x923')
  72. self.failUnless(padded == uh(b("00000004")))
  73. back = unpad(padded, 4, 'x923')
  74. self.failUnless(back == b(""))
  75. def test2(self):
  76. padded = pad(uh(b("12345678")), 4, 'x923')
  77. self.failUnless(padded == uh(b("1234567800000004")))
  78. back = unpad(padded, 4, 'x923')
  79. self.failUnless(back == uh(b("12345678")))
  80. def test3(self):
  81. padded = pad(uh(b("123456")), 4, 'x923')
  82. self.failUnless(padded == uh(b("12345601")))
  83. back = unpad(padded, 4, 'x923')
  84. self.failUnless(back == uh(b("123456")))
  85. def test4(self):
  86. padded = pad(uh(b("1234567890")), 4, 'x923')
  87. self.failUnless(padded == uh(b("1234567890000003")))
  88. back = unpad(padded, 4, 'x923')
  89. self.failUnless(back == uh(b("1234567890")))
  90. def testn1(self):
  91. self.assertRaises(ValueError, unpad, b("123456\x02"), 4, 'x923')
  92. self.assertRaises(ValueError, unpad, b("123456\x00"), 4, 'x923')
  93. self.assertRaises(ValueError, unpad, b("123456\x00\x00\x00\x00\x05"), 4, 'x923')
  94. class ISO7816_Tests(unittest.TestCase):
  95. def test1(self):
  96. padded = pad(b(""), 4, 'iso7816')
  97. self.failUnless(padded == uh(b("80000000")))
  98. back = unpad(padded, 4, 'iso7816')
  99. self.failUnless(back == b(""))
  100. def test2(self):
  101. padded = pad(uh(b("12345678")), 4, 'iso7816')
  102. self.failUnless(padded == uh(b("1234567880000000")))
  103. back = unpad(padded, 4, 'iso7816')
  104. self.failUnless(back == uh(b("12345678")))
  105. def test3(self):
  106. padded = pad(uh(b("123456")), 4, 'iso7816')
  107. self.failUnless(padded == uh(b("12345680")))
  108. #import pdb; pdb.set_trace()
  109. back = unpad(padded, 4, 'iso7816')
  110. self.failUnless(back == uh(b("123456")))
  111. def test4(self):
  112. padded = pad(uh(b("1234567890")), 4, 'iso7816')
  113. self.failUnless(padded == uh(b("1234567890800000")))
  114. back = unpad(padded, 4, 'iso7816')
  115. self.failUnless(back == uh(b("1234567890")))
  116. def testn1(self):
  117. self.assertRaises(ValueError, unpad, b("123456\x81"), 4, 'iso7816')
  118. def get_tests(config={}):
  119. tests = []
  120. tests += list_test_cases(PKCS7_Tests)
  121. tests += list_test_cases(X923_Tests)
  122. tests += list_test_cases(ISO7816_Tests)
  123. return tests
  124. if __name__ == '__main__':
  125. suite = lambda: unittest.TestSuite(get_tests())
  126. unittest.main(defaultTest='suite')