nav-connect
Version:
Nav Online Invoice connection module
45 lines • 1.91 kB
JavaScript
import * as crypto from "node:crypto";
import { Buffer } from "node:buffer";
export function getRequestId() {
const ts = Date.now().toString(36);
const rnd = crypto.randomBytes(8).toString("hex");
return (ts + rnd).slice(0, 30);
}
export function getTimestamp() {
return new Date().toISOString();
}
export function sha512(msg) {
return crypto.createHash("sha512").update(msg).digest("hex").toUpperCase();
}
export function sha3_512(msg) {
return crypto.createHash("sha3-512").update(msg).digest("hex").toUpperCase();
}
export function formatNavTimestampForHash(isoTs) {
const d = new Date(isoTs);
const pad = (n) => n.toString().padStart(2, "0");
return (d.getUTCFullYear().toString() +
pad(d.getUTCMonth() + 1) +
pad(d.getUTCDate()) +
pad(d.getUTCHours()) +
pad(d.getUTCMinutes()) +
pad(d.getUTCSeconds()));
}
export function generateRequestMetadata() {
const requestId = getRequestId();
const timestamp = getTimestamp();
const navTimestampForHash = formatNavTimestampForHash(timestamp);
return { requestId, timestamp, navTimestampForHash };
}
export function computeManageRequestSignature(requestId, navTimestampForHash, signatureKey, operations) {
const partialHash = requestId + navTimestampForHash + signatureKey;
const indexHashes = operations.map((op) => sha3_512(op.operation + op.data));
return sha3_512(partialHash + indexHashes.join(""));
}
export function decodeExchangeToken(encodedToken, exchangeKey) {
const keyBuffer = Buffer.from(exchangeKey, "utf8").slice(0, 16);
const tokenBuffer = Buffer.from(encodedToken, "base64");
const decipher = crypto.createDecipheriv("aes-128-ecb", keyBuffer, null);
const decoded = Buffer.concat([decipher.update(tokenBuffer), decipher.final()]);
return decoded.toString("utf8").replace(/\0/g, "").trim();
}
//# sourceMappingURL=crypto.js.map