tsigkey_python_test.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. # Copyright (C) 2010 Internet Systems Consortium.
  2. #
  3. # Permission to use, copy, modify, and distribute this software for any
  4. # purpose with or without fee is hereby granted, provided that the above
  5. # copyright notice and this permission notice appear in all copies.
  6. #
  7. # THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
  8. # DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
  9. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
  10. # INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
  11. # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
  12. # FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
  13. # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
  14. # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. import unittest
  16. from pydnspp import *
  17. class TSIGKeyTest(unittest.TestCase):
  18. key_name = Name('example.com')
  19. secret = b'anotherRandomData'
  20. def test_algorithm_names(self):
  21. self.assertEqual(Name('hmac-md5.sig-alg.reg.int'),
  22. TSIGKey.HMACMD5_NAME)
  23. self.assertEqual(Name('hmac-sha1'), TSIGKey.HMACSHA1_NAME)
  24. self.assertEqual(Name('hmac-sha256'), TSIGKey.HMACSHA256_NAME)
  25. self.assertEqual(Name('hmac-sha224'), TSIGKey.HMACSHA224_NAME)
  26. self.assertEqual(Name('hmac-sha384'), TSIGKey.HMACSHA384_NAME)
  27. self.assertEqual(Name('hmac-sha512'), TSIGKey.HMACSHA512_NAME)
  28. def test_init(self):
  29. key = TSIGKey(self.key_name, TSIGKey.HMACMD5_NAME, self.secret)
  30. self.assertEqual(self.key_name, key.get_key_name())
  31. self.assertEqual(Name('hmac-md5.sig-alg.reg.int'),
  32. key.get_algorithm_name())
  33. self.assertEqual(self.secret, key.get_secret())
  34. self.assertRaises(InvalidParameter, TSIGKey, self.key_name,
  35. Name('unknown-alg'), self.secret)
  36. self.assertEqual('hmac-sha1.',
  37. TSIGKey(self.key_name, TSIGKey.HMACSHA1_NAME,
  38. self.secret).get_algorithm_name().to_text())
  39. self.assertRaises(TypeError, TSIGKey, self.key_name,
  40. TSIGKey.HMACMD5_NAME,
  41. 'should be binary') # signature mismatch
  42. def test_str(self):
  43. k1 = TSIGKey('test.example:CwsLCwsLCwsLCwsLCwsLCw==:hmac-md5.sig-alg.reg.int')
  44. self.assertEqual(Name('test.example.'), k1.get_key_name())
  45. self.assertEqual(Name('hmac-md5.sig-alg.reg.int.'), k1.get_algorithm_name())
  46. self.assertEqual(b'\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b',
  47. k1.get_secret())
  48. self.assertEqual('test.example.:CwsLCwsLCwsLCwsLCwsLCw==:hmac-md5.sig-alg.reg.int.',
  49. k1.to_text())
  50. self.assertRaises(InvalidParameter, TSIGKey,
  51. 'test.example:CwsLCwsLCwsLCwsLCwsLCw==:unsupported')
  52. self.assertRaises(InvalidParameter, TSIGKey,
  53. '::')
  54. self.assertRaises(InvalidParameter, TSIGKey,
  55. 'test.example:')
  56. self.assertRaises(InvalidParameter, TSIGKey,
  57. 'test.example:%bad_base_64%')
  58. self.assertRaises(InvalidParameter, TSIGKey,
  59. 'test.example:CwsLCwsLCwsLCwsLCwsLCw==:')
  60. self.assertRaises(InvalidParameter, TSIGKey,
  61. 'test.:example:CwsLCwsLCwsLCwsLCwsLCw==')
  62. class TSIGKeyRingTest(unittest.TestCase):
  63. key_name = Name('example.com')
  64. md5_name = Name('hmac-md5.sig-alg.reg.int')
  65. sha1_name = Name('hmac-sha1')
  66. sha256_name = Name('hmac-sha256')
  67. secret = b'someRandomData'
  68. def setUp(self):
  69. self.keyring = TSIGKeyRing()
  70. def test_init(self):
  71. self.assertEqual(0, self.keyring.size())
  72. self.assertRaises(TypeError, TSIGKeyRing, 1)
  73. self.assertRaises(TypeError, TSIGKeyRing, 'there should not be arg')
  74. def test_add(self):
  75. self.assertEqual(TSIGKeyRing.SUCCESS,
  76. self.keyring.add(TSIGKey(self.key_name,
  77. TSIGKey.HMACSHA256_NAME,
  78. self.secret)))
  79. self.assertEqual(1, self.keyring.size())
  80. self.assertEqual(TSIGKeyRing.EXIST,
  81. self.keyring.add(TSIGKey(self.key_name,
  82. TSIGKey.HMACSHA256_NAME,
  83. self.secret)))
  84. self.assertEqual(TSIGKeyRing.EXIST,
  85. self.keyring.add(TSIGKey(self.key_name,
  86. TSIGKey.HMACSHA1_NAME,
  87. self.secret)))
  88. self.assertEqual(TSIGKeyRing.EXIST,
  89. self.keyring.add(TSIGKey(Name('EXAMPLE.COM'),
  90. TSIGKey.HMACSHA1_NAME,
  91. self.secret)))
  92. self.assertEqual(1, self.keyring.size())
  93. def test_add_more(self):
  94. self.assertEqual(TSIGKeyRing.SUCCESS,
  95. self.keyring.add(TSIGKey(self.key_name,
  96. TSIGKey.HMACSHA256_NAME,
  97. self.secret)))
  98. self.assertEqual(TSIGKeyRing.SUCCESS,
  99. self.keyring.add(TSIGKey(Name('another.example'),
  100. TSIGKey.HMACMD5_NAME,
  101. self.secret)))
  102. self.assertEqual(TSIGKeyRing.SUCCESS,
  103. self.keyring.add(TSIGKey(Name('more.example'),
  104. TSIGKey.HMACSHA1_NAME,
  105. self.secret)))
  106. self.assertEqual(3, self.keyring.size())
  107. self.assertRaises(TypeError, self.keyring.add, 1)
  108. self.assertRaises(TypeError, self.keyring.add, 'invalid arg')
  109. def test_remove(self):
  110. self.assertEqual(TSIGKeyRing.SUCCESS,
  111. self.keyring.add(TSIGKey(self.key_name,
  112. TSIGKey.HMACSHA256_NAME,
  113. self.secret)))
  114. self.assertEqual(TSIGKeyRing.SUCCESS,
  115. self.keyring.remove(self.key_name))
  116. self.assertEqual(TSIGKeyRing.NOTFOUND,
  117. self.keyring.remove(self.key_name))
  118. self.assertRaises(TypeError, self.keyring.add, 1)
  119. self.assertRaises(TypeError, self.keyring.add, 'invalid arg')
  120. self.assertRaises(TypeError, self.keyring.add, self.key_name, 0)
  121. def test_remove_from_some(self):
  122. self.assertEqual(TSIGKeyRing.SUCCESS,
  123. self.keyring.add(TSIGKey(self.key_name,
  124. TSIGKey.HMACSHA256_NAME,
  125. self.secret)))
  126. self.assertEqual(TSIGKeyRing.SUCCESS,
  127. self.keyring.add(TSIGKey(Name('another.example'),
  128. TSIGKey.HMACMD5_NAME,
  129. self.secret)))
  130. self.assertEqual(TSIGKeyRing.SUCCESS,
  131. self.keyring.add(TSIGKey(Name('more.example'),
  132. TSIGKey.HMACSHA1_NAME,
  133. self.secret)))
  134. self.assertEqual(TSIGKeyRing.SUCCESS,
  135. self.keyring.remove(Name('another.example')))
  136. self.assertEqual(TSIGKeyRing.NOTFOUND,
  137. self.keyring.remove(Name('noexist.example')))
  138. self.assertEqual(2, self.keyring.size())
  139. def test_find(self):
  140. self.assertEqual((TSIGKeyRing.NOTFOUND, None),
  141. self.keyring.find(self.key_name, self.md5_name))
  142. self.assertEqual(TSIGKeyRing.SUCCESS,
  143. self.keyring.add(TSIGKey(self.key_name,
  144. self.sha256_name,
  145. self.secret)))
  146. (code, key) = self.keyring.find(self.key_name, self.sha256_name)
  147. self.assertEqual(TSIGKeyRing.SUCCESS, code)
  148. self.assertEqual(self.key_name, key.get_key_name())
  149. self.assertEqual(TSIGKey.HMACSHA256_NAME, key.get_algorithm_name())
  150. self.assertEqual(self.secret, key.get_secret())
  151. (code, key) = self.keyring.find(self.key_name)
  152. self.assertEqual(TSIGKeyRing.SUCCESS, code)
  153. self.assertEqual(self.key_name, key.get_key_name())
  154. self.assertEqual(TSIGKey.HMACSHA256_NAME, key.get_algorithm_name())
  155. self.assertEqual(self.secret, key.get_secret())
  156. (code, key) = self.keyring.find(Name('different-key.example'),
  157. self.sha256_name)
  158. self.assertEqual(TSIGKeyRing.NOTFOUND, code)
  159. self.assertEqual(None, key)
  160. (code, key) = self.keyring.find(self.key_name, self.md5_name)
  161. self.assertEqual(TSIGKeyRing.NOTFOUND, code)
  162. self.assertEqual(None, key)
  163. self.assertRaises(TypeError, self.keyring.find, 1)
  164. self.assertRaises(TypeError, self.keyring.find, 'should be a name')
  165. self.assertRaises(TypeError, self.keyring.find, self.key_name, 0)
  166. def test_find_from_some(self):
  167. self.assertEqual(TSIGKeyRing.SUCCESS,
  168. self.keyring.add(TSIGKey(self.key_name,
  169. self.sha256_name,
  170. self.secret)))
  171. self.assertEqual(TSIGKeyRing.SUCCESS,
  172. self.keyring.add(TSIGKey(Name('another.example'),
  173. self.md5_name,
  174. self.secret)))
  175. self.assertEqual(TSIGKeyRing.SUCCESS,
  176. self.keyring.add(TSIGKey(Name('more.example'),
  177. self.sha1_name,
  178. self.secret)))
  179. (code, key) = self.keyring.find(Name('another.example'), self.md5_name)
  180. self.assertEqual(TSIGKeyRing.SUCCESS, code)
  181. self.assertEqual(Name('another.example'), key.get_key_name())
  182. self.assertEqual(TSIGKey.HMACMD5_NAME, key.get_algorithm_name())
  183. self.assertEqual((TSIGKeyRing.NOTFOUND, None),
  184. self.keyring.find(Name('noexist.example'),
  185. self.sha1_name))
  186. self.assertEqual((TSIGKeyRing.NOTFOUND, None),
  187. self.keyring.find(Name('another.example'),
  188. self.sha1_name))
  189. if __name__ == '__main__':
  190. unittest.main()