1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-21 15:04:11 -05:00

fix(node/crypto): support promisify on generateKeyPair (#26913)

Calling `promisify(generateKeyPair)` didn't work as expected. It
requires a custom promisify implementation.

This was easy to fix thanks to the excellent debugging investigation in
https://github.com/denoland/deno/issues/26910

Fixes https://github.com/denoland/deno/issues/26910

Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
This commit is contained in:
Marvin Hagemeister 2024-11-19 01:39:40 +01:00 committed by GitHub
parent 594a99817c
commit df1d36324f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 39 additions and 4 deletions

View file

@ -30,6 +30,7 @@ import {
import { Buffer } from "node:buffer"; import { Buffer } from "node:buffer";
import { KeyFormat, KeyType } from "ext:deno_node/internal/crypto/types.ts"; import { KeyFormat, KeyType } from "ext:deno_node/internal/crypto/types.ts";
import process from "node:process"; import process from "node:process";
import { promisify } from "node:util";
import { import {
op_node_generate_dh_group_key, op_node_generate_dh_group_key,
@ -570,7 +571,15 @@ export function generateKeyPair(
privateKey: any, privateKey: any,
) => void, ) => void,
) { ) {
createJob(kAsync, type, options).then((pair) => { _generateKeyPair(type, options)
.then(
(res) => callback(null, res.publicKey, res.privateKey),
(err) => callback(err, null, null),
);
}
function _generateKeyPair(type: string, options: unknown) {
return createJob(kAsync, type, options).then((pair) => {
const privateKeyHandle = op_node_get_private_key_from_pair(pair); const privateKeyHandle = op_node_get_private_key_from_pair(pair);
const publicKeyHandle = op_node_get_public_key_from_pair(pair); const publicKeyHandle = op_node_get_public_key_from_pair(pair);
@ -589,12 +598,15 @@ export function generateKeyPair(
} }
} }
callback(null, publicKey, privateKey); return { publicKey, privateKey };
}).catch((err) => {
callback(err, null, null);
}); });
} }
Object.defineProperty(generateKeyPair, promisify.custom, {
enumerable: false,
value: _generateKeyPair,
});
export interface KeyPairKeyObjectResult { export interface KeyPairKeyObjectResult {
publicKey: KeyObject; publicKey: KeyObject;
privateKey: KeyObject; privateKey: KeyObject;

View file

@ -677,3 +677,26 @@ Deno.test("generateKeyPair large pem", function () {
}, },
}); });
}); });
Deno.test("generateKeyPair promisify", async () => {
const passphrase = "mypassphrase";
const cipher = "aes-256-cbc";
const modulusLength = 4096;
const { privateKey, publicKey } = await promisify(generateKeyPair)("rsa", {
modulusLength,
publicKeyEncoding: {
type: "spki",
format: "pem",
},
privateKeyEncoding: {
type: "pkcs8",
format: "pem",
cipher,
passphrase,
},
});
assert(publicKey.startsWith("-----BEGIN PUBLIC KEY-----"));
assert(privateKey.startsWith("-----BEGIN PRIVATE KEY-----"));
});