#include "env-inl.h"
#include "node_buffer.h"
#include "node_crypto.h"
#include "node_crypto_common.h"
#include "node.h"
#include "node_internals.h"
#include "node_url.h"
#include "string_bytes.h"
#include "v8.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace node {
using v8::Array;
using v8::ArrayBufferView;
using v8::Context;
using v8::EscapableHandleScope;
using v8::Integer;
using v8::Local;
using v8::MaybeLocal;
using v8::NewStringType;
using v8::Null;
using v8::Object;
using v8::String;
using v8::Value;
namespace crypto {
static constexpr int X509_NAME_FLAGS =
ASN1_STRFLGS_ESC_CTRL |
ASN1_STRFLGS_UTF8_CONVERT |
XN_FLAG_SEP_MULTILINE |
XN_FLAG_FN_SN;
int SSL_CTX_get_issuer(SSL_CTX* ctx, X509* cert, X509** issuer) {
X509_STORE* store = SSL_CTX_get_cert_store(ctx);
DeleteFnPtr store_ctx(
X509_STORE_CTX_new());
return store_ctx.get() != nullptr &&
X509_STORE_CTX_init(store_ctx.get(), store, nullptr, nullptr) == 1 &&
X509_STORE_CTX_get1_issuer(issuer, store_ctx.get(), cert) == 1;
}
void LogSecret(
const SSLPointer& ssl,
const char* name,
const unsigned char* secret,
size_t secretlen) {
auto keylog_cb = SSL_CTX_get_keylog_callback(SSL_get_SSL_CTX(ssl.get()));
unsigned char crandom[32];
if (keylog_cb == nullptr ||
SSL_get_client_random(ssl.get(), crandom, 32) != 32) {
return;
}
std::string line = name;
line += " " + StringBytes::hex_encode(
reinterpret_cast(crandom), 32);
line += " " + StringBytes::hex_encode(
reinterpret_cast(secret), secretlen);
keylog_cb(ssl.get(), line.c_str());
}
bool SetALPN(const SSLPointer& ssl, const std::string& alpn) {
return SSL_set_alpn_protos(
ssl.get(),
reinterpret_cast(alpn.c_str()),
alpn.length()) == 0;
}
bool SetALPN(const SSLPointer& ssl, Local alpn) {
if (!alpn->IsArrayBufferView())
return false;
ArrayBufferViewContents protos(alpn.As());
return SSL_set_alpn_protos(ssl.get(), protos.data(), protos.length()) == 0;
}
MaybeLocal GetSSLOCSPResponse(
Environment* env,
SSL* ssl,
Local default_value) {
const unsigned char* resp;
int len = SSL_get_tlsext_status_ocsp_resp(ssl, &resp);
if (resp == nullptr)
return default_value;
Local ret;
MaybeLocal