La pbkdf2
fonction a l'implémentation JavaScript mais elle délègue en fait tout le travail à faire du côté 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>);
ressource: https://github.com/nodejs/node/blob/master/src/node_crypto.cc
Le module Libuv a une autre responsabilité qui est pertinente pour certaines fonctions très particulières de la bibliothèque standard.
Pour certains appels de fonction de bibliothèque standard, le côté Node C ++ et Libuv décident de faire des calculs coûteux en dehors de la boucle d'événements entièrement.
Au lieu de cela, ils utilisent quelque chose appelé pool de threads, le pool de threads est une série de quatre threads qui peuvent être utilisés pour exécuter des tâches coûteuses en calcul telles que la pbkdf2
fonction.
Par défaut, Libuv crée 4 threads dans ce pool de threads.
En plus des threads utilisés dans la boucle d'événements, il existe quatre autres threads qui peuvent être utilisés pour décharger les calculs coûteux qui doivent se produire dans notre application.
De nombreuses fonctions incluses dans la bibliothèque standard Node utilisent automatiquement ce pool de threads. La pbkdf2
fonction étant l'une d'entre elles.
La présence de ce pool de threads est très significative.
Node n'est donc pas vraiment à thread unique, car il existe d'autres threads que Node utilise pour effectuer des tâches coûteuses en calcul.
Si le pool d'événements était responsable de la tâche coûteuse en calcul, notre application Node ne pourrait rien faire d'autre.
Notre CPU exécute toutes les instructions dans un thread une par une.
En utilisant le pool de threads, nous pouvons faire d'autres choses dans une boucle d'événements pendant que les calculs sont en cours.