aws_request_signer_test.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. //
  2. // Copyright 2020 gRPC authors.
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. //
  16. #include "src/core/lib/security/credentials/external/aws_request_signer.h"
  17. #include <gmock/gmock.h>
  18. #include <grpc/grpc_security.h>
  19. #include "test/core/util/test_config.h"
  20. namespace testing {
  21. namespace {
  22. // Test cases of Aws endpoints that the aws-sourced credentials will depend
  23. // on.
  24. const char* kAmzTestAccessKeyId = "ASIARD4OQDT6A77FR3CL";
  25. const char* kAmzTestSecretAccessKey =
  26. "Y8AfSaucF37G4PpvfguKZ3/l7Id4uocLXxX0+VTx";
  27. const char* kAmzTestToken =
  28. "IQoJb3JpZ2luX2VjEIz//////////wEaCXVzLWVhc3QtMiJGMEQCIH7MHX/Oy/"
  29. "OB8OlLQa9GrqU1B914+iMikqWQW7vPCKlgAiA/"
  30. "Lsv8Jcafn14owfxXn95FURZNKaaphj0ykpmS+Ki+"
  31. "CSq0AwhlEAAaDDA3NzA3MTM5MTk5NiIMx9sAeP1ovlMTMKLjKpEDwuJQg41/"
  32. "QUKx0laTZYjPlQvjwSqS3OB9P1KAXPWSLkliVMMqaHqelvMF/WO/"
  33. "glv3KwuTfQsavRNs3v5pcSEm4SPO3l7mCs7KrQUHwGP0neZhIKxEXy+Ls//1C/"
  34. "Bqt53NL+LSbaGv6RPHaX82laz2qElphg95aVLdYgIFY6JWV5fzyjgnhz0DQmy62/"
  35. "Vi8pNcM2/"
  36. "VnxeCQ8CC8dRDSt52ry2v+nc77vstuI9xV5k8mPtnaPoJDRANh0bjwY5Sdwkbp+"
  37. "mGRUJBAQRlNgHUJusefXQgVKBCiyJY4w3Csd8Bgj9IyDV+"
  38. "Azuy1jQqfFZWgP68LSz5bURyIjlWDQunO82stZ0BgplKKAa/"
  39. "KJHBPCp8Qi6i99uy7qh76FQAqgVTsnDuU6fGpHDcsDSGoCls2HgZjZFPeOj8mmRhFk1Xqvkb"
  40. "juz8V1cJk54d3gIJvQt8gD2D6yJQZecnuGWd5K2e2HohvCc8Fc9kBl1300nUJPV+k4tr/"
  41. "A5R/0QfEKOZL1/"
  42. "k5lf1g9CREnrM8LVkGxCgdYMxLQow1uTL+QU67AHRRSp5PhhGX4Rek+"
  43. "01vdYSnJCMaPhSEgcLqDlQkhk6MPsyT91QMXcWmyO+cAZwUPwnRamFepuP4K8k2KVXs/"
  44. "LIJHLELwAZ0ekyaS7CptgOqS7uaSTFG3U+vzFZLEnGvWQ7y9IPNQZ+"
  45. "Dffgh4p3vF4J68y9049sI6Sr5d5wbKkcbm8hdCDHZcv4lnqohquPirLiFQ3q7B17V9krMPu3"
  46. "mz1cg4Ekgcrn/"
  47. "E09NTsxAqD8NcZ7C7ECom9r+"
  48. "X3zkDOxaajW6hu3Az8hGlyylDaMiFfRbBJpTIlxp7jfa7CxikNgNtEKLH9iCzvuSg2vhA==";
  49. const char* kAmzTestDate = "20200811T065522Z";
  50. // Test cases derived from the Aws signature v4 test suite.
  51. // https://github.com/boto/botocore/tree/master/tests/unit/auth/aws4_testsuite
  52. const char* kBotoTestAccessKeyId = "AKIDEXAMPLE";
  53. const char* kBotoTestSecretAccessKey =
  54. "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY";
  55. const char* kBotoTestToken = "";
  56. const char* kBotoTestDate = "Mon, 09 Sep 2011 23:36:00 GMT";
  57. } // namespace
  58. // AWS official example from the developer doc.
  59. // https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html
  60. TEST(GrpcAwsRequestSignerTest, AWSOfficialExample) {
  61. grpc_error_handle error = GRPC_ERROR_NONE;
  62. grpc_core::AwsRequestSigner signer(
  63. "AKIDEXAMPLE", "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", "", "GET",
  64. "https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08",
  65. "us-east-1", "",
  66. {{"content-type", "application/x-www-form-urlencoded; charset=utf-8"},
  67. {"x-amz-date", "20150830T123600Z"}},
  68. &error);
  69. EXPECT_EQ(error, GRPC_ERROR_NONE);
  70. EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
  71. "AWS4-HMAC-SHA256 "
  72. "Credential=AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request, "
  73. "SignedHeaders=content-type;host;x-amz-date, "
  74. "Signature="
  75. "5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7");
  76. }
  77. TEST(GrpcAwsRequestSignerTest, GetDescribeRegions) {
  78. grpc_error_handle error = GRPC_ERROR_NONE;
  79. grpc_core::AwsRequestSigner signer(
  80. kAmzTestAccessKeyId, kAmzTestSecretAccessKey, kAmzTestToken, "GET",
  81. "https://"
  82. "ec2.us-east-2.amazonaws.com?Action=DescribeRegions&Version=2013-10-15",
  83. "us-east-2", "", {{"x-amz-date", kAmzTestDate}}, &error);
  84. EXPECT_EQ(error, GRPC_ERROR_NONE);
  85. EXPECT_EQ(
  86. signer.GetSignedRequestHeaders()["Authorization"],
  87. "AWS4-HMAC-SHA256 "
  88. "Credential=ASIARD4OQDT6A77FR3CL/20200811/us-east-2/ec2/aws4_request, "
  89. "SignedHeaders=host;x-amz-date;x-amz-security-token, "
  90. "Signature="
  91. "631ea80cddfaa545fdadb120dc92c9f18166e38a5c47b50fab9fce476e022855");
  92. }
  93. TEST(GrpcAwsRequestSignerTest, PostGetCallerIdentity) {
  94. grpc_error_handle error = GRPC_ERROR_NONE;
  95. grpc_core::AwsRequestSigner signer(
  96. kAmzTestAccessKeyId, kAmzTestSecretAccessKey, kAmzTestToken, "POST",
  97. "https://"
  98. "sts.us-east-2.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
  99. "us-east-2", "", {{"x-amz-date", kAmzTestDate}}, &error);
  100. EXPECT_EQ(error, GRPC_ERROR_NONE);
  101. EXPECT_EQ(
  102. signer.GetSignedRequestHeaders()["Authorization"],
  103. "AWS4-HMAC-SHA256 "
  104. "Credential=ASIARD4OQDT6A77FR3CL/20200811/us-east-2/sts/aws4_request, "
  105. "SignedHeaders=host;x-amz-date;x-amz-security-token, "
  106. "Signature="
  107. "73452984e4a880ffdc5c392355733ec3f5ba310d5e0609a89244440cadfe7a7a");
  108. }
  109. TEST(GrpcAwsRequestSignerTest, PostGetCallerIdentityNoToken) {
  110. grpc_error_handle error = GRPC_ERROR_NONE;
  111. grpc_core::AwsRequestSigner signer(
  112. kAmzTestAccessKeyId, kAmzTestSecretAccessKey, "", "POST",
  113. "https://"
  114. "sts.us-east-2.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
  115. "us-east-2", "", {{"x-amz-date", kAmzTestDate}}, &error);
  116. EXPECT_EQ(error, GRPC_ERROR_NONE);
  117. EXPECT_EQ(
  118. signer.GetSignedRequestHeaders()["Authorization"],
  119. "AWS4-HMAC-SHA256 "
  120. "Credential=ASIARD4OQDT6A77FR3CL/20200811/us-east-2/sts/aws4_request, "
  121. "SignedHeaders=host;x-amz-date, "
  122. "Signature="
  123. "d095ba304919cd0d5570ba8a3787884ee78b860f268ed040ba23831d55536d56");
  124. }
  125. TEST(GrpcAwsRequestSignerTest, GetHost) {
  126. grpc_error_handle error = GRPC_ERROR_NONE;
  127. grpc_core::AwsRequestSigner signer(kBotoTestAccessKeyId,
  128. kBotoTestSecretAccessKey, kBotoTestToken,
  129. "GET", "https://host.foo.com", "us-east-1",
  130. "", {{"date", kBotoTestDate}}, &error);
  131. EXPECT_EQ(error, GRPC_ERROR_NONE);
  132. EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
  133. "AWS4-HMAC-SHA256 "
  134. "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
  135. "SignedHeaders=date;host, "
  136. "Signature="
  137. "b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470");
  138. }
  139. TEST(GrpcAwsRequestSignerTest, GetHostDuplicateQueryParam) {
  140. grpc_error_handle error = GRPC_ERROR_NONE;
  141. grpc_core::AwsRequestSigner signer(
  142. kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "GET",
  143. "https://host.foo.com/?foo=Zoo&foo=aha", "us-east-1", "",
  144. {{"date", kBotoTestDate}}, &error);
  145. EXPECT_EQ(error, GRPC_ERROR_NONE);
  146. EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
  147. "AWS4-HMAC-SHA256 "
  148. "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
  149. "SignedHeaders=date;host, "
  150. "Signature="
  151. "be7148d34ebccdc6423b19085378aa0bee970bdc61d144bd1a8c48c33079ab09");
  152. }
  153. TEST(GrpcAwsRequestSignerTest, PostWithUpperCaseHeaderKey) {
  154. grpc_error_handle error = GRPC_ERROR_NONE;
  155. grpc_core::AwsRequestSigner signer(
  156. kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "POST",
  157. "https://host.foo.com/", "us-east-1", "",
  158. {{"date", kBotoTestDate}, {"ZOO", "zoobar"}}, &error);
  159. EXPECT_EQ(error, GRPC_ERROR_NONE);
  160. EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
  161. "AWS4-HMAC-SHA256 "
  162. "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
  163. "SignedHeaders=date;host;zoo, "
  164. "Signature="
  165. "b7a95a52518abbca0964a999a880429ab734f35ebbf1235bd79a5de87756dc4a");
  166. }
  167. TEST(GrpcAwsRequestSignerTest, PostWithUpperCaseHeaderValue) {
  168. grpc_error_handle error = GRPC_ERROR_NONE;
  169. grpc_core::AwsRequestSigner signer(
  170. kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "POST",
  171. "https://host.foo.com/", "us-east-1", "",
  172. {{"date", kBotoTestDate}, {"zoo", "ZOOBAR"}}, &error);
  173. EXPECT_EQ(error, GRPC_ERROR_NONE);
  174. EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
  175. "AWS4-HMAC-SHA256 "
  176. "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
  177. "SignedHeaders=date;host;zoo, "
  178. "Signature="
  179. "273313af9d0c265c531e11db70bbd653f3ba074c1009239e8559d3987039cad7");
  180. }
  181. TEST(GrpcAwsRequestSignerTest, SignPostWithHeader) {
  182. grpc_error_handle error = GRPC_ERROR_NONE;
  183. grpc_core::AwsRequestSigner signer(
  184. kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "POST",
  185. "https://host.foo.com/", "us-east-1", "",
  186. {{"date", kBotoTestDate}, {"p", "phfft"}}, &error);
  187. EXPECT_EQ(error, GRPC_ERROR_NONE);
  188. EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
  189. "AWS4-HMAC-SHA256 "
  190. "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
  191. "SignedHeaders=date;host;p, "
  192. "Signature="
  193. "debf546796015d6f6ded8626f5ce98597c33b47b9164cf6b17b4642036fcb592");
  194. }
  195. TEST(GrpcAwsRequestSignerTest, PostWithBodyNoCustomHeaders) {
  196. grpc_error_handle error = GRPC_ERROR_NONE;
  197. grpc_core::AwsRequestSigner signer(
  198. kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "POST",
  199. "https://host.foo.com/", "us-east-1", "foo=bar",
  200. {{"date", kBotoTestDate},
  201. {"Content-Type", "application/x-www-form-urlencoded"}},
  202. &error);
  203. EXPECT_EQ(error, GRPC_ERROR_NONE);
  204. EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
  205. "AWS4-HMAC-SHA256 "
  206. "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
  207. "SignedHeaders=content-type;date;host, "
  208. "Signature="
  209. "5a15b22cf462f047318703b92e6f4f38884e4a7ab7b1d6426ca46a8bd1c26cbc");
  210. }
  211. TEST(GrpcAwsRequestSignerTest, SignPostWithQueryString) {
  212. grpc_error_handle error = GRPC_ERROR_NONE;
  213. grpc_core::AwsRequestSigner signer(
  214. kBotoTestAccessKeyId, kBotoTestSecretAccessKey, kBotoTestToken, "POST",
  215. "https://host.foo.com/?foo=bar", "us-east-1", "",
  216. {{"date", kBotoTestDate}}, &error);
  217. EXPECT_EQ(error, GRPC_ERROR_NONE);
  218. EXPECT_EQ(signer.GetSignedRequestHeaders()["Authorization"],
  219. "AWS4-HMAC-SHA256 "
  220. "Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, "
  221. "SignedHeaders=date;host, "
  222. "Signature="
  223. "b6e3b79003ce0743a491606ba1035a804593b0efb1e20a11cba83f8c25a57a92");
  224. }
  225. TEST(GrpcAwsRequestSignerTest, InvalidUrl) {
  226. grpc_error_handle error = GRPC_ERROR_NONE;
  227. grpc_core::AwsRequestSigner signer("access_key_id", "secret_access_key",
  228. "token", "POST", "invalid_url",
  229. "us-east-1", "", {}, &error);
  230. std::string actual_error_description;
  231. GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION,
  232. &actual_error_description));
  233. EXPECT_EQ(actual_error_description, "Invalid Aws request url.");
  234. GRPC_ERROR_UNREF(error);
  235. }
  236. TEST(GrpcAwsRequestSignerTest, DuplicateRequestDate) {
  237. grpc_error_handle error = GRPC_ERROR_NONE;
  238. grpc_core::AwsRequestSigner signer(
  239. "access_key_id", "secret_access_key", "token", "POST", "invalid_url",
  240. "us-east-1", "", {{"date", kBotoTestDate}, {"x-amz-date", kAmzTestDate}},
  241. &error);
  242. std::string actual_error_description;
  243. GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION,
  244. &actual_error_description));
  245. EXPECT_EQ(actual_error_description,
  246. "Only one of {date, x-amz-date} can be specified, not both.");
  247. GRPC_ERROR_UNREF(error);
  248. }
  249. } // namespace testing
  250. int main(int argc, char** argv) {
  251. grpc::testing::TestEnvironment env(argc, argv);
  252. ::testing::InitGoogleTest(&argc, argv);
  253. grpc_init();
  254. int ret = RUN_ALL_TESTS();
  255. grpc_shutdown();
  256. return ret;
  257. }