tsigkey_unittest.cc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. // Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <string>
  15. #include <gtest/gtest.h>
  16. #include <exceptions/exceptions.h>
  17. #include <cryptolink/cryptolink.h>
  18. #include <dns/tsigkey.h>
  19. #include <dns/tests/unittest_util.h>
  20. using namespace std;
  21. using namespace isc::dns;
  22. using isc::UnitTestUtil;
  23. namespace {
  24. class TSIGKeyTest : public ::testing::Test {
  25. protected:
  26. TSIGKeyTest() : secret("someRandomData"), key_name("example.com") {}
  27. string secret;
  28. Name key_name;
  29. };
  30. TEST_F(TSIGKeyTest, algorithmNames) {
  31. EXPECT_EQ(Name("hmac-md5.sig-alg.reg.int"), TSIGKey::HMACMD5_NAME());
  32. EXPECT_EQ(Name("hmac-sha1"), TSIGKey::HMACSHA1_NAME());
  33. EXPECT_EQ(Name("hmac-sha256"), TSIGKey::HMACSHA256_NAME());
  34. // Also check conversion to cryptolink definitions
  35. EXPECT_EQ(isc::cryptolink::MD5, TSIGKey(key_name, TSIGKey::HMACMD5_NAME(),
  36. NULL, 0).getCryptoAlgorithm());
  37. EXPECT_EQ(isc::cryptolink::SHA1, TSIGKey(key_name, TSIGKey::HMACSHA1_NAME(),
  38. NULL, 0).getCryptoAlgorithm());
  39. EXPECT_EQ(isc::cryptolink::SHA256, TSIGKey(key_name,
  40. TSIGKey::HMACSHA256_NAME(),
  41. NULL, 0).getCryptoAlgorithm());
  42. }
  43. TEST_F(TSIGKeyTest, construct) {
  44. TSIGKey key(key_name, TSIGKey::HMACMD5_NAME(),
  45. secret.c_str(), secret.size());
  46. EXPECT_EQ(key_name, key.getKeyName());
  47. EXPECT_EQ(Name("hmac-md5.sig-alg.reg.int"), key.getAlgorithmName());
  48. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, secret.c_str(),
  49. secret.size(), key.getSecret(), key.getSecretLength());
  50. EXPECT_THROW(TSIGKey(key_name, Name("unknown-alg"),
  51. secret.c_str(), secret.size()),
  52. isc::InvalidParameter);
  53. // The algorithm name should be converted to the canonical form.
  54. EXPECT_EQ("hmac-sha1.",
  55. TSIGKey(key_name, Name("HMAC-sha1"),
  56. secret.c_str(),
  57. secret.size()).getAlgorithmName().toText());
  58. EXPECT_EQ("example.com.",
  59. TSIGKey(Name("EXAMPLE.CoM."), TSIGKey::HMACSHA256_NAME(),
  60. secret.c_str(),
  61. secret.size()).getKeyName().toText());
  62. // Invalid combinations of secret and secret_len:
  63. EXPECT_THROW(TSIGKey(key_name, TSIGKey::HMACSHA1_NAME(), secret.c_str(), 0),
  64. isc::InvalidParameter);
  65. EXPECT_THROW(TSIGKey(key_name, TSIGKey::HMACSHA256_NAME(), NULL, 16),
  66. isc::InvalidParameter);
  67. }
  68. void
  69. compareTSIGKeys(const TSIGKey& expect, const TSIGKey& actual) {
  70. EXPECT_EQ(expect.getKeyName(), actual.getKeyName());
  71. EXPECT_EQ(expect.getAlgorithmName(), actual.getAlgorithmName());
  72. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
  73. expect.getSecret(), expect.getSecretLength(),
  74. actual.getSecret(), actual.getSecretLength());
  75. }
  76. TEST_F(TSIGKeyTest, copyConstruct) {
  77. const TSIGKey original(key_name, TSIGKey::HMACSHA256_NAME(),
  78. secret.c_str(), secret.size());
  79. const TSIGKey copy(original);
  80. compareTSIGKeys(original, copy);
  81. // Check the copied data is valid even after the original is deleted
  82. TSIGKey* copy2 = new TSIGKey(original);
  83. TSIGKey copy3(*copy2);
  84. delete copy2;
  85. compareTSIGKeys(original, copy3);
  86. }
  87. TEST_F(TSIGKeyTest, assignment) {
  88. const TSIGKey original(key_name, TSIGKey::HMACSHA256_NAME(),
  89. secret.c_str(), secret.size());
  90. TSIGKey copy = original;
  91. compareTSIGKeys(original, copy);
  92. // Check if the copied data is valid even after the original is deleted
  93. TSIGKey* copy2 = new TSIGKey(original);
  94. TSIGKey copy3(original);
  95. copy3 = *copy2;
  96. delete copy2;
  97. compareTSIGKeys(original, copy3);
  98. // self assignment
  99. copy = copy;
  100. compareTSIGKeys(original, copy);
  101. }
  102. class TSIGKeyRingTest : public ::testing::Test {
  103. protected:
  104. TSIGKeyRingTest() :
  105. key_name("example.com"),
  106. secretstring("anotherRandomData"),
  107. secret(secretstring.c_str()),
  108. secret_len(secretstring.size())
  109. {}
  110. TSIGKeyRing keyring;
  111. Name key_name;
  112. private:
  113. const string secretstring;
  114. protected:
  115. const char* secret;
  116. size_t secret_len;
  117. };
  118. TEST_F(TSIGKeyRingTest, init) {
  119. EXPECT_EQ(0, keyring.size());
  120. }
  121. TEST_F(TSIGKeyRingTest, add) {
  122. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  123. TSIGKey(key_name, TSIGKey::HMACSHA256_NAME(),
  124. secret, secret_len)));
  125. EXPECT_EQ(1, keyring.size());
  126. EXPECT_EQ(TSIGKeyRing::EXIST, keyring.add(
  127. TSIGKey(key_name, TSIGKey::HMACSHA256_NAME(),
  128. secret, secret_len)));
  129. // keys are identified their names, the same name of key with a different
  130. // algorithm would be considered a duplicate.
  131. EXPECT_EQ(TSIGKeyRing::EXIST, keyring.add(
  132. TSIGKey(Name("example.com"), TSIGKey::HMACSHA1_NAME(),
  133. secret, secret_len)));
  134. // names are compared in a case insensitive manner.
  135. EXPECT_EQ(TSIGKeyRing::EXIST, keyring.add(
  136. TSIGKey(Name("EXAMPLE.COM"), TSIGKey::HMACSHA1_NAME(),
  137. secret, secret_len)));
  138. EXPECT_EQ(1, keyring.size());
  139. }
  140. TEST_F(TSIGKeyRingTest, addMore) {
  141. // essentially the same test, but try adding more than 1
  142. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  143. TSIGKey(key_name, TSIGKey::HMACSHA256_NAME(),
  144. secret, secret_len)));
  145. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  146. TSIGKey(Name("another.example"), TSIGKey::HMACMD5_NAME(),
  147. secret, secret_len)));
  148. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  149. TSIGKey(Name("more.example"), TSIGKey::HMACSHA1_NAME(),
  150. secret, secret_len)));
  151. EXPECT_EQ(3, keyring.size());
  152. }
  153. TEST_F(TSIGKeyRingTest, remove) {
  154. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  155. TSIGKey(key_name, TSIGKey::HMACSHA256_NAME(),
  156. secret, secret_len)));
  157. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.remove(key_name));
  158. EXPECT_EQ(TSIGKeyRing::NOTFOUND, keyring.remove(key_name));
  159. }
  160. TEST_F(TSIGKeyRingTest, removeFromSome) {
  161. // essentially the same test, but try removing from a larger set
  162. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  163. TSIGKey(key_name, TSIGKey::HMACSHA256_NAME(),
  164. secret, secret_len)));
  165. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  166. TSIGKey(Name("another.example"), TSIGKey::HMACMD5_NAME(),
  167. secret, secret_len)));
  168. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  169. TSIGKey(Name("more.example"), TSIGKey::HMACSHA1_NAME(),
  170. secret, secret_len)));
  171. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.remove(Name("another.example")));
  172. EXPECT_EQ(TSIGKeyRing::NOTFOUND, keyring.remove(Name("noexist.example")));
  173. EXPECT_EQ(2, keyring.size());
  174. }
  175. TEST_F(TSIGKeyRingTest, find) {
  176. EXPECT_EQ(TSIGKeyRing::NOTFOUND, keyring.find(key_name).code);
  177. EXPECT_EQ(static_cast<const TSIGKey*>(NULL), keyring.find(key_name).key);
  178. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  179. TSIGKey(key_name, TSIGKey::HMACSHA256_NAME(),
  180. secret, secret_len)));
  181. const TSIGKeyRing::FindResult result(keyring.find(key_name));
  182. EXPECT_EQ(TSIGKeyRing::SUCCESS, result.code);
  183. EXPECT_EQ(key_name, result.key->getKeyName());
  184. EXPECT_EQ(TSIGKey::HMACSHA256_NAME(), result.key->getAlgorithmName());
  185. EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, secret, secret_len,
  186. result.key->getSecret(),
  187. result.key->getSecretLength());
  188. }
  189. TEST_F(TSIGKeyRingTest, findFromSome) {
  190. // essentially the same test, but search a larger set
  191. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  192. TSIGKey(key_name, TSIGKey::HMACSHA256_NAME(),
  193. secret, secret_len)));
  194. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  195. TSIGKey(Name("another.example"), TSIGKey::HMACMD5_NAME(),
  196. secret, secret_len)));
  197. EXPECT_EQ(TSIGKeyRing::SUCCESS, keyring.add(
  198. TSIGKey(Name("more.example"), TSIGKey::HMACSHA1_NAME(),
  199. secret, secret_len)));
  200. const TSIGKeyRing::FindResult result(
  201. keyring.find(Name("another.example")));
  202. EXPECT_EQ(TSIGKeyRing::SUCCESS, result.code);
  203. EXPECT_EQ(Name("another.example"), result.key->getKeyName());
  204. EXPECT_EQ(TSIGKey::HMACMD5_NAME(), result.key->getAlgorithmName());
  205. EXPECT_EQ(TSIGKeyRing::NOTFOUND,
  206. keyring.find(Name("noexist.example")).code);
  207. EXPECT_EQ(static_cast<const TSIGKey*>(NULL),
  208. keyring.find(Name("noexist.example")).key);
  209. }
  210. TEST(TSIGStringTest, TSIGKeyFromToString) {
  211. TSIGKey k1 = TSIGKey("test.example:MSG6Ng==:hmac-md5.sig-alg.reg.int");
  212. TSIGKey k2 = TSIGKey("test.example.:MSG6Ng==:hmac-md5.sig-alg.reg.int.");
  213. TSIGKey k3 = TSIGKey("test.example:MSG6Ng==");
  214. TSIGKey k4 = TSIGKey(Name("test.example."), Name("hmac-sha1."), NULL, 0);
  215. EXPECT_EQ("test.example.:MSG6Ng==:hmac-md5.sig-alg.reg.int.",
  216. k1.toText());
  217. EXPECT_EQ("test.example.:MSG6Ng==:hmac-md5.sig-alg.reg.int.",
  218. k2.toText());
  219. EXPECT_EQ("test.example.:MSG6Ng==:hmac-md5.sig-alg.reg.int.",
  220. k3.toText());
  221. EXPECT_EQ("test.example.::hmac-sha1.", k4.toText());
  222. EXPECT_THROW(TSIGKey(""), isc::InvalidParameter);
  223. EXPECT_THROW(TSIGKey(":"), isc::InvalidParameter);
  224. EXPECT_THROW(TSIGKey("::"), isc::InvalidParameter);
  225. EXPECT_THROW(TSIGKey("..:aa:"), isc::InvalidParameter);
  226. EXPECT_THROW(TSIGKey("test.example:xxxx:"), isc::InvalidParameter);
  227. EXPECT_THROW(TSIGKey("test.example.::"), isc::InvalidParameter);
  228. EXPECT_THROW(TSIGKey("test.example.:"), isc::InvalidParameter);
  229. EXPECT_THROW(TSIGKey("test.example.:MSG6Ng==:"), isc::InvalidParameter);
  230. EXPECT_THROW(TSIGKey("test.example.:MSG6Ng==:unknown"), isc::InvalidParameter);
  231. }
  232. } // end namespace