xds_credentials_test.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. //
  2. //
  3. // Copyright 2020 gRPC authors.
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. //
  17. //
  18. #include "src/core/lib/security/credentials/xds/xds_credentials.h"
  19. #include <gtest/gtest.h>
  20. #include <grpc/grpc.h>
  21. #include "test/core/util/test_config.h"
  22. namespace grpc_core {
  23. namespace testing {
  24. namespace {
  25. StringMatcher ExactMatcher(const char* string) {
  26. return StringMatcher::Create(StringMatcher::Type::kExact, string).value();
  27. }
  28. StringMatcher PrefixMatcher(const char* string, bool case_sensitive = true) {
  29. return StringMatcher::Create(StringMatcher::Type::kPrefix, string,
  30. case_sensitive)
  31. .value();
  32. }
  33. StringMatcher SuffixMatcher(const char* string, bool case_sensitive = true) {
  34. return StringMatcher::Create(StringMatcher::Type::kSuffix, string,
  35. case_sensitive)
  36. .value();
  37. }
  38. StringMatcher ContainsMatcher(const char* string, bool case_sensitive = true) {
  39. return StringMatcher::Create(StringMatcher::Type::kContains, string,
  40. case_sensitive)
  41. .value();
  42. }
  43. StringMatcher SafeRegexMatcher(const char* string) {
  44. return StringMatcher::Create(StringMatcher::Type::kSafeRegex, string).value();
  45. }
  46. TEST(XdsSanMatchingTest, EmptySansList) {
  47. std::vector<const char*> sans = {};
  48. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  49. sans.data(), sans.size(),
  50. {ExactMatcher("a.example.com"), ExactMatcher("b.example.com")}));
  51. }
  52. TEST(XdsSanMatchingTest, EmptyMatchersList) {
  53. std::vector<const char*> sans = {"a.example.com", "foo.example.com"};
  54. EXPECT_TRUE(
  55. TestOnlyXdsVerifySubjectAlternativeNames(sans.data(), sans.size(), {}));
  56. }
  57. TEST(XdsSanMatchingTest, ExactMatchIllegalValues) {
  58. std::vector<const char*> sans = {".a.example.com"};
  59. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  60. sans.data(), sans.size(),
  61. {ExactMatcher(""), ExactMatcher("a.example.com"),
  62. ExactMatcher(".a.example.com")}));
  63. sans = {""};
  64. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  65. sans.data(), sans.size(),
  66. {ExactMatcher(""), ExactMatcher("a.example.com"),
  67. ExactMatcher(".a.example.com")}));
  68. sans = {"a.example.com"};
  69. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  70. sans.data(), sans.size(),
  71. {ExactMatcher(""), ExactMatcher("a.example.com"),
  72. ExactMatcher(".a.example.com")}));
  73. }
  74. TEST(XdsSanMatchingTest, ExactMatchDns) {
  75. std::vector<const char*> sans = {"a.example.com"};
  76. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  77. sans.data(), sans.size(), {ExactMatcher("a.example.com")}));
  78. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  79. sans.data(), sans.size(), {ExactMatcher("b.example.com")}));
  80. sans = {"b.example.com."};
  81. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  82. sans.data(), sans.size(), {ExactMatcher("a.example.com.")}));
  83. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  84. sans.data(), sans.size(), {ExactMatcher("b.example.com.")}));
  85. }
  86. TEST(XdsSanMatchingTest, ExactMatchWithFullyQualifiedSan) {
  87. std::vector<const char*> sans = {"a.example.com."};
  88. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  89. sans.data(), sans.size(), {ExactMatcher("a.example.com")}));
  90. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  91. sans.data(), sans.size(), {ExactMatcher("b.example.com")}));
  92. }
  93. TEST(XdsSanMatchingTest, ExactMatchWithFullyQualifiedMatcher) {
  94. std::vector<const char*> sans = {"a.example.com"};
  95. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  96. sans.data(), sans.size(), {ExactMatcher("a.example.com.")}));
  97. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  98. sans.data(), sans.size(), {ExactMatcher("b.example.com.")}));
  99. }
  100. TEST(XdsSanMatchingTest, ExactMatchDnsCaseInsensitive) {
  101. std::vector<const char*> sans = {"A.eXaMpLe.CoM"};
  102. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  103. sans.data(), sans.size(), {ExactMatcher("a.example.com")}));
  104. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  105. sans.data(), sans.size(), {ExactMatcher("a.ExAmPlE.cOm")}));
  106. }
  107. TEST(XdsSanMatchingTest, ExactMatchMultipleSansMultipleMatchers) {
  108. std::vector<const char*> sans = {"a.example.com", "foo.example.com",
  109. "b.example.com"};
  110. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  111. sans.data(), sans.size(),
  112. {ExactMatcher("abc.example.com"), ExactMatcher("foo.example.com"),
  113. ExactMatcher("xyz.example.com")}));
  114. }
  115. TEST(XdsSanMatchingTest, ExactMatchWildCard) {
  116. std::vector<const char*> sans = {"*.example.com"};
  117. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  118. sans.data(), sans.size(), {ExactMatcher("a.example.com")}));
  119. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  120. sans.data(), sans.size(), {ExactMatcher("fOo.ExAmPlE.cOm")}));
  121. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  122. sans.data(), sans.size(), {ExactMatcher("BaR.eXaMpLe.CoM")}));
  123. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  124. sans.data(), sans.size(), {ExactMatcher(".example.com")}));
  125. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  126. sans.data(), sans.size(), {ExactMatcher("example.com")}));
  127. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  128. sans.data(), sans.size(), {ExactMatcher("foo.bar.com")}));
  129. }
  130. TEST(XdsSanMatchingTest, ExactMatchWildCardDoesNotMatchSingleLabelDomain) {
  131. std::vector<const char*> sans = {"*"};
  132. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  133. sans.data(), sans.size(), {ExactMatcher("abc")}));
  134. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  135. sans.data(), sans.size(), {ExactMatcher("abc.com.")}));
  136. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  137. sans.data(), sans.size(), {ExactMatcher("bar.baz.com")}));
  138. sans = {"*."};
  139. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  140. sans.data(), sans.size(), {ExactMatcher("abc")}));
  141. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  142. sans.data(), sans.size(), {ExactMatcher("abc.com.")}));
  143. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  144. sans.data(), sans.size(), {ExactMatcher("bar.baz.com")}));
  145. }
  146. TEST(XdsSanMatchingTest, ExactMatchAsteriskOnlyPermittedInLeftMostDomainName) {
  147. std::vector<const char*> sans = {"*.example.*.com"};
  148. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  149. sans.data(), sans.size(), {ExactMatcher("abc.example.xyz.com")}));
  150. sans = {"*.exam*ple.com"};
  151. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  152. sans.data(), sans.size(), {ExactMatcher("abc.example.com")}));
  153. }
  154. TEST(XdsSanMatchingTest,
  155. ExactMatchAsteriskMustBeOnlyCharacterInLeftMostDomainName) {
  156. std::vector<const char*> sans = {"*c.example.com"};
  157. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  158. sans.data(), sans.size(), {ExactMatcher("abc.example.com")}));
  159. }
  160. TEST(XdsSanMatchingTest,
  161. ExactMatchAsteriskMatchingAcrossDomainLabelsNotPermitted) {
  162. std::vector<const char*> sans = {"*.com"};
  163. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  164. sans.data(), sans.size(), {ExactMatcher("abc.example.com")}));
  165. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  166. sans.data(), sans.size(), {ExactMatcher("foo.bar.baz.com")}));
  167. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  168. sans.data(), sans.size(), {ExactMatcher("abc.com")}));
  169. }
  170. TEST(XdsSanMatchingTest, PrefixMatch) {
  171. std::vector<const char*> sans = {"abc.com"};
  172. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(sans.data(), sans.size(),
  173. {PrefixMatcher("abc")}));
  174. sans = {"AbC.CoM"};
  175. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  176. sans.data(), sans.size(), {PrefixMatcher("abc")}));
  177. sans = {"xyz.com"};
  178. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  179. sans.data(), sans.size(), {PrefixMatcher("abc")}));
  180. }
  181. TEST(XdsSanMatchingTest, PrefixMatchIgnoreCase) {
  182. std::vector<const char*> sans = {"aBc.cOm"};
  183. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  184. sans.data(), sans.size(),
  185. {PrefixMatcher("AbC", false /* case_sensitive */)}));
  186. sans = {"abc.com"};
  187. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  188. sans.data(), sans.size(),
  189. {PrefixMatcher("AbC", false /* case_sensitive */)}));
  190. sans = {"xyz.com"};
  191. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  192. sans.data(), sans.size(),
  193. {PrefixMatcher("AbC", false /* case_sensitive */)}));
  194. }
  195. TEST(XdsSanMatchingTest, SuffixMatch) {
  196. std::vector<const char*> sans = {"abc.com"};
  197. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  198. sans.data(), sans.size(), {SuffixMatcher(".com")}));
  199. sans = {"AbC.CoM"};
  200. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  201. sans.data(), sans.size(), {SuffixMatcher(".com")}));
  202. sans = {"abc.xyz"};
  203. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  204. sans.data(), sans.size(), {SuffixMatcher(".com")}));
  205. }
  206. TEST(XdsSanMatchingTest, SuffixMatchIgnoreCase) {
  207. std::vector<const char*> sans = {"abc.com"};
  208. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  209. sans.data(), sans.size(),
  210. {SuffixMatcher(".CoM", false /* case_sensitive */)}));
  211. sans = {"AbC.cOm"};
  212. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  213. sans.data(), sans.size(),
  214. {SuffixMatcher(".CoM", false /* case_sensitive */)}));
  215. sans = {"abc.xyz"};
  216. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  217. sans.data(), sans.size(),
  218. {SuffixMatcher(".CoM", false /* case_sensitive */)}));
  219. }
  220. TEST(XdsSanMatchingTest, ContainsMatch) {
  221. std::vector<const char*> sans = {"abc.com"};
  222. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  223. sans.data(), sans.size(), {ContainsMatcher("abc")}));
  224. sans = {"xyz.abc.com"};
  225. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  226. sans.data(), sans.size(), {ContainsMatcher("abc")}));
  227. sans = {"foo.AbC.com"};
  228. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  229. sans.data(), sans.size(), {ContainsMatcher("abc")}));
  230. }
  231. TEST(XdsSanMatchingTest, ContainsMatchIgnoresCase) {
  232. std::vector<const char*> sans = {"abc.com"};
  233. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  234. sans.data(), sans.size(),
  235. {ContainsMatcher("AbC", false /* case_sensitive */)}));
  236. sans = {"xyz.abc.com"};
  237. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  238. sans.data(), sans.size(),
  239. {ContainsMatcher("AbC", false /* case_sensitive */)}));
  240. sans = {"foo.aBc.com"};
  241. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  242. sans.data(), sans.size(),
  243. {ContainsMatcher("AbC", false /* case_sensitive */)}));
  244. sans = {"foo.Ab.com"};
  245. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  246. sans.data(), sans.size(),
  247. {ContainsMatcher("AbC", false /* case_sensitive */)}));
  248. }
  249. TEST(XdsSanMatchingTest, RegexMatch) {
  250. std::vector<const char*> sans = {"abc.example.com"};
  251. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  252. sans.data(), sans.size(), {SafeRegexMatcher("(abc|xyz).example.com")}));
  253. sans = {"xyz.example.com"};
  254. EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
  255. sans.data(), sans.size(), {SafeRegexMatcher("(abc|xyz).example.com")}));
  256. sans = {"foo.example.com"};
  257. EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
  258. sans.data(), sans.size(), {SafeRegexMatcher("(abc|xyz).example.com")}));
  259. }
  260. } // namespace
  261. } // namespace testing
  262. } // namespace grpc_core
  263. int main(int argc, char** argv) {
  264. ::testing::InitGoogleTest(&argc, argv);
  265. grpc::testing::TestEnvironment env(argc, argv);
  266. grpc_init();
  267. auto result = RUN_ALL_TESTS();
  268. grpc_shutdown();
  269. return result;
  270. }