96 lines
2.2 KiB
JavaScript
96 lines
2.2 KiB
JavaScript
|
/*!
|
||
|
* parse/compact.js - JOSE JSON Serialization Parser
|
||
|
*
|
||
|
* Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
|
||
|
*/
|
||
|
"use strict";
|
||
|
|
||
|
var merge = require("../util/merge");
|
||
|
|
||
|
var jose = {
|
||
|
JWE: require("../jwe"),
|
||
|
JWS: require("../jws"),
|
||
|
util: require("../util")
|
||
|
};
|
||
|
|
||
|
function parseJSON(input) {
|
||
|
var type,
|
||
|
op,
|
||
|
headers;
|
||
|
|
||
|
if ("signatures" in input || "signature" in input) {
|
||
|
// JWS
|
||
|
type = "JWS";
|
||
|
op = function(ks, opts) {
|
||
|
return jose.JWS.createVerify(ks).
|
||
|
verify(input, opts);
|
||
|
};
|
||
|
// headers can be (signatures[].protected, signatures[].header, signature.protected, signature.header)
|
||
|
headers = input.signatures ||
|
||
|
[ {
|
||
|
protected: input.protected,
|
||
|
header: input.header,
|
||
|
signature: input.signature
|
||
|
}];
|
||
|
headers = headers.map(function(sig) {
|
||
|
var all = {};
|
||
|
if (sig.header) {
|
||
|
all = merge(all, sig.header);
|
||
|
}
|
||
|
|
||
|
var prot;
|
||
|
if (sig.protected) {
|
||
|
prot = sig.protected;
|
||
|
prot = jose.util.base64url.decode(prot, "utf8");
|
||
|
prot = JSON.parse(prot);
|
||
|
all = merge(all, prot);
|
||
|
}
|
||
|
|
||
|
return all;
|
||
|
});
|
||
|
} else if ("ciphertext" in input) {
|
||
|
// JWE
|
||
|
type = "JWE";
|
||
|
op = function(ks, opts) {
|
||
|
return jose.JWE.createDecrypt(ks).
|
||
|
decrypt(input, opts);
|
||
|
};
|
||
|
// headers can be (protected, unprotected, recipients[].header)
|
||
|
var root = {};
|
||
|
if (input.protected) {
|
||
|
root.protected = input.protected;
|
||
|
root.protected = jose.util.base64url.decode(root.protected, "utf8");
|
||
|
root.protected = JSON.parse(root.protected);
|
||
|
}
|
||
|
if (input.unprotected) {
|
||
|
root.unprotected = input.unprotected;
|
||
|
}
|
||
|
|
||
|
headers = input.recipients || [{}];
|
||
|
headers = headers.map(function(rcpt) {
|
||
|
var all = {};
|
||
|
if (rcpt.header) {
|
||
|
all = merge(all, rcpt.header);
|
||
|
}
|
||
|
if (root.unprotected) {
|
||
|
all = merge(all, root.unprotected);
|
||
|
}
|
||
|
if (root.protected) {
|
||
|
all = merge(all, root.protected);
|
||
|
}
|
||
|
|
||
|
return all;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
type: type,
|
||
|
format: "json",
|
||
|
input: input,
|
||
|
all: headers,
|
||
|
perform: op
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module.exports = parseJSON;
|