@webex/internal-plugin-encryption 3.0.0-beta.8 → 3.0.0-bnr.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.
- package/README.md +1 -3
- package/dist/config.js +0 -9
- package/dist/config.js.map +1 -1
- package/dist/encryption.js +9 -60
- package/dist/encryption.js.map +1 -1
- package/dist/ensure-buffer.browser.js +0 -12
- package/dist/ensure-buffer.browser.js.map +1 -1
- package/dist/ensure-buffer.js +5 -12
- package/dist/ensure-buffer.js.map +1 -1
- package/dist/index.js +7 -33
- package/dist/index.js.map +1 -1
- package/dist/kms-batcher.js +6 -30
- package/dist/kms-batcher.js.map +1 -1
- package/dist/kms-certificate-validation.js +20 -88
- package/dist/kms-certificate-validation.js.map +1 -1
- package/dist/kms-dry-error-interceptor.js +1 -23
- package/dist/kms-dry-error-interceptor.js.map +1 -1
- package/dist/kms-errors.js +3 -50
- package/dist/kms-errors.js.map +1 -1
- package/dist/kms.js +74 -213
- package/dist/kms.js.map +1 -1
- package/dist/types/config.d.ts +16 -0
- package/dist/types/encryption.d.ts +2 -0
- package/dist/types/ensure-buffer.browser.d.ts +10 -0
- package/dist/types/ensure-buffer.d.ts +7 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/kms-batcher.d.ts +6 -0
- package/dist/types/kms-certificate-validation.d.ts +24 -0
- package/dist/types/kms-dry-error-interceptor.d.ts +25 -0
- package/dist/types/kms-errors.d.ts +33 -0
- package/dist/types/kms.d.ts +5 -0
- package/package.json +15 -15
- package/src/config.js +3 -3
- package/src/encryption.js +66 -56
- package/src/ensure-buffer.browser.js +0 -1
- package/src/ensure-buffer.js +5 -5
- package/src/index.js +120 -96
- package/src/kms-batcher.js +50 -44
- package/src/kms-certificate-validation.js +45 -47
- package/src/kms-dry-error-interceptor.js +8 -4
- package/src/kms-errors.js +19 -16
- package/src/kms.js +210 -206
- package/test/integration/spec/encryption.js +311 -230
- package/test/integration/spec/kms.js +532 -404
- package/test/integration/spec/payload-transfom.js +69 -69
- package/test/unit/spec/encryption.js +16 -13
- package/test/unit/spec/kms-certificate-validation.js +41 -32
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["interceptors","process","env","NODE_ENV","KmsDryErrorInterceptor","create","registerInternalPlugin","Encryption","payloadTransformer","predicates","name","direction","test","ctx","options","resolve","body","kmsMessage","keyUris","length","resourceUri","includes","uri","extract","response","reason","Boolean","errorCode","transforms","fn","object","webex","internal","encryption","kms","prepareRequest","then","req","wrapped","decryptKmsMessage","promises","errors","map","error","description","desc","push","message","all","reject","DryError","config"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n// Note: There's a bug where if bind gets replayed because of a timeout in which\n// the original request eventually completed, there'll be an error indicating\n// the key can't be bound (because it already has been). This could be mitigated\n// by using Promise.race to resolve replays (as more requests get enqueue for a\n// specific action, accept whichever one completes first).\n\nimport {registerInternalPlugin} from '@webex/webex-core';\nimport {has, isObject, isString} from 'lodash';\n\nimport Encryption from './encryption';\nimport config from './config';\nimport {DryError} from './kms-errors';\nimport
|
|
1
|
+
{"version":3,"names":["interceptors","process","env","NODE_ENV","KmsDryErrorInterceptor","create","registerInternalPlugin","Encryption","payloadTransformer","predicates","name","direction","test","ctx","options","resolve","body","kmsMessage","keyUris","length","resourceUri","includes","uri","extract","response","reason","Boolean","errorCode","transforms","fn","object","webex","internal","encryption","kms","prepareRequest","then","req","wrapped","decryptKmsMessage","promises","errors","map","error","description","desc","push","message","all","reject","DryError","config"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n// Note: There's a bug where if bind gets replayed because of a timeout in which\n// the original request eventually completed, there'll be an error indicating\n// the key can't be bound (because it already has been). This could be mitigated\n// by using Promise.race to resolve replays (as more requests get enqueue for a\n// specific action, accept whichever one completes first).\n\nimport '@webex/internal-plugin-device';\n\nimport '@webex/internal-plugin-mercury';\n\nimport {registerInternalPlugin} from '@webex/webex-core';\nimport {has, isObject, isString} from 'lodash';\n\nimport Encryption from './encryption';\nimport config from './config';\nimport {DryError} from './kms-errors';\n\nimport KmsDryErrorInterceptor from './kms-dry-error-interceptor';\n\nlet interceptors;\n\nif (process.env.NODE_ENV === 'test') {\n interceptors = {\n KmsDryErrorInterceptor: KmsDryErrorInterceptor.create,\n };\n}\n\nregisterInternalPlugin('encryption', Encryption, {\n payloadTransformer: {\n predicates: [\n {\n name: 'encryptKmsMessage',\n direction: 'outbound',\n // I don't see any practical way to reduce complexity here.\n // eslint-disable-next-line complexity\n test(ctx, options) {\n if (!has(options, 'body.kmsMessage')) {\n return Promise.resolve(false);\n }\n\n if (!isObject(options.body.kmsMessage)) {\n return Promise.resolve(false);\n }\n\n // If this is a template for a kms message, assume another transform\n // will fill it in later. This is a bit of a leaky abstraction, but the\n // alternative is building a complex rules engine for controlling\n // ordering of transforms\n if (options.body.kmsMessage.keyUris && options.body.kmsMessage.keyUris.length === 0) {\n return Promise.resolve(false);\n }\n if (\n options.body.kmsMessage.resourceUri &&\n (options.body.kmsMessage.resourceUri.includes('<KRO>') ||\n options.body.kmsMessage.resourceUri.includes('<KEYURL>'))\n ) {\n return Promise.resolve(false);\n }\n if (\n options.body.kmsMessage.uri &&\n (options.body.kmsMessage.uri.includes('<KRO>') ||\n options.body.kmsMessage.uri.includes('<KEYURL>'))\n ) {\n return Promise.resolve(false);\n }\n\n return Promise.resolve(true);\n },\n extract(options) {\n return Promise.resolve(options.body);\n },\n },\n {\n name: 'decryptKmsMessage',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(\n has(response, 'body.kmsMessage') && isString(response.body.kmsMessage)\n );\n },\n extract(response) {\n return Promise.resolve(response.body);\n },\n },\n {\n name: 'decryptErrorResponse',\n direction: 'inbound',\n test(ctx, reason) {\n return Promise.resolve(Boolean(reason.body && reason.body.errorCode === 1900000));\n },\n extract(reason) {\n return Promise.resolve(reason);\n },\n },\n ],\n transforms: [\n {\n name: 'encryptKmsMessage',\n fn(ctx, object) {\n if (!object) {\n return Promise.resolve();\n }\n\n if (!object.kmsMessage) {\n return Promise.resolve();\n }\n\n if (isString(object.kmsMessage)) {\n return Promise.resolve();\n }\n\n return ctx.webex.internal.encryption.kms.prepareRequest(object.kmsMessage).then((req) => {\n object.kmsMessage = req.wrapped;\n });\n },\n },\n {\n name: 'decryptKmsMessage',\n fn(ctx, object) {\n return ctx.webex.internal.encryption.kms\n .decryptKmsMessage(object.kmsMessage)\n .then((kmsMessage) => {\n object.kmsMessage = kmsMessage;\n });\n },\n },\n {\n name: 'decryptErrorResponse',\n fn(ctx, reason) {\n const promises = reason.body.errors.map((error) =>\n ctx.webex.internal.encryption.kms.decryptKmsMessage(error.description).then((desc) => {\n error.description = desc;\n })\n );\n\n promises.push(\n ctx.webex.internal.encryption.kms\n .decryptKmsMessage(reason.body.message)\n .then((kmsMessage) => {\n reason.body.message = kmsMessage;\n })\n );\n\n return Promise.all(promises).then(() => Promise.reject(new DryError(reason)));\n },\n },\n ],\n },\n interceptors,\n config,\n});\n\nexport {default} from './encryption';\nexport {default as KMS} from './kms';\nexport {KmsError, DryError} from './kms-errors';\n"],"mappings":"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"}
|
package/dist/kms-batcher.js
CHANGED
|
@@ -1,38 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
-
|
|
5
4
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
6
|
-
|
|
7
5
|
_Object$defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
10
|
-
|
|
11
8
|
exports.default = exports.TIMEOUT_SYMBOL = void 0;
|
|
12
|
-
|
|
13
9
|
var _symbol = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/symbol"));
|
|
14
|
-
|
|
15
10
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
16
|
-
|
|
17
11
|
var _commonTimers = require("@webex/common-timers");
|
|
18
|
-
|
|
19
12
|
var _webexCore = require("@webex/webex-core");
|
|
20
|
-
|
|
21
13
|
var _kmsErrors = require("./kms-errors");
|
|
22
|
-
|
|
23
14
|
/*!
|
|
24
15
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
25
16
|
*/
|
|
17
|
+
|
|
26
18
|
var TIMEOUT_SYMBOL = (0, _symbol.default)('TIMEOUT_SYMBOL');
|
|
19
|
+
|
|
27
20
|
/**
|
|
28
21
|
* @class
|
|
29
22
|
*/
|
|
30
|
-
|
|
31
23
|
exports.TIMEOUT_SYMBOL = TIMEOUT_SYMBOL;
|
|
32
|
-
|
|
33
24
|
var KmsBatcher = _webexCore.Batcher.extend({
|
|
34
25
|
namespace: 'Encryption',
|
|
35
|
-
|
|
36
26
|
/**
|
|
37
27
|
* Accepts a kmsMessage event and passes its contents to acceptItem
|
|
38
28
|
* @param {Object} event
|
|
@@ -40,7 +30,6 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
40
30
|
*/
|
|
41
31
|
processKmsMessageEvent: function processKmsMessageEvent(event) {
|
|
42
32
|
var _this = this;
|
|
43
|
-
|
|
44
33
|
this.logger.info('kms-batcher: received kms message');
|
|
45
34
|
return _promise.default.all(event.encryption.kmsMessages.map(function (kmsMessage) {
|
|
46
35
|
return new _promise.default(function (resolve) {
|
|
@@ -48,12 +37,10 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
48
37
|
if (process.env.NODE_ENV !== 'production') {
|
|
49
38
|
_this.logger.info('kms-batcher:', kmsMessage.body);
|
|
50
39
|
}
|
|
51
|
-
|
|
52
40
|
resolve(_this.acceptItem(kmsMessage));
|
|
53
41
|
});
|
|
54
42
|
}));
|
|
55
43
|
},
|
|
56
|
-
|
|
57
44
|
/**
|
|
58
45
|
* Attaches a timeout to the given KMS message
|
|
59
46
|
* @param {Object} item
|
|
@@ -61,25 +48,23 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
61
48
|
*/
|
|
62
49
|
prepareItem: function prepareItem(item) {
|
|
63
50
|
var _this2 = this;
|
|
64
|
-
|
|
65
51
|
return this.getDeferredForRequest(item).then(function (defer) {
|
|
66
52
|
var timeout = item[TIMEOUT_SYMBOL];
|
|
67
|
-
/* istanbul ignore if */
|
|
68
53
|
|
|
54
|
+
/* istanbul ignore if */
|
|
69
55
|
if (!timeout) {
|
|
70
56
|
throw new Error('timeout is required');
|
|
71
57
|
}
|
|
72
|
-
|
|
73
58
|
var timer = (0, _commonTimers.safeSetTimeout)(function () {
|
|
74
59
|
_this2.logger.warn("kms: request timed out; request id: ".concat(item.requestId, "; timeout: ").concat(timeout));
|
|
75
|
-
|
|
76
60
|
_this2.handleItemFailure(item, new _kmsErrors.KmsTimeoutError({
|
|
77
61
|
timeout: timeout,
|
|
78
62
|
request: item
|
|
79
63
|
}));
|
|
80
|
-
}, timeout);
|
|
81
|
-
// the Promise chain
|
|
64
|
+
}, timeout);
|
|
82
65
|
|
|
66
|
+
// Reminder: reassign `promise` is not a viable means of inserting into
|
|
67
|
+
// the Promise chain
|
|
83
68
|
defer.promise.then(function () {
|
|
84
69
|
return clearTimeout(timer);
|
|
85
70
|
});
|
|
@@ -89,7 +74,6 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
89
74
|
return item;
|
|
90
75
|
});
|
|
91
76
|
},
|
|
92
|
-
|
|
93
77
|
/**
|
|
94
78
|
* Attaches the final bits of cluster info to the payload
|
|
95
79
|
* @param {Array} queue
|
|
@@ -105,7 +89,6 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
105
89
|
};
|
|
106
90
|
});
|
|
107
91
|
},
|
|
108
|
-
|
|
109
92
|
/**
|
|
110
93
|
* @param {Object} payload
|
|
111
94
|
* @returns {Promise<HttpResponseObject>}
|
|
@@ -119,7 +102,6 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
119
102
|
body: payload
|
|
120
103
|
});
|
|
121
104
|
},
|
|
122
|
-
|
|
123
105
|
/**
|
|
124
106
|
* Does nothing; the http response doesn't carry our response data
|
|
125
107
|
* @returns {Promise}
|
|
@@ -127,7 +109,6 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
127
109
|
handleHttpSuccess: function handleHttpSuccess() {
|
|
128
110
|
return _promise.default.resolve();
|
|
129
111
|
},
|
|
130
|
-
|
|
131
112
|
/**
|
|
132
113
|
* @param {Object} item
|
|
133
114
|
* @returns {Promise<boolean>}
|
|
@@ -135,7 +116,6 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
135
116
|
didItemFail: function didItemFail(item) {
|
|
136
117
|
return _promise.default.resolve(item.status >= 400);
|
|
137
118
|
},
|
|
138
|
-
|
|
139
119
|
/**
|
|
140
120
|
* @param {Object} item
|
|
141
121
|
* @returns {Promise}
|
|
@@ -145,7 +125,6 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
145
125
|
defer.resolve(item.body);
|
|
146
126
|
});
|
|
147
127
|
},
|
|
148
|
-
|
|
149
128
|
/**
|
|
150
129
|
* @param {Object} item
|
|
151
130
|
* @param {KmsError} [reason]
|
|
@@ -156,7 +135,6 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
156
135
|
defer.reject(reason || new _kmsErrors.KmsError(item.body));
|
|
157
136
|
});
|
|
158
137
|
},
|
|
159
|
-
|
|
160
138
|
/**
|
|
161
139
|
* @param {Object} item
|
|
162
140
|
* @returns {Promise}
|
|
@@ -164,7 +142,6 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
164
142
|
fingerprintRequest: function fingerprintRequest(item) {
|
|
165
143
|
return _promise.default.resolve(item.requestId);
|
|
166
144
|
},
|
|
167
|
-
|
|
168
145
|
/**
|
|
169
146
|
* @param {Object} item
|
|
170
147
|
* @returns {Promise}
|
|
@@ -173,7 +150,6 @@ var KmsBatcher = _webexCore.Batcher.extend({
|
|
|
173
150
|
return _promise.default.resolve(item.requestId);
|
|
174
151
|
}
|
|
175
152
|
});
|
|
176
|
-
|
|
177
153
|
var _default = KmsBatcher;
|
|
178
154
|
exports.default = _default;
|
|
179
155
|
//# sourceMappingURL=kms-batcher.js.map
|
package/dist/kms-batcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TIMEOUT_SYMBOL","KmsBatcher","Batcher","extend","namespace","processKmsMessageEvent","event","logger","info","all","encryption","kmsMessages","map","kmsMessage","resolve","process","env","NODE_ENV","body","acceptItem","prepareItem","item","getDeferredForRequest","then","defer","timeout","Error","timer","safeSetTimeout","warn","requestId","handleItemFailure","KmsTimeoutError","request","promise","clearTimeout","catch","prepareRequest","queue","webex","internal","kms","_getKMSCluster","cluster","destination","req","wrapped","submitHttpRequest","payload","length","method","service","resource","handleHttpSuccess","didItemFail","status","handleItemSuccess","getDeferredForResponse","reason","reject","KmsError","fingerprintRequest","fingerprintResponse"],"sources":["kms-batcher.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {Batcher} from '@webex/webex-core';\n\nimport {KmsError, KmsTimeoutError} from './kms-errors';\n\nexport const TIMEOUT_SYMBOL = Symbol('TIMEOUT_SYMBOL');\n\n/**\n * @class\n */\nconst KmsBatcher = Batcher.extend({\n namespace: 'Encryption',\n\n /**\n * Accepts a kmsMessage event and passes its contents to acceptItem\n * @param {Object} event\n * @returns {Promise}\n */\n processKmsMessageEvent(event) {\n this.logger.info('kms-batcher: received kms message');\n\n return Promise.all(event.encryption.kmsMessages.map((kmsMessage)
|
|
1
|
+
{"version":3,"names":["TIMEOUT_SYMBOL","KmsBatcher","Batcher","extend","namespace","processKmsMessageEvent","event","logger","info","all","encryption","kmsMessages","map","kmsMessage","resolve","process","env","NODE_ENV","body","acceptItem","prepareItem","item","getDeferredForRequest","then","defer","timeout","Error","timer","safeSetTimeout","warn","requestId","handleItemFailure","KmsTimeoutError","request","promise","clearTimeout","catch","prepareRequest","queue","webex","internal","kms","_getKMSCluster","cluster","destination","req","wrapped","submitHttpRequest","payload","length","method","service","resource","handleHttpSuccess","didItemFail","status","handleItemSuccess","getDeferredForResponse","reason","reject","KmsError","fingerprintRequest","fingerprintResponse"],"sources":["kms-batcher.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {Batcher} from '@webex/webex-core';\n\nimport {KmsError, KmsTimeoutError} from './kms-errors';\n\nexport const TIMEOUT_SYMBOL = Symbol('TIMEOUT_SYMBOL');\n\n/**\n * @class\n */\nconst KmsBatcher = Batcher.extend({\n namespace: 'Encryption',\n\n /**\n * Accepts a kmsMessage event and passes its contents to acceptItem\n * @param {Object} event\n * @returns {Promise}\n */\n processKmsMessageEvent(event) {\n this.logger.info('kms-batcher: received kms message');\n\n return Promise.all(\n event.encryption.kmsMessages.map(\n (kmsMessage) =>\n new Promise((resolve) => {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n this.logger.info('kms-batcher:', kmsMessage.body);\n }\n\n resolve(this.acceptItem(kmsMessage));\n })\n )\n );\n },\n\n /**\n * Attaches a timeout to the given KMS message\n * @param {Object} item\n * @returns {Promise<Object>}\n */\n prepareItem(item) {\n return this.getDeferredForRequest(item).then((defer) => {\n const timeout = item[TIMEOUT_SYMBOL];\n\n /* istanbul ignore if */\n if (!timeout) {\n throw new Error('timeout is required');\n }\n\n const timer = safeSetTimeout(() => {\n this.logger.warn(\n `kms: request timed out; request id: ${item.requestId}; timeout: ${timeout}`\n );\n this.handleItemFailure(\n item,\n new KmsTimeoutError({\n timeout,\n request: item,\n })\n );\n }, timeout);\n\n // Reminder: reassign `promise` is not a viable means of inserting into\n // the Promise chain\n defer.promise.then(() => clearTimeout(timer));\n defer.promise.catch(() => clearTimeout(timer));\n\n return item;\n });\n },\n\n /**\n * Attaches the final bits of cluster info to the payload\n * @param {Array} queue\n * @returns {Promise<Array>}\n */\n prepareRequest(queue) {\n return this.webex.internal.encryption.kms._getKMSCluster().then((cluster) => ({\n destination: cluster,\n kmsMessages: queue.map((req) => req.wrapped),\n }));\n },\n\n /**\n * @param {Object} payload\n * @returns {Promise<HttpResponseObject>}\n */\n submitHttpRequest(payload) {\n this.logger.info('kms: batched-request-length', payload.kmsMessages.length);\n\n return this.webex.request({\n method: 'POST',\n service: 'encryption',\n resource: '/kms/messages',\n body: payload,\n });\n },\n\n /**\n * Does nothing; the http response doesn't carry our response data\n * @returns {Promise}\n */\n handleHttpSuccess() {\n return Promise.resolve();\n },\n\n /**\n * @param {Object} item\n * @returns {Promise<boolean>}\n */\n didItemFail(item) {\n return Promise.resolve(item.status >= 400);\n },\n\n /**\n * @param {Object} item\n * @returns {Promise}\n */\n handleItemSuccess(item) {\n return this.getDeferredForResponse(item).then((defer) => {\n defer.resolve(item.body);\n });\n },\n\n /**\n * @param {Object} item\n * @param {KmsError} [reason]\n * @returns {Promise}\n */\n handleItemFailure(item, reason) {\n return this.getDeferredForResponse(item).then((defer) => {\n defer.reject(reason || new KmsError(item.body));\n });\n },\n\n /**\n * @param {Object} item\n * @returns {Promise}\n */\n fingerprintRequest(item) {\n return Promise.resolve(item.requestId);\n },\n\n /**\n * @param {Object} item\n * @returns {Promise}\n */\n fingerprintResponse(item) {\n return Promise.resolve(item.requestId);\n },\n});\n\nexport default KmsBatcher;\n"],"mappings":"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"}
|
|
@@ -1,67 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
|
|
4
|
-
|
|
5
4
|
var _Array$from = require("@babel/runtime-corejs2/core-js/array/from");
|
|
6
|
-
|
|
7
5
|
var _Symbol = require("@babel/runtime-corejs2/core-js/symbol");
|
|
8
|
-
|
|
9
6
|
var _Symbol$iterator = require("@babel/runtime-corejs2/core-js/symbol/iterator");
|
|
10
|
-
|
|
11
7
|
var _Array$isArray = require("@babel/runtime-corejs2/core-js/array/is-array");
|
|
12
|
-
|
|
13
8
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
14
|
-
|
|
15
9
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
16
|
-
|
|
17
10
|
_Object$defineProperty(exports, "__esModule", {
|
|
18
11
|
value: true
|
|
19
12
|
});
|
|
20
|
-
|
|
21
13
|
exports.default = exports.KMSError = void 0;
|
|
22
|
-
|
|
23
14
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
24
|
-
|
|
25
15
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
|
|
26
|
-
|
|
27
16
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
28
|
-
|
|
29
17
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
30
|
-
|
|
31
18
|
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
|
|
32
|
-
|
|
33
19
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
|
|
34
|
-
|
|
35
20
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
|
|
36
|
-
|
|
37
21
|
var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/wrapNativeSuper"));
|
|
38
|
-
|
|
39
22
|
var _isArray2 = _interopRequireDefault(require("lodash/isArray"));
|
|
40
|
-
|
|
41
23
|
var _url = require("url");
|
|
42
|
-
|
|
43
24
|
var _validUrl = require("valid-url");
|
|
44
|
-
|
|
45
25
|
var _asn1js = require("asn1js");
|
|
46
|
-
|
|
47
26
|
var _pkijs = require("pkijs");
|
|
48
|
-
|
|
49
27
|
var _nodeJose = _interopRequireDefault(require("node-jose"));
|
|
50
|
-
|
|
51
28
|
var _isomorphicWebcrypto = _interopRequireDefault(require("isomorphic-webcrypto"));
|
|
52
|
-
|
|
53
29
|
var _safeBuffer = require("safe-buffer");
|
|
54
|
-
|
|
55
30
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && o[_Symbol$iterator] || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
56
|
-
|
|
57
31
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
58
|
-
|
|
59
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
60
|
-
|
|
32
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
61
33
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
62
|
-
|
|
63
34
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
64
|
-
|
|
65
35
|
(0, _pkijs.setEngine)('newEngine', _isomorphicWebcrypto.default, new _pkijs.CryptoEngine({
|
|
66
36
|
name: '',
|
|
67
37
|
crypto: _isomorphicWebcrypto.default,
|
|
@@ -71,57 +41,49 @@ var VALID_KTY = 'RSA';
|
|
|
71
41
|
var VALID_KID_PROTOCOL = 'kms:';
|
|
72
42
|
var X509_COMMON_NAME_KEY = '2.5.4.3';
|
|
73
43
|
var X509_SUBJECT_ALT_NAME_KEY = '2.5.29.17';
|
|
44
|
+
|
|
74
45
|
/**
|
|
75
46
|
* Customize Error so the SDK knows to quit retrying and notify
|
|
76
47
|
* the user
|
|
77
48
|
*/
|
|
78
|
-
|
|
79
49
|
var KMSError = /*#__PURE__*/function (_Error) {
|
|
80
50
|
(0, _inherits2.default)(KMSError, _Error);
|
|
81
|
-
|
|
82
51
|
var _super = _createSuper(KMSError);
|
|
83
|
-
|
|
84
52
|
/**
|
|
85
53
|
* add kmsError field to notify
|
|
86
54
|
* @param {string} message
|
|
87
55
|
*/
|
|
88
56
|
function KMSError(message) {
|
|
89
57
|
var _this;
|
|
90
|
-
|
|
91
58
|
(0, _classCallCheck2.default)(this, KMSError);
|
|
92
59
|
_this = _super.call(this, message);
|
|
93
60
|
_this.kmsError = true;
|
|
94
61
|
return _this;
|
|
95
62
|
}
|
|
96
|
-
|
|
97
63
|
return (0, _createClass2.default)(KMSError);
|
|
98
64
|
}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
|
|
99
|
-
|
|
100
65
|
exports.KMSError = KMSError;
|
|
101
|
-
|
|
102
66
|
var throwError = function throwError(err) {
|
|
103
67
|
throw new KMSError("INVALID KMS: ".concat(err));
|
|
104
68
|
};
|
|
69
|
+
|
|
105
70
|
/**
|
|
106
71
|
* Converts the PEM string to a pkijs certificate object
|
|
107
72
|
* @param {string} pem PEM representation of a certificate
|
|
108
73
|
* @returns {Certificate} pkijs object of the certificate
|
|
109
74
|
*/
|
|
110
|
-
|
|
111
|
-
|
|
112
75
|
var decodeCert = function decodeCert(pem) {
|
|
113
76
|
if (typeof pem !== 'string') {
|
|
114
77
|
throwError('certificate needs to be a string');
|
|
115
78
|
}
|
|
116
|
-
|
|
117
79
|
var der = _safeBuffer.Buffer.from(pem, 'base64');
|
|
118
|
-
|
|
119
80
|
var ber = new Uint8Array(der).buffer;
|
|
120
81
|
var asn1 = (0, _asn1js.fromBER)(ber);
|
|
121
82
|
return new _pkijs.Certificate({
|
|
122
83
|
schema: asn1.result
|
|
123
84
|
});
|
|
124
85
|
};
|
|
86
|
+
|
|
125
87
|
/**
|
|
126
88
|
* Validate the 'kty' property of the KMS credentials
|
|
127
89
|
* @param {Object} JWT KMS credentials
|
|
@@ -129,27 +91,22 @@ var decodeCert = function decodeCert(pem) {
|
|
|
129
91
|
* @throws {KMSError} if kty is not a valid type
|
|
130
92
|
* @returns {void}
|
|
131
93
|
*/
|
|
132
|
-
|
|
133
|
-
|
|
134
94
|
var validateKtyHeader = function validateKtyHeader(_ref) {
|
|
135
95
|
var kty = _ref.kty;
|
|
136
|
-
|
|
137
96
|
if (kty !== VALID_KTY) {
|
|
138
97
|
throwError("'kty' header must be '".concat(VALID_KTY, "'"));
|
|
139
98
|
}
|
|
140
99
|
};
|
|
141
|
-
|
|
142
100
|
var validateKidHeader = function validateKidHeader(_ref2) {
|
|
143
101
|
var kid = _ref2.kid;
|
|
144
|
-
|
|
145
102
|
if (!(0, _validUrl.isUri)(kid)) {
|
|
146
|
-
throwError('
|
|
103
|
+
throwError("'kid' is not a valid URI");
|
|
147
104
|
}
|
|
148
|
-
|
|
149
105
|
if ((0, _url.parse)(kid).protocol !== VALID_KID_PROTOCOL) {
|
|
150
106
|
throwError("'kid' protocol must be '".concat(VALID_KID_PROTOCOL, "'"));
|
|
151
107
|
}
|
|
152
108
|
};
|
|
109
|
+
|
|
153
110
|
/**
|
|
154
111
|
* Checks the first certificate matches the 'kid' in the JWT.
|
|
155
112
|
* It first checks the Subject Alternative Name then it checks
|
|
@@ -160,37 +117,28 @@ var validateKidHeader = function validateKidHeader(_ref2) {
|
|
|
160
117
|
* @throws {KMSError} if unable to validate certificate against KMS credentials
|
|
161
118
|
* @returns {void}
|
|
162
119
|
*/
|
|
163
|
-
|
|
164
|
-
|
|
165
120
|
var validateCommonName = function validateCommonName(_ref3, _ref4) {
|
|
166
121
|
var _ref5 = (0, _slicedToArray2.default)(_ref3, 1),
|
|
167
|
-
|
|
168
|
-
|
|
122
|
+
certificate = _ref5[0];
|
|
169
123
|
var kid = _ref4.kid;
|
|
170
124
|
var kidHostname = (0, _url.parse)(kid).hostname;
|
|
171
125
|
var validationSuccessful = false;
|
|
172
|
-
|
|
173
126
|
if (certificate.extensions) {
|
|
174
127
|
// Subject Alt Names are in here
|
|
175
128
|
var _iterator = _createForOfIteratorHelper(certificate.extensions),
|
|
176
|
-
|
|
177
|
-
|
|
129
|
+
_step;
|
|
178
130
|
try {
|
|
179
131
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
180
132
|
var extension = _step.value;
|
|
181
|
-
|
|
182
133
|
if (extension.extnID === X509_SUBJECT_ALT_NAME_KEY) {
|
|
183
134
|
var altNames = extension.parsedValue.altNames;
|
|
184
|
-
|
|
185
135
|
var _iterator2 = _createForOfIteratorHelper(altNames),
|
|
186
|
-
|
|
187
|
-
|
|
136
|
+
_step2;
|
|
188
137
|
try {
|
|
189
138
|
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
190
139
|
var entry = _step2.value;
|
|
191
140
|
var san = entry.value;
|
|
192
141
|
validationSuccessful = san === kidHostname;
|
|
193
|
-
|
|
194
142
|
if (validationSuccessful) {
|
|
195
143
|
break;
|
|
196
144
|
}
|
|
@@ -200,7 +148,6 @@ var validateCommonName = function validateCommonName(_ref3, _ref4) {
|
|
|
200
148
|
} finally {
|
|
201
149
|
_iterator2.f();
|
|
202
150
|
}
|
|
203
|
-
|
|
204
151
|
if (validationSuccessful) {
|
|
205
152
|
break;
|
|
206
153
|
}
|
|
@@ -212,22 +159,17 @@ var validateCommonName = function validateCommonName(_ref3, _ref4) {
|
|
|
212
159
|
_iterator.f();
|
|
213
160
|
}
|
|
214
161
|
}
|
|
215
|
-
|
|
216
162
|
if (!validationSuccessful) {
|
|
217
163
|
// Didn't match kid in the Subject Alt Names, checking the Common Name
|
|
218
164
|
var subjectAttributes = certificate.subject.typesAndValues;
|
|
219
|
-
|
|
220
165
|
var _iterator3 = _createForOfIteratorHelper(subjectAttributes),
|
|
221
|
-
|
|
222
|
-
|
|
166
|
+
_step3;
|
|
223
167
|
try {
|
|
224
168
|
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
225
169
|
var attribute = _step3.value;
|
|
226
|
-
|
|
227
170
|
if (attribute.type === X509_COMMON_NAME_KEY) {
|
|
228
171
|
var commonName = attribute.value.valueBlock.value;
|
|
229
172
|
validationSuccessful = commonName === kidHostname;
|
|
230
|
-
|
|
231
173
|
if (validationSuccessful) {
|
|
232
174
|
break;
|
|
233
175
|
}
|
|
@@ -239,11 +181,11 @@ var validateCommonName = function validateCommonName(_ref3, _ref4) {
|
|
|
239
181
|
_iterator3.f();
|
|
240
182
|
}
|
|
241
183
|
}
|
|
242
|
-
|
|
243
184
|
if (!validationSuccessful) {
|
|
244
|
-
throwError(
|
|
185
|
+
throwError("hostname of the 1st certificate does not match 'kid'");
|
|
245
186
|
}
|
|
246
187
|
};
|
|
188
|
+
|
|
247
189
|
/**
|
|
248
190
|
* Validate the first KMS certificate against the information
|
|
249
191
|
* provided in the JWT
|
|
@@ -254,14 +196,11 @@ var validateCommonName = function validateCommonName(_ref3, _ref4) {
|
|
|
254
196
|
* @throws {KMSError} if e or n doesn't match the first certificate
|
|
255
197
|
* @returns {void}
|
|
256
198
|
*/
|
|
257
|
-
|
|
258
|
-
|
|
259
199
|
var validatePublicCertificate = function validatePublicCertificate(_ref6, _ref7) {
|
|
260
200
|
var _ref8 = (0, _slicedToArray2.default)(_ref6, 1),
|
|
261
|
-
|
|
262
|
-
|
|
201
|
+
certificate = _ref8[0];
|
|
263
202
|
var publicExponent = _ref7.e,
|
|
264
|
-
|
|
203
|
+
modulus = _ref7.n;
|
|
265
204
|
var encode = _nodeJose.default.util.base64url.encode;
|
|
266
205
|
var publicKey = certificate.subjectPublicKeyInfo.subjectPublicKey;
|
|
267
206
|
var asn1PublicCert = (0, _asn1js.fromBER)(publicKey.valueBlock.valueHex);
|
|
@@ -270,15 +209,14 @@ var validatePublicCertificate = function validatePublicCertificate(_ref6, _ref7)
|
|
|
270
209
|
});
|
|
271
210
|
var publicExponentHex = publicCert.publicExponent.valueBlock.valueHex;
|
|
272
211
|
var modulusHex = publicCert.modulus.valueBlock.valueHex;
|
|
273
|
-
|
|
274
212
|
if (publicExponent !== encode(publicExponentHex)) {
|
|
275
213
|
throwError('Public exponent is invalid');
|
|
276
214
|
}
|
|
277
|
-
|
|
278
215
|
if (modulus !== encode(modulusHex)) {
|
|
279
216
|
throwError('Modulus is invalid');
|
|
280
217
|
}
|
|
281
218
|
};
|
|
219
|
+
|
|
282
220
|
/**
|
|
283
221
|
* Validates the list of certificates against the CAs provided
|
|
284
222
|
* @param {certificate[]} certificates list of certificates provided
|
|
@@ -287,8 +225,6 @@ var validatePublicCertificate = function validatePublicCertificate(_ref6, _ref7)
|
|
|
287
225
|
* validate the KMS's certificates
|
|
288
226
|
* @returns {Promise} rejects if unable to validate the certificates
|
|
289
227
|
*/
|
|
290
|
-
|
|
291
|
-
|
|
292
228
|
var validateCertificatesSignature = function validateCertificatesSignature(certificates) {
|
|
293
229
|
var caroots = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
294
230
|
var certificateEngine = new _pkijs.CertificateChainValidationEngine({
|
|
@@ -297,14 +233,14 @@ var validateCertificatesSignature = function validateCertificatesSignature(certi
|
|
|
297
233
|
});
|
|
298
234
|
return certificateEngine.verify().then(function (_ref9) {
|
|
299
235
|
var result = _ref9.result,
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
236
|
+
resultCode = _ref9.resultCode,
|
|
237
|
+
resultMessage = _ref9.resultMessage;
|
|
303
238
|
if (!result) {
|
|
304
239
|
throwError("Certificate Validation failed [".concat(resultCode, "]: ").concat(resultMessage));
|
|
305
240
|
}
|
|
306
241
|
});
|
|
307
242
|
};
|
|
243
|
+
|
|
308
244
|
/**
|
|
309
245
|
* Validates the information provided by the KMS. This is a curried function.
|
|
310
246
|
* The first function takes the caroots param and returns a second function.
|
|
@@ -315,23 +251,20 @@ var validateCertificatesSignature = function validateCertificatesSignature(certi
|
|
|
315
251
|
* validate the KMS
|
|
316
252
|
* @returns {Promise} when resolved will return the jwt
|
|
317
253
|
*/
|
|
318
|
-
|
|
319
|
-
|
|
320
254
|
var validateKMS = function validateKMS(caroots) {
|
|
321
255
|
return function () {
|
|
322
256
|
var jwt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
323
257
|
return _promise.default.resolve().then(function () {
|
|
324
258
|
validateKtyHeader(jwt);
|
|
325
259
|
validateKidHeader(jwt);
|
|
326
|
-
|
|
327
260
|
if (!((0, _isArray2.default)(jwt.x5c) && jwt.x5c.length > 0)) {
|
|
328
261
|
throwError('JWK does not contain a list of certificates');
|
|
329
262
|
}
|
|
330
|
-
|
|
331
263
|
var certificates = jwt.x5c.map(decodeCert);
|
|
332
264
|
validateCommonName(certificates, jwt);
|
|
333
|
-
validatePublicCertificate(certificates, jwt);
|
|
265
|
+
validatePublicCertificate(certificates, jwt);
|
|
334
266
|
|
|
267
|
+
// Skip validating signatures if no CA roots were provided
|
|
335
268
|
var promise = caroots ? validateCertificatesSignature(certificates, caroots) : _promise.default.resolve();
|
|
336
269
|
return promise.then(function () {
|
|
337
270
|
return jwt;
|
|
@@ -339,7 +272,6 @@ var validateKMS = function validateKMS(caroots) {
|
|
|
339
272
|
});
|
|
340
273
|
};
|
|
341
274
|
};
|
|
342
|
-
|
|
343
275
|
var _default = validateKMS;
|
|
344
276
|
exports.default = _default;
|
|
345
277
|
//# sourceMappingURL=kms-certificate-validation.js.map
|