rittenhop-dev/versions/5.94.2/node_modules/node-jose/lib/parse/json.js

96 lines
2.2 KiB
JavaScript
Raw Normal View History

2024-09-23 19:40:12 -04:00
/*!
* 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;