123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- var AWS = require('../core');
- /**
- * @api private
- */
- var cachedSecret = {};
- /**
- * @api private
- */
- var cacheQueue = [];
- /**
- * @api private
- */
- var maxCacheEntries = 50;
- /**
- * @api private
- */
- var v4Identifier = 'aws4_request';
- /**
- * @api private
- */
- module.exports = {
- /**
- * @api private
- *
- * @param date [String]
- * @param region [String]
- * @param serviceName [String]
- * @return [String]
- */
- createScope: function createScope(date, region, serviceName) {
- return [
- date.substr(0, 8),
- region,
- serviceName,
- v4Identifier
- ].join('/');
- },
- /**
- * @api private
- *
- * @param credentials [Credentials]
- * @param date [String]
- * @param region [String]
- * @param service [String]
- * @param shouldCache [Boolean]
- * @return [String]
- */
- getSigningKey: function getSigningKey(
- credentials,
- date,
- region,
- service,
- shouldCache
- ) {
- var credsIdentifier = AWS.util.crypto
- .hmac(credentials.secretAccessKey, credentials.accessKeyId, 'base64');
- var cacheKey = [credsIdentifier, date, region, service].join('_');
- shouldCache = shouldCache !== false;
- if (shouldCache && (cacheKey in cachedSecret)) {
- return cachedSecret[cacheKey];
- }
- var kDate = AWS.util.crypto.hmac(
- 'AWS4' + credentials.secretAccessKey,
- date,
- 'buffer'
- );
- var kRegion = AWS.util.crypto.hmac(kDate, region, 'buffer');
- var kService = AWS.util.crypto.hmac(kRegion, service, 'buffer');
- var signingKey = AWS.util.crypto.hmac(kService, v4Identifier, 'buffer');
- if (shouldCache) {
- cachedSecret[cacheKey] = signingKey;
- cacheQueue.push(cacheKey);
- if (cacheQueue.length > maxCacheEntries) {
- // remove the oldest entry (not the least recently used)
- delete cachedSecret[cacheQueue.shift()];
- }
- }
- return signingKey;
- },
- /**
- * @api private
- *
- * Empties the derived signing key cache. Made available for testing purposes
- * only.
- */
- emptyCache: function emptyCache() {
- cachedSecret = {};
- cacheQueue = [];
- }
- };
|