Skip to content

Commit d682e29

Browse files
committed
Merge pull request #12 from volition-inc/restore-deprecated-concat-kdf-alg
Update: Support deprecated A*CBC+HS* algorithms (aka the "plus" algorithms)
2 parents 30c75df + 473bdae commit d682e29

File tree

9 files changed

+351
-178
lines changed

9 files changed

+351
-178
lines changed

lib/algorithms/aes-cbc-hmac-sha2.js

+310-163
Large diffs are not rendered by default.

lib/algorithms/constants.js

+6
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ module.exports = {
2525
"A128CBC-HS256": 256,
2626
"A192CBC-HS384": 384,
2727
"A256CBC-HS512": 512,
28+
"A128CBC+HS256": 256,
29+
"A192CBC+HS384": 384,
30+
"A256CBC+HS512": 512,
2831
"A128GCM": 128,
2932
"A192GCM": 192,
3033
"A256GCM": 256,
@@ -39,6 +42,9 @@ module.exports = {
3942
"A128CBC-HS256": 128,
4043
"A192CBC-HS384": 128,
4144
"A256CBC-HS512": 128,
45+
"A128CBC+HS256": 128,
46+
"A192CBC+HS384": 128,
47+
"A256CBC+HS512": 128,
4248
"A128GCM": 96,
4349
"A192GCM": 96,
4450
"A256GCM": 96

lib/jwe/decrypt.js

+9-5
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ function JWEDecrypter(ks) {
8989

9090
// decrypt with first key found
9191
var algKey,
92-
encKey;
92+
encKey,
93+
kdata;
9394
promise = promise.then(function(rcptList) {
9495
var jwe = {};
9596
return new Promise(function(resolve, reject) {
@@ -100,10 +101,9 @@ function JWEDecrypter(ks) {
100101
return;
101102
}
102103

103-
var algPromise,
104-
prekey;
104+
var algPromise;
105105

106-
prekey = rcpt.encrypted_key || "";
106+
var prekey = kdata = rcpt.encrypted_key || "";
107107
prekey = base64url.decode(prekey);
108108
algKey = assumedKey || keystore.get({
109109
use: "enc",
@@ -145,10 +145,14 @@ function JWEDecrypter(ks) {
145145
if ("aad" in input && null != input.aad) {
146146
adata += "." + input.aad;
147147
}
148+
148149
var params = {
149150
iv: jwe.iv,
150151
adata: adata,
151-
tag: jwe.tag
152+
tag: jwe.tag,
153+
kdata: kdata,
154+
epu: jwe.epu,
155+
epv: jwe.epv
152156
};
153157
var cdata = jwe.ciphertext;
154158

lib/jwe/encrypt.js

+12
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,18 @@ function JWEEncrypter(cfg, fields, recipients) {
379379
}
380380
props.iv = iv;
381381

382+
if ("recipients" in jwe && jwe.recipients.length === 1) {
383+
props.kdata = jwe.recipients[0].encrypted_key;
384+
}
385+
386+
if ("epu" in cfg && cfg.epu != null) {
387+
props.epu = cfg.epu;
388+
}
389+
390+
if ("epv" in cfg && cfg.epv != null) {
391+
props.epv = cfg.epv;
392+
}
393+
382394
var pdata = jwe.plaintext;
383395
delete jwe.plaintext;
384396
return encKey.then(function(encKey) {

lib/jwk/octkey.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ var ENC_ALGS = [
2323
"A256GCM",
2424
"A128CBC-HS256",
2525
"A192CBC-HS384",
26-
"A256CBC-HS512"
26+
"A256CBC-HS512",
27+
"A128CBC+HS256",
28+
"A192CBC+HS384",
29+
"A256CBC+HS512"
2730
];
2831
var WRAP_ALGS = [
2932
"A128KW",
@@ -115,6 +118,7 @@ var JWKOctetCfg = {
115118
case "decrypt":
116119
return ENC_ALGS.filter(function(a) {
117120
return (a === ("A" + (len / 2) + "CBC-HS" + len)) ||
121+
(a === ("A" + (len / 2) + "CBC+HS" + len)) ||
118122
(a === ("A" + len + "GCM"));
119123
});
120124
case "sign":

test/jwk/octkey-test.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -523,9 +523,9 @@ describe("jwk/oct", function() {
523523
assert.deepEqual(algs, ["HS256"]);
524524

525525
algs = JWK.OCTET.config.algorithms(keys, "encrypt");
526-
assert.deepEqual(algs, ["A256GCM", "A128CBC-HS256"]);
526+
assert.deepEqual(algs, ["A256GCM", "A128CBC-HS256", "A128CBC+HS256"]);
527527
algs = JWK.OCTET.config.algorithms(keys, "decrypt");
528-
assert.deepEqual(algs, ["A256GCM", "A128CBC-HS256"]);
528+
assert.deepEqual(algs, ["A256GCM", "A128CBC-HS256", "A128CBC+HS256"]);
529529

530530
algs = JWK.OCTET.config.algorithms(keys, "wrap");
531531
assert.deepEqual(algs, ["A256KW", "A256GCMKW", "PBES2-HS256+A128KW", "PBES2-HS384+A192KW", "PBES2-HS512+A256KW", "dir"]);
@@ -542,9 +542,9 @@ describe("jwk/oct", function() {
542542
assert.deepEqual(algs, ["HS256", "HS384"]);
543543

544544
algs = JWK.OCTET.config.algorithms(keys, "encrypt");
545-
assert.deepEqual(algs, ["A192CBC-HS384"]);
545+
assert.deepEqual(algs, ["A192CBC-HS384", "A192CBC+HS384"]);
546546
algs = JWK.OCTET.config.algorithms(keys, "decrypt");
547-
assert.deepEqual(algs, ["A192CBC-HS384"]);
547+
assert.deepEqual(algs, ["A192CBC-HS384", "A192CBC+HS384"]);
548548

549549
algs = JWK.OCTET.config.algorithms(keys, "wrap");
550550
assert.deepEqual(algs, ["PBES2-HS256+A128KW", "PBES2-HS384+A192KW", "PBES2-HS512+A256KW", "dir"]);
@@ -561,9 +561,9 @@ describe("jwk/oct", function() {
561561
assert.deepEqual(algs, ["HS256", "HS384", "HS512"]);
562562

563563
algs = JWK.OCTET.config.algorithms(keys, "encrypt");
564-
assert.deepEqual(algs, ["A256CBC-HS512"]);
564+
assert.deepEqual(algs, ["A256CBC-HS512", "A256CBC+HS512"]);
565565
algs = JWK.OCTET.config.algorithms(keys, "decrypt");
566-
assert.deepEqual(algs, ["A256CBC-HS512"]);
566+
assert.deepEqual(algs, ["A256CBC-HS512", "A256CBC+HS512"]);
567567

568568
algs = JWK.OCTET.config.algorithms(keys, "wrap");
569569
assert.deepEqual(algs, ["PBES2-HS256+A128KW", "PBES2-HS384+A192KW", "PBES2-HS512+A256KW", "dir"]);

test/parse/compact-test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
var chai = require("chai");
88
var assert = chai.assert;
99

10-
var cloneDeep = require("lodash.cloneDeep");
10+
var cloneDeep = require("lodash.clonedeep");
1111
var parseCompact = require("../../lib/parse/compact");
1212
var jose = {
1313
JWK: require("../../lib/jwk")

test/parse/index-test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
var chai = require("chai");
88
var assert = chai.assert;
99

10-
var cloneDeep = require("lodash.cloneDeep");
10+
var cloneDeep = require("lodash.clonedeep");
1111
var merge = require("../../lib/util/merge");
1212

1313
var jose = {

test/parse/json-test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
var chai = require("chai");
88
var assert = chai.assert;
99

10-
var cloneDeep = require("lodash.cloneDeep");
10+
var cloneDeep = require("lodash.clonedeep");
1111
var merge = require("../../lib/util/merge");
1212
var parseJSON = require("../../lib/parse/json");
1313

0 commit comments

Comments
 (0)