Where Online Learning is simpler!
The C and C++ Include Header Files
cat -n /usr/include/nodejs/src/crypto/crypto_dh.h
1 #ifndef SRC_CRYPTO_CRYPTO_DH_H_ 2 #define SRC_CRYPTO_CRYPTO_DH_H_ 3 4 #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS 5 6 #include "crypto/crypto_keys.h" 7 #include "crypto/crypto_keygen.h" 8 #include "crypto/crypto_util.h" 9 #include "env.h" 10 #include "memory_tracker.h" 11 #include "v8.h" 12 13 #include <variant> 14 15 namespace node { 16 namespace crypto { 17 class DiffieHellman final : public BaseObject { 18 public: 19 static void Initialize(Environment* env, v8::Local<v8::Object> target); 20 static void RegisterExternalReferences(ExternalReferenceRegistry* registry); 21 22 DiffieHellman(Environment* env, 23 v8::Local<v8::Object> wrap, 24 ncrypto::DHPointer dh); 25 operator ncrypto::DHPointer&() { return dh_; } 26 27 void MemoryInfo(MemoryTracker* tracker) const override; 28 SET_MEMORY_INFO_NAME(DiffieHellman) 29 SET_SELF_SIZE(DiffieHellman) 30 31 private: 32 ncrypto::DHPointer dh_; 33 }; 34 35 struct DhKeyPairParams final : public MemoryRetainer { 36 // Diffie-Hellman can either generate keys using a fixed prime, or by first 37 // generating a random prime of a given size (in bits). Only one of both 38 // options may be specified. 39 std::variant<ncrypto::BignumPointer, int> prime; 40 unsigned int generator; 41 SET_NO_MEMORY_INFO() 42 SET_MEMORY_INFO_NAME(DhKeyPairParams) 43 SET_SELF_SIZE(DhKeyPairParams) 44 }; 45 46 using DhKeyPairGenConfig = KeyPairGenConfig<DhKeyPairParams>; 47 48 struct DhKeyGenTraits final { 49 using AdditionalParameters = DhKeyPairGenConfig; 50 static constexpr const char* JobName = "DhKeyPairGenJob"; 51 52 static ncrypto::EVPKeyCtxPointer Setup(DhKeyPairGenConfig* params); 53 54 static v8::Maybe<void> AdditionalConfig( 55 CryptoJobMode mode, 56 const v8::FunctionCallbackInfo<v8::Value>& args, 57 unsigned int* offset, 58 DhKeyPairGenConfig* params); 59 }; 60 61 using DHKeyPairGenJob = KeyGenJob<KeyPairGenTraits<DhKeyGenTraits>>; 62 63 struct DHKeyExportConfig final : public MemoryRetainer { 64 SET_NO_MEMORY_INFO() 65 SET_MEMORY_INFO_NAME(DHKeyExportConfig) 66 SET_SELF_SIZE(DHKeyExportConfig) 67 }; 68 69 struct DHKeyExportTraits final { 70 static constexpr const char* JobName = "DHKeyExportJob"; 71 using AdditionalParameters = DHKeyExportConfig; 72 73 static v8::Maybe<void> AdditionalConfig( 74 const v8::FunctionCallbackInfo<v8::Value>& args, 75 unsigned int offset, 76 DHKeyExportConfig* config); 77 78 static WebCryptoKeyExportStatus DoExport(const KeyObjectData& key_data, 79 WebCryptoKeyFormat format, 80 const DHKeyExportConfig& params, 81 ByteSource* out); 82 }; 83 84 using DHKeyExportJob = KeyExportJob<DHKeyExportTraits>; 85 86 struct DHBitsConfig final : public MemoryRetainer { 87 KeyObjectData private_key; 88 KeyObjectData public_key; 89 SET_NO_MEMORY_INFO() 90 SET_MEMORY_INFO_NAME(DHBitsConfig) 91 SET_SELF_SIZE(DHBitsConfig) 92 }; 93 94 struct DHBitsTraits final { 95 using AdditionalParameters = DHBitsConfig; 96 static constexpr const char* JobName = "DHBitsJob"; 97 static constexpr AsyncWrap::ProviderType Provider = 98 AsyncWrap::PROVIDER_DERIVEBITSREQUEST; 99 100 static v8::Maybe<void> AdditionalConfig( 101 CryptoJobMode mode, 102 const v8::FunctionCallbackInfo<v8::Value>& args, 103 unsigned int offset, 104 DHBitsConfig* params); 105 106 static bool DeriveBits(Environment* env, 107 const DHBitsConfig& params, 108 ByteSource* out_, 109 CryptoJobMode mode); 110 111 static v8::MaybeLocal<v8::Value> EncodeOutput(Environment* env, 112 const DHBitsConfig& params, 113 ByteSource* out); 114 }; 115 116 using DHBitsJob = DeriveBitsJob<DHBitsTraits>; 117 118 v8::Maybe<void> GetDhKeyDetail(Environment* env, 119 const KeyObjectData& key, 120 v8::Local<v8::Object> target); 121 122 } // namespace crypto 123 } // namespace node 124 125 #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS 126 #endif // SRC_CRYPTO_CRYPTO_DH_H_