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:
parent
594a99817c
commit
df1d36324f
2 changed files with 39 additions and 4 deletions
|
@ -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;
|
||||||
|
|
|
@ -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