tsigkey_unittest.cc 10.0 KB

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