diff --git a/doc/api/crypto.markdown b/doc/api/crypto.markdown index df5f28e5f91fd4..6e2e1ef99d2df0 100644 --- a/doc/api/crypto.markdown +++ b/doc/api/crypto.markdown @@ -42,7 +42,7 @@ Returns an array with the names of the supported ciphers. Example: var ciphers = crypto.getCiphers(); - console.log(ciphers); // ['AES-128-CBC', 'AES-128-CBC-HMAC-SHA1', ...] + console.log(ciphers); // ['aes-128-cbc', 'aes-128-ccm', ...] ## crypto.getHashes() @@ -55,6 +55,16 @@ Example: console.log(hashes); // ['sha', 'sha1', 'sha1WithRSAEncryption', ...] +## crypto.getCurves() + +Returns an array with the names of the supported elliptic curves. + +Example: + + var curves = crypto.getCurves(); + console.log(curves); // ['secp256k1', 'secp384r1', ...] + + ## crypto.createCredentials(details) Stability: 0 - Deprecated. Use [tls.createSecureContext][] instead. diff --git a/lib/crypto.js b/lib/crypto.js index 7ce89482d54b14..d0ecef42a2412f 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -10,6 +10,7 @@ try { var randomBytes = binding.randomBytes; var getCiphers = binding.getCiphers; var getHashes = binding.getHashes; + var getCurves = binding.getCurves; } catch (e) { throw new Error('node.js not compiled with openssl crypto support.'); } @@ -652,13 +653,17 @@ exports.randomBytes = exports.pseudoRandomBytes = randomBytes; exports.rng = exports.prng = randomBytes; exports.getCiphers = function() { - return filterDuplicates(getCiphers.call(null, arguments)); + return filterDuplicates(getCiphers()); }; exports.getHashes = function() { - return filterDuplicates(getHashes.call(null, arguments)); + return filterDuplicates(getHashes()); +}; + +exports.getCurves = function() { + return filterDuplicates(getCurves()); }; diff --git a/src/node_crypto.cc b/src/node_crypto.cc index e2c478a510be84..51914b8cd74a11 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -4878,6 +4878,32 @@ void GetHashes(const FunctionCallbackInfo& args) { } +void GetCurves(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + const size_t num_curves = EC_get_builtin_curves(nullptr, 0); + Local arr = Array::New(env->isolate(), num_curves); + EC_builtin_curve* curves; + size_t alloc_size; + + if (num_curves) { + alloc_size = sizeof(*curves) * num_curves; + curves = static_cast(malloc(alloc_size)); + + CHECK_NE(curves, nullptr); + + if (EC_get_builtin_curves(curves, num_curves)) { + for (size_t i = 0; i < num_curves; i++) { + arr->Set(i, OneByteString(env->isolate(), OBJ_nid2sn(curves[i].nid))); + } + } + + free(curves); + } + + args.GetReturnValue().Set(arr); +} + + void Certificate::Initialize(Environment* env, Handle target) { HandleScope scope(env->isolate()); @@ -5160,6 +5186,7 @@ void InitCrypto(Handle target, env->SetMethod(target, "getSSLCiphers", GetSSLCiphers); env->SetMethod(target, "getCiphers", GetCiphers); env->SetMethod(target, "getHashes", GetHashes); + env->SetMethod(target, "getCurves", GetCurves); env->SetMethod(target, "publicEncrypt", PublicKeyCipher::Cipher