src: update crypto objects to use DictionaryTemplate · nodejs/node@e330f03
@@ -33,6 +33,7 @@ using v8::BackingStoreOnFailureMode;
3333using v8::Boolean;
3434using v8::Context;
3535using v8::Date;
36+using v8::DictionaryTemplate;
3637using v8::EscapableHandleScope;
3738using v8::Function;
3839using v8::FunctionCallbackInfo;
@@ -46,6 +47,7 @@ using v8::NewStringType;
4647using v8::Object;
4748using v8::String;
4849using v8::Uint32;
50+using v8::Undefined;
4951using v8::Value;
50525153namespace crypto {
@@ -735,116 +737,86 @@ MaybeLocal<Value> GetCurveName(Environment* env, const int nid) {
735737736738MaybeLocal<Object> X509ToObject(Environment* env, const X509View& cert) {
737739 EscapableHandleScope scope(env->isolate());
738- Local<Object> info = Object::New(env->isolate());
739-740-if (!Set<Value>(env,
741- info,
742- env->subject_string(),
743-GetX509NameObject(env, cert.getSubjectName())) ||
744- !Set<Value>(env,
745- info,
746- env->issuer_string(),
747-GetX509NameObject(env, cert.getIssuerName())) ||
748- !Set<Value>(env,
749- info,
750- env->subjectaltname_string(),
751-GetSubjectAltNameString(env, cert)) ||
752- !Set<Value>(env,
753- info,
754- env->infoaccess_string(),
755-GetInfoAccessString(env, cert)) ||
756- !Set<Boolean>(env,
757- info,
758- env->ca_string(),
759-Boolean::New(env->isolate(), cert.isCA()))) [[unlikely]] {
760-return {};
761- }
762740763-if (!cert.ifRsa([&](const ncrypto::Rsa& rsa) {
764-auto pub_key = rsa.getPublicKey();
765-if (!Set<Value>(env,
766- info,
767- env->modulus_string(),
768-GetModulusString(env, pub_key.n)) ||
769- !Set<Value>(env,
770- info,
771- env->bits_string(),
772-Integer::New(env->isolate(),
773-BignumPointer::GetBitCount(pub_key.n))) ||
774- !Set<Value>(env,
775- info,
776- env->exponent_string(),
777-GetExponentString(env, pub_key.e)) ||
778- !Set<Object>(env, info, env->pubkey_string(), GetPubKey(env, rsa)))
779- [[unlikely]] {
780-return false;
781- }
782-return true;
783- })) [[unlikely]] {
784-return {};
741+auto tmpl = env->x509_dictionary_template();
742+if (tmpl.IsEmpty()) {
743+static constexpr std::string_view names[] = {
744+"subject",
745+"issuer",
746+"subjectaltname",
747+"infoAccess",
748+"ca",
749+"modulus",
750+"exponent",
751+"pubkey",
752+"bits",
753+"valid_from",
754+"valid_to",
755+"fingerprint",
756+"fingerprint256",
757+"fingerprint512",
758+"ext_key_usage",
759+"serialNumber",
760+"raw",
761+"asn1Curve",
762+"nistCurve",
763+ };
764+ tmpl = DictionaryTemplate::New(env->isolate(), names);
765+ env->set_x509_dictionary_template(tmpl);
785766 }
786767787-if (!cert.ifEc([&](const ncrypto::Ec& ec) {
788-const auto group = ec.getGroup();
789-790-if (!Set<Value>(
791- env, info, env->bits_string(), GetECGroupBits(env, group)) ||
792- !Set<Value>(
793- env, info, env->pubkey_string(), GetECPubKey(env, group, ec)))
794- [[unlikely]] {
795-return false;
796- }
797-798-const int nid = ec.getCurve();
799-if (nid != 0) [[likely]] {
800-// Curve is well-known, get its OID and NIST nick-name (if it has
801-// one).
802-803-if (!Set<Value>(env,
804- info,
805- env->asn1curve_string(),
806- GetCurveName<OBJ_nid2sn>(env, nid)) ||
807- !Set<Value>(env,
808- info,
809- env->nistcurve_string(),
810- GetCurveName<EC_curve_nid2nist>(env, nid)))
811- [[unlikely]] {
812-return false;
813- }
814- }
815-// Unnamed curves can be described by their mathematical properties,
816-// but aren't used much (at all?) with X.509/TLS. Support later if
817-// needed.
818-return true;
819- })) [[unlikely]] {
820-return {};
821- }
768+ MaybeLocal<Value> values[] = {
769+GetX509NameObject(env, cert.getSubjectName()),
770+GetX509NameObject(env, cert.getIssuerName()),
771+GetSubjectAltNameString(env, cert),
772+GetInfoAccessString(env, cert),
773+Boolean::New(env->isolate(), cert.isCA()),
774+Undefined(env->isolate()), // modulus
775+Undefined(env->isolate()), // exponent
776+Undefined(env->isolate()), // pubkey
777+Undefined(env->isolate()), // bits
778+GetValidFrom(env, cert),
779+GetValidTo(env, cert),
780+GetFingerprintDigest(env, Digest::SHA1, cert),
781+GetFingerprintDigest(env, Digest::SHA256, cert),
782+GetFingerprintDigest(env, Digest::SHA512, cert),
783+GetKeyUsage(env, cert),
784+GetSerialNumber(env, cert),
785+GetDer(env, cert),
786+Undefined(env->isolate()), // asn1curve
787+Undefined(env->isolate()), // nistcurve
788+ };
789+790+ cert.ifRsa([&](const ncrypto::Rsa& rsa) {
791+auto pub_key = rsa.getPublicKey();
792+ values[5] = GetModulusString(env, pub_key.n); // modulus
793+ values[6] = GetExponentString(env, pub_key.e); // exponent
794+ values[7] = GetPubKey(env, rsa); // pubkey
795+ values[8] = Integer::New(env->isolate(),
796+BignumPointer::GetBitCount(pub_key.n)); // bits
797+// TODO(@jasnell): The true response is a left-over from the original
798+// non DictionaryTemplate-based implementation. It can be removed later.
799+return true;
800+ });
822801823-if (!Set<Value>(
824- env, info, env->valid_from_string(), GetValidFrom(env, cert)) ||
825- !Set<Value>(env, info, env->valid_to_string(), GetValidTo(env, cert)) ||
826- !Set<Value>(env,
827- info,
828- env->fingerprint_string(),
829-GetFingerprintDigest(env, Digest::SHA1, cert)) ||
830- !Set<Value>(env,
831- info,
832- env->fingerprint256_string(),
833-GetFingerprintDigest(env, Digest::SHA256, cert)) ||
834- !Set<Value>(env,
835- info,
836- env->fingerprint512_string(),
837-GetFingerprintDigest(env, Digest::SHA512, cert)) ||
838- !Set<Value>(
839- env, info, env->ext_key_usage_string(), GetKeyUsage(env, cert)) ||
840- !Set<Value>(
841- env, info, env->serial_number_string(), GetSerialNumber(env, cert)) ||
842- !Set<Value>(env, info, env->raw_string(), GetDer(env, cert)))
843- [[unlikely]] {
844-return {};
845- }
802+ cert.ifEc([&](const ncrypto::Ec& ec) {
803+const auto group = ec.getGroup();
804+ values[7] = GetECPubKey(env, group, ec); // pubkey
805+ values[8] = GetECGroupBits(env, group); // bits
806+const int nid = ec.getCurve();
807+if (nid != 0) {
808+// Curve is well-known, get its OID and NIST nick-name (if it has
809+// one).
810+ values[17] = GetCurveName<OBJ_nid2sn>(env, nid); // asn1curve
811+ values[18] = GetCurveName<EC_curve_nid2nist>(env, nid); // nistcurve
812+ }
813+// Unnamed curves can be described by their mathematical properties,
814+// but aren't used much (at all?) with X.509/TLS. Support later if
815+// needed.
816+return true;
817+ });
846818847-return scope.Escape(info);
819+return scope.EscapeMaybe(NewDictionaryInstance(env->context(), tmpl, values));
848820}
849821} // namespace
850822