La pbkdf2
función tiene la implementación de JavaScript, pero en realidad delega todo el trabajo a realizar en el lado de 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>);
recurso: https://github.com/nodejs/node/blob/master/src/node_crypto.cc
El módulo Libuv tiene otra responsabilidad que es relevante para algunas funciones muy particulares en la biblioteca estándar.
Para algunas llamadas de función de biblioteca estándar, el lado del Nodo C ++ y Libuv deciden hacer cálculos caros fuera del ciclo de eventos por completo.
En su lugar, hacen uso de algo llamado grupo de subprocesos, el grupo de subprocesos es una serie de cuatro subprocesos que se pueden usar para ejecutar tareas computacionalmente costosas como el pbkdf2
función.
Por defecto, Libuv crea 4 hilos en este grupo de hilos.
Además de los hilos utilizados en el bucle de eventos, hay otros cuatro hilos que pueden usarse para descargar cálculos costosos que deben ocurrir dentro de nuestra aplicación.
Muchas de las funciones incluidas en la biblioteca estándar de Nodos utilizan automáticamente este grupo de subprocesos. lospbkdf2
función es una de ellas.
La presencia de este grupo de subprocesos es muy significativa.
Por lo tanto, Node no es realmente un único subproceso, porque hay otros subprocesos que utiliza Node para realizar algunas tareas computacionalmente costosas.
Si el grupo de eventos fue responsable de realizar la tarea computacionalmente costosa, entonces nuestra aplicación Node no podría hacer nada más.
Nuestra CPU ejecuta todas las instrucciones dentro de un hilo una por una.
Al usar el grupo de subprocesos podemos hacer otras cosas dentro de un bucle de eventos mientras se realizan los cálculos.