From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Shelley Vohr <shelley.vohr@gmail.com>
Date: Thu, 23 Sep 2021 12:29:23 +0200
Subject: fix: crash creating private key with unsupported algorithm

This patch fixes an issue where some calls to crypto.createPrivateKey
made with algorithms unsupported by BoringSSL cause a crash when invoking
methods on their return values. This was happening because BoringSSL
shims some algorithms but doesn't implement them and so attempted to
created keys with them will fail (see https://source.chromium.org/chromium/chromium/src/+/main:third_party/boringssl/src/include/openssl/evp.h;l=835-837?q=ed448&ss=chromium)

Node.js returned false in initEdRaw (see: https://github.com/nodejs/node/blob/20cf47004e7801ede1588d2de8785c0100f6ab38/src/crypto/crypto_keys.cc#L1106)
but then did nothing with the return value, meaning that if no pkey was
created successfully that a key object was still returned but attempts
to use the data_ field would crash the process as data_ was never
assigned. This is fixed by checking the return value of initEdRaw at the
JavaScript level and throwing an error if the function returns false.

This patch will be upstreamed in some form.

diff --git a/lib/internal/crypto/keys.js b/lib/internal/crypto/keys.js
index c24b2d14eb50019d442a32ba92560c8c0c58d2d5..2b120d3c264f44eff452a8f4f8e8da4443bdb6f3 100644
--- a/lib/internal/crypto/keys.js
+++ b/lib/internal/crypto/keys.js
@@ -459,15 +459,19 @@ function getKeyObjectHandleFromJwk(key, ctx) {
 
     const handle = new KeyObjectHandle();
     if (isPublic) {
-      handle.initEDRaw(
+      if (!handle.initEDRaw(
         `NODE-${key.crv.toUpperCase()}`,
         keyData,
-        kKeyTypePublic);
+        kKeyTypePublic)) {
+        throw new Error('Failed to create key - unsupported algorithm');
+      }
     } else {
-      handle.initEDRaw(
+      if (!handle.initEDRaw(
         `NODE-${key.crv.toUpperCase()}`,
         keyData,
-        kKeyTypePrivate);
+        kKeyTypePrivate)) {
+        throw new Error('Failed to create key - unsupported algorithm');
+      }
     }
 
     return handle;
