import * as plugins from '../plugins.js'; import type { MTA } from './mta.classes.mta.js'; interface Headers { [key: string]: string; } interface IEmailSignJobOptions { domain: string; selector: string; headers: Headers; body: string; } export class EmailSignJob { mtaRef: MTA; jobOptions: IEmailSignJobOptions; constructor(mtaRefArg: MTA, options: IEmailSignJobOptions) { this.mtaRef = mtaRefArg; this.jobOptions = options; } async loadPrivateKey(): Promise { return plugins.fs.promises.readFile( (await this.mtaRef.dkimCreator.getKeyPathsForDomain(this.jobOptions.domain)).privateKeyPath, 'utf-8' ); } public async getSignatureHeader(emailMessage: string): Promise { const signResult = await plugins.dkimSign(emailMessage, { // Optional, default canonicalization, default is "relaxed/relaxed" canonicalization: 'relaxed/relaxed', // c= // Optional, default signing and hashing algorithm // Mostly useful when you want to use rsa-sha1, otherwise no need to set algorithm: 'rsa-sha256', // Optional, default is current time signTime: new Date(), // t= // Keys for one or more signatures // Different signatures can use different algorithms (mostly useful when // you want to sign a message both with RSA and Ed25519) signatureData: [ { signingDomain: this.jobOptions.domain, // d= selector: this.jobOptions.selector, // s= // supported key types: RSA, Ed25519 privateKey: await this.loadPrivateKey(), // k= // Optional algorithm, default is derived from the key. // Overrides whatever was set in parent object algorithm: 'rsa-sha256', // Optional signature specifc canonicalization, overrides whatever was set in parent object canonicalization: 'relaxed/relaxed', // c= // Maximum number of canonicalized body bytes to sign (eg. the "l=" tag). // Do not use though. This is available only for compatibility testing. // maxBodyLength: 12345 }, ], }); const signature = signResult.signatures; return signature; } }