@aws-amplify/core 5.2.1-unstable.eca5078.2 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/lib/Platform/version.d.ts +1 -1
  2. package/lib/Platform/version.js +1 -1
  3. package/lib/Platform/version.js.map +1 -1
  4. package/lib/Signer.d.ts +1 -1
  5. package/lib/Signer.js +59 -256
  6. package/lib/Signer.js.map +1 -1
  7. package/lib/clients/middleware/signing/signer/signatureV4/constants.d.ts +17 -0
  8. package/lib/clients/middleware/signing/signer/signatureV4/constants.js +26 -0
  9. package/lib/clients/middleware/signing/signer/signatureV4/constants.js.map +1 -0
  10. package/lib/clients/middleware/signing/signer/signatureV4/index.d.ts +3 -0
  11. package/lib/clients/middleware/signing/signer/signatureV4/index.js +12 -0
  12. package/lib/clients/middleware/signing/signer/signatureV4/index.js.map +1 -0
  13. package/lib/clients/middleware/signing/signer/signatureV4/index.native.d.ts +4 -0
  14. package/lib/clients/middleware/signing/signer/signatureV4/index.native.js +13 -0
  15. package/lib/clients/middleware/signing/signer/signatureV4/index.native.js.map +1 -0
  16. package/lib/clients/middleware/signing/signer/signatureV4/presignUrl.d.ts +9 -0
  17. package/lib/clients/middleware/signing/signer/signatureV4/presignUrl.js +40 -0
  18. package/lib/clients/middleware/signing/signer/signatureV4/presignUrl.js.map +1 -0
  19. package/lib/clients/middleware/signing/signer/signatureV4/signRequest.d.ts +10 -0
  20. package/lib/clients/middleware/signing/signer/signatureV4/signRequest.js +36 -0
  21. package/lib/clients/middleware/signing/signer/signatureV4/signRequest.js.map +1 -0
  22. package/lib/clients/middleware/signing/signer/signatureV4/types/index.d.ts +1 -0
  23. package/lib/clients/middleware/signing/signer/signatureV4/types/index.js +5 -0
  24. package/lib/clients/middleware/signing/signer/signatureV4/types/index.js.map +1 -0
  25. package/lib/clients/middleware/signing/signer/signatureV4/types/signer.d.ts +20 -0
  26. package/lib/clients/middleware/signing/signer/signatureV4/types/signer.js +5 -0
  27. package/lib/clients/middleware/signing/signer/signatureV4/types/signer.js.map +1 -0
  28. package/lib/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.d.ts +18 -0
  29. package/lib/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.js +35 -0
  30. package/lib/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.js.map +1 -0
  31. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.d.ts +12 -0
  32. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.js +31 -0
  33. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.js.map +1 -0
  34. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.d.ts +12 -0
  35. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.js +39 -0
  36. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.js.map +1 -0
  37. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.d.ts +16 -0
  38. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.js +35 -0
  39. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.js.map +1 -0
  40. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.d.ts +10 -0
  41. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.js +17 -0
  42. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.js.map +1 -0
  43. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.d.ts +12 -0
  44. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.js +18 -0
  45. package/lib/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.js.map +1 -0
  46. package/lib/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.d.ts +12 -0
  47. package/lib/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.js +22 -0
  48. package/lib/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.js.map +1 -0
  49. package/lib/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.d.ts +10 -0
  50. package/lib/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.js +35 -0
  51. package/lib/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.js.map +1 -0
  52. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignature.d.ts +13 -0
  53. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignature.js +31 -0
  54. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignature.js.map +1 -0
  55. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.d.ts +10 -0
  56. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.js +20 -0
  57. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.js.map +1 -0
  58. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.d.ts +13 -0
  59. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.js +27 -0
  60. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.js.map +1 -0
  61. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.d.ts +11 -0
  62. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.js +34 -0
  63. package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.js.map +1 -0
  64. package/lib/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.d.ts +16 -0
  65. package/lib/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.js +24 -0
  66. package/lib/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.js.map +1 -0
  67. package/lib/clients/types/aws.d.ts +2 -0
  68. package/lib/clients/types/aws.js +5 -0
  69. package/lib/clients/types/aws.js.map +1 -0
  70. package/lib/clients/types/core.d.ts +13 -0
  71. package/lib/clients/types/core.js +5 -0
  72. package/lib/clients/types/core.js.map +1 -0
  73. package/lib/clients/types/http.d.ts +26 -0
  74. package/lib/clients/types/http.js +5 -0
  75. package/lib/clients/types/http.js.map +1 -0
  76. package/lib/clients/types/index.d.ts +2 -0
  77. package/lib/clients/types/index.js +5 -0
  78. package/lib/clients/types/index.js.map +1 -0
  79. package/lib-esm/Platform/version.d.ts +1 -1
  80. package/lib-esm/Platform/version.js +1 -1
  81. package/lib-esm/Platform/version.js.map +1 -1
  82. package/lib-esm/Signer.d.ts +1 -1
  83. package/lib-esm/Signer.js +60 -257
  84. package/lib-esm/Signer.js.map +1 -1
  85. package/lib-esm/clients/middleware/signing/signer/signatureV4/constants.d.ts +17 -0
  86. package/lib-esm/clients/middleware/signing/signer/signatureV4/constants.js +24 -0
  87. package/lib-esm/clients/middleware/signing/signer/signatureV4/constants.js.map +1 -0
  88. package/lib-esm/clients/middleware/signing/signer/signatureV4/index.d.ts +3 -0
  89. package/lib-esm/clients/middleware/signing/signer/signatureV4/index.js +7 -0
  90. package/lib-esm/clients/middleware/signing/signer/signatureV4/index.js.map +1 -0
  91. package/lib-esm/clients/middleware/signing/signer/signatureV4/index.native.d.ts +4 -0
  92. package/lib-esm/clients/middleware/signing/signer/signatureV4/index.native.js +8 -0
  93. package/lib-esm/clients/middleware/signing/signer/signatureV4/index.native.js.map +1 -0
  94. package/lib-esm/clients/middleware/signing/signer/signatureV4/presignUrl.d.ts +9 -0
  95. package/lib-esm/clients/middleware/signing/signer/signatureV4/presignUrl.js +38 -0
  96. package/lib-esm/clients/middleware/signing/signer/signatureV4/presignUrl.js.map +1 -0
  97. package/lib-esm/clients/middleware/signing/signer/signatureV4/signRequest.d.ts +10 -0
  98. package/lib-esm/clients/middleware/signing/signer/signatureV4/signRequest.js +34 -0
  99. package/lib-esm/clients/middleware/signing/signer/signatureV4/signRequest.js.map +1 -0
  100. package/lib-esm/clients/middleware/signing/signer/signatureV4/types/index.d.ts +1 -0
  101. package/lib-esm/clients/middleware/signing/signer/signatureV4/types/index.js +3 -0
  102. package/lib-esm/clients/middleware/signing/signer/signatureV4/types/index.js.map +1 -0
  103. package/lib-esm/clients/middleware/signing/signer/signatureV4/types/signer.d.ts +20 -0
  104. package/lib-esm/clients/middleware/signing/signer/signatureV4/types/signer.js +3 -0
  105. package/lib-esm/clients/middleware/signing/signer/signatureV4/types/signer.js.map +1 -0
  106. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.d.ts +18 -0
  107. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.js +33 -0
  108. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.js.map +1 -0
  109. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.d.ts +12 -0
  110. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.js +29 -0
  111. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.js.map +1 -0
  112. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.d.ts +12 -0
  113. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.js +37 -0
  114. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.js.map +1 -0
  115. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.d.ts +16 -0
  116. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.js +33 -0
  117. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.js.map +1 -0
  118. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.d.ts +10 -0
  119. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.js +15 -0
  120. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.js.map +1 -0
  121. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.d.ts +12 -0
  122. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.js +16 -0
  123. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.js.map +1 -0
  124. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.d.ts +12 -0
  125. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.js +20 -0
  126. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.js.map +1 -0
  127. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.d.ts +10 -0
  128. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.js +33 -0
  129. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.js.map +1 -0
  130. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignature.d.ts +13 -0
  131. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignature.js +29 -0
  132. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignature.js.map +1 -0
  133. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.d.ts +10 -0
  134. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.js +18 -0
  135. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.js.map +1 -0
  136. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.d.ts +13 -0
  137. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.js +25 -0
  138. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.js.map +1 -0
  139. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.d.ts +11 -0
  140. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.js +32 -0
  141. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.js.map +1 -0
  142. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.d.ts +16 -0
  143. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.js +22 -0
  144. package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.js.map +1 -0
  145. package/lib-esm/clients/types/aws.d.ts +2 -0
  146. package/lib-esm/clients/types/aws.js +3 -0
  147. package/lib-esm/clients/types/aws.js.map +1 -0
  148. package/lib-esm/clients/types/core.d.ts +13 -0
  149. package/lib-esm/clients/types/core.js +3 -0
  150. package/lib-esm/clients/types/core.js.map +1 -0
  151. package/lib-esm/clients/types/http.d.ts +26 -0
  152. package/lib-esm/clients/types/http.js +3 -0
  153. package/lib-esm/clients/types/http.js.map +1 -0
  154. package/lib-esm/clients/types/index.d.ts +2 -0
  155. package/lib-esm/clients/types/index.js +3 -0
  156. package/lib-esm/clients/types/index.js.map +1 -0
  157. package/package.json +6 -2
  158. package/src/Platform/version.ts +1 -1
  159. package/src/Signer.ts +89 -344
  160. package/src/clients/middleware/signing/signer/signatureV4/constants.ts +28 -0
  161. package/src/clients/middleware/signing/signer/signatureV4/index.native.ts +9 -0
  162. package/src/clients/middleware/signing/signer/signatureV4/index.ts +7 -0
  163. package/src/clients/middleware/signing/signer/signatureV4/presignUrl.ts +59 -0
  164. package/src/clients/middleware/signing/signer/signatureV4/signRequest.ts +51 -0
  165. package/src/clients/middleware/signing/signer/signatureV4/types/index.ts +4 -0
  166. package/src/clients/middleware/signing/signer/signatureV4/types/signer.ts +31 -0
  167. package/src/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.ts +42 -0
  168. package/src/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.ts +25 -0
  169. package/src/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.ts +32 -0
  170. package/src/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.ts +38 -0
  171. package/src/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.ts +14 -0
  172. package/src/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.ts +21 -0
  173. package/src/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.ts +22 -0
  174. package/src/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.ts +38 -0
  175. package/src/clients/middleware/signing/signer/signatureV4/utils/getSignature.ts +52 -0
  176. package/src/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.ts +19 -0
  177. package/src/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.ts +31 -0
  178. package/src/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.ts +43 -0
  179. package/src/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.ts +28 -0
  180. package/src/clients/types/aws.ts +6 -0
  181. package/src/clients/types/core.ts +17 -0
  182. package/src/clients/types/http.ts +33 -0
  183. package/src/clients/types/index.ts +5 -0
