alts_util_test.cc 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /*
  2. *
  3. * Copyright 2019 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 "upb/upb.hpp"
  19. #include <grpcpp/security/alts_context.h>
  20. #include <grpcpp/security/alts_util.h>
  21. #include <grpcpp/security/auth_context.h>
  22. #include <gtest/gtest.h>
  23. #include "src/core/tsi/alts/handshaker/alts_tsi_handshaker.h"
  24. #include "src/cpp/common/secure_auth_context.h"
  25. #include "src/proto/grpc/gcp/altscontext.upb.h"
  26. #include "test/cpp/util/string_ref_helper.h"
  27. namespace grpc {
  28. namespace {
  29. TEST(AltsUtilTest, NullAuthContext) {
  30. std::unique_ptr<experimental::AltsContext> alts_context =
  31. experimental::GetAltsContextFromAuthContext(nullptr);
  32. EXPECT_EQ(alts_context, nullptr);
  33. }
  34. TEST(AltsUtilTest, EmptyAuthContext) {
  35. grpc_core::RefCountedPtr<grpc_auth_context> ctx =
  36. grpc_core::MakeRefCounted<grpc_auth_context>(nullptr);
  37. const std::shared_ptr<AuthContext> auth_context(
  38. new SecureAuthContext(ctx.get()));
  39. std::unique_ptr<experimental::AltsContext> alts_context =
  40. experimental::GetAltsContextFromAuthContext(auth_context);
  41. EXPECT_EQ(alts_context, nullptr);
  42. }
  43. TEST(AltsUtilTest, AuthContextWithMoreThanOneAltsContext) {
  44. grpc_core::RefCountedPtr<grpc_auth_context> ctx =
  45. grpc_core::MakeRefCounted<grpc_auth_context>(nullptr);
  46. const std::shared_ptr<AuthContext> auth_context(
  47. new SecureAuthContext(ctx.get()));
  48. ctx.reset();
  49. auth_context->AddProperty(TSI_ALTS_CONTEXT, "context1");
  50. auth_context->AddProperty(TSI_ALTS_CONTEXT, "context2");
  51. std::unique_ptr<experimental::AltsContext> alts_context =
  52. experimental::GetAltsContextFromAuthContext(auth_context);
  53. EXPECT_EQ(alts_context, nullptr);
  54. }
  55. TEST(AltsUtilTest, AuthContextWithBadAltsContext) {
  56. grpc_core::RefCountedPtr<grpc_auth_context> ctx =
  57. grpc_core::MakeRefCounted<grpc_auth_context>(nullptr);
  58. const std::shared_ptr<AuthContext> auth_context(
  59. new SecureAuthContext(ctx.get()));
  60. ctx.reset();
  61. auth_context->AddProperty(TSI_ALTS_CONTEXT,
  62. "bad context string serialization");
  63. std::unique_ptr<experimental::AltsContext> alts_context =
  64. experimental::GetAltsContextFromAuthContext(auth_context);
  65. EXPECT_EQ(alts_context, nullptr);
  66. }
  67. TEST(AltsUtilTest, AuthContextWithGoodAltsContextWithoutRpcVersions) {
  68. grpc_core::RefCountedPtr<grpc_auth_context> ctx =
  69. grpc_core::MakeRefCounted<grpc_auth_context>(nullptr);
  70. const std::shared_ptr<AuthContext> auth_context(
  71. new SecureAuthContext(ctx.get()));
  72. ctx.reset();
  73. std::string expected_ap("application protocol");
  74. std::string expected_rp("record protocol");
  75. std::string expected_peer("peer");
  76. std::string expected_local("local");
  77. //doggo
  78. std::string expected_peer_atrributes_key("peer");
  79. std::string expected_peer_atrributes_value("attributes");
  80. grpc_security_level expected_sl = GRPC_INTEGRITY_ONLY;
  81. upb::Arena context_arena;
  82. grpc_gcp_AltsContext* context = grpc_gcp_AltsContext_new(context_arena.ptr());
  83. grpc_gcp_AltsContext_set_application_protocol(
  84. context, upb_strview_make(expected_ap.data(), expected_ap.length()));
  85. grpc_gcp_AltsContext_set_record_protocol(
  86. context, upb_strview_make(expected_rp.data(), expected_rp.length()));
  87. grpc_gcp_AltsContext_set_security_level(context, expected_sl);
  88. grpc_gcp_AltsContext_set_peer_service_account(
  89. context, upb_strview_make(expected_peer.data(), expected_peer.length()));
  90. grpc_gcp_AltsContext_set_local_service_account(
  91. context,
  92. upb_strview_make(expected_local.data(), expected_local.length()));
  93. grpc_gcp_AltsContext_peer_attributes_set(context,
  94. upb_strview_make(expected_peer_atrributes_key.data(), expected_peer_atrributes_key.length()),
  95. upb_strview_make(expected_peer_atrributes_value.data(), expected_peer_atrributes_value.length()),
  96. context_arena.ptr());
  97. size_t serialized_ctx_length;
  98. char* serialized_ctx = grpc_gcp_AltsContext_serialize(
  99. context, context_arena.ptr(), &serialized_ctx_length);
  100. EXPECT_NE(serialized_ctx, nullptr);
  101. auth_context->AddProperty(TSI_ALTS_CONTEXT,
  102. string(serialized_ctx, serialized_ctx_length));
  103. std::unique_ptr<experimental::AltsContext> alts_context =
  104. experimental::GetAltsContextFromAuthContext(auth_context);
  105. EXPECT_NE(alts_context, nullptr);
  106. EXPECT_EQ(expected_ap, alts_context->application_protocol());
  107. EXPECT_EQ(expected_rp, alts_context->record_protocol());
  108. EXPECT_EQ(expected_peer, alts_context->peer_service_account());
  109. EXPECT_EQ(expected_local, alts_context->local_service_account());
  110. EXPECT_EQ(expected_sl, alts_context->security_level());
  111. // all rpc versions should be 0 if not set
  112. experimental::AltsContext::RpcProtocolVersions rpc_protocol_versions =
  113. alts_context->peer_rpc_versions();
  114. EXPECT_EQ(0, rpc_protocol_versions.max_rpc_version.major_version);
  115. EXPECT_EQ(0, rpc_protocol_versions.max_rpc_version.minor_version);
  116. EXPECT_EQ(0, rpc_protocol_versions.min_rpc_version.major_version);
  117. EXPECT_EQ(0, rpc_protocol_versions.min_rpc_version.minor_version);
  118. EXPECT_EQ(expected_peer_atrributes_value, alts_context->peer_attributes()[expected_peer_atrributes_key]);
  119. }
  120. TEST(AltsUtilTest, AuthContextWithGoodAltsContext) {
  121. grpc_core::RefCountedPtr<grpc_auth_context> ctx =
  122. grpc_core::MakeRefCounted<grpc_auth_context>(nullptr);
  123. const std::shared_ptr<AuthContext> auth_context(
  124. new SecureAuthContext(ctx.get()));
  125. ctx.reset();
  126. upb::Arena context_arena;
  127. grpc_gcp_AltsContext* context = grpc_gcp_AltsContext_new(context_arena.ptr());
  128. upb::Arena versions_arena;
  129. grpc_gcp_RpcProtocolVersions* versions =
  130. grpc_gcp_RpcProtocolVersions_new(versions_arena.ptr());
  131. upb::Arena max_major_version_arena;
  132. grpc_gcp_RpcProtocolVersions_Version* version =
  133. grpc_gcp_RpcProtocolVersions_Version_new(max_major_version_arena.ptr());
  134. grpc_gcp_RpcProtocolVersions_Version_set_major(version, 10);
  135. grpc_gcp_RpcProtocolVersions_set_max_rpc_version(versions, version);
  136. grpc_gcp_AltsContext_set_peer_rpc_versions(context, versions);
  137. size_t serialized_ctx_length;
  138. char* serialized_ctx = grpc_gcp_AltsContext_serialize(
  139. context, context_arena.ptr(), &serialized_ctx_length);
  140. EXPECT_NE(serialized_ctx, nullptr);
  141. auth_context->AddProperty(TSI_ALTS_CONTEXT,
  142. string(serialized_ctx, serialized_ctx_length));
  143. std::unique_ptr<experimental::AltsContext> alts_context =
  144. experimental::GetAltsContextFromAuthContext(auth_context);
  145. EXPECT_NE(alts_context, nullptr);
  146. EXPECT_EQ("", alts_context->application_protocol());
  147. EXPECT_EQ("", alts_context->record_protocol());
  148. EXPECT_EQ("", alts_context->peer_service_account());
  149. EXPECT_EQ("", alts_context->local_service_account());
  150. EXPECT_EQ(GRPC_SECURITY_NONE, alts_context->security_level());
  151. experimental::AltsContext::RpcProtocolVersions rpc_protocol_versions =
  152. alts_context->peer_rpc_versions();
  153. EXPECT_EQ(10, rpc_protocol_versions.max_rpc_version.major_version);
  154. EXPECT_EQ(0, rpc_protocol_versions.max_rpc_version.minor_version);
  155. EXPECT_EQ(0, rpc_protocol_versions.min_rpc_version.major_version);
  156. EXPECT_EQ(0, rpc_protocol_versions.min_rpc_version.minor_version);
  157. }
  158. TEST(AltsUtilTest, AltsClientAuthzCheck) {
  159. // AltsClientAuthzCheck function should return a permission denied error on
  160. // the bad_auth_context, whose internal ALTS context does not exist
  161. const std::shared_ptr<AuthContext> bad_auth_context(
  162. new SecureAuthContext(nullptr));
  163. std::vector<std::string> service_accounts{"client"};
  164. grpc::Status status =
  165. experimental::AltsClientAuthzCheck(bad_auth_context, service_accounts);
  166. EXPECT_EQ(grpc::StatusCode::PERMISSION_DENIED, status.error_code());
  167. // AltsClientAuthzCheck function should function normally when the peer name
  168. // in ALTS context is listed in service_accounts
  169. grpc_core::RefCountedPtr<grpc_auth_context> ctx =
  170. grpc_core::MakeRefCounted<grpc_auth_context>(nullptr);
  171. const std::shared_ptr<AuthContext> auth_context(
  172. new SecureAuthContext(ctx.get()));
  173. ctx.reset();
  174. std::string peer("good_client");
  175. std::vector<std::string> good_service_accounts{"good_client",
  176. "good_client_1"};
  177. std::vector<std::string> bad_service_accounts{"bad_client", "bad_client_1"};
  178. upb::Arena context_arena;
  179. grpc_gcp_AltsContext* context = grpc_gcp_AltsContext_new(context_arena.ptr());
  180. grpc_gcp_AltsContext_set_peer_service_account(
  181. context, upb_strview_make(peer.data(), peer.length()));
  182. size_t serialized_ctx_length;
  183. char* serialized_ctx = grpc_gcp_AltsContext_serialize(
  184. context, context_arena.ptr(), &serialized_ctx_length);
  185. EXPECT_NE(serialized_ctx, nullptr);
  186. auth_context->AddProperty(TSI_ALTS_CONTEXT,
  187. string(serialized_ctx, serialized_ctx_length));
  188. grpc::Status good_status =
  189. experimental::AltsClientAuthzCheck(auth_context, good_service_accounts);
  190. EXPECT_TRUE(good_status.ok());
  191. grpc::Status bad_status =
  192. experimental::AltsClientAuthzCheck(auth_context, bad_service_accounts);
  193. EXPECT_EQ(grpc::StatusCode::PERMISSION_DENIED, bad_status.error_code());
  194. }
  195. } // namespace
  196. } // namespace grpc
  197. int main(int argc, char** argv) {
  198. ::testing::InitGoogleTest(&argc, argv);
  199. return RUN_ALL_TESTS();
  200. }