UNPKG

dkim-verifier

Version:

DKIM Signature Verifier in TypeScript

118 lines 4.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.relaxedNewLineAndSpace = exports.simpleBody = exports.relaxedBody = exports.simpleHeaders = exports.relaxedHeader = exports.relaxedHeaders = exports.canonicalize = exports.canonicalizationToStr = exports.newCanonicalization = void 0; const header_1 = require("./header"); const signature_1 = require("./signature"); var Canonicalization; (function (Canonicalization) { Canonicalization["Simple"] = "simple"; Canonicalization["Relaxed"] = "relaxed"; })(Canonicalization || (Canonicalization = {})); const newCanonicalization = (c) => { if (!c) { return [Canonicalization.Relaxed, Canonicalization.Relaxed]; } else if (c.includes("/")) { const [headerCanon, bodyCanon] = c.split("/"); return [ headerCanon === "simple" ? Canonicalization.Simple : Canonicalization.Relaxed, bodyCanon === "simple" ? Canonicalization.Simple : Canonicalization.Relaxed, ]; } else { return [ c === "simple" ? Canonicalization.Simple : Canonicalization.Relaxed, Canonicalization.Simple, ]; } }; exports.newCanonicalization = newCanonicalization; const canonicalizationToStr = (c) => { return `${c[0]}/${c[1]}`; }; exports.canonicalizationToStr = canonicalizationToStr; const canonicalize = (c, dkim, headers, body) => { return [ c[0] === Canonicalization.Simple ? (0, exports.simpleHeaders)(dkim, headers) : (0, exports.relaxedHeaders)(dkim, headers), c[1] === Canonicalization.Simple ? (0, exports.simpleBody)(body) : (0, exports.relaxedBody)(body), ]; }; exports.canonicalize = canonicalize; const relaxedHeaders = (dkim, headers) => { const { h } = dkim; const signingHeaders = (0, signature_1.selectSigningHeaders)(h, headers); let header = ""; for (const { key, value } of signingHeaders) { header += key.toLowerCase(); header += ":"; header += (0, exports.relaxedHeader)(value); header += "\r\n"; } const nonSignatureDkim = (0, header_1.getNonSignatureDkim)(headers); header += nonSignatureDkim; return header; }; exports.relaxedHeaders = relaxedHeaders; const relaxedHeader = (header) => { header = header.replace(/\t/g, " "); header = (0, exports.relaxedNewLineAndSpace)(header); while (header.endsWith(" ")) { header = header.slice(0, -1); } while (header.startsWith(" ")) { header = header.slice(1); } return header; }; exports.relaxedHeader = relaxedHeader; // https://tools.ietf.org/html/rfc6376#section-3.4.2 const simpleHeaders = (dkim, headers) => { const { h } = dkim; const signingHeaders = (0, signature_1.selectSigningHeaders)(h, headers); let header = ""; for (const { key, value } of signingHeaders) { header += key; header += ": "; header += value; header += "\r\n"; } const nonSignatureDkim = (0, header_1.getNonSignatureDkim)(headers); header += nonSignatureDkim; return header; }; exports.simpleHeaders = simpleHeaders; // https://tools.ietf.org/html/rfc6376#section-3.4.4 const relaxedBody = (body) => { body = body.replace(/\t/g, " "); body = body.replace(/ +/g, " "); body = body.replace(/ +\r\n/g, "\r\n"); while (body.endsWith("\r\n\r\n")) { body = body.slice(0, -2); } if (body.length > 0 && !body.endsWith("\r\n")) { body += "\r\n"; } return body; }; exports.relaxedBody = relaxedBody; const simpleBody = (body) => { if (body.length === 0) { return "\r\n"; } while (body.endsWith("\r\n\r\n")) { body = body.slice(0, -2); } return body.replace(/\s+/g, " ").trim(); }; exports.simpleBody = simpleBody; const relaxedNewLineAndSpace = (str) => { return str.replace(/ +/g, " ").replace(/\r\n/g, ""); }; exports.relaxedNewLineAndSpace = relaxedNewLineAndSpace; //# sourceMappingURL=canonicalization.js.map