package/src/Signer.ts CHANGED
@@ -1,238 +1,16 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { ConsoleLogger as Logger } from './Logger';
5
- import { Sha256 as jsSha256 } from '@aws-crypto/sha256-js';
6
- import { toHex } from '@aws-sdk/util-hex-encoding';
7
- import { parse, format } from 'url';
8
4
  import { DateUtils } from './Util';
5
+ import {
6
+ presignUrl,
7
+ signRequest,
8
+ TOKEN_QUERY_PARAM,
9
+ } from './clients/middleware/signing/signer/signatureV4';
9
10
 
10
- const logger = new Logger('Signer');
11
-
12
- const DEFAULT_ALGORITHM = 'AWS4-HMAC-SHA256';
13
11
  const IOT_SERVICE_NAME = 'iotdevicegateway';
14
-
15
- const encrypt = function(key, src) {
16
- const hash = new jsSha256(key);
17
- hash.update(src);
18
- return hash.digestSync();
19
- };
20
-
21
- const hash = function(src) {
22
- const arg = src || '';
23
- const hash = new jsSha256();
24
- hash.update(arg);
25
- return toHex(hash.digestSync());
26
- };
27
-
28
- /**
29
- * @private
30
- * RFC 3986 compliant version of encodeURIComponent
31
- */
32
- const escape_RFC3986 = function(component) {
33
- return component.replace(/[!'()*]/g, function(c) {
34
- return '%' + c.charCodeAt(0).toString(16).toUpperCase();
35
- });
36
- };
37
-
38
- /**
39
- * @private
40
- * Create canonical query string
41
- *
42
- */
43
- const canonical_query = function(query) {
44
- if (!query || query.length === 0) {
45
- return '';
46
- }
47
-
48
- return query
49
- .split('&')
50
- .map(e => {
51
- const key_val = e.split('=');
52
-
53
- if (key_val.length === 1) {
54
- return e;
55
- } else {
56
- const reencoded_val = escape_RFC3986(key_val[1]);
57
- return key_val[0] + '=' + reencoded_val;
58
- }
59
- })
60
- .sort((a, b) => {
61
- const key_a = a.split('=')[0];
62
- const key_b = b.split('=')[0];
63
- if (key_a === key_b) {
64
- return a < b ? -1 : 1;
65
- } else {
66
- return key_a < key_b ? -1 : 1;
67
- }
68
- })
69
- .join('&');
70
- };
71
-
72
- /**
73
- * @private
74
- * Create canonical headers
75
- *
76
- <pre>
77
- CanonicalHeaders =
78
- CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ... + CanonicalHeadersEntryN
79
- CanonicalHeadersEntry =
80
- Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'
81
- </pre>
82
- */
83
- const canonical_headers = function(headers) {
84
- if (!headers || Object.keys(headers).length === 0) {
85
- return '';
86
- }
87
-
88
- return (
89
- Object.keys(headers)
90
- .map(function(key) {
91
- return {
92
- key: key.toLowerCase(),
93
- value: headers[key] ? headers[key].trim().replace(/\s+/g, ' ') : '',
94
- };
95
- })
96
- .sort(function(a, b) {
97
- return a.key < b.key ? -1 : 1;
98
- })
99
- .map(function(item) {
100
- return item.key + ':' + item.value;
101
- })
102
- .join('\n') + '\n'
103
- );
104
- };
105
-
106
- /**
107
- * List of header keys included in the canonical headers.
108
- * @access private
109
- */
110
- const signed_headers = function(headers) {
111
- return Object.keys(headers)
112
- .map(function(key) {
113
- return key.toLowerCase();
114
- })
115
- .sort()
116
- .join(';');
117
- };
118
-
119
- /**
120
- * @private
121
- * Create canonical request
122
- * Refer to
123
- * {@link http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html|Create a Canonical Request}
124
- *
125
- <pre>
126
- CanonicalRequest =
127
- HTTPRequestMethod + '\n' +
128
- CanonicalURI + '\n' +
129
- CanonicalQueryString + '\n' +
130
- CanonicalHeaders + '\n' +
131
- SignedHeaders + '\n' +
132
- HexEncode(Hash(RequestPayload))
133
- </pre>
134
- */
135
- const canonical_request = function(request) {
136
- const url_info = parse(request.url);
137
-
138
- return [
139
- request.method || '/',
140
- encodeURIComponent(url_info.pathname).replace(/%2F/gi, '/'),
141
- canonical_query(url_info.query),
142
- canonical_headers(request.headers),
143
- signed_headers(request.headers),
144
- hash(request.data),
145
- ].join('\n');
146
- };
147
-
148
- const parse_service_info = function(request) {
149
- const url_info = parse(request.url),
150
- host = url_info.host;
151
-
152
- const matched = host.match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com$/);
153
- let parsed = (matched || []).slice(1, 3);
154
-
155
- if (parsed[1] === 'es') {
156
- // Elastic Search
157
- parsed = parsed.reverse();
158
- }
159
-
160
- return {
161
- service: request.service || parsed[0],
162
- region: request.region || parsed[1],
163
- };
164
- };
165
-
166
- const credential_scope = function(d_str, region, service) {
167
- return [d_str, region, service, 'aws4_request'].join('/');
168
- };
169
-
170
- /**
171
- * @private
172
- * Create a string to sign
173
- * Refer to
174
- * {@link http://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html|Create String to Sign}
175
- *
176
- <pre>
177
- StringToSign =
178
- Algorithm + \n +
179
- RequestDateTime + \n +
180
- CredentialScope + \n +
181
- HashedCanonicalRequest
182
- </pre>
183
- */
184
- const string_to_sign = function(algorithm, canonical_request, dt_str, scope) {
185
- return [algorithm, dt_str, scope, hash(canonical_request)].join('\n');
186
- };
187
-
188
- /**
189
- * @private
190
- * Create signing key
191
- * Refer to
192
- * {@link http://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html|Calculate Signature}
193
- *
194
- <pre>
195
- kSecret = your secret access key
196
- kDate = HMAC("AWS4" + kSecret, Date)
197
- kRegion = HMAC(kDate, Region)
198
- kService = HMAC(kRegion, Service)
199
- kSigning = HMAC(kService, "aws4_request")
200
- </pre>
201
- */
202
- const get_signing_key = function(secret_key, d_str, service_info) {
203
- logger.debug(service_info);
204
- const k = 'AWS4' + secret_key,
205
- k_date = encrypt(k, d_str),
206
- k_region = encrypt(k_date, service_info.region),
207
- k_service = encrypt(k_region, service_info.service),
208
- k_signing = encrypt(k_service, 'aws4_request');
209
-
210
- return k_signing;
211
- };
212
-
213
- const get_signature = function(signing_key, str_to_sign) {
214
- return toHex(encrypt(signing_key, str_to_sign));
215
- };
216
-
217
- /**
218
- * @private
219
- * Create authorization header
220
- * Refer to
221
- * {@link http://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html|Add the Signing Information}
222
- */
223
- const get_authorization_header = function(
224
- algorithm,
225
- access_key,
226
- scope,
227
- signed_headers,
228
- signature
229
- ) {
230
- return [
231
- algorithm + ' ' + 'Credential=' + access_key + '/' + scope,
232
- 'SignedHeaders=' + signed_headers,
233
- 'Signature=' + signature,
234
- ].join(', ');
235
- };
12
+ // Best practice regex to parse the service and region from an AWS endpoint
13
+ const AWS_ENDPOINT_REGEX = /([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com(.cn)?$/;
236
14
 
237
15
  export class Signer {
238
16
  /**
@@ -271,7 +49,7 @@ export class Signer {
271
49
  *
272
50
  * @returns {object} Signed HTTP request
273
51
  */
274
- static sign(request, access_info, service_info = null) {
52
+ static sign(request, accessInfo, serviceInfo) {
275
53
  request.headers = request.headers || {};
276
54
 
277
55
  if (request.body && !request.data) {
@@ -280,51 +58,25 @@ export class Signer {
280
58
  );
281
59
  }
282
60
 
283
- // datetime string and date string
284
- const dt = DateUtils.getDateWithClockOffset(),
285
- dt_str = dt.toISOString().replace(/[:\-]|\.\d{3}/g, ''),
286
- d_str = dt_str.substr(0, 8);
287
-
288
- const url_info = parse(request.url);
289
- request.headers['host'] = url_info.host;
290
- request.headers['x-amz-date'] = dt_str;
291
- if (access_info.session_token) {
292
- request.headers['X-Amz-Security-Token'] = access_info.session_token;
293
- }
294
-
295
- // Task 1: Create a Canonical Request
296
- const request_str = canonical_request(request);
297
- logger.debug(request_str);
298
-
299
- // Task 2: Create a String to Sign
300
- const serviceInfo = service_info || parse_service_info(request),
301
- scope = credential_scope(d_str, serviceInfo.region, serviceInfo.service),
302
- str_to_sign = string_to_sign(
303
- DEFAULT_ALGORITHM,
304
- request_str,
305
- dt_str,
306
- scope
307
- );
308
-
309
- // Task 3: Calculate the Signature
310
- const signing_key = get_signing_key(
311
- access_info.secret_key,
312
- d_str,
313
- serviceInfo
314
- ),
315
- signature = get_signature(signing_key, str_to_sign);
316
-
317
- // Task 4: Adding the Signing information to the Request
318
- const authorization_header = get_authorization_header(
319
- DEFAULT_ALGORITHM,
320
- access_info.access_key,
321
- scope,
322
- signed_headers(request.headers),
323
- signature
324
- );
325
- request.headers['Authorization'] = authorization_header;
61
+ const requestToSign = {
62
+ ...request,
63
+ body: request.data,
64
+ url: new URL(request.url as string),
65
+ };
326
66
 
327
- return request;
67
+ const options = getOptions(requestToSign, accessInfo, serviceInfo);
68
+ const signedRequest: any = signRequest(requestToSign, options);
69
+ // Prior to using `signRequest`, Signer accepted urls as strings and outputted urls as string. Coerce the property
70
+ // back to a string so as not to disrupt consumers of Signer.
71
+ signedRequest.url = signedRequest.url.toString();
72
+ // HTTP headers should be case insensitive but, to maintain parity with the previous Signer implementation and
73
+ // limit the impact of this implementation swap, replace lowercased headers with title cased ones.
74
+ signedRequest.headers.Authorization = signedRequest.headers.authorization;
75
+ signedRequest.headers['X-Amz-Security-Token'] =
76
+ signedRequest.headers['x-amz-security-token'];
77
+ delete signedRequest.headers.authorization;
78
+ delete signedRequest.headers['x-amz-security-token'];
79
+ return signedRequest;
328
80
  }
329
81
 
330
82
  static signUrl(
@@ -352,80 +104,73 @@ export class Signer {
352
104
  const body: any =
353
105
  typeof urlOrRequest === 'object' ? urlOrRequest.body : undefined;
354
106
 
355
- const now = DateUtils.getDateWithClockOffset()
356
- .toISOString()
357
- .replace(/[:\-]|\.\d{3}/g, '');
358
- const today = now.substr(0, 8);
359
- // Intentionally discarding search
360
- const { search, ...parsedUrl } = parse(urlToSign, true, true);
361
- const { host } = parsedUrl;
362
- const signedHeaders = { host };
363
-
364
- const { region, service } =
365
- serviceInfo || parse_service_info({ url: format(parsedUrl) });
366
- const credentialScope = credential_scope(today, region, service);
367
-
368
- // IoT service does not allow the session token in the canonical request
369
- // https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html
370
- const sessionTokenRequired =
371
- accessInfo.session_token && service !== IOT_SERVICE_NAME;
372
- const queryParams = {
373
- 'X-Amz-Algorithm': DEFAULT_ALGORITHM,
374
- 'X-Amz-Credential': [accessInfo.access_key, credentialScope].join('/'),
375
- 'X-Amz-Date': now.substr(0, 16),
376
- ...(sessionTokenRequired
377
- ? { 'X-Amz-Security-Token': `${accessInfo.session_token}` }
378
- : {}),
379
- ...(expiration ? { 'X-Amz-Expires': `${expiration}` } : {}),
380
- 'X-Amz-SignedHeaders': Object.keys(signedHeaders).join(','),
381
- };
382
-
383
- const canonicalRequest = canonical_request({
107
+ const presignable = {
108
+ body,
384
109
  method,
385
- url: format({
386
- ...parsedUrl,
387
- query: {
388
- ...parsedUrl.query,
389
- ...queryParams,
390
- },
391
- }),
392
- headers: signedHeaders,
393
- data: body,
394
- });
110
+ url: new URL(urlToSign),
111
+ };
395
112
 
396
- const stringToSign = string_to_sign(
397
- DEFAULT_ALGORITHM,
398
- canonicalRequest,
399
- now,
400
- credentialScope
113
+ const options = getOptions(
114
+ presignable,
115
+ accessInfo,
116
+ serviceInfo,
117
+ expiration
401
118
  );
119
+ const signedUrl = presignUrl(presignable, options);
120
+ if (
121
+ accessInfo.session_token &&
122
+ !sessionTokenRequiredInSigning(options.signingService)
123
+ ) {
124
+ signedUrl.searchParams.append(
125
+ TOKEN_QUERY_PARAM,
126
+ accessInfo.session_token
127
+ );
128
+ }
129
+ return signedUrl.toString();
130
+ }
131
+ }
402
132
 
403
- const signing_key = get_signing_key(accessInfo.secret_key, today, {
404
- region,
405
- service,
406
- });
407
- const signature = get_signature(signing_key, stringToSign);
408
-
409
- const additionalQueryParams = {
410
- 'X-Amz-Signature': signature,
411
- ...(accessInfo.session_token && {
412
- 'X-Amz-Security-Token': accessInfo.session_token,
413
- }),
414
- };
133
+ const getOptions = (request, accessInfo, serviceInfo, expiration?) => {
134
+ const { access_key, secret_key, session_token } = accessInfo ?? {};
135
+ const { region: urlRegion, service: urlService } = parseServiceInfo(
136
+ request.url
137
+ );
138
+ const { region = urlRegion, service = urlService } = serviceInfo ?? {};
139
+ const credentials = {
140
+ accessKeyId: access_key,
141
+ secretAccessKey: secret_key,
142
+ ...(sessionTokenRequiredInSigning(service)
143
+ ? { sessionToken: session_token }
144
+ : {}),
145
+ };
146
+ return {
147
+ credentials,
148
+ signingDate: DateUtils.getDateWithClockOffset(),
149
+ signingRegion: region,
150
+ signingService: service,
151
+ ...(expiration && { expiration }),
152
+ };
153
+ };
415
154
 
416
- const result = format({
417
- protocol: parsedUrl.protocol,
418
- slashes: true,
419
- hostname: parsedUrl.hostname,
420
- port: parsedUrl.port,
421
- pathname: parsedUrl.pathname,
422
- query: {
423
- ...parsedUrl.query,
424
- ...queryParams,
425
- ...additionalQueryParams,
426
- },
427
- });
155
+ // TODO: V6 investigate whether add to custom clients' general signer implementation.
156
+ const parseServiceInfo = (url: URL) => {
157
+ const host = url.host;
158
+ const matched = host.match(AWS_ENDPOINT_REGEX) ?? [];
159
+ let parsed = matched.slice(1, 3);
428
160
 
429
- return result;
161
+ if (parsed[1] === 'es') {
162
+ // Elastic Search
163
+ parsed = parsed.reverse();
430
164
  }
431
- }
165
+
166
+ return {
167
+ service: parsed[0],
168
+ region: parsed[1],
169
+ };
170
+ };
171
+
172
+ // IoT service does not allow the session token in the canonical request
173
+ // https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html
174
+ // TODO: V6 investigate whether add to custom clients' general signer implementation.
175
+ const sessionTokenRequiredInSigning = (service: string) =>
176
+ service !== IOT_SERVICE_NAME;
@@ -0,0 +1,28 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ // query params
5
+ export const ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm';
6
+ export const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date';
7
+ export const CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential';
8
+ export const EXPIRES_QUERY_PARAM = 'X-Amz-Expires';
9
+ export const REGION_SET_PARAM = 'X-Amz-Region-Set';
10
+ export const SIGNATURE_QUERY_PARAM = 'X-Amz-Signature';
11
+ export const SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders';
12
+ export const TOKEN_QUERY_PARAM = 'X-Amz-Security-Token';
13
+
14
+ // headers
15
+ export const AUTH_HEADER = 'authorization';
16
+ export const HOST_HEADER = 'host';
17
+ export const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase();
18
+ export const TOKEN_HEADER = TOKEN_QUERY_PARAM.toLowerCase();
19
+
20
+ // identifiers
21
+ export const KEY_TYPE_IDENTIFIER = 'aws4_request';
22
+ export const SHA256_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256';
23
+ export const SIGNATURE_IDENTIFIER = 'AWS4';
24
+
25
+ // preset values
26
+ export const EMPTY_HASH =
27
+ 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
28
+ export const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD';
@@ -0,0 +1,9 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import 'react-native-url-polyfill/auto';
5
+
6
+ // TODO: V6 replace Signer
7
+ export { signRequest } from './signRequest';
8
+ export { presignUrl } from './presignUrl';
9
+ export { TOKEN_QUERY_PARAM } from './constants';
@@ -0,0 +1,7 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ // TODO: V6 replace Signer
5
+ export { signRequest } from './signRequest';
6
+ export { presignUrl } from './presignUrl';
7
+ export { TOKEN_QUERY_PARAM } from './constants';
@@ -0,0 +1,59 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { Presignable, PresignUrlOptions } from './types';
5
+ import {
6
+ ALGORITHM_QUERY_PARAM,
7
+ AMZ_DATE_QUERY_PARAM,
8
+ CREDENTIAL_QUERY_PARAM,
9
+ EXPIRES_QUERY_PARAM,
10
+ HOST_HEADER,
11
+ SHA256_ALGORITHM_IDENTIFIER,
12
+ SIGNATURE_QUERY_PARAM,
13
+ SIGNED_HEADERS_QUERY_PARAM,
14
+ TOKEN_QUERY_PARAM,
15
+ } from './constants';
16
+ import { getSigningValues } from './utils/getSigningValues';
17
+ import { getSignature } from './utils/getSignature';
18
+
19
+ /**
20
+ * Given a `Presignable` object, returns a Signature Version 4 presigned `URL` object.
21
+ *
22
+ * @param presignable `Presignable` object containing at least a url to be presigned with authentication query params.
23
+ * @param presignUrlOptions `PresignUrlOptions` object containing values used to construct the signature.
24
+ * @returns A `URL` with authentication query params which can grant temporary access to AWS resources.
25
+ */
26
+ export const presignUrl = (
27
+ { body, method = 'GET', url }: Presignable,
28
+ { expiration, ...options }: PresignUrlOptions
29
+ ): URL => {
30
+ const signingValues = getSigningValues(options);
31
+ const { accessKeyId, credentialScope, longDate, sessionToken } =
32
+ signingValues;
33
+
34
+ // create the request to sign
35
+ // @ts-ignore URL constructor accepts a URL object
36
+ const presignedUrl = new URL(url);
37
+ Object.entries({
38
+ [ALGORITHM_QUERY_PARAM]: SHA256_ALGORITHM_IDENTIFIER,
39
+ [CREDENTIAL_QUERY_PARAM]: `${accessKeyId}/${credentialScope}`,
40
+ [AMZ_DATE_QUERY_PARAM]: longDate,
41
+ [SIGNED_HEADERS_QUERY_PARAM]: HOST_HEADER,
42
+ ...(expiration && { [EXPIRES_QUERY_PARAM]: expiration.toString() }),
43
+ ...(sessionToken && { [TOKEN_QUERY_PARAM]: sessionToken }),
44
+ }).forEach(([key, value]) => {
45
+ presignedUrl.searchParams.append(key, value);
46
+ });
47
+ const requestToSign = {
48
+ body,
49
+ headers: { [HOST_HEADER]: url.host },
50
+ method,
51
+ url: presignedUrl,
52
+ };
53
+
54
+ // calculate and add the signature to the url
55
+ const signature = getSignature(requestToSign, signingValues);
56
+ presignedUrl.searchParams.append(SIGNATURE_QUERY_PARAM, signature);
57
+
58
+ return presignedUrl;
59
+ };
@@ -0,0 +1,51 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { HttpRequest } from '../../../../types';
5
+ import { SignRequestOptions } from './types/signer';
6
+ import { getSignedHeaders } from './utils/getSignedHeaders';
7
+ import { getSigningValues } from './utils/getSigningValues';
8
+ import {
9
+ AMZ_DATE_HEADER,
10
+ AUTH_HEADER,
11
+ HOST_HEADER,
12
+ SHA256_ALGORITHM_IDENTIFIER,
13
+ TOKEN_HEADER,
14
+ } from './constants';
15
+ import { getSignature } from './utils/getSignature';
16
+
17
+ /**
18
+ * Given a `HttpRequest`, returns a Signature Version 4 signed `HttpRequest`.
19
+ *
20
+ * @param request `HttpRequest` to be signed.
21
+ * @param signRequestOptions `SignRequestOptions` object containing values used to construct the signature.
22
+ * @returns A `HttpRequest` with authentication headers which can grant temporary access to AWS resources.
23
+ */
24
+ export const signRequest = (
25
+ request: HttpRequest,
26
+ options: SignRequestOptions
27
+ ): HttpRequest => {
28
+ const signingValues = getSigningValues(options);
29
+ const { accessKeyId, credentialScope, longDate, sessionToken } =
30
+ signingValues;
31
+
32
+ // create the request to sign
33
+ const headers = { ...request.headers };
34
+ headers[HOST_HEADER] = request.url.host;
35
+ headers[AMZ_DATE_HEADER] = longDate;
36
+ if (sessionToken) {
37
+ headers[TOKEN_HEADER] = sessionToken;
38
+ }
39
+ const requestToSign = { ...request, headers };
40
+
41
+ // calculate and add the signature to the request
42
+ const signature = getSignature(requestToSign, signingValues);
43
+ const credentialEntry = `Credential=${accessKeyId}/${credentialScope}`;
44
+ const signedHeadersEntry = `SignedHeaders=${getSignedHeaders(headers)}`;
45
+ const signatureEntry = `Signature=${signature}`;
46
+ headers[
47
+ AUTH_HEADER
48
+ ] = `${SHA256_ALGORITHM_IDENTIFIER} ${credentialEntry}, ${signedHeadersEntry}, ${signatureEntry}`;
49
+
50
+ return requestToSign;
51
+ };
@@ -0,0 +1,4 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export { Presignable, PresignUrlOptions, SignRequestOptions } from './signer';
@@ -0,0 +1,31 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { Credentials, HttpRequest } from '../../../../../types';
5
+
6
+ export interface SignRequestOptions {
7
+ credentials: Credentials;
8
+ signingDate?: Date;
9
+ signingRegion: string;
10
+ signingService: string;
11
+ }
12
+
13
+ export interface PresignUrlOptions extends SignRequestOptions {
14
+ expiration?: number;
15
+ }
16
+
17
+ export interface Presignable extends Pick<HttpRequest, 'body' | 'url'> {
18
+ method?: HttpRequest['method'];
19
+ }
20
+
21
+ export interface FormattedDates {
22
+ longDate: string;
23
+ shortDate: string;
24
+ }
25
+
26
+ export interface SigningValues
27
+ extends Credentials,
28
+ FormattedDates,
29
+ Pick<SignRequestOptions, 'signingRegion' | 'signingService'> {
30
+ credentialScope: string;
31
+ }