-
-
Save shrys/2d6b4c0c85095a628c261eaeeef34a8b to your computer and use it in GitHub Desktop.
| const c = require('crypto'); | |
| const utf8 = require('utf8'); | |
| const key = 'YOUR_SECRET_KEY'; | |
| const region = 'us-east-1'; | |
| const date = '11111111'; | |
| const service = 'ses'; | |
| const terminal = 'aws4_request'; | |
| const message = 'SendRawEmail'; | |
| const versionInBytes = [0x04]; | |
| function sign(key, msg) { | |
| return c.createHmac('sha256', Buffer.from(key.map(a => a.charCodeAt(0)))) | |
| .update(utf8.encode(msg)) | |
| .digest('latin1') | |
| .split(''); | |
| } | |
| let signature = sign((utf8.encode('AWS4' + key)).split(''), date); | |
| signature = sign(signature, region); | |
| signature = sign(signature, service); | |
| signature = sign(signature, terminal); | |
| signature = sign(signature, message); | |
| const signatureAndVersion = versionInBytes.slice(); //copy of array | |
| signature.forEach(a => signatureAndVersion.push(a.charCodeAt(0))); | |
| const smtpPassword = Buffer.from(signatureAndVersion).toString('base64'); | |
| console.log(smtpPassword); |
| { | |
| "name": "sample", | |
| "version": "1.0.0", | |
| "description": "", | |
| "main": "indext.ts", | |
| "scripts": { | |
| "test": "echo \"Error: no test specified\" && exit 1" | |
| }, | |
| "author": "", | |
| "license": "ISC", | |
| "dependencies": { | |
| "@types/node": "^14.0.12", | |
| "@types/utf8": "^2.1.6", | |
| "express": "^4.17.1", | |
| "express.js": "^1.0.0", | |
| "utf8": "^3.0.0" | |
| } | |
| } |
| { | |
| "compilerOptions": { | |
| "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ | |
| "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ | |
| "strict": true, /* Enable all strict type-checking options. */ | |
| "noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */ | |
| "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ | |
| "skipLibCheck": true, /* Skip type checking of declaration files. */ | |
| "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ | |
| } | |
| } |
Hi @Cloudrage, thank you for pointing it out. I have updated the gist with working code and the configurations I have been using.
The problems I think are caused by typescript language in vscode, I've used the "noImplicitAny": false, option to suppress them. For argument type, I have corrected it to latin1 as you rightly pointed out. Docs mention it as type HexBase64Latin1Encoding = "latin1" | "hex" | "base64";
Thanks, better with latin1 indeed.
For the others, noImplicitAny can be set to true if desired with that code :
// Convert to SMTP base64 password
const crypto = require('crypto');
const utf8 = require('utf8');
const key = MyKey
const region = MyRegion;
const date = '11111111';
const service = 'ses';
const terminal = 'aws4_request';
const message = 'SendRawEmail';
const versionInBytes = [0x04];
function sign(key: { map: (arg0: (a: any) => any) => ArrayBuffer | SharedArrayBuffer; }, msg: string) {
return crypto.createHmac('sha256', Buffer.from(key.map((a: string) => a.charCodeAt(0))))
.update(utf8.encode(msg))
.digest('latin1')
.split('');
}
let signature = sign((utf8.encode('AWS4' + key)).split(''), date);
signature = sign(signature, region);
signature = sign(signature, service);
signature = sign(signature, terminal);
signature = sign(signature, message);
const signatureAndVersion = versionInBytes.slice(); //copy of array
signature.forEach((a: string) => signatureAndVersion.push(a.charCodeAt(0)));
const smtpPassword = Buffer.from(signatureAndVersion).toString('base64');
But a SMTP connection test don't seems to work, strange. I follow that proc :
https://docs.aws.amazon.com/fr_fr/ses/latest/DeveloperGuide/send-email-smtp-client-command-line.html
I've a :
535 Authentication Credentials Invalid
530 Authentication required
I'm also testing with working credentials from an application using SES; so maybe I doing something wrong with the AWS testing proc.
Hi @shrys,
On my side, I've some problems with that code :