mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 05:42:25 -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:
parent
594a99817c
commit
df1d36324f
2 changed files with 39 additions and 4 deletions
|
@ -30,6 +30,7 @@ import {
|
|||
import { Buffer } from "node:buffer";
|
||||
import { KeyFormat, KeyType } from "ext:deno_node/internal/crypto/types.ts";
|
||||
import process from "node:process";
|
||||
import { promisify } from "node:util";
|
||||
|
||||
import {
|
||||
op_node_generate_dh_group_key,
|
||||
|
@ -570,7 +571,15 @@ export function generateKeyPair(
|
|||
privateKey: any,
|
||||
) => 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 publicKeyHandle = op_node_get_public_key_from_pair(pair);
|
||||
|
||||
|
@ -589,12 +598,15 @@ export function generateKeyPair(
|
|||
}
|
||||
}
|
||||
|
||||
callback(null, publicKey, privateKey);
|
||||
}).catch((err) => {
|
||||
callback(err, null, null);
|
||||
return { publicKey, privateKey };
|
||||
});
|
||||
}
|
||||
|
||||
Object.defineProperty(generateKeyPair, promisify.custom, {
|
||||
enumerable: false,
|
||||
value: _generateKeyPair,
|
||||
});
|
||||
|
||||
export interface KeyPairKeyObjectResult {
|
||||
publicKey: KeyObject;
|
||||
privateKey: KeyObject;
|
||||
|
|
|
@ -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-----"));
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue