dkim-verifier
Version:
DKIM Signature Verifier in TypeScript
118 lines • 4.1 kB
JavaScript
;
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