dkim-verifier
Version:
DKIM Signature Verifier in TypeScript
55 lines • 2.49 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getGmailDkimPublicKeyN = exports.getDkimPublicKeyN = exports.getDkimPublicKey = void 0;
const promises_1 = __importDefault(require("dns/promises"));
const crypto_1 = require("crypto");
const getDkimPublicKey = async (dkim) => {
const { d: domain, s: selector } = dkim;
const publicKeyData = await getTxtRecord(domain, selector);
const publicKey = "-----BEGIN PUBLIC KEY-----\n" +
publicKeyData +
"\n" +
"-----END PUBLIC KEY-----\n";
return publicKey;
};
exports.getDkimPublicKey = getDkimPublicKey;
const getDkimPublicKeyN = async (dkim) => {
const publicKey = await (0, exports.getDkimPublicKey)(dkim);
return { publicKey, n: extractModulusN(publicKey) };
};
exports.getDkimPublicKeyN = getDkimPublicKeyN;
const getGmailDkimPublicKeyN = () => {
const publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAntvSKT1hkqhKe0xcaZ0x+QbouDsJuBfby/S82jxsoC/SodmfmVs2D1KAH3mi1AqdMdU12h2VfETeOJkgGYq5ljd996AJ7ud2SyOLQmlhaNHH7Lx+Mdab8/zDN1SdxPARDgcM7AsRECHwQ15R20FaKUABGu4NTbR2fDKnYwiq5jQyBkLWP+LgGOgfUF4T4HZb2PY2bQtEP6QeqOtcW4rrsH24L7XhD+HSZb1hsitrE0VPbhJzxDwI4JF815XMnSVjZgYUXP8CxI1Y0FONlqtQYgsorZ9apoW1KPQe8brSSlRsi9sXB/tu56LmG7tEDNmrZ5XUwQYUUADBOu7t1niwXwIDAQAB
-----END PUBLIC KEY-----
`;
return { publicKey, n: extractModulusN(publicKey) };
};
exports.getGmailDkimPublicKeyN = getGmailDkimPublicKeyN;
const extractModulusN = (publicKeyPem) => {
const key = (0, crypto_1.createPublicKey)(publicKeyPem);
const jwk = key.export({ format: "jwk" });
return jwkToBigInt(jwk.n ?? "");
};
const getTxtRecord = async (domain, selector) => {
const dnsDomain = `${selector}._domainkey.${domain}`;
const dnsTxt = await promises_1.default.resolveTxt(dnsDomain);
let publicKeyData = dnsTxt[0][0].split("p=")[1];
for (let i = 1; i < dnsTxt[0].length; i++) {
publicKeyData += dnsTxt[0][i];
}
return publicKeyData;
};
const jwkToBigInt = (jwk) => {
let base64 = jwk.replace(/-/g, "+").replace(/_/g, "/");
while (base64.length % 4) {
base64 += "=";
}
const base64Buffer = Buffer.from(base64, "base64");
const base64Hex = base64Buffer.toString("hex");
return BigInt(`0x${base64Hex}`);
};
//# sourceMappingURL=publicKey.js.map