#ifndef SRC_CRYPTO_CRYPTO_X509_H_
#define SRC_CRYPTO_CRYPTO_X509_H_
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
#include "base_object.h"
#include "crypto/crypto_util.h"
#include "env.h"
#include "memory_tracker.h"
#include "node_worker.h"
#include "v8.h"
namespace node {
namespace crypto {
// The ManagedX509 class is essentially a smart pointer for
// X509 objects that allows an X509Certificate instance to
// be cloned at the JS level while pointing at the same
// underlying X509 instance.
class ManagedX509 : public MemoryRetainer {
public:
ManagedX509() = default;
explicit ManagedX509(X509Pointer&& cert);
ManagedX509(const ManagedX509& that);
ManagedX509& operator=(const ManagedX509& that);
operator bool() const { return !!cert_; }
X509* get() const { return cert_.get(); }
void MemoryInfo(MemoryTracker* tracker) const override;
SET_MEMORY_INFO_NAME(ManagedX509)
SET_SELF_SIZE(ManagedX509)
private:
X509Pointer cert_;
};
class X509Certificate : public BaseObject {
public:
enum class GetPeerCertificateFlag {
NONE,
SERVER
};
static void Initialize(Environment* env, v8::Local<v8::Object> target);
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
Environment* env);
static bool HasInstance(Environment* env, v8::Local<v8::Object> object);
static v8::MaybeLocal<v8::Object> New(
Environment* env,
X509Pointer cert,
STACK_OF(X509)* issuer_chain = nullptr);
static v8::MaybeLocal<v8::Object> New(
Environment* env,
std::shared_ptr<ManagedX509> cert,
STACK_OF(X509)* issuer_chain = nullptr);
static v8::MaybeLocal<v8::Object> GetCert(
Environment* env,
const SSLPointer& ssl);
static v8::MaybeLocal<v8::Object> GetPeerCert(
Environment* env,
const SSLPointer& ssl,
GetPeerCertificateFlag flag);
static v8::Local<v8::Object> Wrap(
Environment* env,
v8::Local<v8::Object> object,
X509Pointer cert);
static void Parse(const v8::FunctionCallbackInfo<v8::Value>& args);
static void Subject(const v8::FunctionCallbackInfo<v8::Value>& args);
static void SubjectAltName(const v8::FunctionCallbackInfo<v8::Value>& args);
static void Issuer(const v8::FunctionCallbackInfo<v8::Value>& args);
static void InfoAccess(const v8::FunctionCallbackInfo<v8::Value>& args);
static void ValidFrom(const v8::FunctionCallbackInfo<v8::Value>& args);
static void ValidTo(const v8::FunctionCallbackInfo<v8::Value>& args);
static void KeyUsage(const v8::FunctionCallbackInfo<v8::Value>& args);
static void SerialNumber(const v8::FunctionCallbackInfo<v8::Value>& args);
static void Raw(const v8::FunctionCallbackInfo<v8::Value>& args);
static void PublicKey(const v8::FunctionCallbackInfo<v8::Value>& args);
static void Pem(const v8::FunctionCallbackInfo<v8::Value>& args);
static void CheckCA(const v8::FunctionCallbackInfo<v8::Value>& args);
static void CheckHost(const v8::FunctionCallbackInfo<v8::Value>& args);
static void CheckEmail(const v8::FunctionCallbackInfo<v8::Value>& args);
static void CheckIP(const v8::FunctionCallbackInfo<v8::Value>& args);
static void CheckIssued(const v8::FunctionCallbackInfo<v8::Value>& args);
static void CheckPrivateKey(const v8::FunctionCallbackInfo<v8::Value>& args);
static void Verify(const v8::FunctionCallbackInfo<v8::Value>& args);
static void ToLegacy(const v8::FunctionCallbackInfo<v8::Value>& args);
static void GetIssuerCert(const v8::FunctionCallbackInfo<v8::Value>& args);
X509* get() { return cert_->get(); }
void MemoryInfo(MemoryTracker* tracker) const override;
SET_MEMORY_INFO_NAME(X509Certificate)
SET_SELF_SIZE(X509Certificate)
class X509CertificateTransferData : public worker::TransferData {
public:
explicit X509CertificateTransferData(
const std::shared_ptr<ManagedX509>& data)
: data_(data) {}
BaseObjectPtr<BaseObject> Deserialize(
Environment* env,
v8::Local<v8::Context> context,
std::unique_ptr<worker::TransferData> self) override;
SET_MEMORY_INFO_NAME(X509CertificateTransferData)
SET_SELF_SIZE(X509CertificateTransferData)
SET_NO_MEMORY_INFO()
private:
std::shared_ptr<ManagedX509> data_;
};
BaseObject::TransferMode GetTransferMode() const override;
std::unique_ptr<worker::TransferData> CloneForMessaging() const override;
private:
X509Certificate(
Environment* env,
v8::Local<v8::Object> object,
std::shared_ptr<ManagedX509> cert,
STACK_OF(X509)* issuer_chain = nullptr);
std::shared_ptr<ManagedX509> cert_;
BaseObjectPtr<X509Certificate> issuer_cert_;
};
} // namespace crypto
} // namespace node
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
#endif // SRC_CRYPTO_CRYPTO_X509_H_
|