GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: crypto/crypto_context.h Lines: 3 4 75.0 %
Date: 2022-04-27 04:15:16 Branches: 0 0 - %

Line Branch Exec Source
1
#ifndef SRC_CRYPTO_CRYPTO_CONTEXT_H_
2
#define SRC_CRYPTO_CRYPTO_CONTEXT_H_
3
4
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
6
#include "crypto/crypto_util.h"
7
#include "base_object.h"
8
#include "env.h"
9
#include "memory_tracker.h"
10
#include "v8.h"
11
12
namespace node {
13
namespace crypto {
14
// A maxVersion of 0 means "any", but OpenSSL may support TLS versions that
15
// Node.js doesn't, so pin the max to what we do support.
16
constexpr int kMaxSupportedVersion = TLS1_3_VERSION;
17
18
void GetRootCertificates(
19
    const v8::FunctionCallbackInfo<v8::Value>& args);
20
21
void IsExtraRootCertsFileLoaded(
22
    const v8::FunctionCallbackInfo<v8::Value>& args);
23
24
X509_STORE* NewRootCertStore();
25
26
BIOPointer LoadBIO(Environment* env, v8::Local<v8::Value> v);
27
28
class SecureContext final : public BaseObject {
29
 public:
30
  using GetSessionCb = SSL_SESSION* (*)(SSL*, const unsigned char*, int, int*);
31
  using KeylogCb = void (*)(const SSL*, const char*);
32
  using NewSessionCb = int (*)(SSL*, SSL_SESSION*);
33
  using SelectSNIContextCb = int (*)(SSL*, int*, void*);
34
35
  ~SecureContext() override;
36
37
  static bool HasInstance(Environment* env, const v8::Local<v8::Value>& value);
38
  static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
39
      Environment* env);
40
  static void Initialize(Environment* env, v8::Local<v8::Object> target);
41
  static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
42
  static SecureContext* Create(Environment* env);
43
44
  SSL_CTX* operator*() const { return ctx_.get(); }
45
46
  SSL_CTX* ssl_ctx() const { return ctx_.get(); }
47
48
  SSLPointer CreateSSL();
49
50
  void SetGetSessionCallback(GetSessionCb cb);
51
  void SetKeylogCallback(KeylogCb cb);
52
  void SetNewSessionCallback(NewSessionCb cb);
53
  void SetSelectSNIContextCallback(SelectSNIContextCb cb);
54
55
  // TODO(joyeecheung): track the memory used by OpenSSL types
56
1
  SET_NO_MEMORY_INFO()
57
1
  SET_MEMORY_INFO_NAME(SecureContext)
58
1
  SET_SELF_SIZE(SecureContext)
59
60
  SSLCtxPointer ctx_;
61
  X509Pointer cert_;
62
  X509Pointer issuer_;
63
#ifndef OPENSSL_NO_ENGINE
64
  bool client_cert_engine_provided_ = false;
65
  EnginePointer private_key_engine_;
66
#endif  // !OPENSSL_NO_ENGINE
67
68
  static const int kMaxSessionSize = 10 * 1024;
69
70
  // See TicketKeyCallback
71
  static const int kTicketKeyReturnIndex = 0;
72
  static const int kTicketKeyHMACIndex = 1;
73
  static const int kTicketKeyAESIndex = 2;
74
  static const int kTicketKeyNameIndex = 3;
75
  static const int kTicketKeyIVIndex = 4;
76
77
  unsigned char ticket_key_name_[16];
78
  unsigned char ticket_key_aes_[16];
79
  unsigned char ticket_key_hmac_[16];
80
81
 protected:
82
  // OpenSSL structures are opaque. This is sizeof(SSL_CTX) for OpenSSL 1.1.1b:
83
  static const int64_t kExternalSize = 1024;
84
85
  static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
86
  static void Init(const v8::FunctionCallbackInfo<v8::Value>& args);
87
  static void SetKey(const v8::FunctionCallbackInfo<v8::Value>& args);
88
#ifndef OPENSSL_NO_ENGINE
89
  static void SetEngineKey(const v8::FunctionCallbackInfo<v8::Value>& args);
90
#endif  // !OPENSSL_NO_ENGINE
91
  static void SetCert(const v8::FunctionCallbackInfo<v8::Value>& args);
92
  static void AddCACert(const v8::FunctionCallbackInfo<v8::Value>& args);
93
  static void AddCRL(const v8::FunctionCallbackInfo<v8::Value>& args);
94
  static void AddRootCerts(const v8::FunctionCallbackInfo<v8::Value>& args);
95
  static void SetCipherSuites(const v8::FunctionCallbackInfo<v8::Value>& args);
96
  static void SetCiphers(const v8::FunctionCallbackInfo<v8::Value>& args);
97
  static void SetSigalgs(const v8::FunctionCallbackInfo<v8::Value>& args);
98
  static void SetECDHCurve(const v8::FunctionCallbackInfo<v8::Value>& args);
99
  static void SetDHParam(const v8::FunctionCallbackInfo<v8::Value>& args);
100
  static void SetOptions(const v8::FunctionCallbackInfo<v8::Value>& args);
101
  static void SetSessionIdContext(
102
      const v8::FunctionCallbackInfo<v8::Value>& args);
103
  static void SetSessionTimeout(
104
      const v8::FunctionCallbackInfo<v8::Value>& args);
105
  static void SetMinProto(const v8::FunctionCallbackInfo<v8::Value>& args);
106
  static void SetMaxProto(const v8::FunctionCallbackInfo<v8::Value>& args);
107
  static void GetMinProto(const v8::FunctionCallbackInfo<v8::Value>& args);
108
  static void GetMaxProto(const v8::FunctionCallbackInfo<v8::Value>& args);
109
  static void Close(const v8::FunctionCallbackInfo<v8::Value>& args);
110
  static void LoadPKCS12(const v8::FunctionCallbackInfo<v8::Value>& args);
111
#ifndef OPENSSL_NO_ENGINE
112
  static void SetClientCertEngine(
113
      const v8::FunctionCallbackInfo<v8::Value>& args);
114
#endif  // !OPENSSL_NO_ENGINE
115
  static void GetTicketKeys(const v8::FunctionCallbackInfo<v8::Value>& args);
116
  static void SetTicketKeys(const v8::FunctionCallbackInfo<v8::Value>& args);
117
  static void SetFreeListLength(
118
      const v8::FunctionCallbackInfo<v8::Value>& args);
119
  static void EnableTicketKeyCallback(
120
      const v8::FunctionCallbackInfo<v8::Value>& args);
121
  static void CtxGetter(const v8::FunctionCallbackInfo<v8::Value>& info);
122
123
  template <bool primary>
124
  static void GetCertificate(const v8::FunctionCallbackInfo<v8::Value>& args);
125
126
  static int TicketKeyCallback(SSL* ssl,
127
                               unsigned char* name,
128
                               unsigned char* iv,
129
                               EVP_CIPHER_CTX* ectx,
130
                               HMAC_CTX* hctx,
131
                               int enc);
132
133
  static int TicketCompatibilityCallback(SSL* ssl,
134
                                         unsigned char* name,
135
                                         unsigned char* iv,
136
                                         EVP_CIPHER_CTX* ectx,
137
                                         HMAC_CTX* hctx,
138
                                         int enc);
139
140
  SecureContext(Environment* env, v8::Local<v8::Object> wrap);
141
  void Reset();
142
};
143
144
}  // namespace crypto
145
}  // namespace node
146
147
#endif  // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
148
#endif  // SRC_CRYPTO_CRYPTO_CONTEXT_H_