credentials_test.cc 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. /*
  2. *
  3. * Copyright 2015 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 <grpcpp/security/credentials.h>
  19. #include <grpcpp/security/tls_credentials_options.h>
  20. #include <grpcpp/server_builder.h>
  21. #include <memory>
  22. #include <gmock/gmock.h>
  23. #include <grpc/grpc.h>
  24. #include <gtest/gtest.h>
  25. #include "src/core/lib/gpr/env.h"
  26. #include "src/core/lib/gpr/tmpfile.h"
  27. #include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h"
  28. #include "src/cpp/client/secure_credentials.h"
  29. #include "src/cpp/common/tls_credentials_options_util.h"
  30. namespace {
  31. typedef class ::grpc_impl::experimental::TlsKeyMaterialsConfig
  32. TlsKeyMaterialsConfig;
  33. typedef class ::grpc_impl::experimental::TlsCredentialReloadArg
  34. TlsCredentialReloadArg;
  35. typedef struct ::grpc_impl::experimental::TlsCredentialReloadInterface
  36. TlsCredentialReloadInterface;
  37. typedef class ::grpc_impl::experimental::TlsServerAuthorizationCheckArg
  38. TlsServerAuthorizationCheckArg;
  39. typedef struct ::grpc_impl::experimental::TlsServerAuthorizationCheckInterface
  40. TlsServerAuthorizationCheckInterface;
  41. static void tls_credential_reload_callback(
  42. grpc_tls_credential_reload_arg* arg) {
  43. GPR_ASSERT(arg != nullptr);
  44. arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
  45. }
  46. class TestTlsCredentialReload : public TlsCredentialReloadInterface {
  47. int Schedule(TlsCredentialReloadArg* arg) override {
  48. GPR_ASSERT(arg != nullptr);
  49. struct TlsKeyMaterialsConfig::PemKeyCertPair pair3 = {"private_key3",
  50. "cert_chain3"};
  51. arg->set_pem_root_certs("new_pem_root_certs");
  52. arg->add_pem_key_cert_pair(pair3);
  53. arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
  54. return 0;
  55. }
  56. void Cancel(TlsCredentialReloadArg* arg) override {
  57. GPR_ASSERT(arg != nullptr);
  58. arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL);
  59. arg->set_error_details("cancelled");
  60. }
  61. };
  62. static void tls_server_authorization_check_callback(
  63. grpc_tls_server_authorization_check_arg* arg) {
  64. GPR_ASSERT(arg != nullptr);
  65. grpc::string cb_user_data = "cb_user_data";
  66. arg->cb_user_data = static_cast<void*>(gpr_strdup(cb_user_data.c_str()));
  67. arg->success = 1;
  68. arg->target_name = gpr_strdup("callback_target_name");
  69. arg->peer_cert = gpr_strdup("callback_peer_cert");
  70. arg->status = GRPC_STATUS_OK;
  71. arg->error_details = gpr_strdup("callback_error_details");
  72. }
  73. class TestTlsServerAuthorizationCheck
  74. : public TlsServerAuthorizationCheckInterface {
  75. int Schedule(TlsServerAuthorizationCheckArg* arg) override {
  76. GPR_ASSERT(arg != nullptr);
  77. grpc::string cb_user_data = "cb_user_data";
  78. arg->set_cb_user_data(static_cast<void*>(gpr_strdup(cb_user_data.c_str())));
  79. arg->set_success(1);
  80. arg->set_target_name("sync_target_name");
  81. arg->set_peer_cert("sync_peer_cert");
  82. arg->set_status(GRPC_STATUS_OK);
  83. arg->set_error_details("sync_error_details");
  84. return 1;
  85. }
  86. void Cancel(TlsServerAuthorizationCheckArg* arg) override {
  87. GPR_ASSERT(arg != nullptr);
  88. arg->set_status(GRPC_STATUS_PERMISSION_DENIED);
  89. arg->set_error_details("cancelled");
  90. }
  91. };
  92. } // namespace
  93. namespace grpc {
  94. namespace testing {
  95. class CredentialsTest : public ::testing::Test {
  96. protected:
  97. };
  98. TEST_F(CredentialsTest, InvalidGoogleRefreshToken) {
  99. std::shared_ptr<CallCredentials> bad1 = GoogleRefreshTokenCredentials("");
  100. EXPECT_EQ(static_cast<CallCredentials*>(nullptr), bad1.get());
  101. }
  102. TEST_F(CredentialsTest, DefaultCredentials) {
  103. auto creds = GoogleDefaultCredentials();
  104. }
  105. TEST_F(CredentialsTest, StsCredentialsOptionsCppToCore) {
  106. grpc::experimental::StsCredentialsOptions options;
  107. options.token_exchange_service_uri = "https://foo.com/exchange";
  108. options.resource = "resource";
  109. options.audience = "audience";
  110. options.scope = "scope";
  111. // options.requested_token_type explicitly not set.
  112. options.subject_token_path = "/foo/bar";
  113. options.subject_token_type = "nice_token_type";
  114. options.actor_token_path = "/foo/baz";
  115. options.actor_token_type = "even_nicer_token_type";
  116. grpc_sts_credentials_options core_opts =
  117. grpc_impl::experimental::StsCredentialsCppToCoreOptions(options);
  118. EXPECT_EQ(options.token_exchange_service_uri,
  119. core_opts.token_exchange_service_uri);
  120. EXPECT_EQ(options.resource, core_opts.resource);
  121. EXPECT_EQ(options.audience, core_opts.audience);
  122. EXPECT_EQ(options.scope, core_opts.scope);
  123. EXPECT_EQ(options.requested_token_type, core_opts.requested_token_type);
  124. EXPECT_EQ(options.subject_token_path, core_opts.subject_token_path);
  125. EXPECT_EQ(options.subject_token_type, core_opts.subject_token_type);
  126. EXPECT_EQ(options.actor_token_path, core_opts.actor_token_path);
  127. EXPECT_EQ(options.actor_token_type, core_opts.actor_token_type);
  128. }
  129. TEST_F(CredentialsTest, StsCredentialsOptionsJson) {
  130. const char valid_json[] = R"(
  131. {
  132. "token_exchange_service_uri": "https://foo/exchange",
  133. "resource": "resource",
  134. "audience": "audience",
  135. "scope": "scope",
  136. "requested_token_type": "requested_token_type",
  137. "subject_token_path": "subject_token_path",
  138. "subject_token_type": "subject_token_type",
  139. "actor_token_path": "actor_token_path",
  140. "actor_token_type": "actor_token_type"
  141. })";
  142. grpc::experimental::StsCredentialsOptions options;
  143. EXPECT_TRUE(
  144. grpc::experimental::StsCredentialsOptionsFromJson(valid_json, &options)
  145. .ok());
  146. EXPECT_EQ(options.token_exchange_service_uri, "https://foo/exchange");
  147. EXPECT_EQ(options.resource, "resource");
  148. EXPECT_EQ(options.audience, "audience");
  149. EXPECT_EQ(options.scope, "scope");
  150. EXPECT_EQ(options.requested_token_type, "requested_token_type");
  151. EXPECT_EQ(options.subject_token_path, "subject_token_path");
  152. EXPECT_EQ(options.subject_token_type, "subject_token_type");
  153. EXPECT_EQ(options.actor_token_path, "actor_token_path");
  154. EXPECT_EQ(options.actor_token_type, "actor_token_type");
  155. const char minimum_valid_json[] = R"(
  156. {
  157. "token_exchange_service_uri": "https://foo/exchange",
  158. "subject_token_path": "subject_token_path",
  159. "subject_token_type": "subject_token_type"
  160. })";
  161. EXPECT_TRUE(grpc::experimental::StsCredentialsOptionsFromJson(
  162. minimum_valid_json, &options)
  163. .ok());
  164. EXPECT_EQ(options.token_exchange_service_uri, "https://foo/exchange");
  165. EXPECT_EQ(options.resource, "");
  166. EXPECT_EQ(options.audience, "");
  167. EXPECT_EQ(options.scope, "");
  168. EXPECT_EQ(options.requested_token_type, "");
  169. EXPECT_EQ(options.subject_token_path, "subject_token_path");
  170. EXPECT_EQ(options.subject_token_type, "subject_token_type");
  171. EXPECT_EQ(options.actor_token_path, "");
  172. EXPECT_EQ(options.actor_token_type, "");
  173. const char invalid_json[] = R"(
  174. I'm not a valid JSON.
  175. )";
  176. EXPECT_EQ(
  177. grpc::StatusCode::INVALID_ARGUMENT,
  178. grpc::experimental::StsCredentialsOptionsFromJson(invalid_json, &options)
  179. .error_code());
  180. const char invalid_json_missing_subject_token_type[] = R"(
  181. {
  182. "token_exchange_service_uri": "https://foo/exchange",
  183. "subject_token_path": "subject_token_path"
  184. })";
  185. auto status = grpc::experimental::StsCredentialsOptionsFromJson(
  186. invalid_json_missing_subject_token_type, &options);
  187. EXPECT_EQ(grpc::StatusCode::INVALID_ARGUMENT, status.error_code());
  188. EXPECT_THAT(status.error_message(),
  189. ::testing::HasSubstr("subject_token_type"));
  190. const char invalid_json_missing_subject_token_path[] = R"(
  191. {
  192. "token_exchange_service_uri": "https://foo/exchange",
  193. "subject_token_type": "subject_token_type"
  194. })";
  195. status = grpc::experimental::StsCredentialsOptionsFromJson(
  196. invalid_json_missing_subject_token_path, &options);
  197. EXPECT_EQ(grpc::StatusCode::INVALID_ARGUMENT, status.error_code());
  198. EXPECT_THAT(status.error_message(),
  199. ::testing::HasSubstr("subject_token_path"));
  200. const char invalid_json_missing_token_exchange_uri[] = R"(
  201. {
  202. "subject_token_path": "subject_token_path",
  203. "subject_token_type": "subject_token_type"
  204. })";
  205. status = grpc::experimental::StsCredentialsOptionsFromJson(
  206. invalid_json_missing_token_exchange_uri, &options);
  207. EXPECT_EQ(grpc::StatusCode::INVALID_ARGUMENT, status.error_code());
  208. EXPECT_THAT(status.error_message(),
  209. ::testing::HasSubstr("token_exchange_service_uri"));
  210. }
  211. TEST_F(CredentialsTest, StsCredentialsOptionsFromEnv) {
  212. // Unset env and check expected failure.
  213. gpr_unsetenv("STS_CREDENTIALS");
  214. grpc::experimental::StsCredentialsOptions options;
  215. auto status = grpc::experimental::StsCredentialsOptionsFromEnv(&options);
  216. EXPECT_EQ(grpc::StatusCode::NOT_FOUND, status.error_code());
  217. // Set env and check for success.
  218. const char valid_json[] = R"(
  219. {
  220. "token_exchange_service_uri": "https://foo/exchange",
  221. "subject_token_path": "subject_token_path",
  222. "subject_token_type": "subject_token_type"
  223. })";
  224. char* creds_file_name;
  225. FILE* creds_file = gpr_tmpfile("sts_creds_options", &creds_file_name);
  226. ASSERT_NE(creds_file_name, nullptr);
  227. ASSERT_NE(creds_file, nullptr);
  228. ASSERT_EQ(sizeof(valid_json),
  229. fwrite(valid_json, 1, sizeof(valid_json), creds_file));
  230. fclose(creds_file);
  231. gpr_setenv("STS_CREDENTIALS", creds_file_name);
  232. gpr_free(creds_file_name);
  233. status = grpc::experimental::StsCredentialsOptionsFromEnv(&options);
  234. EXPECT_TRUE(status.ok());
  235. EXPECT_EQ(options.token_exchange_service_uri, "https://foo/exchange");
  236. EXPECT_EQ(options.resource, "");
  237. EXPECT_EQ(options.audience, "");
  238. EXPECT_EQ(options.scope, "");
  239. EXPECT_EQ(options.requested_token_type, "");
  240. EXPECT_EQ(options.subject_token_path, "subject_token_path");
  241. EXPECT_EQ(options.subject_token_type, "subject_token_type");
  242. EXPECT_EQ(options.actor_token_path, "");
  243. EXPECT_EQ(options.actor_token_type, "");
  244. // Cleanup.
  245. gpr_unsetenv("STS_CREDENTIALS");
  246. }
  247. typedef class ::grpc_impl::experimental::TlsKeyMaterialsConfig
  248. TlsKeyMaterialsConfig;
  249. TEST_F(CredentialsTest, TlsKeyMaterialsConfigCppToC) {
  250. std::shared_ptr<TlsKeyMaterialsConfig> config(new TlsKeyMaterialsConfig());
  251. struct TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key",
  252. "cert_chain"};
  253. std::vector<TlsKeyMaterialsConfig::PemKeyCertPair> pair_list = {pair};
  254. config->set_key_materials("pem_root_certs", pair_list);
  255. grpc_tls_key_materials_config* c_config =
  256. ConvertToCKeyMaterialsConfig(config);
  257. EXPECT_STREQ("pem_root_certs", c_config->pem_root_certs());
  258. EXPECT_EQ(1, static_cast<int>(c_config->pem_key_cert_pair_list().size()));
  259. EXPECT_STREQ(pair.private_key.c_str(),
  260. c_config->pem_key_cert_pair_list()[0].private_key());
  261. EXPECT_STREQ(pair.cert_chain.c_str(),
  262. c_config->pem_key_cert_pair_list()[0].cert_chain());
  263. delete c_config;
  264. }
  265. TEST_F(CredentialsTest, TlsKeyMaterialsModifiers) {
  266. std::shared_ptr<TlsKeyMaterialsConfig> config(new TlsKeyMaterialsConfig());
  267. struct TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key",
  268. "cert_chain"};
  269. config->add_pem_key_cert_pair(pair);
  270. config->set_pem_root_certs("pem_root_certs");
  271. EXPECT_STREQ(config->pem_root_certs().c_str(), "pem_root_certs");
  272. std::vector<TlsKeyMaterialsConfig::PemKeyCertPair> list =
  273. config->pem_key_cert_pair_list();
  274. EXPECT_EQ(static_cast<int>(list.size()), 1);
  275. EXPECT_STREQ(list[0].private_key.c_str(), "private_key");
  276. EXPECT_STREQ(list[0].cert_chain.c_str(), "cert_chain");
  277. }
  278. typedef class ::grpc_impl::experimental::TlsCredentialReloadArg
  279. TlsCredentialReloadArg;
  280. typedef class ::grpc_impl::experimental::TlsCredentialReloadConfig
  281. TlsCredentialReloadConfig;
  282. TEST_F(CredentialsTest, TlsCredentialReloadArgCallback) {
  283. grpc_tls_credential_reload_arg* c_arg = new grpc_tls_credential_reload_arg;
  284. c_arg->cb = tls_credential_reload_callback;
  285. c_arg->context = nullptr;
  286. TlsCredentialReloadArg* arg = new TlsCredentialReloadArg(c_arg);
  287. arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
  288. arg->OnCredentialReloadDoneCallback();
  289. EXPECT_EQ(arg->status(), GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED);
  290. // Cleanup.
  291. delete arg;
  292. delete c_arg;
  293. }
  294. TEST_F(CredentialsTest, TlsCredentialReloadConfigSchedule) {
  295. std::shared_ptr<TestTlsCredentialReload> test_credential_reload(
  296. new TestTlsCredentialReload());
  297. std::shared_ptr<TlsCredentialReloadConfig> config(
  298. new TlsCredentialReloadConfig(test_credential_reload));
  299. grpc_tls_credential_reload_arg* c_arg = new grpc_tls_credential_reload_arg();
  300. c_arg->context = nullptr;
  301. TlsCredentialReloadArg* arg = new TlsCredentialReloadArg(c_arg);
  302. std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config(
  303. new TlsKeyMaterialsConfig());
  304. struct TlsKeyMaterialsConfig::PemKeyCertPair pair1 = {"private_key1",
  305. "cert_chain1"};
  306. struct TlsKeyMaterialsConfig::PemKeyCertPair pair2 = {"private_key2",
  307. "cert_chain2"};
  308. std::vector<TlsKeyMaterialsConfig::PemKeyCertPair> pair_list = {pair1, pair2};
  309. key_materials_config->set_key_materials("pem_root_certs", pair_list);
  310. arg->set_key_materials_config(key_materials_config);
  311. arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
  312. arg->set_error_details("error_details");
  313. const char* error_details_before_schedule = c_arg->error_details;
  314. int schedule_output = config->Schedule(arg);
  315. EXPECT_EQ(schedule_output, 0);
  316. EXPECT_STREQ(c_arg->key_materials_config->pem_root_certs(),
  317. "new_pem_root_certs");
  318. grpc_tls_key_materials_config::PemKeyCertPairList c_pair_list =
  319. c_arg->key_materials_config->pem_key_cert_pair_list();
  320. EXPECT_TRUE(!arg->is_pem_key_cert_pair_list_empty());
  321. EXPECT_EQ(static_cast<int>(c_pair_list.size()), 3);
  322. EXPECT_STREQ(c_pair_list[0].private_key(), "private_key1");
  323. EXPECT_STREQ(c_pair_list[0].cert_chain(), "cert_chain1");
  324. EXPECT_STREQ(c_pair_list[1].private_key(), "private_key2");
  325. EXPECT_STREQ(c_pair_list[1].cert_chain(), "cert_chain2");
  326. EXPECT_STREQ(c_pair_list[2].private_key(), "private_key3");
  327. EXPECT_STREQ(c_pair_list[2].cert_chain(), "cert_chain3");
  328. EXPECT_EQ(arg->status(), GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
  329. EXPECT_STREQ(arg->error_details().c_str(), "error_details");
  330. // Cleanup.
  331. gpr_free(const_cast<char*>(error_details_before_schedule));
  332. delete c_arg->key_materials_config;
  333. if (c_arg->destroy_context != nullptr) {
  334. c_arg->destroy_context(c_arg->context);
  335. }
  336. delete c_arg;
  337. delete config->c_config();
  338. }
  339. TEST_F(CredentialsTest, TlsCredentialReloadConfigCppToC) {
  340. std::shared_ptr<TestTlsCredentialReload> test_credential_reload(
  341. new TestTlsCredentialReload());
  342. TlsCredentialReloadConfig config(test_credential_reload);
  343. grpc_tls_credential_reload_arg c_arg;
  344. c_arg.context = nullptr;
  345. c_arg.cb_user_data = static_cast<void*>(nullptr);
  346. grpc_tls_key_materials_config c_key_materials;
  347. grpc::string test_private_key = "private_key";
  348. grpc::string test_cert_chain = "cert_chain";
  349. grpc_ssl_pem_key_cert_pair* ssl_pair =
  350. (grpc_ssl_pem_key_cert_pair*)gpr_malloc(
  351. sizeof(grpc_ssl_pem_key_cert_pair));
  352. ssl_pair->private_key = gpr_strdup(test_private_key.c_str());
  353. ssl_pair->cert_chain = gpr_strdup(test_cert_chain.c_str());
  354. ::grpc_core::PemKeyCertPair pem_key_cert_pair =
  355. ::grpc_core::PemKeyCertPair(ssl_pair);
  356. ::grpc_core::InlinedVector<::grpc_core::PemKeyCertPair, 1>
  357. pem_key_cert_pair_list;
  358. pem_key_cert_pair_list.push_back(pem_key_cert_pair);
  359. grpc::string test_pem_root_certs = "pem_root_certs";
  360. c_key_materials.set_key_materials(
  361. ::grpc_core::UniquePtr<char>(gpr_strdup(test_pem_root_certs.c_str())),
  362. pem_key_cert_pair_list);
  363. c_arg.key_materials_config = &c_key_materials;
  364. c_arg.status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
  365. grpc::string test_error_details = "error_details";
  366. c_arg.error_details = test_error_details.c_str();
  367. grpc_tls_credential_reload_config* c_config = config.c_config();
  368. c_arg.config = c_config;
  369. int c_schedule_output = c_config->Schedule(&c_arg);
  370. EXPECT_EQ(c_schedule_output, 0);
  371. EXPECT_EQ(c_arg.cb_user_data, nullptr);
  372. EXPECT_STREQ(c_arg.key_materials_config->pem_root_certs(),
  373. "new_pem_root_certs");
  374. ::grpc_core::InlinedVector<::grpc_core::PemKeyCertPair, 1> pair_list =
  375. c_arg.key_materials_config->pem_key_cert_pair_list();
  376. EXPECT_EQ(static_cast<int>(pair_list.size()), 2);
  377. EXPECT_STREQ(pair_list[0].private_key(), "private_key");
  378. EXPECT_STREQ(pair_list[0].cert_chain(), "cert_chain");
  379. EXPECT_STREQ(pair_list[1].private_key(), "private_key3");
  380. EXPECT_STREQ(pair_list[1].cert_chain(), "cert_chain3");
  381. EXPECT_EQ(c_arg.status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
  382. EXPECT_STREQ(c_arg.error_details, test_error_details.c_str());
  383. // Cleanup.
  384. c_arg.destroy_context(c_arg.context);
  385. delete config.c_config();
  386. }
  387. typedef class ::grpc_impl::experimental::TlsServerAuthorizationCheckArg
  388. TlsServerAuthorizationCheckArg;
  389. typedef class ::grpc_impl::experimental::TlsServerAuthorizationCheckConfig
  390. TlsServerAuthorizationCheckConfig;
  391. TEST_F(CredentialsTest, TlsServerAuthorizationCheckArgCallback) {
  392. grpc_tls_server_authorization_check_arg* c_arg =
  393. new grpc_tls_server_authorization_check_arg;
  394. c_arg->cb = tls_server_authorization_check_callback;
  395. c_arg->context = nullptr;
  396. TlsServerAuthorizationCheckArg* arg =
  397. new TlsServerAuthorizationCheckArg(c_arg);
  398. arg->set_cb_user_data(nullptr);
  399. arg->set_success(0);
  400. arg->set_target_name("target_name");
  401. arg->set_peer_cert("peer_cert");
  402. arg->set_status(GRPC_STATUS_UNAUTHENTICATED);
  403. arg->set_error_details("error_details");
  404. const char* target_name_before_callback = c_arg->target_name;
  405. const char* peer_cert_before_callback = c_arg->peer_cert;
  406. const char* error_details_before_callback = c_arg->error_details;
  407. arg->OnServerAuthorizationCheckDoneCallback();
  408. EXPECT_STREQ(static_cast<char*>(arg->cb_user_data()), "cb_user_data");
  409. gpr_free(arg->cb_user_data());
  410. EXPECT_EQ(arg->success(), 1);
  411. EXPECT_STREQ(arg->target_name().c_str(), "callback_target_name");
  412. EXPECT_STREQ(arg->peer_cert().c_str(), "callback_peer_cert");
  413. EXPECT_EQ(arg->status(), GRPC_STATUS_OK);
  414. EXPECT_STREQ(arg->error_details().c_str(), "callback_error_details");
  415. // Cleanup.
  416. gpr_free(const_cast<char*>(target_name_before_callback));
  417. gpr_free(const_cast<char*>(peer_cert_before_callback));
  418. gpr_free(const_cast<char*>(error_details_before_callback));
  419. gpr_free(const_cast<char*>(c_arg->target_name));
  420. gpr_free(const_cast<char*>(c_arg->peer_cert));
  421. gpr_free(const_cast<char*>(c_arg->error_details));
  422. delete arg;
  423. delete c_arg;
  424. }
  425. TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigSchedule) {
  426. std::shared_ptr<TestTlsServerAuthorizationCheck>
  427. test_server_authorization_check(new TestTlsServerAuthorizationCheck());
  428. TlsServerAuthorizationCheckConfig config(test_server_authorization_check);
  429. grpc_tls_server_authorization_check_arg* c_arg =
  430. new grpc_tls_server_authorization_check_arg();
  431. c_arg->context = nullptr;
  432. TlsServerAuthorizationCheckArg* arg =
  433. new TlsServerAuthorizationCheckArg(c_arg);
  434. arg->set_cb_user_data(nullptr);
  435. arg->set_success(0);
  436. arg->set_target_name("target_name");
  437. arg->set_peer_cert("peer_cert");
  438. arg->set_status(GRPC_STATUS_PERMISSION_DENIED);
  439. arg->set_error_details("error_details");
  440. const char* target_name_before_schedule = c_arg->target_name;
  441. const char* peer_cert_before_schedule = c_arg->peer_cert;
  442. const char* error_details_before_schedule = c_arg->error_details;
  443. int schedule_output = config.Schedule(arg);
  444. EXPECT_EQ(schedule_output, 1);
  445. EXPECT_STREQ(static_cast<char*>(arg->cb_user_data()), "cb_user_data");
  446. EXPECT_EQ(arg->success(), 1);
  447. EXPECT_STREQ(arg->target_name().c_str(), "sync_target_name");
  448. EXPECT_STREQ(arg->peer_cert().c_str(), "sync_peer_cert");
  449. EXPECT_EQ(arg->status(), GRPC_STATUS_OK);
  450. EXPECT_STREQ(arg->error_details().c_str(), "sync_error_details");
  451. // Cleanup.
  452. gpr_free(arg->cb_user_data());
  453. gpr_free(const_cast<char*>(target_name_before_schedule));
  454. gpr_free(const_cast<char*>(peer_cert_before_schedule));
  455. gpr_free(const_cast<char*>(error_details_before_schedule));
  456. gpr_free(const_cast<char*>(c_arg->target_name));
  457. gpr_free(const_cast<char*>(c_arg->peer_cert));
  458. gpr_free(const_cast<char*>(c_arg->error_details));
  459. if (c_arg->destroy_context != nullptr) {
  460. c_arg->destroy_context(c_arg->context);
  461. }
  462. delete c_arg;
  463. delete config.c_config();
  464. }
  465. TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigCppToC) {
  466. std::shared_ptr<TestTlsServerAuthorizationCheck>
  467. test_server_authorization_check(new TestTlsServerAuthorizationCheck());
  468. TlsServerAuthorizationCheckConfig config(test_server_authorization_check);
  469. grpc_tls_server_authorization_check_arg c_arg;
  470. c_arg.cb = tls_server_authorization_check_callback;
  471. c_arg.cb_user_data = nullptr;
  472. c_arg.success = 0;
  473. c_arg.target_name = "target_name";
  474. c_arg.peer_cert = "peer_cert";
  475. c_arg.status = GRPC_STATUS_UNAUTHENTICATED;
  476. c_arg.error_details = "error_details";
  477. c_arg.config = config.c_config();
  478. c_arg.context = nullptr;
  479. int c_schedule_output = (c_arg.config)->Schedule(&c_arg);
  480. EXPECT_EQ(c_schedule_output, 1);
  481. EXPECT_STREQ(static_cast<char*>(c_arg.cb_user_data), "cb_user_data");
  482. EXPECT_EQ(c_arg.success, 1);
  483. EXPECT_STREQ(c_arg.target_name, "sync_target_name");
  484. EXPECT_STREQ(c_arg.peer_cert, "sync_peer_cert");
  485. EXPECT_EQ(c_arg.status, GRPC_STATUS_OK);
  486. EXPECT_STREQ(c_arg.error_details, "sync_error_details");
  487. // Cleanup.
  488. gpr_free(c_arg.cb_user_data);
  489. c_arg.destroy_context(c_arg.context);
  490. gpr_free(const_cast<char*>(c_arg.error_details));
  491. gpr_free(const_cast<char*>(c_arg.target_name));
  492. gpr_free(const_cast<char*>(c_arg.peer_cert));
  493. delete config.c_config();
  494. }
  495. typedef class ::grpc_impl::experimental::TlsCredentialsOptions
  496. TlsCredentialsOptions;
  497. TEST_F(CredentialsTest, TlsCredentialsOptionsCppToC) {
  498. std::shared_ptr<TlsKeyMaterialsConfig> key_materials_config(
  499. new TlsKeyMaterialsConfig());
  500. struct TlsKeyMaterialsConfig::PemKeyCertPair pair = {"private_key",
  501. "cert_chain"};
  502. std::vector<TlsKeyMaterialsConfig::PemKeyCertPair> pair_list = {pair};
  503. key_materials_config->set_key_materials("pem_root_certs", pair_list);
  504. std::shared_ptr<TestTlsCredentialReload> test_credential_reload(
  505. new TestTlsCredentialReload());
  506. std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config(
  507. new TlsCredentialReloadConfig(test_credential_reload));
  508. std::shared_ptr<TestTlsServerAuthorizationCheck>
  509. test_server_authorization_check(new TestTlsServerAuthorizationCheck());
  510. std::shared_ptr<TlsServerAuthorizationCheckConfig>
  511. server_authorization_check_config(new TlsServerAuthorizationCheckConfig(
  512. test_server_authorization_check));
  513. TlsCredentialsOptions options = TlsCredentialsOptions(
  514. GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY,
  515. GRPC_TLS_SERVER_VERIFICATION, key_materials_config,
  516. credential_reload_config, server_authorization_check_config);
  517. grpc_tls_credentials_options* c_options = options.c_credentials_options();
  518. EXPECT_EQ(c_options->cert_request_type(),
  519. GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY);
  520. grpc_tls_key_materials_config* c_key_materials_config =
  521. c_options->key_materials_config();
  522. grpc_tls_credential_reload_config* c_credential_reload_config =
  523. c_options->credential_reload_config();
  524. grpc_tls_credential_reload_arg c_credential_reload_arg;
  525. c_credential_reload_arg.cb_user_data = nullptr;
  526. c_credential_reload_arg.key_materials_config =
  527. c_options->key_materials_config();
  528. c_credential_reload_arg.status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
  529. grpc::string test_error_details = "error_details";
  530. c_credential_reload_arg.error_details = test_error_details.c_str();
  531. c_credential_reload_arg.context = nullptr;
  532. grpc_tls_server_authorization_check_config*
  533. c_server_authorization_check_config =
  534. c_options->server_authorization_check_config();
  535. grpc_tls_server_authorization_check_arg c_server_authorization_check_arg;
  536. c_server_authorization_check_arg.cb = tls_server_authorization_check_callback;
  537. c_server_authorization_check_arg.cb_user_data = nullptr;
  538. c_server_authorization_check_arg.success = 0;
  539. c_server_authorization_check_arg.target_name = "target_name";
  540. c_server_authorization_check_arg.peer_cert = "peer_cert";
  541. c_server_authorization_check_arg.status = GRPC_STATUS_UNAUTHENTICATED;
  542. c_server_authorization_check_arg.error_details = "error_details";
  543. c_server_authorization_check_arg.context = nullptr;
  544. EXPECT_STREQ(c_key_materials_config->pem_root_certs(), "pem_root_certs");
  545. EXPECT_EQ(
  546. static_cast<int>(c_key_materials_config->pem_key_cert_pair_list().size()),
  547. 1);
  548. EXPECT_STREQ(
  549. c_key_materials_config->pem_key_cert_pair_list()[0].private_key(),
  550. "private_key");
  551. EXPECT_STREQ(c_key_materials_config->pem_key_cert_pair_list()[0].cert_chain(),
  552. "cert_chain");
  553. GPR_ASSERT(c_credential_reload_config != nullptr);
  554. int c_credential_reload_schedule_output =
  555. c_credential_reload_config->Schedule(&c_credential_reload_arg);
  556. EXPECT_EQ(c_credential_reload_schedule_output, 0);
  557. EXPECT_EQ(c_credential_reload_arg.cb_user_data, nullptr);
  558. EXPECT_STREQ(c_credential_reload_arg.key_materials_config->pem_root_certs(),
  559. "new_pem_root_certs");
  560. ::grpc_core::InlinedVector<::grpc_core::PemKeyCertPair, 1> c_pair_list =
  561. c_credential_reload_arg.key_materials_config->pem_key_cert_pair_list();
  562. EXPECT_EQ(static_cast<int>(c_pair_list.size()), 2);
  563. EXPECT_STREQ(c_pair_list[0].private_key(), "private_key");
  564. EXPECT_STREQ(c_pair_list[0].cert_chain(), "cert_chain");
  565. EXPECT_STREQ(c_pair_list[1].private_key(), "private_key3");
  566. EXPECT_STREQ(c_pair_list[1].cert_chain(), "cert_chain3");
  567. EXPECT_EQ(c_credential_reload_arg.status,
  568. GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW);
  569. EXPECT_STREQ(c_credential_reload_arg.error_details,
  570. test_error_details.c_str());
  571. int c_server_authorization_check_schedule_output =
  572. c_server_authorization_check_config->Schedule(
  573. &c_server_authorization_check_arg);
  574. EXPECT_EQ(c_server_authorization_check_schedule_output, 1);
  575. EXPECT_STREQ(
  576. static_cast<char*>(c_server_authorization_check_arg.cb_user_data),
  577. "cb_user_data");
  578. EXPECT_EQ(c_server_authorization_check_arg.success, 1);
  579. EXPECT_STREQ(c_server_authorization_check_arg.target_name,
  580. "sync_target_name");
  581. EXPECT_STREQ(c_server_authorization_check_arg.peer_cert, "sync_peer_cert");
  582. EXPECT_EQ(c_server_authorization_check_arg.status, GRPC_STATUS_OK);
  583. EXPECT_STREQ(c_server_authorization_check_arg.error_details,
  584. "sync_error_details");
  585. // Cleanup.
  586. c_credential_reload_arg.destroy_context(c_credential_reload_arg.context);
  587. c_server_authorization_check_arg.destroy_context(
  588. c_server_authorization_check_arg.context);
  589. gpr_free(c_server_authorization_check_arg.cb_user_data);
  590. gpr_free(const_cast<char*>(c_server_authorization_check_arg.target_name));
  591. gpr_free(const_cast<char*>(c_server_authorization_check_arg.peer_cert));
  592. gpr_free(const_cast<char*>(c_server_authorization_check_arg.error_details));
  593. delete c_options;
  594. }
  595. // This test demonstrates how the SPIFFE credentials will be used.
  596. TEST_F(CredentialsTest, LoadTlsChannelCredentials) {
  597. std::shared_ptr<TestTlsCredentialReload> test_credential_reload(
  598. new TestTlsCredentialReload());
  599. std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config(
  600. new TlsCredentialReloadConfig(test_credential_reload));
  601. std::shared_ptr<TestTlsServerAuthorizationCheck>
  602. test_server_authorization_check(new TestTlsServerAuthorizationCheck());
  603. std::shared_ptr<TlsServerAuthorizationCheckConfig>
  604. server_authorization_check_config(new TlsServerAuthorizationCheckConfig(
  605. test_server_authorization_check));
  606. TlsCredentialsOptions options = TlsCredentialsOptions(
  607. GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY,
  608. GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config,
  609. server_authorization_check_config);
  610. std::shared_ptr<grpc_impl::ChannelCredentials> channel_credentials =
  611. grpc::experimental::TlsCredentials(options);
  612. GPR_ASSERT(channel_credentials.get() != nullptr);
  613. }
  614. // This test demonstrates how the TLS credentials will be used to create
  615. // server credentials.
  616. TEST_F(CredentialsTest, LoadTlsServerCredentials) {
  617. std::shared_ptr<TestTlsCredentialReload> test_credential_reload(
  618. new TestTlsCredentialReload());
  619. std::shared_ptr<TlsCredentialReloadConfig> credential_reload_config(
  620. new TlsCredentialReloadConfig(test_credential_reload));
  621. TlsCredentialsOptions options = TlsCredentialsOptions(
  622. GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY,
  623. GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config, nullptr);
  624. // It is necessary to instantiate a |ServerBuilder| object so that the C-core
  625. // is properly initialized.
  626. ::grpc::ServerBuilder builder;
  627. (void)builder;
  628. std::shared_ptr<::grpc_impl::ServerCredentials> server_credentials =
  629. grpc::experimental::TlsServerCredentials(options);
  630. GPR_ASSERT(server_credentials.get() != nullptr);
  631. }
  632. TEST_F(CredentialsTest, TlsCredentialReloadConfigErrorMessages) {
  633. std::shared_ptr<TlsCredentialReloadConfig> config(
  634. new TlsCredentialReloadConfig(nullptr));
  635. grpc_tls_credential_reload_arg* c_arg = new grpc_tls_credential_reload_arg;
  636. c_arg->context = nullptr;
  637. TlsCredentialReloadArg* arg = new TlsCredentialReloadArg(c_arg);
  638. int schedule_output = config->Schedule(arg);
  639. EXPECT_EQ(schedule_output, 1);
  640. EXPECT_EQ(arg->status(), GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL);
  641. EXPECT_STREQ(arg->error_details().c_str(),
  642. "the interface of the credential reload config is nullptr");
  643. gpr_free(const_cast<char*>(c_arg->error_details));
  644. arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED);
  645. config->Cancel(arg);
  646. EXPECT_EQ(arg->status(), GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL);
  647. EXPECT_STREQ(arg->error_details().c_str(),
  648. "the interface of the credential reload config is nullptr");
  649. // Cleanup.
  650. gpr_free(const_cast<char*>(c_arg->error_details));
  651. if (c_arg->destroy_context != nullptr) {
  652. c_arg->destroy_context(c_arg->context);
  653. }
  654. delete c_arg;
  655. delete config->c_config();
  656. }
  657. TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigErrorMessages) {
  658. std::shared_ptr<TlsServerAuthorizationCheckConfig> config(
  659. new TlsServerAuthorizationCheckConfig(nullptr));
  660. grpc_tls_server_authorization_check_arg* c_arg =
  661. new grpc_tls_server_authorization_check_arg;
  662. c_arg->context = nullptr;
  663. TlsServerAuthorizationCheckArg* arg =
  664. new TlsServerAuthorizationCheckArg(c_arg);
  665. int schedule_output = config->Schedule(arg);
  666. EXPECT_EQ(schedule_output, 1);
  667. EXPECT_EQ(arg->status(), GRPC_STATUS_NOT_FOUND);
  668. EXPECT_STREQ(
  669. arg->error_details().c_str(),
  670. "the interface of the server authorization check config is nullptr");
  671. gpr_free(const_cast<char*>(c_arg->error_details));
  672. arg->set_status(GRPC_STATUS_OK);
  673. config->Cancel(arg);
  674. EXPECT_EQ(arg->status(), GRPC_STATUS_NOT_FOUND);
  675. EXPECT_STREQ(
  676. arg->error_details().c_str(),
  677. "the interface of the server authorization check config is nullptr");
  678. // Cleanup.
  679. gpr_free(const_cast<char*>(c_arg->error_details));
  680. if (c_arg->destroy_context != nullptr) {
  681. c_arg->destroy_context(c_arg->context);
  682. }
  683. delete c_arg;
  684. delete config->c_config();
  685. }
  686. } // namespace testing
  687. } // namespace grpc
  688. int main(int argc, char** argv) {
  689. ::testing::InitGoogleTest(&argc, argv);
  690. int ret = RUN_ALL_TESTS();
  691. return ret;
  692. }