このpbkdf2
関数には JavaScript の実装がありますが、実際にはすべての作業を C++ 側に委譲します。
env->SetMethod(target, "pbkdf2", PBKDF2);
env->SetMethod(target, "generateKeyPairRSA", GenerateKeyPairRSA);
env->SetMethod(target, "generateKeyPairDSA", GenerateKeyPairDSA);
env->SetMethod(target, "generateKeyPairEC", GenerateKeyPairEC);
NODE_DEFINE_CONSTANT(target, OPENSSL_EC_NAMED_CURVE);
NODE_DEFINE_CONSTANT(target, OPENSSL_EC_EXPLICIT_CURVE);
NODE_DEFINE_CONSTANT(target, kKeyEncodingPKCS1);
NODE_DEFINE_CONSTANT(target, kKeyEncodingPKCS8);
NODE_DEFINE_CONSTANT(target, kKeyEncodingSPKI);
NODE_DEFINE_CONSTANT(target, kKeyEncodingSEC1);
NODE_DEFINE_CONSTANT(target, kKeyFormatDER);
NODE_DEFINE_CONSTANT(target, kKeyFormatPEM);
NODE_DEFINE_CONSTANT(target, kKeyTypeSecret);
NODE_DEFINE_CONSTANT(target, kKeyTypePublic);
NODE_DEFINE_CONSTANT(target, kKeyTypePrivate);
env->SetMethod(target, "randomBytes", RandomBytes);
env->SetMethodNoSideEffect(target, "timingSafeEqual", TimingSafeEqual);
env->SetMethodNoSideEffect(target, "getSSLCiphers", GetSSLCiphers);
env->SetMethodNoSideEffect(target, "getCiphers", GetCiphers);
env->SetMethodNoSideEffect(target, "getHashes", GetHashes);
env->SetMethodNoSideEffect(target, "getCurves", GetCurves);
env->SetMethod(target, "publicEncrypt",
PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
EVP_PKEY_encrypt_init,
EVP_PKEY_encrypt>);
env->SetMethod(target, "privateDecrypt",
PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
EVP_PKEY_decrypt_init,
EVP_PKEY_decrypt>);
env->SetMethod(target, "privateEncrypt",
PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
EVP_PKEY_sign_init,
EVP_PKEY_sign>);
env->SetMethod(target, "publicDecrypt",
PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
EVP_PKEY_verify_recover_init,
EVP_PKEY_verify_recover>);
リソース: https://github.com/nodejs/node/blob/master/src/node_crypto.cc
Libuv モジュールには、標準ライブラリ内の非常に特定の関数に関連する別の責任があります。
一部の標準ライブラリ関数呼び出しでは、Node C++ 側と Libuv は、イベント ループの外側でコストのかかる計算を完全に実行することを決定します。
pbkdf2
代わりに、スレッド プールと呼ばれるものを使用します。スレッド プールは、関数などの計算コストの高いタスクを実行するために使用できる一連の 4 つのスレッドです。
デフォルトでは、Libuv はこのスレッド プールに 4 つのスレッドを作成します。
イベント ループで使用されるスレッドに加えて、アプリケーション内で発生する必要がある高価な計算をオフロードするために使用できる 4 つのスレッドがあります。
Node 標準ライブラリに含まれる関数の多くは、このスレッド プールを自動的に利用します。pbkdf2
機能もその一つです。
このスレッド プールの存在は非常に重要です。
そのため、Node は真のシングル スレッドではありません。Node が計算コストの高いタスクを実行するために使用する他のスレッドがあるからです。
計算コストの高いタスクを実行する責任がイベント プールにある場合、Node アプリケーションは他に何もできません。
私たちの CPU は、スレッド内のすべての命令を 1 つずつ実行します。
スレッド プールを使用することで、計算が行われている間にイベント ループ内で他のことを行うことができます。