#pragma once #include #include namespace workerd::api { class CryptoKey; class X509Certificate: public jsg::Object { public: X509Certificate(X509* cert): cert_(kj::disposeWith(cert)) {} static kj::Maybe> parse(jsg::Lock& js, kj::Array raw); kj::Maybe getSubject(); kj::Maybe getSubjectAltName(); kj::Maybe getInfoAccess(); kj::Maybe getIssuer(); kj::Maybe> getIssuerCert(); kj::Maybe getValidFrom(); kj::Maybe getValidTo(); kj::Maybe> getKeyUsage(); kj::Maybe> getSerialNumber(); jsg::JsUint8Array getRaw(jsg::Lock& js); kj::Maybe> getPublicKey(jsg::Lock& js); kj::Maybe getPem(); kj::Maybe getFingerprint(); kj::Maybe getFingerprint256(); kj::Maybe getFingerprint512(); bool getIsCA(); struct CheckOptions { jsg::Optional subject; jsg::Optional wildcards; jsg::Optional partialWildcards; jsg::Optional multiLabelWildcards; jsg::Optional singleLabelSubdomains; JSG_STRUCT(subject, wildcards, partialWildcards, multiLabelWildcards, singleLabelSubdomains); }; kj::Maybe checkHost(kj::String name, jsg::Optional options); kj::Maybe checkEmail(kj::String email, jsg::Optional options); kj::Maybe checkIp(kj::String ip, jsg::Optional options); bool checkIssued(jsg::Ref other); bool checkPrivateKey(jsg::Ref privateKey); bool verify(jsg::Ref publicKey); jsg::JsObject toLegacyObject(jsg::Lock& js); JSG_RESOURCE_TYPE(X509Certificate) { JSG_STATIC_METHOD(parse); JSG_READONLY_PROTOTYPE_PROPERTY(subject, getSubject); JSG_READONLY_PROTOTYPE_PROPERTY(subjectAltName, getSubjectAltName); JSG_READONLY_PROTOTYPE_PROPERTY(infoAccess, getInfoAccess); JSG_READONLY_PROTOTYPE_PROPERTY(issuer, getIssuer); JSG_READONLY_PROTOTYPE_PROPERTY(issuerCert, getIssuerCert); JSG_READONLY_PROTOTYPE_PROPERTY(validFrom, getValidFrom); JSG_READONLY_PROTOTYPE_PROPERTY(validTo, getValidTo); JSG_READONLY_PROTOTYPE_PROPERTY(fingerprint, getFingerprint); JSG_READONLY_PROTOTYPE_PROPERTY(fingerprint256, getFingerprint256); JSG_READONLY_PROTOTYPE_PROPERTY(fingerprint512, getFingerprint512); JSG_READONLY_PROTOTYPE_PROPERTY(keyUsage, getKeyUsage); JSG_READONLY_PROTOTYPE_PROPERTY(serialNumber, getSerialNumber); JSG_READONLY_PROTOTYPE_PROPERTY(pem, getPem); JSG_READONLY_PROTOTYPE_PROPERTY(raw, getRaw); JSG_READONLY_PROTOTYPE_PROPERTY(publicKey, getPublicKey); JSG_READONLY_PROTOTYPE_PROPERTY(isCA, getIsCA); JSG_METHOD(checkHost); JSG_METHOD(checkEmail); JSG_METHOD(checkIp); JSG_METHOD(checkIssued); JSG_METHOD(checkPrivateKey); JSG_METHOD(verify); JSG_METHOD(toLegacyObject); } private: kj::Own cert_; kj::Maybe> issuerCert_; }; } // namespace workerd::api KJ_DECLARE_NON_POLYMORPHIC(X509); #define EW_CRYPTO_X509_ISOLATE_TYPES api::X509Certificate, api::X509Certificate::CheckOptions