diff --git a/src/sbbs3/js_cryptcert.c b/src/sbbs3/js_cryptcert.c new file mode 100644 index 0000000000000000000000000000000000000000..886ec130b90eb6cf5a1ace4fd847cef477f35e2e --- /dev/null +++ b/src/sbbs3/js_cryptcert.c @@ -0,0 +1,2717 @@ +/* $Id$ */ + +// Cyrptlib Certificates... + +#include "sbbs.h" +#include <cryptlib.h> +#include "js_request.h" +#include "js_cryptcon.h" +#include "js_cryptcert.h" +#include "ssl.h" + +static JSClass js_cryptcert_class; +static const char* getprivate_failure = "line %d %s %s JS_GetPrivate failed"; + +// Helpers + +static void +js_cryptcert_error(JSContext *cx, CRYPT_CERTIFICATE cert, int error) +{ + char *errstr; + int errlen; + + if (cryptGetAttributeString(cert, CRYPT_ATTRIBUTE_ERRORMESSAGE, NULL, &errlen) != CRYPT_OK) { + JS_ReportError(cx, "CryptLib error %d", error); + return; + } + if ((errstr = (char *)malloc(errlen+1)) == NULL) { + JS_ReportError(cx, "CryptLib error %d", error); + return; + } + if (cryptGetAttributeString(cert, CRYPT_ATTRIBUTE_ERRORMESSAGE, errstr, &errlen) != CRYPT_OK) { + free(errstr); + JS_ReportError(cx, "CryptLib error %d", error); + return; + } + errstr[errlen+1] = 0; + + JS_ReportError(cx, "Cryptlib error %d (%s)", error, errstr); + free(errstr); +} + +// Destructor + +static void +js_finalize_cryptcert(JSContext *cx, JSObject *obj) +{ + jsrefcount rc; + struct js_cryptcert_private_data* p; + + if ((p=(struct js_cryptcert_private_data *)JS_GetPrivate(cx,obj))==NULL) + return; + + rc = JS_SUSPENDREQUEST(cx); + if (p->cert != CRYPT_UNUSED) + cryptDestroyCert(p->cert); + free(p); + JS_RESUMEREQUEST(cx, rc); + + JS_SetPrivate(cx, obj, NULL); +} + +// Methods + +static JSBool +js_check(JSContext *cx, uintN argc, jsval *arglist) +{ + struct js_cryptcert_private_data* p; + JSObject *obj=JS_THIS_OBJECT(cx, arglist); + jsrefcount rc; + int status; + + if ((p=(struct js_cryptcert_private_data *)JS_GetPrivate(cx,obj))==NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + rc = JS_SUSPENDREQUEST(cx); + status = cryptCheckCert(p->cert, CRYPT_UNUSED); // TODO: Check against key/CRL/online + JS_RESUMEREQUEST(cx, rc); + if (cryptStatusError(status)) { + js_cryptcert_error(cx, p->cert, status); + return JS_FALSE; + } + JS_SET_RVAL(cx, arglist, JSVAL_TRUE); + return JS_TRUE; +} + +static JSBool +js_destroy(JSContext *cx, uintN argc, jsval *arglist) +{ + struct js_cryptcert_private_data* p; + JSObject *obj=JS_THIS_OBJECT(cx, arglist); + jsrefcount rc; + int status; + + if ((p=(struct js_cryptcert_private_data *)JS_GetPrivate(cx,obj))==NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + rc = JS_SUSPENDREQUEST(cx); + status = cryptDestroyCert(p->cert); + JS_RESUMEREQUEST(cx, rc); + if (cryptStatusError(status)) { + js_cryptcert_error(cx, p->cert, status); + return JS_FALSE; + } + p->cert = CRYPT_UNUSED; + JS_SET_RVAL(cx, arglist, JSVAL_TRUE); + return JS_TRUE; +} + +static JSBool +js_export(JSContext *cx, uintN argc, jsval *arglist) +{ + struct js_cryptcert_private_data* p; + JSObject *obj=JS_THIS_OBJECT(cx, arglist); + jsrefcount rc; + int status; + int format; + char *buf; + JSString *ret; + jsval *argv=JS_ARGV(cx, arglist); + int len; + + if(argc != 1) { + JS_ReportError(cx, "Incorrect number of arguments. Got %d, expected 1.", argc); + return JS_FALSE; + } + if (!JS_ValueToInt32(cx,argv[0],&format)) + return JS_FALSE; + + if ((p=(struct js_cryptcert_private_data *)JS_GetPrivate(cx,obj))==NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + + rc = JS_SUSPENDREQUEST(cx); + status = cryptExportCert(NULL, 0, &len, format, p->cert); + if (cryptStatusError(status)) { + JS_RESUMEREQUEST(cx, rc); + js_cryptcert_error(cx, p->cert, status); + return JS_FALSE; + } + buf = malloc(len); + if (buf == NULL) { + JS_RESUMEREQUEST(cx, rc); + JS_ReportError(cx, "Unable to allocate %d bytes\n", len); + return JS_FALSE; + } + status = cryptExportCert(buf, len, &len, format, p->cert); + JS_RESUMEREQUEST(cx, rc); + if (cryptStatusError(status)) { + JS_RESUMEREQUEST(cx, rc); + js_cryptcert_error(cx, p->cert, status); + return JS_FALSE; + } + ret = JS_NewStringCopyN(cx, buf, len); + free(buf); + if (ret == NULL) + return JS_FALSE; + JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(ret)); + + return JS_FALSE; +} + +static JSBool +js_sign(JSContext *cx, uintN argc, jsval *arglist) +{ + struct js_cryptcon_private_data* ctx; + struct js_cryptcert_private_data* p; + jsval *argv=JS_ARGV(cx, arglist); + JSObject *obj=JS_THIS_OBJECT(cx, arglist); + jsrefcount rc; + int status; + JSObject *key; + + if(argc != 1) { + JS_ReportError(cx, "Incorrect number of arguments. Got %d, expected 1.", argc); + return JS_FALSE; + } + + key = JSVAL_TO_OBJECT(argv[0]); + if (!JS_InstanceOf(cx, key, &js_cryptcon_class, NULL)) { + JS_ReportError(cx, "Invalid CryptContext"); + return JS_FALSE; + } + + if ((p=(struct js_cryptcert_private_data *)JS_GetPrivate(cx,obj))==NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + + if ((ctx=(struct js_cryptcon_private_data *)JS_GetPrivate(cx,key))==NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + + rc = JS_SUSPENDREQUEST(cx); + status = cryptSignCert(p->cert, ctx->ctx); + JS_RESUMEREQUEST(cx, rc); + if (cryptStatusError(status)) { + JS_RESUMEREQUEST(cx, rc); + js_cryptcert_error(cx, p->cert, status); + return JS_FALSE; + } + + return JS_TRUE; +} + +// Properties + +static JSBool +js_cryptcert_attr_get(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT_ATTRIBUTE_TYPE type) +{ + int status; + int val; + + status = cryptGetAttribute(cert, type, &val); + if (cryptStatusError(status)) { + *vp = JSVAL_VOID; + return JS_TRUE; + } + *vp = INT_TO_JSVAL(val); + + return JS_TRUE; +} + +static JSBool +js_cryptcert_attrstr_get(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT_ATTRIBUTE_TYPE type) +{ + int status; + char *val; + int len; + JSString *js_str; + + status = cryptGetAttributeString(cert, type, NULL, &len); + if (cryptStatusError(status)) { + *vp = JSVAL_VOID; + return JS_TRUE; // Do not return JS_FALSE here, or jsdocs build will break. + } + if ((val = (char *)malloc(len)) == NULL) { + JS_ReportError(cx, "malloc(%d) failure", len); + return JS_FALSE; + } + status = cryptGetAttributeString(cert, type, val, &len); + if (cryptStatusError(status)) { + js_cryptcert_error(cx, cert, status); + return JS_FALSE; + } + if((js_str=JS_NewStringCopyN(cx, val, len))==NULL) { + free(val); + return(JS_FALSE); + } + free(val); + *vp = STRING_TO_JSVAL(js_str); + + return JS_TRUE; +} + +enum { + /**************************/ + /* Certificate attributes */ + /**************************/ + + /* Because there are so many cert attributes, we break them down into + blocks to minimise the number of values that change if a new one is + added halfway through */ + + /* Pseudo-information on a cert object or meta-information which is used + to control the way that a cert object is processed */ + CRYPTCERT_PROP_SELFSIGNED, /* Cert is self-signed */ + CRYPTCERT_PROP_IMMUTABLE, /* Cert is signed and immutable */ + CRYPTCERT_PROP_XYZZY, /* Cert is a magic just-works cert */ + CRYPTCERT_PROP_CERTTYPE, /* Certificate object type */ + CRYPTCERT_PROP_FINGERPRINT_SHA1,/* Certificate fingerprints */ + CRYPTCERT_PROP_FINGERPRINT_SHA2, + CRYPTCERT_PROP_FINGERPRINT_SHAng, + CRYPTCERT_PROP_CURRENT_CERTIFICATE,/* Cursor mgt: Rel.pos in chain/CRL/OCSP */ + CRYPTCERT_PROP_TRUSTED_USAGE, /* Usage that cert is trusted for */ + CRYPTCERT_PROP_TRUSTED_IMPLICIT,/* Whether cert is implicitly trusted */ + CRYPTCERT_PROP_SIGNATURELEVEL, /* Amount of detail to include in sigs.*/ + + /* General certificate object information */ + CRYPTCERT_PROP_VERSION, /* Cert.format version */ + CRYPTCERT_PROP_SERIALNUMBER, /* Serial number */ + CRYPTCERT_PROP_SUBJECTPUBLICKEYINFO, /* Public key */ + CRYPTCERT_PROP_CERTIFICATE, /* User certificate */ + CRYPTCERT_PROP_CACERTIFICATE, /* CA certificate */ + CRYPTCERT_PROP_ISSUERNAME, /* Issuer DN */ + CRYPTCERT_PROP_VALIDFROM, /* Cert valid-from time */ + CRYPTCERT_PROP_VALIDTO, /* Cert valid-to time */ + CRYPTCERT_PROP_SUBJECTNAME, /* Subject DN */ + CRYPTCERT_PROP_ISSUERUNIQUEID, /* Issuer unique ID */ + CRYPTCERT_PROP_SUBJECTUNIQUEID, /* Subject unique ID */ + CRYPTCERT_PROP_CERTREQUEST, /* Cert.request (DN + public key) */ + CRYPTCERT_PROP_THISUPDATE, /* CRL/OCSP current-update time */ + CRYPTCERT_PROP_NEXTUPDATE, /* CRL/OCSP next-update time */ + CRYPTCERT_PROP_REVOCATIONDATE, /* CRL/OCSP cert-revocation time */ + CRYPTCERT_PROP_REVOCATIONSTATUS,/* OCSP revocation status */ + CRYPTCERT_PROP_CERTSTATUS, /* RTCS certificate status */ + CRYPTCERT_PROP_DN, /* Currently selected DN in string form */ + CRYPTCERT_PROP_PKIUSER_ID, /* PKI user ID */ + CRYPTCERT_PROP_PKIUSER_ISSUEPASSWORD, /* PKI user issue password */ + CRYPTCERT_PROP_PKIUSER_REVPASSWORD, /* PKI user revocation password */ + CRYPTCERT_PROP_PKIUSER_RA, /* PKI user is an RA */ + + /* X.520 Distinguished Name components. This is a composite field, the + DN to be manipulated is selected through the addition of a + pseudocomponent, and then one of the following is used to access the + DN components directly */ + CRYPTCERT_PROP_COUNTRYNAME, /* countryName */ + CRYPTCERT_PROP_STATEORPROVINCENAME, /* stateOrProvinceName */ + CRYPTCERT_PROP_LOCALITYNAME, /* localityName */ + CRYPTCERT_PROP_ORGANIZATIONNAME, /* organizationName */ + CRYPTCERT_PROP_ORGANIZATIONALUNITNAME, /* organizationalUnitName */ + CRYPTCERT_PROP_COMMONNAME, /* commonName */ + + /* X.509 General Name components. These are handled in the same way as + the DN composite field, with the current GeneralName being selected by + a pseudo-component after which the individual components can be + modified through one of the following */ + CRYPTCERT_PROP_OTHERNAME_TYPEID, /* otherName.typeID */ + CRYPTCERT_PROP_OTHERNAME_VALUE, /* otherName.value */ + CRYPTCERT_PROP_RFC822NAME, /* rfc822Name */ + CRYPTCERT_PROP_DNSNAME, /* dNSName */ +#if 0 /* Not supported, these are never used in practice and have an + insane internal structure */ + CRYPTCERT_PROP_X400ADDRESS, /* x400Address */ +#endif /* 0 */ + CRYPTCERT_PROP_DIRECTORYNAME, /* directoryName */ + CRYPTCERT_PROP_EDIPARTYNAME_NAMEASSIGNER, /* ediPartyName.nameAssigner */ + CRYPTCERT_PROP_EDIPARTYNAME_PARTYNAME, /* ediPartyName.partyName */ + CRYPTCERT_PROP_UNIFORMRESOURCEIDENTIFIER, /* uniformResourceIdentifier */ + CRYPTCERT_PROP_IPADDRESS, /* iPAddress */ + CRYPTCERT_PROP_REGISTEREDID, /* registeredID */ + + /* X.509 certificate extensions. Although it would be nicer to use names + that match the extensions more closely (e.g. + CRYPTCERT_PROP_BASICCONSTRAINTS_PATHLENCONSTRAINT), these exceed the + 32-character ANSI minimum length for unique names, and get really + hairy once you get into the weird policy constraints extensions whose + names wrap around the screen about three times. + + The following values are defined in OID order, this isn't absolutely + necessary but saves an extra layer of processing when encoding them */ + + /* 1 2 840 113549 1 9 7 challengePassword. This is here even though it's + a CMS attribute because SCEP stuffs it into PKCS #10 requests */ + CRYPTCERT_PROP_CHALLENGEPASSWORD, + + /* 1 3 6 1 4 1 3029 3 1 4 cRLExtReason */ + CRYPTCERT_PROP_CRLEXTREASON, + + /* 1 3 6 1 4 1 3029 3 1 5 keyFeatures */ + CRYPTCERT_PROP_KEYFEATURES, + + /* 1 3 6 1 5 5 7 1 1 authorityInfoAccess */ + CRYPTCERT_PROP_AUTHORITYINFOACCESS, + CRYPTCERT_PROP_AUTHORITYINFO_RTCS, /* accessDescription.accessLocation */ + CRYPTCERT_PROP_AUTHORITYINFO_OCSP, /* accessDescription.accessLocation */ + CRYPTCERT_PROP_AUTHORITYINFO_CAISSUERS, /* accessDescription.accessLocation */ + CRYPTCERT_PROP_AUTHORITYINFO_CERTSTORE, /* accessDescription.accessLocation */ + CRYPTCERT_PROP_AUTHORITYINFO_CRLS, /* accessDescription.accessLocation */ + + /* 1 3 6 1 5 5 7 1 2 biometricInfo */ + CRYPTCERT_PROP_BIOMETRICINFO, + CRYPTCERT_PROP_BIOMETRICINFO_TYPE, /* biometricData.typeOfData */ + CRYPTCERT_PROP_BIOMETRICINFO_HASHALGO, /* biometricData.hashAlgorithm */ + CRYPTCERT_PROP_BIOMETRICINFO_HASH, /* biometricData.dataHash */ + CRYPTCERT_PROP_BIOMETRICINFO_URL, /* biometricData.sourceDataUri */ + + /* 1 3 6 1 5 5 7 1 3 qcStatements */ + CRYPTCERT_PROP_QCSTATEMENT, + CRYPTCERT_PROP_QCSTATEMENT_SEMANTICS, + /* qcStatement.statementInfo.semanticsIdentifier */ + CRYPTCERT_PROP_QCSTATEMENT_REGISTRATIONAUTHORITY, + /* qcStatement.statementInfo.nameRegistrationAuthorities */ + + /* 1 3 6 1 5 5 7 1 7 ipAddrBlocks */ + CRYPTCERT_PROP_IPADDRESSBLOCKS, + CRYPTCERT_PROP_IPADDRESSBLOCKS_ADDRESSFAMILY, /* addressFamily */ +/* CRYPTCERT_PROP_IPADDRESSBLOCKS_INHERIT, // ipAddress.inherit */ + CRYPTCERT_PROP_IPADDRESSBLOCKS_PREFIX, /* ipAddress.addressPrefix */ + CRYPTCERT_PROP_IPADDRESSBLOCKS_MIN, /* ipAddress.addressRangeMin */ + CRYPTCERT_PROP_IPADDRESSBLOCKS_MAX, /* ipAddress.addressRangeMax */ + + /* 1 3 6 1 5 5 7 1 8 autonomousSysIds */ + CRYPTCERT_PROP_AUTONOMOUSSYSIDS, +/* CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_INHERIT,// asNum.inherit */ + CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_ID, /* asNum.id */ + CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_MIN, /* asNum.min */ + CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_MAX, /* asNum.max */ + + /* 1 3 6 1 5 5 7 48 1 2 ocspNonce */ + CRYPTCERT_PROP_OCSP_NONCE, /* nonce */ + + /* 1 3 6 1 5 5 7 48 1 4 ocspAcceptableResponses */ + CRYPTCERT_PROP_OCSP_RESPONSE, + CRYPTCERT_PROP_OCSP_RESPONSE_OCSP, /* OCSP standard response */ + + /* 1 3 6 1 5 5 7 48 1 5 ocspNoCheck */ + CRYPTCERT_PROP_OCSP_NOCHECK, + + /* 1 3 6 1 5 5 7 48 1 6 ocspArchiveCutoff */ + CRYPTCERT_PROP_OCSP_ARCHIVECUTOFF, + + /* 1 3 6 1 5 5 7 48 1 11 subjectInfoAccess */ + CRYPTCERT_PROP_SUBJECTINFOACCESS, + CRYPTCERT_PROP_SUBJECTINFO_TIMESTAMPING,/* accessDescription.accessLocation */ + CRYPTCERT_PROP_SUBJECTINFO_CAREPOSITORY,/* accessDescription.accessLocation */ + CRYPTCERT_PROP_SUBJECTINFO_SIGNEDOBJECTREPOSITORY,/* accessDescription.accessLocation */ + CRYPTCERT_PROP_SUBJECTINFO_RPKIMANIFEST,/* accessDescription.accessLocation */ + CRYPTCERT_PROP_SUBJECTINFO_SIGNEDOBJECT,/* accessDescription.accessLocation */ + + /* 1 3 36 8 3 1 siggDateOfCertGen */ + CRYPTCERT_PROP_SIGG_DATEOFCERTGEN, + + /* 1 3 36 8 3 2 siggProcuration */ + CRYPTCERT_PROP_SIGG_PROCURATION, + CRYPTCERT_PROP_SIGG_PROCURE_COUNTRY, /* country */ + CRYPTCERT_PROP_SIGG_PROCURE_TYPEOFSUBSTITUTION, /* typeOfSubstitution */ + CRYPTCERT_PROP_SIGG_PROCURE_SIGNINGFOR, /* signingFor.thirdPerson */ + + /* 1 3 36 8 3 3 siggAdmissions */ + CRYPTCERT_PROP_SIGG_ADMISSIONS, + CRYPTCERT_PROP_SIGG_ADMISSIONS_AUTHORITY, /* authority */ + CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHID, /* namingAuth.iD */ + CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHURL, /* namingAuth.uRL */ + CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHTEXT, /* namingAuth.text */ + CRYPTCERT_PROP_SIGG_ADMISSIONS_PROFESSIONITEM, /* professionItem */ + CRYPTCERT_PROP_SIGG_ADMISSIONS_PROFESSIONOID, /* professionOID */ + CRYPTCERT_PROP_SIGG_ADMISSIONS_REGISTRATIONNUMBER, /* registrationNumber */ + + /* 1 3 36 8 3 4 siggMonetaryLimit */ + CRYPTCERT_PROP_SIGG_MONETARYLIMIT, + CRYPTCERT_PROP_SIGG_MONETARY_CURRENCY, /* currency */ + CRYPTCERT_PROP_SIGG_MONETARY_AMOUNT, /* amount */ + CRYPTCERT_PROP_SIGG_MONETARY_EXPONENT, /* exponent */ + + /* 1 3 36 8 3 5 siggDeclarationOfMajority */ + CRYPTCERT_PROP_SIGG_DECLARATIONOFMAJORITY, + CRYPTCERT_PROP_SIGG_DECLARATIONOFMAJORITY_COUNTRY, /* fullAgeAtCountry */ + + /* 1 3 36 8 3 8 siggRestriction */ + CRYPTCERT_PROP_SIGG_RESTRICTION, + + /* 1 3 36 8 3 13 siggCertHash */ + CRYPTCERT_PROP_SIGG_CERTHASH, + + /* 1 3 36 8 3 15 siggAdditionalInformation */ + CRYPTCERT_PROP_SIGG_ADDITIONALINFORMATION, + + /* 1 3 101 1 4 1 strongExtranet */ + CRYPTCERT_PROP_STRONGEXTRANET, + CRYPTCERT_PROP_STRONGEXTRANET_ZONE, /* sxNetIDList.sxNetID.zone */ + CRYPTCERT_PROP_STRONGEXTRANET_ID, /* sxNetIDList.sxNetID.id */ + + /* 2 5 29 9 subjectDirectoryAttributes */ + CRYPTCERT_PROP_SUBJECTDIRECTORYATTRIBUTES, + CRYPTCERT_PROP_SUBJECTDIR_TYPE, /* attribute.type */ + CRYPTCERT_PROP_SUBJECTDIR_VALUES, /* attribute.values */ + + /* 2 5 29 14 subjectKeyIdentifier */ + CRYPTCERT_PROP_SUBJECTKEYIDENTIFIER, + + /* 2 5 29 15 keyUsage */ + CRYPTCERT_PROP_KEYUSAGE, + + /* 2 5 29 16 privateKeyUsagePeriod */ + CRYPTCERT_PROP_PRIVATEKEYUSAGEPERIOD, + CRYPTCERT_PROP_PRIVATEKEY_NOTBEFORE, /* notBefore */ + CRYPTCERT_PROP_PRIVATEKEY_NOTAFTER, /* notAfter */ + + /* 2 5 29 17 subjectAltName */ + CRYPTCERT_PROP_SUBJECTALTNAME, + + /* 2 5 29 18 issuerAltName */ + CRYPTCERT_PROP_ISSUERALTNAME, + + /* 2 5 29 19 basicConstraints */ + CRYPTCERT_PROP_BASICCONSTRAINTS, + CRYPTCERT_PROP_CA, /* cA */ + CRYPTCERT_PROP_PATHLENCONSTRAINT, /* pathLenConstraint */ + + /* 2 5 29 20 cRLNumber */ + CRYPTCERT_PROP_CRLNUMBER, + + /* 2 5 29 21 cRLReason */ + CRYPTCERT_PROP_CRLREASON, + + /* 2 5 29 23 holdInstructionCode */ + CRYPTCERT_PROP_HOLDINSTRUCTIONCODE, + + /* 2 5 29 24 invalidityDate */ + CRYPTCERT_PROP_INVALIDITYDATE, + + /* 2 5 29 27 deltaCRLIndicator */ + CRYPTCERT_PROP_DELTACRLINDICATOR, + + /* 2 5 29 28 issuingDistributionPoint */ + CRYPTCERT_PROP_ISSUINGDISTRIBUTIONPOINT, + CRYPTCERT_PROP_ISSUINGDIST_FULLNAME, /* distributionPointName.fullName */ + CRYPTCERT_PROP_ISSUINGDIST_USERCERTSONLY, /* onlyContainsUserCerts */ + CRYPTCERT_PROP_ISSUINGDIST_CACERTSONLY, /* onlyContainsCACerts */ + CRYPTCERT_PROP_ISSUINGDIST_SOMEREASONSONLY, /* onlySomeReasons */ + CRYPTCERT_PROP_ISSUINGDIST_INDIRECTCRL, /* indirectCRL */ + + /* 2 5 29 29 certificateIssuer */ + CRYPTCERT_PROP_CERTIFICATEISSUER, + + /* 2 5 29 30 nameConstraints */ + CRYPTCERT_PROP_NAMECONSTRAINTS, + CRYPTCERT_PROP_PERMITTEDSUBTREES, /* permittedSubtrees */ + CRYPTCERT_PROP_EXCLUDEDSUBTREES, /* excludedSubtrees */ + + /* 2 5 29 31 cRLDistributionPoint */ + CRYPTCERT_PROP_CRLDISTRIBUTIONPOINT, + CRYPTCERT_PROP_CRLDIST_FULLNAME, /* distributionPointName.fullName */ + CRYPTCERT_PROP_CRLDIST_REASONS, /* reasons */ + CRYPTCERT_PROP_CRLDIST_CRLISSUER, /* cRLIssuer */ + + /* 2 5 29 32 certificatePolicies */ + CRYPTCERT_PROP_CERTIFICATEPOLICIES, + CRYPTCERT_PROP_CERTPOLICYID, /* policyInformation.policyIdentifier */ + CRYPTCERT_PROP_CERTPOLICY_CPSURI, + /* policyInformation.policyQualifiers.qualifier.cPSuri */ + CRYPTCERT_PROP_CERTPOLICY_ORGANIZATION, + /* policyInformation.policyQualifiers.qualifier.userNotice.noticeRef.organization */ + CRYPTCERT_PROP_CERTPOLICY_NOTICENUMBERS, + /* policyInformation.policyQualifiers.qualifier.userNotice.noticeRef.noticeNumbers */ + CRYPTCERT_PROP_CERTPOLICY_EXPLICITTEXT, + /* policyInformation.policyQualifiers.qualifier.userNotice.explicitText */ + + /* 2 5 29 33 policyMappings */ + CRYPTCERT_PROP_POLICYMAPPINGS, + CRYPTCERT_PROP_ISSUERDOMAINPOLICY, /* policyMappings.issuerDomainPolicy */ + CRYPTCERT_PROP_SUBJECTDOMAINPOLICY, /* policyMappings.subjectDomainPolicy */ + + /* 2 5 29 35 authorityKeyIdentifier */ + CRYPTCERT_PROP_AUTHORITYKEYIDENTIFIER, + CRYPTCERT_PROP_AUTHORITY_KEYIDENTIFIER, /* keyIdentifier */ + CRYPTCERT_PROP_AUTHORITY_CERTISSUER, /* authorityCertIssuer */ + CRYPTCERT_PROP_AUTHORITY_CERTSERIALNUMBER, /* authorityCertSerialNumber */ + + /* 2 5 29 36 policyConstraints */ + CRYPTCERT_PROP_POLICYCONSTRAINTS, + CRYPTCERT_PROP_REQUIREEXPLICITPOLICY, /* policyConstraints.requireExplicitPolicy */ + CRYPTCERT_PROP_INHIBITPOLICYMAPPING, /* policyConstraints.inhibitPolicyMapping */ + + /* 2 5 29 37 extKeyUsage */ + CRYPTCERT_PROP_EXTKEYUSAGE, + CRYPTCERT_PROP_EXTKEY_MS_INDIVIDUALCODESIGNING, /* individualCodeSigning */ + CRYPTCERT_PROP_EXTKEY_MS_COMMERCIALCODESIGNING, /* commercialCodeSigning */ + CRYPTCERT_PROP_EXTKEY_MS_CERTTRUSTLISTSIGNING, /* certTrustListSigning */ + CRYPTCERT_PROP_EXTKEY_MS_TIMESTAMPSIGNING, /* timeStampSigning */ + CRYPTCERT_PROP_EXTKEY_MS_SERVERGATEDCRYPTO, /* serverGatedCrypto */ + CRYPTCERT_PROP_EXTKEY_MS_ENCRYPTEDFILESYSTEM, /* encrypedFileSystem */ + CRYPTCERT_PROP_EXTKEY_SERVERAUTH, /* serverAuth */ + CRYPTCERT_PROP_EXTKEY_CLIENTAUTH, /* clientAuth */ + CRYPTCERT_PROP_EXTKEY_CODESIGNING, /* codeSigning */ + CRYPTCERT_PROP_EXTKEY_EMAILPROTECTION, /* emailProtection */ + CRYPTCERT_PROP_EXTKEY_IPSECENDSYSTEM, /* ipsecEndSystem */ + CRYPTCERT_PROP_EXTKEY_IPSECTUNNEL, /* ipsecTunnel */ + CRYPTCERT_PROP_EXTKEY_IPSECUSER, /* ipsecUser */ + CRYPTCERT_PROP_EXTKEY_TIMESTAMPING, /* timeStamping */ + CRYPTCERT_PROP_EXTKEY_OCSPSIGNING, /* ocspSigning */ + CRYPTCERT_PROP_EXTKEY_DIRECTORYSERVICE, /* directoryService */ + CRYPTCERT_PROP_EXTKEY_ANYKEYUSAGE, /* anyExtendedKeyUsage */ + CRYPTCERT_PROP_EXTKEY_NS_SERVERGATEDCRYPTO, /* serverGatedCrypto */ + CRYPTCERT_PROP_EXTKEY_VS_SERVERGATEDCRYPTO_CA, /* serverGatedCrypto CA */ + + /* 2 5 29 40 crlStreamIdentifier */ + CRYPTCERT_PROP_CRLSTREAMIDENTIFIER, + + /* 2 5 29 46 freshestCRL */ + CRYPTCERT_PROP_FRESHESTCRL, + CRYPTCERT_PROP_FRESHESTCRL_FULLNAME, /* distributionPointName.fullName */ + CRYPTCERT_PROP_FRESHESTCRL_REASONS, /* reasons */ + CRYPTCERT_PROP_FRESHESTCRL_CRLISSUER, /* cRLIssuer */ + + /* 2 5 29 47 orderedList */ + CRYPTCERT_PROP_ORDEREDLIST, + + /* 2 5 29 51 baseUpdateTime */ + CRYPTCERT_PROP_BASEUPDATETIME, + + /* 2 5 29 53 deltaInfo */ + CRYPTCERT_PROP_DELTAINFO, + CRYPTCERT_PROP_DELTAINFO_LOCATION, /* deltaLocation */ + CRYPTCERT_PROP_DELTAINFO_NEXTDELTA, /* nextDelta */ + + /* 2 5 29 54 inhibitAnyPolicy */ + CRYPTCERT_PROP_INHIBITANYPOLICY, + + /* 2 5 29 58 toBeRevoked */ + CRYPTCERT_PROP_TOBEREVOKED, + CRYPTCERT_PROP_TOBEREVOKED_CERTISSUER, /* certificateIssuer */ + CRYPTCERT_PROP_TOBEREVOKED_REASONCODE, /* reasonCode */ + CRYPTCERT_PROP_TOBEREVOKED_REVOCATIONTIME, /* revocationTime */ + CRYPTCERT_PROP_TOBEREVOKED_CERTSERIALNUMBER,/* certSerialNumber */ + + /* 2 5 29 59 revokedGroups */ + CRYPTCERT_PROP_REVOKEDGROUPS, + CRYPTCERT_PROP_REVOKEDGROUPS_CERTISSUER,/* certificateIssuer */ + CRYPTCERT_PROP_REVOKEDGROUPS_REASONCODE,/* reasonCode */ + CRYPTCERT_PROP_REVOKEDGROUPS_INVALIDITYDATE,/* invalidityDate */ + CRYPTCERT_PROP_REVOKEDGROUPS_STARTINGNUMBER,/* startingNumber */ + CRYPTCERT_PROP_REVOKEDGROUPS_ENDINGNUMBER, /* endingNumber */ + + /* 2 5 29 60 expiredCertsOnCRL */ + CRYPTCERT_PROP_EXPIREDCERTSONCRL, + + /* 2 5 29 63 aaIssuingDistributionPoint */ + CRYPTCERT_PROP_AAISSUINGDISTRIBUTIONPOINT, + CRYPTCERT_PROP_AAISSUINGDIST_FULLNAME, /* distributionPointName.fullName */ + CRYPTCERT_PROP_AAISSUINGDIST_SOMEREASONSONLY,/* onlySomeReasons */ + CRYPTCERT_PROP_AAISSUINGDIST_INDIRECTCRL, /* indirectCRL */ + CRYPTCERT_PROP_AAISSUINGDIST_USERATTRCERTS, /* containsUserAttributeCerts */ + CRYPTCERT_PROP_AAISSUINGDIST_AACERTS, /* containsAACerts */ + CRYPTCERT_PROP_AAISSUINGDIST_SOACERTS, /* containsSOAPublicKeyCerts */ + + /* 2 16 840 1 113730 1 x Netscape extensions */ + CRYPTCERT_PROP_NS_CERTTYPE, /* netscape-cert-type */ + CRYPTCERT_PROP_NS_BASEURL, /* netscape-base-url */ + CRYPTCERT_PROP_NS_REVOCATIONURL, /* netscape-revocation-url */ + CRYPTCERT_PROP_NS_CAREVOCATIONURL, /* netscape-ca-revocation-url */ + CRYPTCERT_PROP_NS_CERTRENEWALURL, /* netscape-cert-renewal-url */ + CRYPTCERT_PROP_NS_CAPOLICYURL, /* netscape-ca-policy-url */ + CRYPTCERT_PROP_NS_SSLSERVERNAME, /* netscape-ssl-server-name */ + CRYPTCERT_PROP_NS_COMMENT, /* netscape-comment */ + + /* 2 23 42 7 0 SET hashedRootKey */ + CRYPTCERT_PROP_SET_HASHEDROOTKEY, + CRYPTCERT_PROP_SET_ROOTKEYTHUMBPRINT, /* rootKeyThumbPrint */ + + /* 2 23 42 7 1 SET certificateType */ + CRYPTCERT_PROP_SET_CERTIFICATETYPE, + + /* 2 23 42 7 2 SET merchantData */ + CRYPTCERT_PROP_SET_MERCHANTDATA, + CRYPTCERT_PROP_SET_MERID, /* merID */ + CRYPTCERT_PROP_SET_MERACQUIRERBIN, /* merAcquirerBIN */ + CRYPTCERT_PROP_SET_MERCHANTLANGUAGE, /* merNames.language */ + CRYPTCERT_PROP_SET_MERCHANTNAME, /* merNames.name */ + CRYPTCERT_PROP_SET_MERCHANTCITY, /* merNames.city */ + CRYPTCERT_PROP_SET_MERCHANTSTATEPROVINCE,/* merNames.stateProvince */ + CRYPTCERT_PROP_SET_MERCHANTPOSTALCODE, /* merNames.postalCode */ + CRYPTCERT_PROP_SET_MERCHANTCOUNTRYNAME, /* merNames.countryName */ + CRYPTCERT_PROP_SET_MERCOUNTRY, /* merCountry */ + CRYPTCERT_PROP_SET_MERAUTHFLAG, /* merAuthFlag */ + + /* 2 23 42 7 3 SET certCardRequired */ + CRYPTCERT_PROP_SET_CERTCARDREQUIRED, + + /* 2 23 42 7 4 SET tunneling */ + CRYPTCERT_PROP_SET_TUNNELING, + CRYPTCERT_PROP_SET_TUNNELINGFLAG, /* tunneling */ + CRYPTCERT_PROP_SET_TUNNELINGALGID, /* tunnelingAlgID */ + + /* S/MIME attributes */ + + /* 1 2 840 113549 1 9 3 contentType */ + CRYPTCERT_PROP_CMS_CONTENTTYPE, + + /* 1 2 840 113549 1 9 4 messageDigest */ + CRYPTCERT_PROP_CMS_MESSAGEDIGEST, + + /* 1 2 840 113549 1 9 5 signingTime */ + CRYPTCERT_PROP_CMS_SIGNINGTIME, + + /* 1 2 840 113549 1 9 6 counterSignature */ + CRYPTCERT_PROP_CMS_COUNTERSIGNATURE, /* counterSignature */ + + /* 1 2 840 113549 1 9 13 signingDescription */ + CRYPTCERT_PROP_CMS_SIGNINGDESCRIPTION, + + /* 1 2 840 113549 1 9 15 sMIMECapabilities */ + CRYPTCERT_PROP_CMS_SMIMECAPABILITIES, + CRYPTCERT_PROP_CMS_SMIMECAP_3DES, /* 3DES encryption */ + CRYPTCERT_PROP_CMS_SMIMECAP_AES, /* AES encryption */ + CRYPTCERT_PROP_CMS_SMIMECAP_CAST128, /* CAST-128 encryption */ + CRYPTCERT_PROP_CMS_SMIMECAP_SHAng, /* SHA2-ng hash */ + CRYPTCERT_PROP_CMS_SMIMECAP_SHA2, /* SHA2-256 hash */ + CRYPTCERT_PROP_CMS_SMIMECAP_SHA1, /* SHA1 hash */ + CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHAng, /* HMAC-SHA2-ng MAC */ + CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHA2, /* HMAC-SHA2-256 MAC */ + CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHA1, /* HMAC-SHA1 MAC */ + CRYPTCERT_PROP_CMS_SMIMECAP_AUTHENC256, /* AuthEnc w.256-bit key */ + CRYPTCERT_PROP_CMS_SMIMECAP_AUTHENC128, /* AuthEnc w.128-bit key */ + CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHAng, /* RSA with SHA-ng signing */ + CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHA2, /* RSA with SHA2-256 signing */ + CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHA1, /* RSA with SHA1 signing */ + CRYPTCERT_PROP_CMS_SMIMECAP_DSA_SHA1, /* DSA with SHA-1 signing */ + CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHAng,/* ECDSA with SHA-ng signing */ + CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHA2, /* ECDSA with SHA2-256 signing */ + CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHA1, /* ECDSA with SHA-1 signing */ + CRYPTCERT_PROP_CMS_SMIMECAP_PREFERSIGNEDDATA, /* preferSignedData */ + CRYPTCERT_PROP_CMS_SMIMECAP_CANNOTDECRYPTANY, /* canNotDecryptAny */ + CRYPTCERT_PROP_CMS_SMIMECAP_PREFERBINARYINSIDE, /* preferBinaryInside */ + + /* 1 2 840 113549 1 9 16 2 1 receiptRequest */ + CRYPTCERT_PROP_CMS_RECEIPTREQUEST, + CRYPTCERT_PROP_CMS_RECEIPT_CONTENTIDENTIFIER, /* contentIdentifier */ + CRYPTCERT_PROP_CMS_RECEIPT_FROM, /* receiptsFrom */ + CRYPTCERT_PROP_CMS_RECEIPT_TO, /* receiptsTo */ + + /* 1 2 840 113549 1 9 16 2 2 essSecurityLabel */ + CRYPTCERT_PROP_CMS_SECURITYLABEL, + CRYPTCERT_PROP_CMS_SECLABEL_POLICY, /* securityPolicyIdentifier */ + CRYPTCERT_PROP_CMS_SECLABEL_CLASSIFICATION, /* securityClassification */ + CRYPTCERT_PROP_CMS_SECLABEL_PRIVACYMARK,/* privacyMark */ + CRYPTCERT_PROP_CMS_SECLABEL_CATTYPE, /* securityCategories.securityCategory.type */ + CRYPTCERT_PROP_CMS_SECLABEL_CATVALUE, /* securityCategories.securityCategory.value */ + + /* 1 2 840 113549 1 9 16 2 3 mlExpansionHistory */ + CRYPTCERT_PROP_CMS_MLEXPANSIONHISTORY, + CRYPTCERT_PROP_CMS_MLEXP_ENTITYIDENTIFIER, /* mlData.mailListIdentifier.issuerAndSerialNumber */ + CRYPTCERT_PROP_CMS_MLEXP_TIME, /* mlData.expansionTime */ + CRYPTCERT_PROP_CMS_MLEXP_NONE, /* mlData.mlReceiptPolicy.none */ + CRYPTCERT_PROP_CMS_MLEXP_INSTEADOF, /* mlData.mlReceiptPolicy.insteadOf.generalNames.generalName */ + CRYPTCERT_PROP_CMS_MLEXP_INADDITIONTO, /* mlData.mlReceiptPolicy.inAdditionTo.generalNames.generalName */ + + /* 1 2 840 113549 1 9 16 2 4 contentHints */ + CRYPTCERT_PROP_CMS_CONTENTHINTS, + CRYPTCERT_PROP_CMS_CONTENTHINT_DESCRIPTION, /* contentDescription */ + CRYPTCERT_PROP_CMS_CONTENTHINT_TYPE, /* contentType */ + + /* 1 2 840 113549 1 9 16 2 9 equivalentLabels */ + CRYPTCERT_PROP_CMS_EQUIVALENTLABEL, + CRYPTCERT_PROP_CMS_EQVLABEL_POLICY, /* securityPolicyIdentifier */ + CRYPTCERT_PROP_CMS_EQVLABEL_CLASSIFICATION, /* securityClassification */ + CRYPTCERT_PROP_CMS_EQVLABEL_PRIVACYMARK,/* privacyMark */ + CRYPTCERT_PROP_CMS_EQVLABEL_CATTYPE, /* securityCategories.securityCategory.type */ + CRYPTCERT_PROP_CMS_EQVLABEL_CATVALUE, /* securityCategories.securityCategory.value */ + + /* 1 2 840 113549 1 9 16 2 12 signingCertificate */ + CRYPTCERT_PROP_CMS_SIGNINGCERTIFICATE, + CRYPTCERT_PROP_CMS_SIGNINGCERT_ESSCERTID, /* certs.essCertID */ + CRYPTCERT_PROP_CMS_SIGNINGCERT_POLICIES,/* policies.policyInformation.policyIdentifier */ + + /* 1 2 840 113549 1 9 16 2 47 signingCertificateV2 */ + CRYPTCERT_PROP_CMS_SIGNINGCERTIFICATEV2, + CRYPTCERT_PROP_CMS_SIGNINGCERTV2_ESSCERTIDV2, /* certs.essCertID */ + CRYPTCERT_PROP_CMS_SIGNINGCERTV2_POLICIES,/* policies.policyInformation.policyIdentifier */ + + /* 1 2 840 113549 1 9 16 2 15 signaturePolicyID */ + CRYPTCERT_PROP_CMS_SIGNATUREPOLICYID, + CRYPTCERT_PROP_CMS_SIGPOLICYID, /* sigPolicyID */ + CRYPTCERT_PROP_CMS_SIGPOLICYHASH, /* sigPolicyHash */ + CRYPTCERT_PROP_CMS_SIGPOLICY_CPSURI, /* sigPolicyQualifiers.sigPolicyQualifier.cPSuri */ + CRYPTCERT_PROP_CMS_SIGPOLICY_ORGANIZATION, + /* sigPolicyQualifiers.sigPolicyQualifier.userNotice.noticeRef.organization */ + CRYPTCERT_PROP_CMS_SIGPOLICY_NOTICENUMBERS, + /* sigPolicyQualifiers.sigPolicyQualifier.userNotice.noticeRef.noticeNumbers */ + CRYPTCERT_PROP_CMS_SIGPOLICY_EXPLICITTEXT, + /* sigPolicyQualifiers.sigPolicyQualifier.userNotice.explicitText */ + + /* 1 2 840 113549 1 9 16 9 signatureTypeIdentifier */ + CRYPTCERT_PROP_CMS_SIGTYPEIDENTIFIER, + CRYPTCERT_PROP_CMS_SIGTYPEID_ORIGINATORSIG, /* originatorSig */ + CRYPTCERT_PROP_CMS_SIGTYPEID_DOMAINSIG, /* domainSig */ + CRYPTCERT_PROP_CMS_SIGTYPEID_ADDITIONALATTRIBUTES, /* additionalAttributesSig */ + CRYPTCERT_PROP_CMS_SIGTYPEID_REVIEWSIG, /* reviewSig */ + + /* 1 2 840 113549 1 9 25 3 randomNonce */ + CRYPTCERT_PROP_CMS_NONCE, /* randomNonce */ + + /* SCEP attributes: + 2 16 840 1 113733 1 9 2 messageType + 2 16 840 1 113733 1 9 3 pkiStatus + 2 16 840 1 113733 1 9 4 failInfo + 2 16 840 1 113733 1 9 5 senderNonce + 2 16 840 1 113733 1 9 6 recipientNonce + 2 16 840 1 113733 1 9 7 transID */ + CRYPTCERT_PROP_SCEP_MESSAGETYPE, /* messageType */ + CRYPTCERT_PROP_SCEP_PKISTATUS, /* pkiStatus */ + CRYPTCERT_PROP_SCEP_FAILINFO, /* failInfo */ + CRYPTCERT_PROP_SCEP_SENDERNONCE, /* senderNonce */ + CRYPTCERT_PROP_SCEP_RECIPIENTNONCE, /* recipientNonce */ + CRYPTCERT_PROP_SCEP_TRANSACTIONID, /* transID */ + + /* 1 3 6 1 4 1 311 2 1 10 spcAgencyInfo */ + CRYPTCERT_PROP_CMS_SPCAGENCYINFO, + CRYPTCERT_PROP_CMS_SPCAGENCYURL, /* spcAgencyInfo.url */ + + /* 1 3 6 1 4 1 311 2 1 11 spcStatementType */ + CRYPTCERT_PROP_CMS_SPCSTATEMENTTYPE, + CRYPTCERT_PROP_CMS_SPCSTMT_INDIVIDUALCODESIGNING, /* individualCodeSigning */ + CRYPTCERT_PROP_CMS_SPCSTMT_COMMERCIALCODESIGNING, /* commercialCodeSigning */ + + /* 1 3 6 1 4 1 311 2 1 12 spcOpusInfo */ + CRYPTCERT_PROP_CMS_SPCOPUSINFO, + CRYPTCERT_PROP_CMS_SPCOPUSINFO_NAME, /* spcOpusInfo.name */ + CRYPTCERT_PROP_CMS_SPCOPUSINFO_URL /* spcOpusInfo.url */ + +}; + +static JSBool +js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) +{ + jsval idval; + jsint tiny; + struct js_cryptcert_private_data* p; + + if ((p=(struct js_cryptcert_private_data *)JS_GetPrivate(cx,obj))==NULL) { + return JS_TRUE; + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + + JS_IdToValue(cx, id, &idval); + tiny = JSVAL_TO_INT(idval); + + switch (tiny) { + case CRYPTCERT_PROP_SELFSIGNED: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SELFSIGNED); + case CRYPTCERT_PROP_IMMUTABLE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_IMMUTABLE); + case CRYPTCERT_PROP_XYZZY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_XYZZY); + case CRYPTCERT_PROP_CERTTYPE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTTYPE); + case CRYPTCERT_PROP_FINGERPRINT_SHA1: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_FINGERPRINT_SHA1); + case CRYPTCERT_PROP_FINGERPRINT_SHA2: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_FINGERPRINT_SHA2); + case CRYPTCERT_PROP_FINGERPRINT_SHAng: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_FINGERPRINT_SHAng); + case CRYPTCERT_PROP_CURRENT_CERTIFICATE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CURRENT_CERTIFICATE); + case CRYPTCERT_PROP_TRUSTED_USAGE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_TRUSTED_USAGE); + case CRYPTCERT_PROP_TRUSTED_IMPLICIT: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_TRUSTED_IMPLICIT); + case CRYPTCERT_PROP_SIGNATURELEVEL: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGNATURELEVEL); + case CRYPTCERT_PROP_VERSION: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_VERSION); + case CRYPTCERT_PROP_SERIALNUMBER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SERIALNUMBER); + case CRYPTCERT_PROP_SUBJECTPUBLICKEYINFO: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTPUBLICKEYINFO); + case CRYPTCERT_PROP_CERTIFICATE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTIFICATE); + case CRYPTCERT_PROP_CACERTIFICATE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CACERTIFICATE); + case CRYPTCERT_PROP_ISSUERNAME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_ISSUERNAME); + case CRYPTCERT_PROP_VALIDFROM: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_VALIDFROM); + case CRYPTCERT_PROP_VALIDTO: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_VALIDTO); + case CRYPTCERT_PROP_SUBJECTNAME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTNAME); + case CRYPTCERT_PROP_ISSUERUNIQUEID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_ISSUERUNIQUEID); + case CRYPTCERT_PROP_SUBJECTUNIQUEID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTUNIQUEID); + case CRYPTCERT_PROP_CERTREQUEST: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTREQUEST); + case CRYPTCERT_PROP_THISUPDATE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_THISUPDATE); + case CRYPTCERT_PROP_NEXTUPDATE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_NEXTUPDATE); + case CRYPTCERT_PROP_REVOCATIONDATE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_REVOCATIONDATE); + case CRYPTCERT_PROP_REVOCATIONSTATUS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_REVOCATIONSTATUS); + case CRYPTCERT_PROP_CERTSTATUS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTSTATUS); + case CRYPTCERT_PROP_DN: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_DN); + case CRYPTCERT_PROP_PKIUSER_ID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_PKIUSER_ID); + case CRYPTCERT_PROP_PKIUSER_ISSUEPASSWORD: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_PKIUSER_ISSUEPASSWORD); + case CRYPTCERT_PROP_PKIUSER_REVPASSWORD: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_PKIUSER_REVPASSWORD); + case CRYPTCERT_PROP_PKIUSER_RA: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_PKIUSER_RA); + case CRYPTCERT_PROP_COUNTRYNAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_COUNTRYNAME); + case CRYPTCERT_PROP_STATEORPROVINCENAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_STATEORPROVINCENAME); + case CRYPTCERT_PROP_LOCALITYNAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_LOCALITYNAME); + case CRYPTCERT_PROP_ORGANIZATIONNAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_ORGANIZATIONNAME); + case CRYPTCERT_PROP_ORGANIZATIONALUNITNAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_ORGANIZATIONALUNITNAME); + case CRYPTCERT_PROP_COMMONNAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_COMMONNAME); + case CRYPTCERT_PROP_OTHERNAME_TYPEID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_OTHERNAME_TYPEID); + case CRYPTCERT_PROP_OTHERNAME_VALUE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_OTHERNAME_VALUE); + case CRYPTCERT_PROP_RFC822NAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_RFC822NAME); + case CRYPTCERT_PROP_DNSNAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_DNSNAME); + case CRYPTCERT_PROP_DIRECTORYNAME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_DIRECTORYNAME); + case CRYPTCERT_PROP_EDIPARTYNAME_NAMEASSIGNER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_EDIPARTYNAME_NAMEASSIGNER); + case CRYPTCERT_PROP_EDIPARTYNAME_PARTYNAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_EDIPARTYNAME_PARTYNAME); + case CRYPTCERT_PROP_UNIFORMRESOURCEIDENTIFIER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_UNIFORMRESOURCEIDENTIFIER); + case CRYPTCERT_PROP_IPADDRESS: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESS); + case CRYPTCERT_PROP_REGISTEREDID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_REGISTEREDID); + case CRYPTCERT_PROP_CHALLENGEPASSWORD: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CHALLENGEPASSWORD); + case CRYPTCERT_PROP_CRLEXTREASON: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CRLEXTREASON); + case CRYPTCERT_PROP_KEYFEATURES: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_KEYFEATURES); + case CRYPTCERT_PROP_AUTHORITYINFOACCESS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFOACCESS); + case CRYPTCERT_PROP_AUTHORITYINFO_RTCS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFO_RTCS); + case CRYPTCERT_PROP_AUTHORITYINFO_OCSP: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFO_OCSP); + case CRYPTCERT_PROP_AUTHORITYINFO_CAISSUERS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFO_CAISSUERS); + case CRYPTCERT_PROP_AUTHORITYINFO_CERTSTORE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFO_CERTSTORE); + case CRYPTCERT_PROP_AUTHORITYINFO_CRLS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFO_CRLS); + case CRYPTCERT_PROP_BIOMETRICINFO: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_BIOMETRICINFO); + case CRYPTCERT_PROP_BIOMETRICINFO_TYPE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_BIOMETRICINFO_TYPE); + case CRYPTCERT_PROP_BIOMETRICINFO_HASHALGO: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_BIOMETRICINFO_HASHALGO); + case CRYPTCERT_PROP_BIOMETRICINFO_HASH: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_BIOMETRICINFO_HASH); + case CRYPTCERT_PROP_BIOMETRICINFO_URL: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_BIOMETRICINFO_URL); + case CRYPTCERT_PROP_QCSTATEMENT: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_QCSTATEMENT); + case CRYPTCERT_PROP_QCSTATEMENT_SEMANTICS: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_QCSTATEMENT_SEMANTICS); + case CRYPTCERT_PROP_QCSTATEMENT_REGISTRATIONAUTHORITY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_QCSTATEMENT_REGISTRATIONAUTHORITY); + case CRYPTCERT_PROP_IPADDRESSBLOCKS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESSBLOCKS); + case CRYPTCERT_PROP_IPADDRESSBLOCKS_ADDRESSFAMILY: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESSBLOCKS_ADDRESSFAMILY); + case CRYPTCERT_PROP_IPADDRESSBLOCKS_PREFIX: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESSBLOCKS_PREFIX); + case CRYPTCERT_PROP_IPADDRESSBLOCKS_MIN: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESSBLOCKS_MIN); + case CRYPTCERT_PROP_IPADDRESSBLOCKS_MAX: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESSBLOCKS_MAX); + case CRYPTCERT_PROP_AUTONOMOUSSYSIDS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTONOMOUSSYSIDS); + case CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_ID: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTONOMOUSSYSIDS_ASNUM_ID); + case CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_MIN: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTONOMOUSSYSIDS_ASNUM_MIN); + case CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_MAX: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTONOMOUSSYSIDS_ASNUM_MAX); + case CRYPTCERT_PROP_OCSP_NONCE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_OCSP_NONCE); + case CRYPTCERT_PROP_OCSP_RESPONSE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_OCSP_RESPONSE); + case CRYPTCERT_PROP_OCSP_RESPONSE_OCSP: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_OCSP_RESPONSE_OCSP); + case CRYPTCERT_PROP_OCSP_NOCHECK: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_OCSP_NOCHECK); + case CRYPTCERT_PROP_OCSP_ARCHIVECUTOFF: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_OCSP_ARCHIVECUTOFF); + case CRYPTCERT_PROP_SUBJECTINFOACCESS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFOACCESS); + case CRYPTCERT_PROP_SUBJECTINFO_TIMESTAMPING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFO_TIMESTAMPING); + case CRYPTCERT_PROP_SUBJECTINFO_CAREPOSITORY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFO_CAREPOSITORY); + case CRYPTCERT_PROP_SUBJECTINFO_SIGNEDOBJECTREPOSITORY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFO_SIGNEDOBJECTREPOSITORY); + case CRYPTCERT_PROP_SUBJECTINFO_RPKIMANIFEST: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFO_RPKIMANIFEST); + case CRYPTCERT_PROP_SUBJECTINFO_SIGNEDOBJECT: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFO_SIGNEDOBJECT); + case CRYPTCERT_PROP_SIGG_DATEOFCERTGEN: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_DATEOFCERTGEN); + case CRYPTCERT_PROP_SIGG_PROCURATION: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_PROCURATION); + case CRYPTCERT_PROP_SIGG_PROCURE_COUNTRY: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_PROCURE_COUNTRY); + case CRYPTCERT_PROP_SIGG_PROCURE_TYPEOFSUBSTITUTION: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_PROCURE_TYPEOFSUBSTITUTION); + case CRYPTCERT_PROP_SIGG_PROCURE_SIGNINGFOR: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_PROCURE_SIGNINGFOR); + case CRYPTCERT_PROP_SIGG_ADMISSIONS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_AUTHORITY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_AUTHORITY); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_NAMINGAUTHID); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHURL: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_NAMINGAUTHURL); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHTEXT: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_NAMINGAUTHTEXT); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_PROFESSIONITEM: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_PROFESSIONITEM); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_PROFESSIONOID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_PROFESSIONOID); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_REGISTRATIONNUMBER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_REGISTRATIONNUMBER); + case CRYPTCERT_PROP_SIGG_MONETARYLIMIT: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_MONETARYLIMIT); + case CRYPTCERT_PROP_SIGG_MONETARY_CURRENCY: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_MONETARY_CURRENCY); + case CRYPTCERT_PROP_SIGG_MONETARY_AMOUNT: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_MONETARY_AMOUNT); + case CRYPTCERT_PROP_SIGG_MONETARY_EXPONENT: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_MONETARY_EXPONENT); + case CRYPTCERT_PROP_SIGG_DECLARATIONOFMAJORITY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_DECLARATIONOFMAJORITY); + case CRYPTCERT_PROP_SIGG_DECLARATIONOFMAJORITY_COUNTRY: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_DECLARATIONOFMAJORITY_COUNTRY); + case CRYPTCERT_PROP_SIGG_RESTRICTION: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_RESTRICTION); + case CRYPTCERT_PROP_SIGG_CERTHASH: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_CERTHASH); + case CRYPTCERT_PROP_SIGG_ADDITIONALINFORMATION: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADDITIONALINFORMATION); + case CRYPTCERT_PROP_STRONGEXTRANET: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_STRONGEXTRANET); + case CRYPTCERT_PROP_STRONGEXTRANET_ZONE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_STRONGEXTRANET_ZONE); + case CRYPTCERT_PROP_STRONGEXTRANET_ID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_STRONGEXTRANET_ID); + case CRYPTCERT_PROP_SUBJECTDIRECTORYATTRIBUTES: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTDIRECTORYATTRIBUTES); + case CRYPTCERT_PROP_SUBJECTDIR_TYPE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTDIR_TYPE); + case CRYPTCERT_PROP_SUBJECTDIR_VALUES: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTDIR_VALUES); + case CRYPTCERT_PROP_SUBJECTKEYIDENTIFIER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTKEYIDENTIFIER); + case CRYPTCERT_PROP_KEYUSAGE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_KEYUSAGE); + case CRYPTCERT_PROP_PRIVATEKEYUSAGEPERIOD: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_PRIVATEKEYUSAGEPERIOD); + case CRYPTCERT_PROP_PRIVATEKEY_NOTBEFORE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_PRIVATEKEY_NOTBEFORE); + case CRYPTCERT_PROP_PRIVATEKEY_NOTAFTER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_PRIVATEKEY_NOTAFTER); + case CRYPTCERT_PROP_SUBJECTALTNAME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTALTNAME); + case CRYPTCERT_PROP_ISSUERALTNAME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_ISSUERALTNAME); + case CRYPTCERT_PROP_BASICCONSTRAINTS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_BASICCONSTRAINTS); + case CRYPTCERT_PROP_CA: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CA); + case CRYPTCERT_PROP_PATHLENCONSTRAINT: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_PATHLENCONSTRAINT); + case CRYPTCERT_PROP_CRLNUMBER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CRLNUMBER); + case CRYPTCERT_PROP_CRLREASON: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CRLREASON); + case CRYPTCERT_PROP_HOLDINSTRUCTIONCODE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_HOLDINSTRUCTIONCODE); + case CRYPTCERT_PROP_INVALIDITYDATE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_INVALIDITYDATE); + case CRYPTCERT_PROP_DELTACRLINDICATOR: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_DELTACRLINDICATOR); + case CRYPTCERT_PROP_ISSUINGDISTRIBUTIONPOINT: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDISTRIBUTIONPOINT); + case CRYPTCERT_PROP_ISSUINGDIST_FULLNAME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDIST_FULLNAME); + case CRYPTCERT_PROP_ISSUINGDIST_USERCERTSONLY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDIST_USERCERTSONLY); + case CRYPTCERT_PROP_ISSUINGDIST_CACERTSONLY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDIST_CACERTSONLY); + case CRYPTCERT_PROP_ISSUINGDIST_SOMEREASONSONLY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDIST_SOMEREASONSONLY); + case CRYPTCERT_PROP_ISSUINGDIST_INDIRECTCRL: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDIST_INDIRECTCRL); + case CRYPTCERT_PROP_CERTIFICATEISSUER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTIFICATEISSUER); + case CRYPTCERT_PROP_NAMECONSTRAINTS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_NAMECONSTRAINTS); + case CRYPTCERT_PROP_PERMITTEDSUBTREES: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_PERMITTEDSUBTREES); + case CRYPTCERT_PROP_EXCLUDEDSUBTREES: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXCLUDEDSUBTREES); + case CRYPTCERT_PROP_CRLDISTRIBUTIONPOINT: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CRLDISTRIBUTIONPOINT); + case CRYPTCERT_PROP_CRLDIST_FULLNAME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CRLDIST_FULLNAME); + case CRYPTCERT_PROP_CRLDIST_REASONS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CRLDIST_REASONS); + case CRYPTCERT_PROP_CRLDIST_CRLISSUER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CRLDIST_CRLISSUER); + case CRYPTCERT_PROP_CERTIFICATEPOLICIES: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTIFICATEPOLICIES); + case CRYPTCERT_PROP_CERTPOLICYID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTPOLICYID); + case CRYPTCERT_PROP_CERTPOLICY_CPSURI: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTPOLICY_CPSURI); + case CRYPTCERT_PROP_CERTPOLICY_ORGANIZATION: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTPOLICY_ORGANIZATION); + case CRYPTCERT_PROP_CERTPOLICY_NOTICENUMBERS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTPOLICY_NOTICENUMBERS); + case CRYPTCERT_PROP_CERTPOLICY_EXPLICITTEXT: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CERTPOLICY_EXPLICITTEXT); + case CRYPTCERT_PROP_POLICYMAPPINGS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_POLICYMAPPINGS); + case CRYPTCERT_PROP_ISSUERDOMAINPOLICY: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_ISSUERDOMAINPOLICY); + case CRYPTCERT_PROP_SUBJECTDOMAINPOLICY: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTDOMAINPOLICY); + case CRYPTCERT_PROP_AUTHORITYKEYIDENTIFIER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYKEYIDENTIFIER); + case CRYPTCERT_PROP_AUTHORITY_KEYIDENTIFIER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITY_KEYIDENTIFIER); + case CRYPTCERT_PROP_AUTHORITY_CERTISSUER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITY_CERTISSUER); + case CRYPTCERT_PROP_AUTHORITY_CERTSERIALNUMBER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITY_CERTSERIALNUMBER); + case CRYPTCERT_PROP_POLICYCONSTRAINTS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_POLICYCONSTRAINTS); + case CRYPTCERT_PROP_REQUIREEXPLICITPOLICY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_REQUIREEXPLICITPOLICY); + case CRYPTCERT_PROP_INHIBITPOLICYMAPPING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_INHIBITPOLICYMAPPING); + case CRYPTCERT_PROP_EXTKEYUSAGE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEYUSAGE); + case CRYPTCERT_PROP_EXTKEY_MS_INDIVIDUALCODESIGNING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_INDIVIDUALCODESIGNING); + case CRYPTCERT_PROP_EXTKEY_MS_COMMERCIALCODESIGNING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_COMMERCIALCODESIGNING); + case CRYPTCERT_PROP_EXTKEY_MS_CERTTRUSTLISTSIGNING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_CERTTRUSTLISTSIGNING); + case CRYPTCERT_PROP_EXTKEY_MS_TIMESTAMPSIGNING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_TIMESTAMPSIGNING); + case CRYPTCERT_PROP_EXTKEY_MS_SERVERGATEDCRYPTO: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_SERVERGATEDCRYPTO); + case CRYPTCERT_PROP_EXTKEY_MS_ENCRYPTEDFILESYSTEM: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_ENCRYPTEDFILESYSTEM); + case CRYPTCERT_PROP_EXTKEY_SERVERAUTH: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_SERVERAUTH); + case CRYPTCERT_PROP_EXTKEY_CLIENTAUTH: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_CLIENTAUTH); + case CRYPTCERT_PROP_EXTKEY_CODESIGNING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_CODESIGNING); + case CRYPTCERT_PROP_EXTKEY_EMAILPROTECTION: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_EMAILPROTECTION); + case CRYPTCERT_PROP_EXTKEY_IPSECENDSYSTEM: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_IPSECENDSYSTEM); + case CRYPTCERT_PROP_EXTKEY_IPSECTUNNEL: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_IPSECTUNNEL); + case CRYPTCERT_PROP_EXTKEY_IPSECUSER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_IPSECUSER); + case CRYPTCERT_PROP_EXTKEY_TIMESTAMPING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_TIMESTAMPING); + case CRYPTCERT_PROP_EXTKEY_OCSPSIGNING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_OCSPSIGNING); + case CRYPTCERT_PROP_EXTKEY_DIRECTORYSERVICE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_DIRECTORYSERVICE); + case CRYPTCERT_PROP_EXTKEY_ANYKEYUSAGE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_ANYKEYUSAGE); + case CRYPTCERT_PROP_EXTKEY_NS_SERVERGATEDCRYPTO: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_NS_SERVERGATEDCRYPTO); + case CRYPTCERT_PROP_EXTKEY_VS_SERVERGATEDCRYPTO_CA: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_VS_SERVERGATEDCRYPTO_CA); + case CRYPTCERT_PROP_CRLSTREAMIDENTIFIER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CRLSTREAMIDENTIFIER); + case CRYPTCERT_PROP_FRESHESTCRL: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_FRESHESTCRL); + case CRYPTCERT_PROP_FRESHESTCRL_FULLNAME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_FRESHESTCRL_FULLNAME); + case CRYPTCERT_PROP_FRESHESTCRL_REASONS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_FRESHESTCRL_REASONS); + case CRYPTCERT_PROP_FRESHESTCRL_CRLISSUER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_FRESHESTCRL_CRLISSUER); + case CRYPTCERT_PROP_ORDEREDLIST: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_ORDEREDLIST); + case CRYPTCERT_PROP_BASEUPDATETIME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_BASEUPDATETIME); + case CRYPTCERT_PROP_DELTAINFO: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_DELTAINFO); + case CRYPTCERT_PROP_DELTAINFO_LOCATION: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_DELTAINFO_LOCATION); + case CRYPTCERT_PROP_DELTAINFO_NEXTDELTA: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_DELTAINFO_NEXTDELTA); + case CRYPTCERT_PROP_INHIBITANYPOLICY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_INHIBITANYPOLICY); + case CRYPTCERT_PROP_TOBEREVOKED: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_TOBEREVOKED); + case CRYPTCERT_PROP_TOBEREVOKED_CERTISSUER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_TOBEREVOKED_CERTISSUER); + case CRYPTCERT_PROP_TOBEREVOKED_REASONCODE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_TOBEREVOKED_REASONCODE); + case CRYPTCERT_PROP_TOBEREVOKED_REVOCATIONTIME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_TOBEREVOKED_REVOCATIONTIME); + case CRYPTCERT_PROP_TOBEREVOKED_CERTSERIALNUMBER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_TOBEREVOKED_CERTSERIALNUMBER); + case CRYPTCERT_PROP_REVOKEDGROUPS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS); + case CRYPTCERT_PROP_REVOKEDGROUPS_CERTISSUER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS_CERTISSUER); + case CRYPTCERT_PROP_REVOKEDGROUPS_REASONCODE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS_REASONCODE); + case CRYPTCERT_PROP_REVOKEDGROUPS_INVALIDITYDATE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS_INVALIDITYDATE); + case CRYPTCERT_PROP_REVOKEDGROUPS_STARTINGNUMBER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS_STARTINGNUMBER); + case CRYPTCERT_PROP_REVOKEDGROUPS_ENDINGNUMBER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS_ENDINGNUMBER); + case CRYPTCERT_PROP_EXPIREDCERTSONCRL: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_EXPIREDCERTSONCRL); + case CRYPTCERT_PROP_AAISSUINGDISTRIBUTIONPOINT: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDISTRIBUTIONPOINT); + case CRYPTCERT_PROP_AAISSUINGDIST_FULLNAME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_FULLNAME); + case CRYPTCERT_PROP_AAISSUINGDIST_SOMEREASONSONLY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_SOMEREASONSONLY); + case CRYPTCERT_PROP_AAISSUINGDIST_INDIRECTCRL: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_INDIRECTCRL); + case CRYPTCERT_PROP_AAISSUINGDIST_USERATTRCERTS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_USERATTRCERTS); + case CRYPTCERT_PROP_AAISSUINGDIST_AACERTS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_AACERTS); + case CRYPTCERT_PROP_AAISSUINGDIST_SOACERTS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_SOACERTS); + case CRYPTCERT_PROP_NS_CERTTYPE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_NS_CERTTYPE); + case CRYPTCERT_PROP_NS_BASEURL: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_NS_BASEURL); + case CRYPTCERT_PROP_NS_REVOCATIONURL: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_NS_REVOCATIONURL); + case CRYPTCERT_PROP_NS_CAREVOCATIONURL: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_NS_CAREVOCATIONURL); + case CRYPTCERT_PROP_NS_CERTRENEWALURL: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_NS_CERTRENEWALURL); + case CRYPTCERT_PROP_NS_CAPOLICYURL: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_NS_CAPOLICYURL); + case CRYPTCERT_PROP_NS_SSLSERVERNAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_NS_SSLSERVERNAME); + case CRYPTCERT_PROP_NS_COMMENT: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_NS_COMMENT); + case CRYPTCERT_PROP_SET_HASHEDROOTKEY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_HASHEDROOTKEY); + case CRYPTCERT_PROP_SET_ROOTKEYTHUMBPRINT: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_ROOTKEYTHUMBPRINT); + case CRYPTCERT_PROP_SET_CERTIFICATETYPE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_CERTIFICATETYPE); + case CRYPTCERT_PROP_SET_MERCHANTDATA: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTDATA); + case CRYPTCERT_PROP_SET_MERID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERID); + case CRYPTCERT_PROP_SET_MERACQUIRERBIN: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERACQUIRERBIN); + case CRYPTCERT_PROP_SET_MERCHANTLANGUAGE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTLANGUAGE); + case CRYPTCERT_PROP_SET_MERCHANTNAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTNAME); + case CRYPTCERT_PROP_SET_MERCHANTCITY: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTCITY); + case CRYPTCERT_PROP_SET_MERCHANTSTATEPROVINCE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTSTATEPROVINCE); + case CRYPTCERT_PROP_SET_MERCHANTPOSTALCODE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTPOSTALCODE); + case CRYPTCERT_PROP_SET_MERCHANTCOUNTRYNAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTCOUNTRYNAME); + case CRYPTCERT_PROP_SET_MERCOUNTRY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCOUNTRY); + case CRYPTCERT_PROP_SET_MERAUTHFLAG: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERAUTHFLAG); + case CRYPTCERT_PROP_SET_CERTCARDREQUIRED: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_CERTCARDREQUIRED); + case CRYPTCERT_PROP_SET_TUNNELING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_TUNNELING); + case CRYPTCERT_PROP_SET_TUNNELINGFLAG: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_TUNNELINGFLAG); + case CRYPTCERT_PROP_SET_TUNNELINGALGID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SET_TUNNELINGALGID); + case CRYPTCERT_PROP_CMS_CONTENTTYPE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_CONTENTTYPE); + case CRYPTCERT_PROP_CMS_MESSAGEDIGEST: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MESSAGEDIGEST); + case CRYPTCERT_PROP_CMS_SIGNINGTIME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGTIME); + case CRYPTCERT_PROP_CMS_COUNTERSIGNATURE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_COUNTERSIGNATURE); + case CRYPTCERT_PROP_CMS_SIGNINGDESCRIPTION: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGDESCRIPTION); + case CRYPTCERT_PROP_CMS_SMIMECAPABILITIES: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAPABILITIES); + case CRYPTCERT_PROP_CMS_SMIMECAP_3DES: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_3DES); + case CRYPTCERT_PROP_CMS_SMIMECAP_AES: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_AES); + case CRYPTCERT_PROP_CMS_SMIMECAP_CAST128: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_CAST128); + case CRYPTCERT_PROP_CMS_SMIMECAP_SHAng: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_SHAng); + case CRYPTCERT_PROP_CMS_SMIMECAP_SHA2: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_SHA2); + case CRYPTCERT_PROP_CMS_SMIMECAP_SHA1: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_SHA1); + case CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHAng: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_HMAC_SHAng); + case CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHA2: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_HMAC_SHA2); + case CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHA1: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_HMAC_SHA1); + case CRYPTCERT_PROP_CMS_SMIMECAP_AUTHENC256: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_AUTHENC256); + case CRYPTCERT_PROP_CMS_SMIMECAP_AUTHENC128: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_AUTHENC128); + case CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHAng: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_RSA_SHAng); + case CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHA2: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_RSA_SHA2); + case CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHA1: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_RSA_SHA1); + case CRYPTCERT_PROP_CMS_SMIMECAP_DSA_SHA1: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_DSA_SHA1); + case CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHAng: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_ECDSA_SHAng); + case CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHA2: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_ECDSA_SHA2); + case CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHA1: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_ECDSA_SHA1); + case CRYPTCERT_PROP_CMS_SMIMECAP_PREFERSIGNEDDATA: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_PREFERSIGNEDDATA); + case CRYPTCERT_PROP_CMS_SMIMECAP_CANNOTDECRYPTANY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_CANNOTDECRYPTANY); + case CRYPTCERT_PROP_CMS_SMIMECAP_PREFERBINARYINSIDE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_PREFERBINARYINSIDE); + case CRYPTCERT_PROP_CMS_RECEIPTREQUEST: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_RECEIPTREQUEST); + case CRYPTCERT_PROP_CMS_RECEIPT_CONTENTIDENTIFIER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_RECEIPT_CONTENTIDENTIFIER); + case CRYPTCERT_PROP_CMS_RECEIPT_FROM: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_RECEIPT_FROM); + case CRYPTCERT_PROP_CMS_RECEIPT_TO: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_RECEIPT_TO); + case CRYPTCERT_PROP_CMS_SECURITYLABEL: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECURITYLABEL); + case CRYPTCERT_PROP_CMS_SECLABEL_POLICY: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECLABEL_POLICY); + case CRYPTCERT_PROP_CMS_SECLABEL_CLASSIFICATION: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECLABEL_CLASSIFICATION); + case CRYPTCERT_PROP_CMS_SECLABEL_PRIVACYMARK: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECLABEL_PRIVACYMARK); + case CRYPTCERT_PROP_CMS_SECLABEL_CATTYPE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECLABEL_CATTYPE); + case CRYPTCERT_PROP_CMS_SECLABEL_CATVALUE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECLABEL_CATVALUE); + case CRYPTCERT_PROP_CMS_MLEXPANSIONHISTORY: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXPANSIONHISTORY); + case CRYPTCERT_PROP_CMS_MLEXP_ENTITYIDENTIFIER: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXP_ENTITYIDENTIFIER); + case CRYPTCERT_PROP_CMS_MLEXP_TIME: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXP_TIME); + case CRYPTCERT_PROP_CMS_MLEXP_NONE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXP_NONE); + case CRYPTCERT_PROP_CMS_MLEXP_INSTEADOF: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXP_INSTEADOF); + case CRYPTCERT_PROP_CMS_MLEXP_INADDITIONTO: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXP_INADDITIONTO); + case CRYPTCERT_PROP_CMS_CONTENTHINTS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_CONTENTHINTS); + case CRYPTCERT_PROP_CMS_CONTENTHINT_DESCRIPTION: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_CONTENTHINT_DESCRIPTION); + case CRYPTCERT_PROP_CMS_CONTENTHINT_TYPE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_CONTENTHINT_TYPE); + case CRYPTCERT_PROP_CMS_EQUIVALENTLABEL: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQUIVALENTLABEL); + case CRYPTCERT_PROP_CMS_EQVLABEL_POLICY: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQVLABEL_POLICY); + case CRYPTCERT_PROP_CMS_EQVLABEL_CLASSIFICATION: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQVLABEL_CLASSIFICATION); + case CRYPTCERT_PROP_CMS_EQVLABEL_PRIVACYMARK: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQVLABEL_PRIVACYMARK); + case CRYPTCERT_PROP_CMS_EQVLABEL_CATTYPE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQVLABEL_CATTYPE); + case CRYPTCERT_PROP_CMS_EQVLABEL_CATVALUE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQVLABEL_CATVALUE); + case CRYPTCERT_PROP_CMS_SIGNINGCERTIFICATE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERTIFICATE); + case CRYPTCERT_PROP_CMS_SIGNINGCERT_ESSCERTID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERT_ESSCERTID); + case CRYPTCERT_PROP_CMS_SIGNINGCERT_POLICIES: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERT_POLICIES); + case CRYPTCERT_PROP_CMS_SIGNINGCERTIFICATEV2: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERTIFICATEV2); + case CRYPTCERT_PROP_CMS_SIGNINGCERTV2_ESSCERTIDV2: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERTV2_ESSCERTIDV2); + case CRYPTCERT_PROP_CMS_SIGNINGCERTV2_POLICIES: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERTV2_POLICIES); + case CRYPTCERT_PROP_CMS_SIGNATUREPOLICYID: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNATUREPOLICYID); + case CRYPTCERT_PROP_CMS_SIGPOLICYID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICYID); + case CRYPTCERT_PROP_CMS_SIGPOLICYHASH: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICYHASH); + case CRYPTCERT_PROP_CMS_SIGPOLICY_CPSURI: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICY_CPSURI); + case CRYPTCERT_PROP_CMS_SIGPOLICY_ORGANIZATION: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICY_ORGANIZATION); + case CRYPTCERT_PROP_CMS_SIGPOLICY_NOTICENUMBERS: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICY_NOTICENUMBERS); + case CRYPTCERT_PROP_CMS_SIGPOLICY_EXPLICITTEXT: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICY_EXPLICITTEXT); + case CRYPTCERT_PROP_CMS_SIGTYPEIDENTIFIER: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGTYPEIDENTIFIER); + case CRYPTCERT_PROP_CMS_SIGTYPEID_ORIGINATORSIG: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGTYPEID_ORIGINATORSIG); + case CRYPTCERT_PROP_CMS_SIGTYPEID_DOMAINSIG: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGTYPEID_DOMAINSIG); + case CRYPTCERT_PROP_CMS_SIGTYPEID_ADDITIONALATTRIBUTES: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGTYPEID_ADDITIONALATTRIBUTES); + case CRYPTCERT_PROP_CMS_SIGTYPEID_REVIEWSIG: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGTYPEID_REVIEWSIG); + case CRYPTCERT_PROP_CMS_NONCE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_NONCE); + case CRYPTCERT_PROP_SCEP_MESSAGETYPE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_MESSAGETYPE); + case CRYPTCERT_PROP_SCEP_PKISTATUS: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_PKISTATUS); + case CRYPTCERT_PROP_SCEP_FAILINFO: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_FAILINFO); + case CRYPTCERT_PROP_SCEP_SENDERNONCE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_SENDERNONCE); + case CRYPTCERT_PROP_SCEP_RECIPIENTNONCE: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_RECIPIENTNONCE); + case CRYPTCERT_PROP_SCEP_TRANSACTIONID: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_TRANSACTIONID); + case CRYPTCERT_PROP_CMS_SPCAGENCYINFO: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCAGENCYINFO); + case CRYPTCERT_PROP_CMS_SPCAGENCYURL: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCAGENCYURL); + case CRYPTCERT_PROP_CMS_SPCSTATEMENTTYPE: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCSTATEMENTTYPE); + case CRYPTCERT_PROP_CMS_SPCSTMT_INDIVIDUALCODESIGNING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCSTMT_INDIVIDUALCODESIGNING); + case CRYPTCERT_PROP_CMS_SPCSTMT_COMMERCIALCODESIGNING: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCSTMT_COMMERCIALCODESIGNING); + case CRYPTCERT_PROP_CMS_SPCOPUSINFO: + return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCOPUSINFO); + case CRYPTCERT_PROP_CMS_SPCOPUSINFO_NAME: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCOPUSINFO_NAME); + case CRYPTCERT_PROP_CMS_SPCOPUSINFO_URL: + return js_cryptcert_attrstr_get(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCOPUSINFO_URL); + } + return JS_TRUE; +} + +static JSBool +js_cryptcert_attr_set(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT_ATTRIBUTE_TYPE type) +{ + int status; + int val; + + if (!JS_ValueToInt32(cx, *vp, &val)) + return JS_FALSE; + status = cryptSetAttribute(cert, type, val); + if (cryptStatusError(status)) { + js_cryptcert_error(cx, cert, status); + return JS_FALSE; + } + return JS_TRUE; +} + +static JSBool +js_cryptcert_attrstr_set(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT_ATTRIBUTE_TYPE type) +{ + int status; + char *val = NULL; + size_t len; + + JSVALUE_TO_MSTRING(cx, *vp, val, &len); + HANDLE_PENDING(cx, val); + if (val == NULL) + return JS_FALSE; + + status = cryptSetAttributeString(cert, type, val, len); + if (cryptStatusError(status)) { + js_cryptcert_error(cx, cert, status); + return JS_FALSE; + } + return JS_TRUE; +} + +static JSBool +js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) +{ + jsval idval; + jsint tiny; + struct js_cryptcert_private_data* p; + + if ((p=(struct js_cryptcert_private_data *)JS_GetPrivate(cx,obj))==NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + + JS_IdToValue(cx, id, &idval); + tiny = JSVAL_TO_INT(idval); + + switch (tiny) { + case CRYPTCERT_PROP_SELFSIGNED: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SELFSIGNED); + case CRYPTCERT_PROP_IMMUTABLE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_IMMUTABLE); + case CRYPTCERT_PROP_XYZZY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_XYZZY); + case CRYPTCERT_PROP_CERTTYPE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTTYPE); + case CRYPTCERT_PROP_FINGERPRINT_SHA1: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_FINGERPRINT_SHA1); + case CRYPTCERT_PROP_FINGERPRINT_SHA2: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_FINGERPRINT_SHA2); + case CRYPTCERT_PROP_FINGERPRINT_SHAng: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_FINGERPRINT_SHAng); + case CRYPTCERT_PROP_CURRENT_CERTIFICATE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CURRENT_CERTIFICATE); + case CRYPTCERT_PROP_TRUSTED_USAGE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_TRUSTED_USAGE); + case CRYPTCERT_PROP_TRUSTED_IMPLICIT: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_TRUSTED_IMPLICIT); + case CRYPTCERT_PROP_SIGNATURELEVEL: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGNATURELEVEL); + case CRYPTCERT_PROP_VERSION: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_VERSION); + case CRYPTCERT_PROP_SERIALNUMBER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SERIALNUMBER); + case CRYPTCERT_PROP_SUBJECTPUBLICKEYINFO: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTPUBLICKEYINFO); + case CRYPTCERT_PROP_CERTIFICATE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTIFICATE); + case CRYPTCERT_PROP_CACERTIFICATE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CACERTIFICATE); + case CRYPTCERT_PROP_ISSUERNAME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_ISSUERNAME); + case CRYPTCERT_PROP_VALIDFROM: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_VALIDFROM); + case CRYPTCERT_PROP_VALIDTO: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_VALIDTO); + case CRYPTCERT_PROP_SUBJECTNAME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTNAME); + case CRYPTCERT_PROP_ISSUERUNIQUEID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_ISSUERUNIQUEID); + case CRYPTCERT_PROP_SUBJECTUNIQUEID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTUNIQUEID); + case CRYPTCERT_PROP_CERTREQUEST: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTREQUEST); + case CRYPTCERT_PROP_THISUPDATE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_THISUPDATE); + case CRYPTCERT_PROP_NEXTUPDATE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_NEXTUPDATE); + case CRYPTCERT_PROP_REVOCATIONDATE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_REVOCATIONDATE); + case CRYPTCERT_PROP_REVOCATIONSTATUS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_REVOCATIONSTATUS); + case CRYPTCERT_PROP_CERTSTATUS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTSTATUS); + case CRYPTCERT_PROP_DN: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_DN); + case CRYPTCERT_PROP_PKIUSER_ID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_PKIUSER_ID); + case CRYPTCERT_PROP_PKIUSER_ISSUEPASSWORD: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_PKIUSER_ISSUEPASSWORD); + case CRYPTCERT_PROP_PKIUSER_REVPASSWORD: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_PKIUSER_REVPASSWORD); + case CRYPTCERT_PROP_PKIUSER_RA: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_PKIUSER_RA); + case CRYPTCERT_PROP_COUNTRYNAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_COUNTRYNAME); + case CRYPTCERT_PROP_STATEORPROVINCENAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_STATEORPROVINCENAME); + case CRYPTCERT_PROP_LOCALITYNAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_LOCALITYNAME); + case CRYPTCERT_PROP_ORGANIZATIONNAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_ORGANIZATIONNAME); + case CRYPTCERT_PROP_ORGANIZATIONALUNITNAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_ORGANIZATIONALUNITNAME); + case CRYPTCERT_PROP_COMMONNAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_COMMONNAME); + case CRYPTCERT_PROP_OTHERNAME_TYPEID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_OTHERNAME_TYPEID); + case CRYPTCERT_PROP_OTHERNAME_VALUE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_OTHERNAME_VALUE); + case CRYPTCERT_PROP_RFC822NAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_RFC822NAME); + case CRYPTCERT_PROP_DNSNAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_DNSNAME); + case CRYPTCERT_PROP_DIRECTORYNAME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_DIRECTORYNAME); + case CRYPTCERT_PROP_EDIPARTYNAME_NAMEASSIGNER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_EDIPARTYNAME_NAMEASSIGNER); + case CRYPTCERT_PROP_EDIPARTYNAME_PARTYNAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_EDIPARTYNAME_PARTYNAME); + case CRYPTCERT_PROP_UNIFORMRESOURCEIDENTIFIER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_UNIFORMRESOURCEIDENTIFIER); + case CRYPTCERT_PROP_IPADDRESS: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESS); + case CRYPTCERT_PROP_REGISTEREDID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_REGISTEREDID); + case CRYPTCERT_PROP_CHALLENGEPASSWORD: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CHALLENGEPASSWORD); + case CRYPTCERT_PROP_CRLEXTREASON: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CRLEXTREASON); + case CRYPTCERT_PROP_KEYFEATURES: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_KEYFEATURES); + case CRYPTCERT_PROP_AUTHORITYINFOACCESS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFOACCESS); + case CRYPTCERT_PROP_AUTHORITYINFO_RTCS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFO_RTCS); + case CRYPTCERT_PROP_AUTHORITYINFO_OCSP: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFO_OCSP); + case CRYPTCERT_PROP_AUTHORITYINFO_CAISSUERS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFO_CAISSUERS); + case CRYPTCERT_PROP_AUTHORITYINFO_CERTSTORE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFO_CERTSTORE); + case CRYPTCERT_PROP_AUTHORITYINFO_CRLS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYINFO_CRLS); + case CRYPTCERT_PROP_BIOMETRICINFO: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_BIOMETRICINFO); + case CRYPTCERT_PROP_BIOMETRICINFO_TYPE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_BIOMETRICINFO_TYPE); + case CRYPTCERT_PROP_BIOMETRICINFO_HASHALGO: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_BIOMETRICINFO_HASHALGO); + case CRYPTCERT_PROP_BIOMETRICINFO_HASH: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_BIOMETRICINFO_HASH); + case CRYPTCERT_PROP_BIOMETRICINFO_URL: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_BIOMETRICINFO_URL); + case CRYPTCERT_PROP_QCSTATEMENT: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_QCSTATEMENT); + case CRYPTCERT_PROP_QCSTATEMENT_SEMANTICS: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_QCSTATEMENT_SEMANTICS); + case CRYPTCERT_PROP_QCSTATEMENT_REGISTRATIONAUTHORITY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_QCSTATEMENT_REGISTRATIONAUTHORITY); + case CRYPTCERT_PROP_IPADDRESSBLOCKS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESSBLOCKS); + case CRYPTCERT_PROP_IPADDRESSBLOCKS_ADDRESSFAMILY: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESSBLOCKS_ADDRESSFAMILY); + case CRYPTCERT_PROP_IPADDRESSBLOCKS_PREFIX: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESSBLOCKS_PREFIX); + case CRYPTCERT_PROP_IPADDRESSBLOCKS_MIN: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESSBLOCKS_MIN); + case CRYPTCERT_PROP_IPADDRESSBLOCKS_MAX: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_IPADDRESSBLOCKS_MAX); + case CRYPTCERT_PROP_AUTONOMOUSSYSIDS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTONOMOUSSYSIDS); + case CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_ID: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTONOMOUSSYSIDS_ASNUM_ID); + case CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_MIN: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTONOMOUSSYSIDS_ASNUM_MIN); + case CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_MAX: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTONOMOUSSYSIDS_ASNUM_MAX); + case CRYPTCERT_PROP_OCSP_NONCE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_OCSP_NONCE); + case CRYPTCERT_PROP_OCSP_RESPONSE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_OCSP_RESPONSE); + case CRYPTCERT_PROP_OCSP_RESPONSE_OCSP: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_OCSP_RESPONSE_OCSP); + case CRYPTCERT_PROP_OCSP_NOCHECK: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_OCSP_NOCHECK); + case CRYPTCERT_PROP_OCSP_ARCHIVECUTOFF: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_OCSP_ARCHIVECUTOFF); + case CRYPTCERT_PROP_SUBJECTINFOACCESS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFOACCESS); + case CRYPTCERT_PROP_SUBJECTINFO_TIMESTAMPING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFO_TIMESTAMPING); + case CRYPTCERT_PROP_SUBJECTINFO_CAREPOSITORY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFO_CAREPOSITORY); + case CRYPTCERT_PROP_SUBJECTINFO_SIGNEDOBJECTREPOSITORY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFO_SIGNEDOBJECTREPOSITORY); + case CRYPTCERT_PROP_SUBJECTINFO_RPKIMANIFEST: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFO_RPKIMANIFEST); + case CRYPTCERT_PROP_SUBJECTINFO_SIGNEDOBJECT: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTINFO_SIGNEDOBJECT); + case CRYPTCERT_PROP_SIGG_DATEOFCERTGEN: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_DATEOFCERTGEN); + case CRYPTCERT_PROP_SIGG_PROCURATION: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_PROCURATION); + case CRYPTCERT_PROP_SIGG_PROCURE_COUNTRY: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_PROCURE_COUNTRY); + case CRYPTCERT_PROP_SIGG_PROCURE_TYPEOFSUBSTITUTION: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_PROCURE_TYPEOFSUBSTITUTION); + case CRYPTCERT_PROP_SIGG_PROCURE_SIGNINGFOR: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_PROCURE_SIGNINGFOR); + case CRYPTCERT_PROP_SIGG_ADMISSIONS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_AUTHORITY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_AUTHORITY); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_NAMINGAUTHID); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHURL: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_NAMINGAUTHURL); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHTEXT: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_NAMINGAUTHTEXT); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_PROFESSIONITEM: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_PROFESSIONITEM); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_PROFESSIONOID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_PROFESSIONOID); + case CRYPTCERT_PROP_SIGG_ADMISSIONS_REGISTRATIONNUMBER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADMISSIONS_REGISTRATIONNUMBER); + case CRYPTCERT_PROP_SIGG_MONETARYLIMIT: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_MONETARYLIMIT); + case CRYPTCERT_PROP_SIGG_MONETARY_CURRENCY: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_MONETARY_CURRENCY); + case CRYPTCERT_PROP_SIGG_MONETARY_AMOUNT: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_MONETARY_AMOUNT); + case CRYPTCERT_PROP_SIGG_MONETARY_EXPONENT: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_MONETARY_EXPONENT); + case CRYPTCERT_PROP_SIGG_DECLARATIONOFMAJORITY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_DECLARATIONOFMAJORITY); + case CRYPTCERT_PROP_SIGG_DECLARATIONOFMAJORITY_COUNTRY: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_DECLARATIONOFMAJORITY_COUNTRY); + case CRYPTCERT_PROP_SIGG_RESTRICTION: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_RESTRICTION); + case CRYPTCERT_PROP_SIGG_CERTHASH: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_CERTHASH); + case CRYPTCERT_PROP_SIGG_ADDITIONALINFORMATION: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SIGG_ADDITIONALINFORMATION); + case CRYPTCERT_PROP_STRONGEXTRANET: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_STRONGEXTRANET); + case CRYPTCERT_PROP_STRONGEXTRANET_ZONE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_STRONGEXTRANET_ZONE); + case CRYPTCERT_PROP_STRONGEXTRANET_ID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_STRONGEXTRANET_ID); + case CRYPTCERT_PROP_SUBJECTDIRECTORYATTRIBUTES: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTDIRECTORYATTRIBUTES); + case CRYPTCERT_PROP_SUBJECTDIR_TYPE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTDIR_TYPE); + case CRYPTCERT_PROP_SUBJECTDIR_VALUES: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTDIR_VALUES); + case CRYPTCERT_PROP_SUBJECTKEYIDENTIFIER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTKEYIDENTIFIER); + case CRYPTCERT_PROP_KEYUSAGE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_KEYUSAGE); + case CRYPTCERT_PROP_PRIVATEKEYUSAGEPERIOD: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_PRIVATEKEYUSAGEPERIOD); + case CRYPTCERT_PROP_PRIVATEKEY_NOTBEFORE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_PRIVATEKEY_NOTBEFORE); + case CRYPTCERT_PROP_PRIVATEKEY_NOTAFTER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_PRIVATEKEY_NOTAFTER); + case CRYPTCERT_PROP_SUBJECTALTNAME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTALTNAME); + case CRYPTCERT_PROP_ISSUERALTNAME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_ISSUERALTNAME); + case CRYPTCERT_PROP_BASICCONSTRAINTS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_BASICCONSTRAINTS); + case CRYPTCERT_PROP_CA: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CA); + case CRYPTCERT_PROP_PATHLENCONSTRAINT: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_PATHLENCONSTRAINT); + case CRYPTCERT_PROP_CRLNUMBER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CRLNUMBER); + case CRYPTCERT_PROP_CRLREASON: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CRLREASON); + case CRYPTCERT_PROP_HOLDINSTRUCTIONCODE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_HOLDINSTRUCTIONCODE); + case CRYPTCERT_PROP_INVALIDITYDATE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_INVALIDITYDATE); + case CRYPTCERT_PROP_DELTACRLINDICATOR: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_DELTACRLINDICATOR); + case CRYPTCERT_PROP_ISSUINGDISTRIBUTIONPOINT: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDISTRIBUTIONPOINT); + case CRYPTCERT_PROP_ISSUINGDIST_FULLNAME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDIST_FULLNAME); + case CRYPTCERT_PROP_ISSUINGDIST_USERCERTSONLY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDIST_USERCERTSONLY); + case CRYPTCERT_PROP_ISSUINGDIST_CACERTSONLY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDIST_CACERTSONLY); + case CRYPTCERT_PROP_ISSUINGDIST_SOMEREASONSONLY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDIST_SOMEREASONSONLY); + case CRYPTCERT_PROP_ISSUINGDIST_INDIRECTCRL: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_ISSUINGDIST_INDIRECTCRL); + case CRYPTCERT_PROP_CERTIFICATEISSUER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTIFICATEISSUER); + case CRYPTCERT_PROP_NAMECONSTRAINTS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_NAMECONSTRAINTS); + case CRYPTCERT_PROP_PERMITTEDSUBTREES: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_PERMITTEDSUBTREES); + case CRYPTCERT_PROP_EXCLUDEDSUBTREES: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXCLUDEDSUBTREES); + case CRYPTCERT_PROP_CRLDISTRIBUTIONPOINT: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CRLDISTRIBUTIONPOINT); + case CRYPTCERT_PROP_CRLDIST_FULLNAME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CRLDIST_FULLNAME); + case CRYPTCERT_PROP_CRLDIST_REASONS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CRLDIST_REASONS); + case CRYPTCERT_PROP_CRLDIST_CRLISSUER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CRLDIST_CRLISSUER); + case CRYPTCERT_PROP_CERTIFICATEPOLICIES: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTIFICATEPOLICIES); + case CRYPTCERT_PROP_CERTPOLICYID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTPOLICYID); + case CRYPTCERT_PROP_CERTPOLICY_CPSURI: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTPOLICY_CPSURI); + case CRYPTCERT_PROP_CERTPOLICY_ORGANIZATION: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTPOLICY_ORGANIZATION); + case CRYPTCERT_PROP_CERTPOLICY_NOTICENUMBERS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTPOLICY_NOTICENUMBERS); + case CRYPTCERT_PROP_CERTPOLICY_EXPLICITTEXT: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTPOLICY_EXPLICITTEXT); + case CRYPTCERT_PROP_POLICYMAPPINGS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_POLICYMAPPINGS); + case CRYPTCERT_PROP_ISSUERDOMAINPOLICY: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_ISSUERDOMAINPOLICY); + case CRYPTCERT_PROP_SUBJECTDOMAINPOLICY: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTDOMAINPOLICY); + case CRYPTCERT_PROP_AUTHORITYKEYIDENTIFIER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITYKEYIDENTIFIER); + case CRYPTCERT_PROP_AUTHORITY_KEYIDENTIFIER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITY_KEYIDENTIFIER); + case CRYPTCERT_PROP_AUTHORITY_CERTISSUER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITY_CERTISSUER); + case CRYPTCERT_PROP_AUTHORITY_CERTSERIALNUMBER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_AUTHORITY_CERTSERIALNUMBER); + case CRYPTCERT_PROP_POLICYCONSTRAINTS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_POLICYCONSTRAINTS); + case CRYPTCERT_PROP_REQUIREEXPLICITPOLICY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_REQUIREEXPLICITPOLICY); + case CRYPTCERT_PROP_INHIBITPOLICYMAPPING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_INHIBITPOLICYMAPPING); + case CRYPTCERT_PROP_EXTKEYUSAGE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEYUSAGE); + case CRYPTCERT_PROP_EXTKEY_MS_INDIVIDUALCODESIGNING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_INDIVIDUALCODESIGNING); + case CRYPTCERT_PROP_EXTKEY_MS_COMMERCIALCODESIGNING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_COMMERCIALCODESIGNING); + case CRYPTCERT_PROP_EXTKEY_MS_CERTTRUSTLISTSIGNING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_CERTTRUSTLISTSIGNING); + case CRYPTCERT_PROP_EXTKEY_MS_TIMESTAMPSIGNING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_TIMESTAMPSIGNING); + case CRYPTCERT_PROP_EXTKEY_MS_SERVERGATEDCRYPTO: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_SERVERGATEDCRYPTO); + case CRYPTCERT_PROP_EXTKEY_MS_ENCRYPTEDFILESYSTEM: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_MS_ENCRYPTEDFILESYSTEM); + case CRYPTCERT_PROP_EXTKEY_SERVERAUTH: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_SERVERAUTH); + case CRYPTCERT_PROP_EXTKEY_CLIENTAUTH: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_CLIENTAUTH); + case CRYPTCERT_PROP_EXTKEY_CODESIGNING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_CODESIGNING); + case CRYPTCERT_PROP_EXTKEY_EMAILPROTECTION: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_EMAILPROTECTION); + case CRYPTCERT_PROP_EXTKEY_IPSECENDSYSTEM: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_IPSECENDSYSTEM); + case CRYPTCERT_PROP_EXTKEY_IPSECTUNNEL: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_IPSECTUNNEL); + case CRYPTCERT_PROP_EXTKEY_IPSECUSER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_IPSECUSER); + case CRYPTCERT_PROP_EXTKEY_TIMESTAMPING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_TIMESTAMPING); + case CRYPTCERT_PROP_EXTKEY_OCSPSIGNING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_OCSPSIGNING); + case CRYPTCERT_PROP_EXTKEY_DIRECTORYSERVICE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_DIRECTORYSERVICE); + case CRYPTCERT_PROP_EXTKEY_ANYKEYUSAGE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_ANYKEYUSAGE); + case CRYPTCERT_PROP_EXTKEY_NS_SERVERGATEDCRYPTO: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_NS_SERVERGATEDCRYPTO); + case CRYPTCERT_PROP_EXTKEY_VS_SERVERGATEDCRYPTO_CA: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXTKEY_VS_SERVERGATEDCRYPTO_CA); + case CRYPTCERT_PROP_CRLSTREAMIDENTIFIER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CRLSTREAMIDENTIFIER); + case CRYPTCERT_PROP_FRESHESTCRL: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_FRESHESTCRL); + case CRYPTCERT_PROP_FRESHESTCRL_FULLNAME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_FRESHESTCRL_FULLNAME); + case CRYPTCERT_PROP_FRESHESTCRL_REASONS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_FRESHESTCRL_REASONS); + case CRYPTCERT_PROP_FRESHESTCRL_CRLISSUER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_FRESHESTCRL_CRLISSUER); + case CRYPTCERT_PROP_ORDEREDLIST: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_ORDEREDLIST); + case CRYPTCERT_PROP_BASEUPDATETIME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_BASEUPDATETIME); + case CRYPTCERT_PROP_DELTAINFO: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_DELTAINFO); + case CRYPTCERT_PROP_DELTAINFO_LOCATION: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_DELTAINFO_LOCATION); + case CRYPTCERT_PROP_DELTAINFO_NEXTDELTA: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_DELTAINFO_NEXTDELTA); + case CRYPTCERT_PROP_INHIBITANYPOLICY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_INHIBITANYPOLICY); + case CRYPTCERT_PROP_TOBEREVOKED: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_TOBEREVOKED); + case CRYPTCERT_PROP_TOBEREVOKED_CERTISSUER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_TOBEREVOKED_CERTISSUER); + case CRYPTCERT_PROP_TOBEREVOKED_REASONCODE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_TOBEREVOKED_REASONCODE); + case CRYPTCERT_PROP_TOBEREVOKED_REVOCATIONTIME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_TOBEREVOKED_REVOCATIONTIME); + case CRYPTCERT_PROP_TOBEREVOKED_CERTSERIALNUMBER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_TOBEREVOKED_CERTSERIALNUMBER); + case CRYPTCERT_PROP_REVOKEDGROUPS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS); + case CRYPTCERT_PROP_REVOKEDGROUPS_CERTISSUER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS_CERTISSUER); + case CRYPTCERT_PROP_REVOKEDGROUPS_REASONCODE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS_REASONCODE); + case CRYPTCERT_PROP_REVOKEDGROUPS_INVALIDITYDATE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS_INVALIDITYDATE); + case CRYPTCERT_PROP_REVOKEDGROUPS_STARTINGNUMBER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS_STARTINGNUMBER); + case CRYPTCERT_PROP_REVOKEDGROUPS_ENDINGNUMBER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_REVOKEDGROUPS_ENDINGNUMBER); + case CRYPTCERT_PROP_EXPIREDCERTSONCRL: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_EXPIREDCERTSONCRL); + case CRYPTCERT_PROP_AAISSUINGDISTRIBUTIONPOINT: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDISTRIBUTIONPOINT); + case CRYPTCERT_PROP_AAISSUINGDIST_FULLNAME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_FULLNAME); + case CRYPTCERT_PROP_AAISSUINGDIST_SOMEREASONSONLY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_SOMEREASONSONLY); + case CRYPTCERT_PROP_AAISSUINGDIST_INDIRECTCRL: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_INDIRECTCRL); + case CRYPTCERT_PROP_AAISSUINGDIST_USERATTRCERTS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_USERATTRCERTS); + case CRYPTCERT_PROP_AAISSUINGDIST_AACERTS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_AACERTS); + case CRYPTCERT_PROP_AAISSUINGDIST_SOACERTS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_AAISSUINGDIST_SOACERTS); + case CRYPTCERT_PROP_NS_CERTTYPE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_NS_CERTTYPE); + case CRYPTCERT_PROP_NS_BASEURL: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_NS_BASEURL); + case CRYPTCERT_PROP_NS_REVOCATIONURL: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_NS_REVOCATIONURL); + case CRYPTCERT_PROP_NS_CAREVOCATIONURL: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_NS_CAREVOCATIONURL); + case CRYPTCERT_PROP_NS_CERTRENEWALURL: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_NS_CERTRENEWALURL); + case CRYPTCERT_PROP_NS_CAPOLICYURL: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_NS_CAPOLICYURL); + case CRYPTCERT_PROP_NS_SSLSERVERNAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_NS_SSLSERVERNAME); + case CRYPTCERT_PROP_NS_COMMENT: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_NS_COMMENT); + case CRYPTCERT_PROP_SET_HASHEDROOTKEY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_HASHEDROOTKEY); + case CRYPTCERT_PROP_SET_ROOTKEYTHUMBPRINT: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_ROOTKEYTHUMBPRINT); + case CRYPTCERT_PROP_SET_CERTIFICATETYPE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_CERTIFICATETYPE); + case CRYPTCERT_PROP_SET_MERCHANTDATA: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTDATA); + case CRYPTCERT_PROP_SET_MERID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERID); + case CRYPTCERT_PROP_SET_MERACQUIRERBIN: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERACQUIRERBIN); + case CRYPTCERT_PROP_SET_MERCHANTLANGUAGE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTLANGUAGE); + case CRYPTCERT_PROP_SET_MERCHANTNAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTNAME); + case CRYPTCERT_PROP_SET_MERCHANTCITY: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTCITY); + case CRYPTCERT_PROP_SET_MERCHANTSTATEPROVINCE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTSTATEPROVINCE); + case CRYPTCERT_PROP_SET_MERCHANTPOSTALCODE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTPOSTALCODE); + case CRYPTCERT_PROP_SET_MERCHANTCOUNTRYNAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCHANTCOUNTRYNAME); + case CRYPTCERT_PROP_SET_MERCOUNTRY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERCOUNTRY); + case CRYPTCERT_PROP_SET_MERAUTHFLAG: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_MERAUTHFLAG); + case CRYPTCERT_PROP_SET_CERTCARDREQUIRED: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_CERTCARDREQUIRED); + case CRYPTCERT_PROP_SET_TUNNELING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_TUNNELING); + case CRYPTCERT_PROP_SET_TUNNELINGFLAG: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_TUNNELINGFLAG); + case CRYPTCERT_PROP_SET_TUNNELINGALGID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SET_TUNNELINGALGID); + case CRYPTCERT_PROP_CMS_CONTENTTYPE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_CONTENTTYPE); + case CRYPTCERT_PROP_CMS_MESSAGEDIGEST: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MESSAGEDIGEST); + case CRYPTCERT_PROP_CMS_SIGNINGTIME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGTIME); + case CRYPTCERT_PROP_CMS_COUNTERSIGNATURE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_COUNTERSIGNATURE); + case CRYPTCERT_PROP_CMS_SIGNINGDESCRIPTION: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGDESCRIPTION); + case CRYPTCERT_PROP_CMS_SMIMECAPABILITIES: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAPABILITIES); + case CRYPTCERT_PROP_CMS_SMIMECAP_3DES: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_3DES); + case CRYPTCERT_PROP_CMS_SMIMECAP_AES: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_AES); + case CRYPTCERT_PROP_CMS_SMIMECAP_CAST128: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_CAST128); + case CRYPTCERT_PROP_CMS_SMIMECAP_SHAng: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_SHAng); + case CRYPTCERT_PROP_CMS_SMIMECAP_SHA2: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_SHA2); + case CRYPTCERT_PROP_CMS_SMIMECAP_SHA1: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_SHA1); + case CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHAng: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_HMAC_SHAng); + case CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHA2: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_HMAC_SHA2); + case CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHA1: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_HMAC_SHA1); + case CRYPTCERT_PROP_CMS_SMIMECAP_AUTHENC256: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_AUTHENC256); + case CRYPTCERT_PROP_CMS_SMIMECAP_AUTHENC128: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_AUTHENC128); + case CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHAng: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_RSA_SHAng); + case CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHA2: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_RSA_SHA2); + case CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHA1: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_RSA_SHA1); + case CRYPTCERT_PROP_CMS_SMIMECAP_DSA_SHA1: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_DSA_SHA1); + case CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHAng: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_ECDSA_SHAng); + case CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHA2: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_ECDSA_SHA2); + case CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHA1: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_ECDSA_SHA1); + case CRYPTCERT_PROP_CMS_SMIMECAP_PREFERSIGNEDDATA: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_PREFERSIGNEDDATA); + case CRYPTCERT_PROP_CMS_SMIMECAP_CANNOTDECRYPTANY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_CANNOTDECRYPTANY); + case CRYPTCERT_PROP_CMS_SMIMECAP_PREFERBINARYINSIDE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SMIMECAP_PREFERBINARYINSIDE); + case CRYPTCERT_PROP_CMS_RECEIPTREQUEST: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_RECEIPTREQUEST); + case CRYPTCERT_PROP_CMS_RECEIPT_CONTENTIDENTIFIER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_RECEIPT_CONTENTIDENTIFIER); + case CRYPTCERT_PROP_CMS_RECEIPT_FROM: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_RECEIPT_FROM); + case CRYPTCERT_PROP_CMS_RECEIPT_TO: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_RECEIPT_TO); + case CRYPTCERT_PROP_CMS_SECURITYLABEL: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECURITYLABEL); + case CRYPTCERT_PROP_CMS_SECLABEL_POLICY: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECLABEL_POLICY); + case CRYPTCERT_PROP_CMS_SECLABEL_CLASSIFICATION: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECLABEL_CLASSIFICATION); + case CRYPTCERT_PROP_CMS_SECLABEL_PRIVACYMARK: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECLABEL_PRIVACYMARK); + case CRYPTCERT_PROP_CMS_SECLABEL_CATTYPE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECLABEL_CATTYPE); + case CRYPTCERT_PROP_CMS_SECLABEL_CATVALUE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SECLABEL_CATVALUE); + case CRYPTCERT_PROP_CMS_MLEXPANSIONHISTORY: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXPANSIONHISTORY); + case CRYPTCERT_PROP_CMS_MLEXP_ENTITYIDENTIFIER: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXP_ENTITYIDENTIFIER); + case CRYPTCERT_PROP_CMS_MLEXP_TIME: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXP_TIME); + case CRYPTCERT_PROP_CMS_MLEXP_NONE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXP_NONE); + case CRYPTCERT_PROP_CMS_MLEXP_INSTEADOF: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXP_INSTEADOF); + case CRYPTCERT_PROP_CMS_MLEXP_INADDITIONTO: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_MLEXP_INADDITIONTO); + case CRYPTCERT_PROP_CMS_CONTENTHINTS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_CONTENTHINTS); + case CRYPTCERT_PROP_CMS_CONTENTHINT_DESCRIPTION: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_CONTENTHINT_DESCRIPTION); + case CRYPTCERT_PROP_CMS_CONTENTHINT_TYPE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_CONTENTHINT_TYPE); + case CRYPTCERT_PROP_CMS_EQUIVALENTLABEL: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQUIVALENTLABEL); + case CRYPTCERT_PROP_CMS_EQVLABEL_POLICY: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQVLABEL_POLICY); + case CRYPTCERT_PROP_CMS_EQVLABEL_CLASSIFICATION: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQVLABEL_CLASSIFICATION); + case CRYPTCERT_PROP_CMS_EQVLABEL_PRIVACYMARK: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQVLABEL_PRIVACYMARK); + case CRYPTCERT_PROP_CMS_EQVLABEL_CATTYPE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQVLABEL_CATTYPE); + case CRYPTCERT_PROP_CMS_EQVLABEL_CATVALUE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_EQVLABEL_CATVALUE); + case CRYPTCERT_PROP_CMS_SIGNINGCERTIFICATE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERTIFICATE); + case CRYPTCERT_PROP_CMS_SIGNINGCERT_ESSCERTID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERT_ESSCERTID); + case CRYPTCERT_PROP_CMS_SIGNINGCERT_POLICIES: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERT_POLICIES); + case CRYPTCERT_PROP_CMS_SIGNINGCERTIFICATEV2: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERTIFICATEV2); + case CRYPTCERT_PROP_CMS_SIGNINGCERTV2_ESSCERTIDV2: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERTV2_ESSCERTIDV2); + case CRYPTCERT_PROP_CMS_SIGNINGCERTV2_POLICIES: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNINGCERTV2_POLICIES); + case CRYPTCERT_PROP_CMS_SIGNATUREPOLICYID: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGNATUREPOLICYID); + case CRYPTCERT_PROP_CMS_SIGPOLICYID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICYID); + case CRYPTCERT_PROP_CMS_SIGPOLICYHASH: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICYHASH); + case CRYPTCERT_PROP_CMS_SIGPOLICY_CPSURI: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICY_CPSURI); + case CRYPTCERT_PROP_CMS_SIGPOLICY_ORGANIZATION: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICY_ORGANIZATION); + case CRYPTCERT_PROP_CMS_SIGPOLICY_NOTICENUMBERS: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICY_NOTICENUMBERS); + case CRYPTCERT_PROP_CMS_SIGPOLICY_EXPLICITTEXT: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGPOLICY_EXPLICITTEXT); + case CRYPTCERT_PROP_CMS_SIGTYPEIDENTIFIER: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGTYPEIDENTIFIER); + case CRYPTCERT_PROP_CMS_SIGTYPEID_ORIGINATORSIG: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGTYPEID_ORIGINATORSIG); + case CRYPTCERT_PROP_CMS_SIGTYPEID_DOMAINSIG: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGTYPEID_DOMAINSIG); + case CRYPTCERT_PROP_CMS_SIGTYPEID_ADDITIONALATTRIBUTES: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGTYPEID_ADDITIONALATTRIBUTES); + case CRYPTCERT_PROP_CMS_SIGTYPEID_REVIEWSIG: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SIGTYPEID_REVIEWSIG); + case CRYPTCERT_PROP_CMS_NONCE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_NONCE); + case CRYPTCERT_PROP_SCEP_MESSAGETYPE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_MESSAGETYPE); + case CRYPTCERT_PROP_SCEP_PKISTATUS: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_PKISTATUS); + case CRYPTCERT_PROP_SCEP_FAILINFO: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_FAILINFO); + case CRYPTCERT_PROP_SCEP_SENDERNONCE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_SENDERNONCE); + case CRYPTCERT_PROP_SCEP_RECIPIENTNONCE: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_RECIPIENTNONCE); + case CRYPTCERT_PROP_SCEP_TRANSACTIONID: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SCEP_TRANSACTIONID); + case CRYPTCERT_PROP_CMS_SPCAGENCYINFO: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCAGENCYINFO); + case CRYPTCERT_PROP_CMS_SPCAGENCYURL: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCAGENCYURL); + case CRYPTCERT_PROP_CMS_SPCSTATEMENTTYPE: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCSTATEMENTTYPE); + case CRYPTCERT_PROP_CMS_SPCSTMT_INDIVIDUALCODESIGNING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCSTMT_INDIVIDUALCODESIGNING); + case CRYPTCERT_PROP_CMS_SPCSTMT_COMMERCIALCODESIGNING: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCSTMT_COMMERCIALCODESIGNING); + case CRYPTCERT_PROP_CMS_SPCOPUSINFO: + return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCOPUSINFO); + case CRYPTCERT_PROP_CMS_SPCOPUSINFO_NAME: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCOPUSINFO_NAME); + case CRYPTCERT_PROP_CMS_SPCOPUSINFO_URL: + return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CMS_SPCOPUSINFO_URL); + } + return JS_TRUE; +} + +#ifdef BUILD_JSDOCS +static char* cryptcert_prop_desc[] = { + "Keyopt constant (CryptCert.KEYOPT.XXX):<ul class=\"showList\">\n" + "<li>CryptCert.KEYOPT.NONE</li>\n" + "<li>CryptCert.KEYOPT.READONLY</li>\n" + "<li>CryptCert.KEYOPT.CREATE</li>\n" + ,NULL +}; +#endif + +static jsSyncPropertySpec js_cryptcert_properties[] = { +/* name ,tinyid ,flags, ver */ + {"selfsigned" ,CRYPTCERT_PROP_SELFSIGNED ,JSPROP_ENUMERATE ,316}, + {"immutable" ,CRYPTCERT_PROP_IMMUTABLE ,JSPROP_ENUMERATE ,316}, + {"xyzzy" ,CRYPTCERT_PROP_XYZZY ,JSPROP_ENUMERATE ,316}, + {"certtype" ,CRYPTCERT_PROP_CERTTYPE ,JSPROP_ENUMERATE ,316}, + {"fingerprint_sha1" ,CRYPTCERT_PROP_FINGERPRINT_SHA1 ,JSPROP_ENUMERATE ,316}, + {"fingerprint_sha2" ,CRYPTCERT_PROP_FINGERPRINT_SHA2 ,JSPROP_ENUMERATE ,316}, + {"fingerprint_shang" ,CRYPTCERT_PROP_FINGERPRINT_SHAng ,JSPROP_ENUMERATE ,316}, + {"current_certificate" ,CRYPTCERT_PROP_CURRENT_CERTIFICATE ,JSPROP_ENUMERATE ,316}, + {"trusted_usage" ,CRYPTCERT_PROP_TRUSTED_USAGE ,JSPROP_ENUMERATE ,316}, + {"trusted_implicit" ,CRYPTCERT_PROP_TRUSTED_IMPLICIT ,JSPROP_ENUMERATE ,316}, + {"signaturelevel" ,CRYPTCERT_PROP_SIGNATURELEVEL ,JSPROP_ENUMERATE ,316}, + {"version" ,CRYPTCERT_PROP_VERSION ,JSPROP_ENUMERATE ,316}, + {"serialnumber" ,CRYPTCERT_PROP_SERIALNUMBER ,JSPROP_ENUMERATE ,316}, + {"subjectpublickeyinfo" ,CRYPTCERT_PROP_SUBJECTPUBLICKEYINFO ,JSPROP_ENUMERATE ,316}, + {"certificate" ,CRYPTCERT_PROP_CERTIFICATE ,JSPROP_ENUMERATE ,316}, + {"cacertificate" ,CRYPTCERT_PROP_CACERTIFICATE ,JSPROP_ENUMERATE ,316}, + {"issuername" ,CRYPTCERT_PROP_ISSUERNAME ,JSPROP_ENUMERATE ,316}, + {"validfrom" ,CRYPTCERT_PROP_VALIDFROM ,JSPROP_ENUMERATE ,316}, + {"validto" ,CRYPTCERT_PROP_VALIDTO ,JSPROP_ENUMERATE ,316}, + {"subjectname" ,CRYPTCERT_PROP_SUBJECTNAME ,JSPROP_ENUMERATE ,316}, + {"issueruniqueid" ,CRYPTCERT_PROP_ISSUERUNIQUEID ,JSPROP_ENUMERATE ,316}, + {"subjectuniqueid" ,CRYPTCERT_PROP_SUBJECTUNIQUEID ,JSPROP_ENUMERATE ,316}, + {"certrequest" ,CRYPTCERT_PROP_CERTREQUEST ,JSPROP_ENUMERATE ,316}, + {"thisupdate" ,CRYPTCERT_PROP_THISUPDATE ,JSPROP_ENUMERATE ,316}, + {"nextupdate" ,CRYPTCERT_PROP_NEXTUPDATE ,JSPROP_ENUMERATE ,316}, + {"revocationdate" ,CRYPTCERT_PROP_REVOCATIONDATE ,JSPROP_ENUMERATE ,316}, + {"revocationstatus" ,CRYPTCERT_PROP_REVOCATIONSTATUS ,JSPROP_ENUMERATE ,316}, + {"certstatus" ,CRYPTCERT_PROP_CERTSTATUS ,JSPROP_ENUMERATE ,316}, + {"dn" ,CRYPTCERT_PROP_DN ,JSPROP_ENUMERATE ,316}, + {"pkiuser_id" ,CRYPTCERT_PROP_PKIUSER_ID ,JSPROP_ENUMERATE ,316}, + {"pkiuser_issuepassword" ,CRYPTCERT_PROP_PKIUSER_ISSUEPASSWORD ,JSPROP_ENUMERATE ,316}, + {"pkiuser_revpassword" ,CRYPTCERT_PROP_PKIUSER_REVPASSWORD ,JSPROP_ENUMERATE ,316}, + {"pkiuser_ra" ,CRYPTCERT_PROP_PKIUSER_RA ,JSPROP_ENUMERATE ,316}, + {"countryname" ,CRYPTCERT_PROP_COUNTRYNAME ,JSPROP_ENUMERATE ,316}, + {"stateorprovincename" ,CRYPTCERT_PROP_STATEORPROVINCENAME ,JSPROP_ENUMERATE ,316}, + {"localityname" ,CRYPTCERT_PROP_LOCALITYNAME ,JSPROP_ENUMERATE ,316}, + {"organizationname" ,CRYPTCERT_PROP_ORGANIZATIONNAME ,JSPROP_ENUMERATE ,316}, + {"organizationalunitname" ,CRYPTCERT_PROP_ORGANIZATIONALUNITNAME ,JSPROP_ENUMERATE ,316}, + {"commonname" ,CRYPTCERT_PROP_COMMONNAME ,JSPROP_ENUMERATE ,316}, + {"othername_typeid" ,CRYPTCERT_PROP_OTHERNAME_TYPEID ,JSPROP_ENUMERATE ,316}, + {"othername_value" ,CRYPTCERT_PROP_OTHERNAME_VALUE ,JSPROP_ENUMERATE ,316}, + {"rfc822name" ,CRYPTCERT_PROP_RFC822NAME ,JSPROP_ENUMERATE ,316}, + {"dnsname" ,CRYPTCERT_PROP_DNSNAME ,JSPROP_ENUMERATE ,316}, + {"directoryname" ,CRYPTCERT_PROP_DIRECTORYNAME ,JSPROP_ENUMERATE ,316}, + {"edipartyname_nameassigner",CRYPTCERT_PROP_EDIPARTYNAME_NAMEASSIGNER ,JSPROP_ENUMERATE ,316}, + {"edipartyname_partyname" ,CRYPTCERT_PROP_EDIPARTYNAME_PARTYNAME ,JSPROP_ENUMERATE ,316}, + {"uniformresourceidentifier",CRYPTCERT_PROP_UNIFORMRESOURCEIDENTIFIER ,JSPROP_ENUMERATE ,316}, + {"ipaddress" ,CRYPTCERT_PROP_IPADDRESS ,JSPROP_ENUMERATE ,316}, + {"registeredid" ,CRYPTCERT_PROP_REGISTEREDID ,JSPROP_ENUMERATE ,316}, + {"challengepassword" ,CRYPTCERT_PROP_CHALLENGEPASSWORD ,JSPROP_ENUMERATE ,316}, + {"crlextreason" ,CRYPTCERT_PROP_CRLEXTREASON ,JSPROP_ENUMERATE ,316}, + {"keyfeatures" ,CRYPTCERT_PROP_KEYFEATURES ,JSPROP_ENUMERATE ,316}, + {"authorityinfoaccess" ,CRYPTCERT_PROP_AUTHORITYINFOACCESS ,JSPROP_ENUMERATE ,316}, + {"authorityinfo_rtcs" ,CRYPTCERT_PROP_AUTHORITYINFO_RTCS ,JSPROP_ENUMERATE ,316}, + {"authorityinfo_ocsp" ,CRYPTCERT_PROP_AUTHORITYINFO_OCSP ,JSPROP_ENUMERATE ,316}, + {"authorityinfo_caissuers" ,CRYPTCERT_PROP_AUTHORITYINFO_CAISSUERS ,JSPROP_ENUMERATE ,316}, + {"authorityinfo_certstore" ,CRYPTCERT_PROP_AUTHORITYINFO_CERTSTORE ,JSPROP_ENUMERATE ,316}, + {"authorityinfo_crls" ,CRYPTCERT_PROP_AUTHORITYINFO_CRLS ,JSPROP_ENUMERATE ,316}, + {"biometricinfo" ,CRYPTCERT_PROP_BIOMETRICINFO ,JSPROP_ENUMERATE ,316}, + {"biometricinfo_type" ,CRYPTCERT_PROP_BIOMETRICINFO_TYPE ,JSPROP_ENUMERATE ,316}, + {"biometricinfo_hashalgo" ,CRYPTCERT_PROP_BIOMETRICINFO_HASHALGO ,JSPROP_ENUMERATE ,316}, + {"biometricinfo_hash" ,CRYPTCERT_PROP_BIOMETRICINFO_HASH ,JSPROP_ENUMERATE ,316}, + {"biometricinfo_url" ,CRYPTCERT_PROP_BIOMETRICINFO_URL ,JSPROP_ENUMERATE ,316}, + {"qcstatement" ,CRYPTCERT_PROP_QCSTATEMENT ,JSPROP_ENUMERATE ,316}, + {"qcstatement_semantics" ,CRYPTCERT_PROP_QCSTATEMENT_SEMANTICS ,JSPROP_ENUMERATE ,316}, + {"qcstatement_registrationauthority",CRYPTCERT_PROP_QCSTATEMENT_REGISTRATIONAUTHORITY ,JSPROP_ENUMERATE ,316}, + {"ipaddressblocks" ,CRYPTCERT_PROP_IPADDRESSBLOCKS ,JSPROP_ENUMERATE ,316}, + {"ipaddressblocks_addressfamily",CRYPTCERT_PROP_IPADDRESSBLOCKS_ADDRESSFAMILY ,JSPROP_ENUMERATE ,316}, + {"ipaddressblocks_prefix" ,CRYPTCERT_PROP_IPADDRESSBLOCKS_PREFIX ,JSPROP_ENUMERATE ,316}, + {"ipaddressblocks_min" ,CRYPTCERT_PROP_IPADDRESSBLOCKS_MIN ,JSPROP_ENUMERATE ,316}, + {"ipaddressblocks_max" ,CRYPTCERT_PROP_IPADDRESSBLOCKS_MAX ,JSPROP_ENUMERATE ,316}, + {"autonomoussysids" ,CRYPTCERT_PROP_AUTONOMOUSSYSIDS ,JSPROP_ENUMERATE ,316}, + {"autonomoussysids_asnum_id",CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_ID ,JSPROP_ENUMERATE ,316}, + {"autonomoussysids_asnum_min",CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_MIN ,JSPROP_ENUMERATE ,316}, + {"autonomoussysids_asnum_max",CRYPTCERT_PROP_AUTONOMOUSSYSIDS_ASNUM_MAX ,JSPROP_ENUMERATE ,316}, + {"ocsp_nonce" ,CRYPTCERT_PROP_OCSP_NONCE ,JSPROP_ENUMERATE ,316}, + {"ocsp_response" ,CRYPTCERT_PROP_OCSP_RESPONSE ,JSPROP_ENUMERATE ,316}, + {"ocsp_response_ocsp" ,CRYPTCERT_PROP_OCSP_RESPONSE_OCSP ,JSPROP_ENUMERATE ,316}, + {"ocsp_nocheck" ,CRYPTCERT_PROP_OCSP_NOCHECK ,JSPROP_ENUMERATE ,316}, + {"ocsp_archivecutoff" ,CRYPTCERT_PROP_OCSP_ARCHIVECUTOFF ,JSPROP_ENUMERATE ,316}, + {"subjectinfoaccess" ,CRYPTCERT_PROP_SUBJECTINFOACCESS ,JSPROP_ENUMERATE ,316}, + {"subjectinfo_timestamping" ,CRYPTCERT_PROP_SUBJECTINFO_TIMESTAMPING ,JSPROP_ENUMERATE ,316}, + {"subjectinfo_carepository" ,CRYPTCERT_PROP_SUBJECTINFO_CAREPOSITORY ,JSPROP_ENUMERATE ,316}, + {"subjectinfo_signedobjectrepository",CRYPTCERT_PROP_SUBJECTINFO_SIGNEDOBJECTREPOSITORY ,JSPROP_ENUMERATE ,316}, + {"subjectinfo_rpkimanifest" ,CRYPTCERT_PROP_SUBJECTINFO_RPKIMANIFEST ,JSPROP_ENUMERATE ,316}, + {"subjectinfo_signedobject" ,CRYPTCERT_PROP_SUBJECTINFO_SIGNEDOBJECT ,JSPROP_ENUMERATE ,316}, + {"sigg_dateofcertgen" ,CRYPTCERT_PROP_SIGG_DATEOFCERTGEN ,JSPROP_ENUMERATE ,316}, + {"sigg_procuration" ,CRYPTCERT_PROP_SIGG_PROCURATION ,JSPROP_ENUMERATE ,316}, + {"sigg_procure_country" ,CRYPTCERT_PROP_SIGG_PROCURE_COUNTRY ,JSPROP_ENUMERATE ,316}, + {"sigg_procure_typeofsubstitution",CRYPTCERT_PROP_SIGG_PROCURE_TYPEOFSUBSTITUTION ,JSPROP_ENUMERATE ,316}, + {"sigg_procure_signingfor" ,CRYPTCERT_PROP_SIGG_PROCURE_SIGNINGFOR ,JSPROP_ENUMERATE ,316}, + {"sigg_admissions" ,CRYPTCERT_PROP_SIGG_ADMISSIONS ,JSPROP_ENUMERATE ,316}, + {"sigg_admissions_authority",CRYPTCERT_PROP_SIGG_ADMISSIONS_AUTHORITY ,JSPROP_ENUMERATE ,316}, + {"sigg_admissions_namingauthid",CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHID ,JSPROP_ENUMERATE ,316}, + {"sigg_admissions_namingauthurl",CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHURL ,JSPROP_ENUMERATE ,316}, + {"sigg_admissions_namingauthtext",CRYPTCERT_PROP_SIGG_ADMISSIONS_NAMINGAUTHTEXT ,JSPROP_ENUMERATE ,316}, + {"sigg_admissions_professionitem",CRYPTCERT_PROP_SIGG_ADMISSIONS_PROFESSIONITEM ,JSPROP_ENUMERATE ,316}, + {"sigg_admissions_professionoid",CRYPTCERT_PROP_SIGG_ADMISSIONS_PROFESSIONOID ,JSPROP_ENUMERATE ,316}, + {"sigg_admissions_registrationnumber",CRYPTCERT_PROP_SIGG_ADMISSIONS_REGISTRATIONNUMBER ,JSPROP_ENUMERATE ,316}, + {"sigg_monetarylimit" ,CRYPTCERT_PROP_SIGG_MONETARYLIMIT ,JSPROP_ENUMERATE ,316}, + {"sigg_monetary_currency" ,CRYPTCERT_PROP_SIGG_MONETARY_CURRENCY ,JSPROP_ENUMERATE ,316}, + {"sigg_monetary_amount" ,CRYPTCERT_PROP_SIGG_MONETARY_AMOUNT ,JSPROP_ENUMERATE ,316}, + {"sigg_monetary_exponent" ,CRYPTCERT_PROP_SIGG_MONETARY_EXPONENT ,JSPROP_ENUMERATE ,316}, + {"sigg_declarationofmajority",CRYPTCERT_PROP_SIGG_DECLARATIONOFMAJORITY ,JSPROP_ENUMERATE ,316}, + {"sigg_declarationofmajority_country",CRYPTCERT_PROP_SIGG_DECLARATIONOFMAJORITY_COUNTRY ,JSPROP_ENUMERATE ,316}, + {"sigg_restriction" ,CRYPTCERT_PROP_SIGG_RESTRICTION ,JSPROP_ENUMERATE ,316}, + {"sigg_certhash" ,CRYPTCERT_PROP_SIGG_CERTHASH ,JSPROP_ENUMERATE ,316}, + {"sigg_additionalinformation",CRYPTCERT_PROP_SIGG_ADDITIONALINFORMATION ,JSPROP_ENUMERATE ,316}, + {"strongextranet" ,CRYPTCERT_PROP_STRONGEXTRANET ,JSPROP_ENUMERATE ,316}, + {"strongextranet_zone" ,CRYPTCERT_PROP_STRONGEXTRANET_ZONE ,JSPROP_ENUMERATE ,316}, + {"strongextranet_id" ,CRYPTCERT_PROP_STRONGEXTRANET_ID ,JSPROP_ENUMERATE ,316}, + {"subjectdirectoryattributes",CRYPTCERT_PROP_SUBJECTDIRECTORYATTRIBUTES ,JSPROP_ENUMERATE ,316}, + {"subjectdir_type" ,CRYPTCERT_PROP_SUBJECTDIR_TYPE ,JSPROP_ENUMERATE ,316}, + {"subjectdir_values" ,CRYPTCERT_PROP_SUBJECTDIR_VALUES ,JSPROP_ENUMERATE ,316}, + {"subjectkeyidentifier" ,CRYPTCERT_PROP_SUBJECTKEYIDENTIFIER ,JSPROP_ENUMERATE ,316}, + {"keyusage" ,CRYPTCERT_PROP_KEYUSAGE ,JSPROP_ENUMERATE ,316}, + {"privatekeyusageperiod" ,CRYPTCERT_PROP_PRIVATEKEYUSAGEPERIOD ,JSPROP_ENUMERATE ,316}, + {"privatekey_notbefore" ,CRYPTCERT_PROP_PRIVATEKEY_NOTBEFORE ,JSPROP_ENUMERATE ,316}, + {"privatekey_notafter" ,CRYPTCERT_PROP_PRIVATEKEY_NOTAFTER ,JSPROP_ENUMERATE ,316}, + {"subjectaltname" ,CRYPTCERT_PROP_SUBJECTALTNAME ,JSPROP_ENUMERATE ,316}, + {"issueraltname" ,CRYPTCERT_PROP_ISSUERALTNAME ,JSPROP_ENUMERATE ,316}, + {"basicconstraints" ,CRYPTCERT_PROP_BASICCONSTRAINTS ,JSPROP_ENUMERATE ,316}, + {"ca" ,CRYPTCERT_PROP_CA ,JSPROP_ENUMERATE ,316}, + {"pathlenconstraint" ,CRYPTCERT_PROP_PATHLENCONSTRAINT ,JSPROP_ENUMERATE ,316}, + {"crlnumber" ,CRYPTCERT_PROP_CRLNUMBER ,JSPROP_ENUMERATE ,316}, + {"crlreason" ,CRYPTCERT_PROP_CRLREASON ,JSPROP_ENUMERATE ,316}, + {"holdinstructioncode" ,CRYPTCERT_PROP_HOLDINSTRUCTIONCODE ,JSPROP_ENUMERATE ,316}, + {"invaliditydate" ,CRYPTCERT_PROP_INVALIDITYDATE ,JSPROP_ENUMERATE ,316}, + {"deltacrlindicator" ,CRYPTCERT_PROP_DELTACRLINDICATOR ,JSPROP_ENUMERATE ,316}, + {"issuingdistributionpoint" ,CRYPTCERT_PROP_ISSUINGDISTRIBUTIONPOINT ,JSPROP_ENUMERATE ,316}, + {"issuingdist_fullname" ,CRYPTCERT_PROP_ISSUINGDIST_FULLNAME ,JSPROP_ENUMERATE ,316}, + {"issuingdist_usercertsonly",CRYPTCERT_PROP_ISSUINGDIST_USERCERTSONLY ,JSPROP_ENUMERATE ,316}, + {"issuingdist_cacertsonly" ,CRYPTCERT_PROP_ISSUINGDIST_CACERTSONLY ,JSPROP_ENUMERATE ,316}, + {"issuingdist_somereasonsonly",CRYPTCERT_PROP_ISSUINGDIST_SOMEREASONSONLY ,JSPROP_ENUMERATE ,316}, + {"issuingdist_indirectcrl" ,CRYPTCERT_PROP_ISSUINGDIST_INDIRECTCRL ,JSPROP_ENUMERATE ,316}, + {"certificateissuer" ,CRYPTCERT_PROP_CERTIFICATEISSUER ,JSPROP_ENUMERATE ,316}, + {"nameconstraints" ,CRYPTCERT_PROP_NAMECONSTRAINTS ,JSPROP_ENUMERATE ,316}, + {"permittedsubtrees" ,CRYPTCERT_PROP_PERMITTEDSUBTREES ,JSPROP_ENUMERATE ,316}, + {"excludedsubtrees" ,CRYPTCERT_PROP_EXCLUDEDSUBTREES ,JSPROP_ENUMERATE ,316}, + {"crldistributionpoint" ,CRYPTCERT_PROP_CRLDISTRIBUTIONPOINT ,JSPROP_ENUMERATE ,316}, + {"crldist_fullname" ,CRYPTCERT_PROP_CRLDIST_FULLNAME ,JSPROP_ENUMERATE ,316}, + {"crldist_reasons" ,CRYPTCERT_PROP_CRLDIST_REASONS ,JSPROP_ENUMERATE ,316}, + {"crldist_crlissuer" ,CRYPTCERT_PROP_CRLDIST_CRLISSUER ,JSPROP_ENUMERATE ,316}, + {"certificatepolicies" ,CRYPTCERT_PROP_CERTIFICATEPOLICIES ,JSPROP_ENUMERATE ,316}, + {"certpolicyid" ,CRYPTCERT_PROP_CERTPOLICYID ,JSPROP_ENUMERATE ,316}, + {"certpolicy_cpsuri" ,CRYPTCERT_PROP_CERTPOLICY_CPSURI ,JSPROP_ENUMERATE ,316}, + {"certpolicy_organization" ,CRYPTCERT_PROP_CERTPOLICY_ORGANIZATION ,JSPROP_ENUMERATE ,316}, + {"certpolicy_noticenumbers" ,CRYPTCERT_PROP_CERTPOLICY_NOTICENUMBERS ,JSPROP_ENUMERATE ,316}, + {"certpolicy_explicittext" ,CRYPTCERT_PROP_CERTPOLICY_EXPLICITTEXT ,JSPROP_ENUMERATE ,316}, + {"policymappings" ,CRYPTCERT_PROP_POLICYMAPPINGS ,JSPROP_ENUMERATE ,316}, + {"issuerdomainpolicy" ,CRYPTCERT_PROP_ISSUERDOMAINPOLICY ,JSPROP_ENUMERATE ,316}, + {"subjectdomainpolicy" ,CRYPTCERT_PROP_SUBJECTDOMAINPOLICY ,JSPROP_ENUMERATE ,316}, + {"authoritykeyidentifier" ,CRYPTCERT_PROP_AUTHORITYKEYIDENTIFIER ,JSPROP_ENUMERATE ,316}, + {"authority_keyidentifier" ,CRYPTCERT_PROP_AUTHORITY_KEYIDENTIFIER ,JSPROP_ENUMERATE ,316}, + {"authority_certissuer" ,CRYPTCERT_PROP_AUTHORITY_CERTISSUER ,JSPROP_ENUMERATE ,316}, + {"authority_certserialnumber",CRYPTCERT_PROP_AUTHORITY_CERTSERIALNUMBER ,JSPROP_ENUMERATE ,316}, + {"policyconstraints" ,CRYPTCERT_PROP_POLICYCONSTRAINTS ,JSPROP_ENUMERATE ,316}, + {"requireexplicitpolicy" ,CRYPTCERT_PROP_REQUIREEXPLICITPOLICY ,JSPROP_ENUMERATE ,316}, + {"inhibitpolicymapping" ,CRYPTCERT_PROP_INHIBITPOLICYMAPPING ,JSPROP_ENUMERATE ,316}, + {"extkeyusage" ,CRYPTCERT_PROP_EXTKEYUSAGE ,JSPROP_ENUMERATE ,316}, + {"extkey_ms_individualcodesigning",CRYPTCERT_PROP_EXTKEY_MS_INDIVIDUALCODESIGNING ,JSPROP_ENUMERATE ,316}, + {"extkey_ms_commercialcodesigning",CRYPTCERT_PROP_EXTKEY_MS_COMMERCIALCODESIGNING ,JSPROP_ENUMERATE ,316}, + {"extkey_ms_certtrustlistsigning",CRYPTCERT_PROP_EXTKEY_MS_CERTTRUSTLISTSIGNING ,JSPROP_ENUMERATE ,316}, + {"extkey_ms_timestampsigning",CRYPTCERT_PROP_EXTKEY_MS_TIMESTAMPSIGNING ,JSPROP_ENUMERATE ,316}, + {"extkey_ms_servergatedcrypto",CRYPTCERT_PROP_EXTKEY_MS_SERVERGATEDCRYPTO ,JSPROP_ENUMERATE ,316}, + {"extkey_ms_encryptedfilesystem",CRYPTCERT_PROP_EXTKEY_MS_ENCRYPTEDFILESYSTEM ,JSPROP_ENUMERATE ,316}, + {"extkey_serverauth" ,CRYPTCERT_PROP_EXTKEY_SERVERAUTH ,JSPROP_ENUMERATE ,316}, + {"extkey_clientauth" ,CRYPTCERT_PROP_EXTKEY_CLIENTAUTH ,JSPROP_ENUMERATE ,316}, + {"extkey_codesigning" ,CRYPTCERT_PROP_EXTKEY_CODESIGNING ,JSPROP_ENUMERATE ,316}, + {"extkey_emailprotection" ,CRYPTCERT_PROP_EXTKEY_EMAILPROTECTION ,JSPROP_ENUMERATE ,316}, + {"extkey_ipsecendsystem" ,CRYPTCERT_PROP_EXTKEY_IPSECENDSYSTEM ,JSPROP_ENUMERATE ,316}, + {"extkey_ipsectunnel" ,CRYPTCERT_PROP_EXTKEY_IPSECTUNNEL ,JSPROP_ENUMERATE ,316}, + {"extkey_ipsecuser" ,CRYPTCERT_PROP_EXTKEY_IPSECUSER ,JSPROP_ENUMERATE ,316}, + {"extkey_timestamping" ,CRYPTCERT_PROP_EXTKEY_TIMESTAMPING ,JSPROP_ENUMERATE ,316}, + {"extkey_ocspsigning" ,CRYPTCERT_PROP_EXTKEY_OCSPSIGNING ,JSPROP_ENUMERATE ,316}, + {"extkey_directoryservice" ,CRYPTCERT_PROP_EXTKEY_DIRECTORYSERVICE ,JSPROP_ENUMERATE ,316}, + {"extkey_anykeyusage" ,CRYPTCERT_PROP_EXTKEY_ANYKEYUSAGE ,JSPROP_ENUMERATE ,316}, + {"extkey_ns_servergatedcrypto",CRYPTCERT_PROP_EXTKEY_NS_SERVERGATEDCRYPTO ,JSPROP_ENUMERATE ,316}, + {"extkey_vs_servergatedcrypto_ca",CRYPTCERT_PROP_EXTKEY_VS_SERVERGATEDCRYPTO_CA ,JSPROP_ENUMERATE ,316}, + {"crlstreamidentifier" ,CRYPTCERT_PROP_CRLSTREAMIDENTIFIER ,JSPROP_ENUMERATE ,316}, + {"freshestcrl" ,CRYPTCERT_PROP_FRESHESTCRL ,JSPROP_ENUMERATE ,316}, + {"freshestcrl_fullname" ,CRYPTCERT_PROP_FRESHESTCRL_FULLNAME ,JSPROP_ENUMERATE ,316}, + {"freshestcrl_reasons" ,CRYPTCERT_PROP_FRESHESTCRL_REASONS ,JSPROP_ENUMERATE ,316}, + {"freshestcrl_crlissuer" ,CRYPTCERT_PROP_FRESHESTCRL_CRLISSUER ,JSPROP_ENUMERATE ,316}, + {"orderedlist" ,CRYPTCERT_PROP_ORDEREDLIST ,JSPROP_ENUMERATE ,316}, + {"baseupdatetime" ,CRYPTCERT_PROP_BASEUPDATETIME ,JSPROP_ENUMERATE ,316}, + {"deltainfo" ,CRYPTCERT_PROP_DELTAINFO ,JSPROP_ENUMERATE ,316}, + {"deltainfo_location" ,CRYPTCERT_PROP_DELTAINFO_LOCATION ,JSPROP_ENUMERATE ,316}, + {"deltainfo_nextdelta" ,CRYPTCERT_PROP_DELTAINFO_NEXTDELTA ,JSPROP_ENUMERATE ,316}, + {"inhibitanypolicy" ,CRYPTCERT_PROP_INHIBITANYPOLICY ,JSPROP_ENUMERATE ,316}, + {"toberevoked" ,CRYPTCERT_PROP_TOBEREVOKED ,JSPROP_ENUMERATE ,316}, + {"toberevoked_certissuer" ,CRYPTCERT_PROP_TOBEREVOKED_CERTISSUER ,JSPROP_ENUMERATE ,316}, + {"toberevoked_reasoncode" ,CRYPTCERT_PROP_TOBEREVOKED_REASONCODE ,JSPROP_ENUMERATE ,316}, + {"toberevoked_revocationtime" ,CRYPTCERT_PROP_TOBEREVOKED_REVOCATIONTIME ,JSPROP_ENUMERATE ,316}, + {"toberevoked_certserialnumber" ,CRYPTCERT_PROP_TOBEREVOKED_CERTSERIALNUMBER ,JSPROP_ENUMERATE ,316}, + {"revokedgroups" ,CRYPTCERT_PROP_REVOKEDGROUPS ,JSPROP_ENUMERATE ,316}, + {"revokedgroups_certissuer" ,CRYPTCERT_PROP_REVOKEDGROUPS_CERTISSUER ,JSPROP_ENUMERATE ,316}, + {"revokedgroups_reasoncode" ,CRYPTCERT_PROP_REVOKEDGROUPS_REASONCODE ,JSPROP_ENUMERATE ,316}, + {"revokedgroups_invaliditydate" ,CRYPTCERT_PROP_REVOKEDGROUPS_INVALIDITYDATE ,JSPROP_ENUMERATE ,316}, + {"revokedgroups_startingnumber" ,CRYPTCERT_PROP_REVOKEDGROUPS_STARTINGNUMBER ,JSPROP_ENUMERATE ,316}, + {"revokedgroups_endingnumber" ,CRYPTCERT_PROP_REVOKEDGROUPS_ENDINGNUMBER ,JSPROP_ENUMERATE ,316}, + {"expiredcertsoncrl" ,CRYPTCERT_PROP_EXPIREDCERTSONCRL ,JSPROP_ENUMERATE ,316}, + {"aaissuingdistributionpoint" ,CRYPTCERT_PROP_AAISSUINGDISTRIBUTIONPOINT ,JSPROP_ENUMERATE ,316}, + {"aaissuingdist_fullname" ,CRYPTCERT_PROP_AAISSUINGDIST_FULLNAME ,JSPROP_ENUMERATE ,316}, + {"aaissuingdist_somereasonsonly" ,CRYPTCERT_PROP_AAISSUINGDIST_SOMEREASONSONLY ,JSPROP_ENUMERATE ,316}, + {"aaissuingdist_indirectcrl" ,CRYPTCERT_PROP_AAISSUINGDIST_INDIRECTCRL ,JSPROP_ENUMERATE ,316}, + {"aaissuingdist_userattrcerts" ,CRYPTCERT_PROP_AAISSUINGDIST_USERATTRCERTS ,JSPROP_ENUMERATE ,316}, + {"aaissuingdist_aacerts" ,CRYPTCERT_PROP_AAISSUINGDIST_AACERTS ,JSPROP_ENUMERATE ,316}, + {"aaissuingdist_soacerts" ,CRYPTCERT_PROP_AAISSUINGDIST_SOACERTS ,JSPROP_ENUMERATE ,316}, + {"ns_certtype" ,CRYPTCERT_PROP_NS_CERTTYPE ,JSPROP_ENUMERATE ,316}, + {"ns_baseurl" ,CRYPTCERT_PROP_NS_BASEURL ,JSPROP_ENUMERATE ,316}, + {"ns_revocationurl" ,CRYPTCERT_PROP_NS_REVOCATIONURL ,JSPROP_ENUMERATE ,316}, + {"ns_carevocationurl" ,CRYPTCERT_PROP_NS_CAREVOCATIONURL ,JSPROP_ENUMERATE ,316}, + {"ns_certrenewalurl" ,CRYPTCERT_PROP_NS_CERTRENEWALURL ,JSPROP_ENUMERATE ,316}, + {"ns_capolicyurl" ,CRYPTCERT_PROP_NS_CAPOLICYURL ,JSPROP_ENUMERATE ,316}, + {"ns_sslservername" ,CRYPTCERT_PROP_NS_SSLSERVERNAME ,JSPROP_ENUMERATE ,316}, + {"ns_comment" ,CRYPTCERT_PROP_NS_COMMENT ,JSPROP_ENUMERATE ,316}, + {"set_hashedrootkey" ,CRYPTCERT_PROP_SET_HASHEDROOTKEY ,JSPROP_ENUMERATE ,316}, + {"set_rootkeythumbprint" ,CRYPTCERT_PROP_SET_ROOTKEYTHUMBPRINT ,JSPROP_ENUMERATE ,316}, + {"set_certificatetype" ,CRYPTCERT_PROP_SET_CERTIFICATETYPE ,JSPROP_ENUMERATE ,316}, + {"set_merchantdata" ,CRYPTCERT_PROP_SET_MERCHANTDATA ,JSPROP_ENUMERATE ,316}, + {"set_merid" ,CRYPTCERT_PROP_SET_MERID ,JSPROP_ENUMERATE ,316}, + {"set_meracquirerbin" ,CRYPTCERT_PROP_SET_MERACQUIRERBIN ,JSPROP_ENUMERATE ,316}, + {"set_merchantlanguage" ,CRYPTCERT_PROP_SET_MERCHANTLANGUAGE ,JSPROP_ENUMERATE ,316}, + {"set_merchantname" ,CRYPTCERT_PROP_SET_MERCHANTNAME ,JSPROP_ENUMERATE ,316}, + {"set_merchantcity" ,CRYPTCERT_PROP_SET_MERCHANTCITY ,JSPROP_ENUMERATE ,316}, + {"set_merchantstateprovince" ,CRYPTCERT_PROP_SET_MERCHANTSTATEPROVINCE ,JSPROP_ENUMERATE ,316}, + {"set_merchantpostalcode" ,CRYPTCERT_PROP_SET_MERCHANTPOSTALCODE ,JSPROP_ENUMERATE ,316}, + {"set_merchantcountryname" ,CRYPTCERT_PROP_SET_MERCHANTCOUNTRYNAME ,JSPROP_ENUMERATE ,316}, + {"set_mercountry" ,CRYPTCERT_PROP_SET_MERCOUNTRY ,JSPROP_ENUMERATE ,316}, + {"set_merauthflag" ,CRYPTCERT_PROP_SET_MERAUTHFLAG ,JSPROP_ENUMERATE ,316}, + {"set_certcardrequired" ,CRYPTCERT_PROP_SET_CERTCARDREQUIRED ,JSPROP_ENUMERATE ,316}, + {"set_tunneling" ,CRYPTCERT_PROP_SET_TUNNELING ,JSPROP_ENUMERATE ,316}, + {"set_tunnelingflag" ,CRYPTCERT_PROP_SET_TUNNELINGFLAG ,JSPROP_ENUMERATE ,316}, + {"set_tunnelingalgid" ,CRYPTCERT_PROP_SET_TUNNELINGALGID ,JSPROP_ENUMERATE ,316}, + {"cms_contenttype" ,CRYPTCERT_PROP_CMS_CONTENTTYPE ,JSPROP_ENUMERATE ,316}, + {"cms_messagedigest" ,CRYPTCERT_PROP_CMS_MESSAGEDIGEST ,JSPROP_ENUMERATE ,316}, + {"cms_signingtime" ,CRYPTCERT_PROP_CMS_SIGNINGTIME ,JSPROP_ENUMERATE ,316}, + {"cms_countersignature" ,CRYPTCERT_PROP_CMS_COUNTERSIGNATURE ,JSPROP_ENUMERATE ,316}, + {"cms_signingdescription" ,CRYPTCERT_PROP_CMS_SIGNINGDESCRIPTION ,JSPROP_ENUMERATE ,316}, + {"cms_smimecapabilities" ,CRYPTCERT_PROP_CMS_SMIMECAPABILITIES ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_3des" ,CRYPTCERT_PROP_CMS_SMIMECAP_3DES ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_aes" ,CRYPTCERT_PROP_CMS_SMIMECAP_AES ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_cast128" ,CRYPTCERT_PROP_CMS_SMIMECAP_CAST128 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_shang" ,CRYPTCERT_PROP_CMS_SMIMECAP_SHAng ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_sha2" ,CRYPTCERT_PROP_CMS_SMIMECAP_SHA2 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_sha1" ,CRYPTCERT_PROP_CMS_SMIMECAP_SHA1 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_hmac_shang" ,CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHAng ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_hmac_sha2" ,CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHA2 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_hmac_sha1" ,CRYPTCERT_PROP_CMS_SMIMECAP_HMAC_SHA1 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_authenc256" ,CRYPTCERT_PROP_CMS_SMIMECAP_AUTHENC256 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_authenc128" ,CRYPTCERT_PROP_CMS_SMIMECAP_AUTHENC128 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_rsa_shang" ,CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHAng ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_rsa_sha2" ,CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHA2 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_rsa_sha1" ,CRYPTCERT_PROP_CMS_SMIMECAP_RSA_SHA1 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_dsa_sha1" ,CRYPTCERT_PROP_CMS_SMIMECAP_DSA_SHA1 ,JSPROP_ENUMERATE ,316}, +#if 0 // TODO: TinyID only goes to 255! + {"cms_smimecap_ecdsa_shang" ,CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHAng ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_ecdsa_sha2" ,CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHA2 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_ecdsa_sha1" ,CRYPTCERT_PROP_CMS_SMIMECAP_ECDSA_SHA1 ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_prefersigneddata" ,CRYPTCERT_PROP_CMS_SMIMECAP_PREFERSIGNEDDATA ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_cannotdecryptany" ,CRYPTCERT_PROP_CMS_SMIMECAP_CANNOTDECRYPTANY ,JSPROP_ENUMERATE ,316}, + {"cms_smimecap_preferbinaryinside" ,CRYPTCERT_PROP_CMS_SMIMECAP_PREFERBINARYINSIDE ,JSPROP_ENUMERATE ,316}, + {"cms_receiptrequest" ,CRYPTCERT_PROP_CMS_RECEIPTREQUEST ,JSPROP_ENUMERATE ,316}, + {"cms_receipt_contentidentifier" ,CRYPTCERT_PROP_CMS_RECEIPT_CONTENTIDENTIFIER ,JSPROP_ENUMERATE ,316}, + {"cms_receipt_from" ,CRYPTCERT_PROP_CMS_RECEIPT_FROM ,JSPROP_ENUMERATE ,316}, + {"cms_receipt_to" ,CRYPTCERT_PROP_CMS_RECEIPT_TO ,JSPROP_ENUMERATE ,316}, + {"cms_securitylabel" ,CRYPTCERT_PROP_CMS_SECURITYLABEL ,JSPROP_ENUMERATE ,316}, + {"cms_seclabel_policy" ,CRYPTCERT_PROP_CMS_SECLABEL_POLICY ,JSPROP_ENUMERATE ,316}, + {"cms_seclabel_classification" ,CRYPTCERT_PROP_CMS_SECLABEL_CLASSIFICATION ,JSPROP_ENUMERATE ,316}, + {"cms_seclabel_privacymark" ,CRYPTCERT_PROP_CMS_SECLABEL_PRIVACYMARK ,JSPROP_ENUMERATE ,316}, + {"cms_seclabel_cattype" ,CRYPTCERT_PROP_CMS_SECLABEL_CATTYPE ,JSPROP_ENUMERATE ,316}, + {"cms_seclabel_catvalue" ,CRYPTCERT_PROP_CMS_SECLABEL_CATVALUE ,JSPROP_ENUMERATE ,316}, + {"cms_mlexpansionhistory" ,CRYPTCERT_PROP_CMS_MLEXPANSIONHISTORY ,JSPROP_ENUMERATE ,316}, + {"cms_mlexp_entityidentifier" ,CRYPTCERT_PROP_CMS_MLEXP_ENTITYIDENTIFIER ,JSPROP_ENUMERATE ,316}, + {"cms_mlexp_time" ,CRYPTCERT_PROP_CMS_MLEXP_TIME ,JSPROP_ENUMERATE ,316}, + {"cms_mlexp_none" ,CRYPTCERT_PROP_CMS_MLEXP_NONE ,JSPROP_ENUMERATE ,316}, + {"cms_mlexp_insteadof" ,CRYPTCERT_PROP_CMS_MLEXP_INSTEADOF ,JSPROP_ENUMERATE ,316}, + {"cms_mlexp_inadditionto" ,CRYPTCERT_PROP_CMS_MLEXP_INADDITIONTO ,JSPROP_ENUMERATE ,316}, + {"cms_contenthints" ,CRYPTCERT_PROP_CMS_CONTENTHINTS ,JSPROP_ENUMERATE ,316}, + {"cms_contenthint_description" ,CRYPTCERT_PROP_CMS_CONTENTHINT_DESCRIPTION ,JSPROP_ENUMERATE ,316}, + {"cms_contenthint_type" ,CRYPTCERT_PROP_CMS_CONTENTHINT_TYPE ,JSPROP_ENUMERATE ,316}, + {"cms_equivalentlabel" ,CRYPTCERT_PROP_CMS_EQUIVALENTLABEL ,JSPROP_ENUMERATE ,316}, + {"cms_eqvlabel_policy" ,CRYPTCERT_PROP_CMS_EQVLABEL_POLICY ,JSPROP_ENUMERATE ,316}, + {"cms_eqvlabel_classification" ,CRYPTCERT_PROP_CMS_EQVLABEL_CLASSIFICATION ,JSPROP_ENUMERATE ,316}, + {"cms_eqvlabel_privacymark" ,CRYPTCERT_PROP_CMS_EQVLABEL_PRIVACYMARK ,JSPROP_ENUMERATE ,316}, + {"cms_eqvlabel_cattype" ,CRYPTCERT_PROP_CMS_EQVLABEL_CATTYPE ,JSPROP_ENUMERATE ,316}, + {"cms_eqvlabel_catvalue" ,CRYPTCERT_PROP_CMS_EQVLABEL_CATVALUE ,JSPROP_ENUMERATE ,316}, + {"cms_signingcertificate" ,CRYPTCERT_PROP_CMS_SIGNINGCERTIFICATE ,JSPROP_ENUMERATE ,316}, + {"cms_signingcert_esscertid" ,CRYPTCERT_PROP_CMS_SIGNINGCERT_ESSCERTID ,JSPROP_ENUMERATE ,316}, + {"cms_signingcert_policies" ,CRYPTCERT_PROP_CMS_SIGNINGCERT_POLICIES ,JSPROP_ENUMERATE ,316}, + {"cms_signingcertificatev2" ,CRYPTCERT_PROP_CMS_SIGNINGCERTIFICATEV2 ,JSPROP_ENUMERATE ,316}, + {"cms_signingcertv2_esscertidv2" ,CRYPTCERT_PROP_CMS_SIGNINGCERTV2_ESSCERTIDV2 ,JSPROP_ENUMERATE ,316}, + {"cms_signingcertv2_policies" ,CRYPTCERT_PROP_CMS_SIGNINGCERTV2_POLICIES ,JSPROP_ENUMERATE ,316}, + {"cms_signaturepolicyid" ,CRYPTCERT_PROP_CMS_SIGNATUREPOLICYID ,JSPROP_ENUMERATE ,316}, + {"cms_sigpolicyid" ,CRYPTCERT_PROP_CMS_SIGPOLICYID ,JSPROP_ENUMERATE ,316}, + {"cms_sigpolicyhash" ,CRYPTCERT_PROP_CMS_SIGPOLICYHASH ,JSPROP_ENUMERATE ,316}, + {"cms_sigpolicy_cpsuri" ,CRYPTCERT_PROP_CMS_SIGPOLICY_CPSURI ,JSPROP_ENUMERATE ,316}, + {"cms_sigpolicy_organization" ,CRYPTCERT_PROP_CMS_SIGPOLICY_ORGANIZATION ,JSPROP_ENUMERATE ,316}, + {"cms_sigpolicy_noticenumbers" ,CRYPTCERT_PROP_CMS_SIGPOLICY_NOTICENUMBERS ,JSPROP_ENUMERATE ,316}, + {"cms_sigpolicy_explicittext" ,CRYPTCERT_PROP_CMS_SIGPOLICY_EXPLICITTEXT ,JSPROP_ENUMERATE ,316}, + {"cms_sigtypeidentifier" ,CRYPTCERT_PROP_CMS_SIGTYPEIDENTIFIER ,JSPROP_ENUMERATE ,316}, + {"cms_sigtypeid_originatorsig" ,CRYPTCERT_PROP_CMS_SIGTYPEID_ORIGINATORSIG ,JSPROP_ENUMERATE ,316}, + {"cms_sigtypeid_domainsig" ,CRYPTCERT_PROP_CMS_SIGTYPEID_DOMAINSIG ,JSPROP_ENUMERATE ,316}, + {"cms_sigtypeid_additionalattributes" ,CRYPTCERT_PROP_CMS_SIGTYPEID_ADDITIONALATTRIBUTES ,JSPROP_ENUMERATE ,316}, + {"cms_sigtypeid_reviewsig" ,CRYPTCERT_PROP_CMS_SIGTYPEID_REVIEWSIG ,JSPROP_ENUMERATE ,316}, + {"cms_nonce" ,CRYPTCERT_PROP_CMS_NONCE ,JSPROP_ENUMERATE ,316}, + {"scep_messagetype" ,CRYPTCERT_PROP_SCEP_MESSAGETYPE ,JSPROP_ENUMERATE ,316}, + {"scep_pkistatus" ,CRYPTCERT_PROP_SCEP_PKISTATUS ,JSPROP_ENUMERATE ,316}, + {"scep_failinfo" ,CRYPTCERT_PROP_SCEP_FAILINFO ,JSPROP_ENUMERATE ,316}, + {"scep_sendernonce" ,CRYPTCERT_PROP_SCEP_SENDERNONCE ,JSPROP_ENUMERATE ,316}, + {"scep_recipientnonce" ,CRYPTCERT_PROP_SCEP_RECIPIENTNONCE ,JSPROP_ENUMERATE ,316}, + {"scep_transactionid" ,CRYPTCERT_PROP_SCEP_TRANSACTIONID ,JSPROP_ENUMERATE ,316}, + {"cms_spcagencyinfo" ,CRYPTCERT_PROP_CMS_SPCAGENCYINFO ,JSPROP_ENUMERATE ,316}, + {"cms_spcagencyurl" ,CRYPTCERT_PROP_CMS_SPCAGENCYURL ,JSPROP_ENUMERATE ,316}, + {"cms_spcstatementtype" ,CRYPTCERT_PROP_CMS_SPCSTATEMENTTYPE ,JSPROP_ENUMERATE ,316}, + {"cms_spcstmt_individualcodesigning" ,CRYPTCERT_PROP_CMS_SPCSTMT_INDIVIDUALCODESIGNING ,JSPROP_ENUMERATE ,316}, + {"cms_spcstmt_commercialcodesigning" ,CRYPTCERT_PROP_CMS_SPCSTMT_COMMERCIALCODESIGNING ,JSPROP_ENUMERATE ,316}, + {"cms_spcopusinfo" ,CRYPTCERT_PROP_CMS_SPCOPUSINFO ,JSPROP_ENUMERATE ,316}, + {"cms_spcopusinfo_name" ,CRYPTCERT_PROP_CMS_SPCOPUSINFO_NAME ,JSPROP_ENUMERATE ,316}, + {"cms_spcopusinfo_url" ,CRYPTCERT_PROP_CMS_SPCOPUSINFO_URL ,JSPROP_ENUMERATE ,316}, +#endif + {0} +}; + +static jsSyncMethodSpec js_cryptcert_functions[] = { + {"check", js_check, 0, JSTYPE_BOOLEAN, "" + ,JSDOCSTR("Checks the certificate for validity.") + ,316 + }, + {"destroy", js_destroy, 0, JSTYPE_VOID, "" + ,JSDOCSTR("Destroys the certificate.") + ,316 + }, + {"export", js_export, 0, JSTYPE_STRING, "format" + ,JSDOCSTR("Exports the certificate in the format chosen from CryptCert.CERTFORMAT.") + ,316 + }, + {"sign", js_sign, 0, JSTYPE_VOID, "key" + ,JSDOCSTR("Signs the certificate with the specified CryptContext") + ,316 + }, + {0} +}; + +static JSBool js_cryptcert_resolve(JSContext *cx, JSObject *obj, jsid id) +{ + char* name=NULL; + JSBool ret; + + if(id != JSID_VOID && id != JSID_EMPTY) { + jsval idval; + + JS_IdToValue(cx, id, &idval); + if(JSVAL_IS_STRING(idval)) { + JSSTRING_TO_MSTRING(cx, JSVAL_TO_STRING(idval), name, NULL); + HANDLE_PENDING(cx, name); + } + } + + ret=js_SyncResolve(cx, obj, name, js_cryptcert_properties, js_cryptcert_functions, NULL, 0); + if(name) + free(name); + return ret; +} + +static JSBool js_cryptcert_enumerate(JSContext *cx, JSObject *obj) +{ + return(js_cryptcert_resolve(cx, obj, JSID_VOID)); +} + +static JSClass js_cryptcert_class = { + "CryptCert" /* name */ + ,JSCLASS_HAS_PRIVATE /* flags */ + ,JS_PropertyStub /* addProperty */ + ,JS_PropertyStub /* delProperty */ + ,js_cryptcert_get /* getProperty */ + ,js_cryptcert_set /* setProperty */ + ,js_cryptcert_enumerate /* enumerate */ + ,js_cryptcert_resolve /* resolve */ + ,JS_ConvertStub /* convert */ + ,js_finalize_cryptcert /* finalize */ +}; + +JSObject* DLLCALL js_CreateCryptCertObject(JSContext* cx, CRYPT_CERTIFICATE cert) +{ + JSObject *obj; + struct js_cryptcert_private_data *p; + + obj=JS_NewObject(cx, &js_cryptcert_class, NULL, NULL); + + if((p=(struct js_cryptcert_private_data *)malloc(sizeof(struct js_cryptcert_private_data)))==NULL) { + JS_ReportError(cx,"malloc failed"); + return NULL; + } + memset(p,0,sizeof(struct js_cryptcert_private_data)); + p->cert = cert; + + if(!JS_SetPrivate(cx, obj, p)) { + JS_ReportError(cx,"JS_SetPrivate failed"); + return NULL; + } + + return obj; +} + +// Constructor + +static JSBool +js_cryptcert_constructor(JSContext *cx, uintN argc, jsval *arglist) +{ + JSObject *obj; + jsval *argv=JS_ARGV(cx, arglist); + struct js_cryptcert_private_data *p; + jsrefcount rc; + int status; + int type; + char *buf; + JSString *jscert; + size_t len; + + do_cryptInit(); + obj=JS_NewObject(cx, &js_cryptcert_class, NULL, NULL); + JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(obj)); + if(argc != 1) { + JS_ReportError(cx, "Incorrect number of arguments to CryptCert constructor. Got %d, expected 1.", argc); + return JS_FALSE; + } + + if((p=(struct js_cryptcert_private_data *)malloc(sizeof(struct js_cryptcert_private_data)))==NULL) { + JS_ReportError(cx,"malloc failed"); + return(JS_FALSE); + } + memset(p,0,sizeof(struct js_cryptcert_private_data)); + + if(!JS_SetPrivate(cx, obj, p)) { + JS_ReportError(cx,"JS_SetPrivate failed"); + return(JS_FALSE); + } + + if (JSVAL_IS_STRING(argv[0])) { + // Import certificate + if ((jscert = JS_ValueToString(cx, argv[0])) == NULL) { + JS_ReportError(cx, "Invalid cert"); + return JS_FALSE; + } + JSSTRING_TO_MSTRING(cx, jscert, buf, &len); + HANDLE_PENDING(cx, buf); + rc = JS_SUSPENDREQUEST(cx); + status = cryptImportCert(buf, len, CRYPT_UNUSED, &p->cert); + free(buf); + JS_RESUMEREQUEST(cx, rc); + } + else { + if (!JS_ValueToInt32(cx,argv[0],&type)) + return JS_FALSE; + rc = JS_SUSPENDREQUEST(cx); + status = cryptCreateCert(&p->cert, CRYPT_UNUSED, type); + JS_RESUMEREQUEST(cx, rc); + } + + if (cryptStatusError(status)) { + JS_ReportError(cx, "CryptLib error %d", status); + free(p); + return JS_FALSE; + } + +#ifdef BUILD_JSDOCS + js_DescribeSyncObject(cx,obj,"Class used for Certificates",31601); + js_DescribeSyncConstructor(cx,obj,"To create a new CryptCert object: " + "var c = new CryptCert('<i>type</i> | <i>cert</i>')</tt><br> " + "where <i>type</i> " + "is a value from CryptCert.TYPE and <i>cert</i> is a DER encoded certificate string" + ); + js_CreateArrayOfStrings(cx, obj, "_property_desc_list", cryptcert_prop_desc, JSPROP_READONLY); +#endif + + return(JS_TRUE); +} + +JSObject* DLLCALL js_CreateCryptCertClass(JSContext* cx, JSObject* parent) +{ + JSObject* cksobj; + JSObject* constructor; + JSObject* type; + JSObject* format; + jsval val; + + cksobj = JS_InitClass(cx, parent, NULL + ,&js_cryptcert_class + ,js_cryptcert_constructor + ,1 /* number of constructor args */ + ,NULL /* props, specified in constructor */ + ,NULL /* funcs, specified in constructor */ + ,NULL, NULL); + + if(JS_GetProperty(cx, parent, js_cryptcert_class.name, &val) && !JSVAL_NULL_OR_VOID(val)) { + JS_ValueToObject(cx,val,&constructor); + type = JS_DefineObject(cx, constructor, "TYPE", NULL, NULL, JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + if(type != NULL) { + JS_DefineProperty(cx, type, "NONE", INT_TO_JSVAL(CRYPT_CERTTYPE_NONE), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "CERTIFICATE", INT_TO_JSVAL(CRYPT_CERTTYPE_CERTIFICATE), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "ATTRIBUTE_CERT", INT_TO_JSVAL(CRYPT_CERTTYPE_ATTRIBUTE_CERT), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "CERTCHAIN", INT_TO_JSVAL(CRYPT_CERTTYPE_CERTCHAIN), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "CERTREQUEST", INT_TO_JSVAL(CRYPT_CERTTYPE_CERTREQUEST), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "REQUEST_CERT", INT_TO_JSVAL(CRYPT_CERTTYPE_REQUEST_CERT), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "REQUEST_REVOCATION", INT_TO_JSVAL(CRYPT_CERTTYPE_REQUEST_REVOCATION), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "CRL", INT_TO_JSVAL(CRYPT_CERTTYPE_CRL), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "CMS_ATTRIBUTES", INT_TO_JSVAL(CRYPT_CERTTYPE_CMS_ATTRIBUTES), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "RTCS_REQUEST", INT_TO_JSVAL(CRYPT_CERTTYPE_RTCS_REQUEST), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "RTCS_RESPONSE", INT_TO_JSVAL(CRYPT_CERTTYPE_RTCS_RESPONSE), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "OCSP_REQUEST", INT_TO_JSVAL(CRYPT_CERTTYPE_OCSP_REQUEST), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "OCSP_RESPONSE", INT_TO_JSVAL(CRYPT_CERTTYPE_OCSP_RESPONSE), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "PKIUSER", INT_TO_JSVAL(CRYPT_CERTTYPE_PKIUSER), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DeepFreezeObject(cx, type); + } + format = JS_DefineObject(cx, constructor, "CERTFORMAT", NULL, NULL, JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + if(format != NULL) { + JS_DefineProperty(cx, type, "NONE", INT_TO_JSVAL(CRYPT_CERTFORMAT_NONE), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "CERTIFICATE", INT_TO_JSVAL(CRYPT_CERTFORMAT_CERTIFICATE), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "CERTCHAIN", INT_TO_JSVAL(CRYPT_CERTFORMAT_CERTCHAIN), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "TEXT_CERTIFICATE", INT_TO_JSVAL(CRYPT_CERTFORMAT_TEXT_CERTIFICATE), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "TEXT_CERTCHAIN", INT_TO_JSVAL(CRYPT_CERTFORMAT_TEXT_CERTCHAIN), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "XML_CERTIFICATE", INT_TO_JSVAL(CRYPT_CERTFORMAT_XML_CERTIFICATE), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DefineProperty(cx, type, "XML_CERTCHAIN", INT_TO_JSVAL(CRYPT_CERTFORMAT_XML_CERTCHAIN), NULL, NULL + , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + JS_DeepFreezeObject(cx, format); + } + } + + return(cksobj); +} diff --git a/src/sbbs3/js_cryptcert.h b/src/sbbs3/js_cryptcert.h new file mode 100644 index 0000000000000000000000000000000000000000..5b405a04327c02d21efd0337dc041edb6c3f8c91 --- /dev/null +++ b/src/sbbs3/js_cryptcert.h @@ -0,0 +1,10 @@ +#ifndef _JS_CRYPTCERT_H_ +#define _JS_CRYPTCERT_H_ + +struct js_cryptcert_private_data { + CRYPT_CERTIFICATE cert; +}; + +JSObject* DLLCALL js_CreateCryptCertObject(JSContext* cx, CRYPT_CERTIFICATE cert); + +#endif diff --git a/src/sbbs3/js_cryptkeyset.c b/src/sbbs3/js_cryptkeyset.c index d384f20708475431cc20d05b4eff12255cde6274..98d2e697fc290ee50263527ad6e0aa51be99062f 100644 --- a/src/sbbs3/js_cryptkeyset.c +++ b/src/sbbs3/js_cryptkeyset.c @@ -6,6 +6,7 @@ #include <cryptlib.h> #include "js_request.h" #include "js_cryptcon.h" +#include "js_cryptcert.h" #include "ssl.h" struct private_data { @@ -95,6 +96,50 @@ js_add_private_key(JSContext *cx, uintN argc, jsval *arglist) return JS_TRUE; } +static JSBool +js_add_public_key(JSContext *cx, uintN argc, jsval *arglist) +{ + struct private_data* p; + struct js_cryptcert_private_data* pcert; + jsval *argv=JS_ARGV(cx, arglist); + int status; + jsrefcount rc; + JSObject *cert; + JSObject *obj=JS_THIS_OBJECT(cx, arglist); + + if (!js_argc(cx, argc, 1)) + return JS_FALSE; + if (argc > 1) { + JS_ReportError(cx, "Too many arguments"); + return JS_FALSE; + } + cert = JSVAL_TO_OBJECT(argv[0]); + if (!JS_InstanceOf(cx, cert, &js_cryptcon_class, NULL)) { + JS_ReportError(cx, "Invalid CryptContext"); + return JS_FALSE; + } + + if ((p=(struct private_data *)JS_GetPrivate(cx,obj))==NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + + if ((pcert=(struct js_cryptcert_private_data *)JS_GetPrivate(cx,cert))==NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + + rc = JS_SUSPENDREQUEST(cx); + status = cryptAddPublicKey(p->ks, pcert->cert); + JS_RESUMEREQUEST(cx, rc); + + if (cryptStatusError(status)) { + JS_ReportError(cx, "Error %d calling cryptAddPublicKey()\n", status); + return JS_FALSE; + } + return JS_TRUE; +} + static JSBool js_close(JSContext *cx, uintN argc, jsval *arglist) { @@ -226,6 +271,53 @@ js_get_private_key(JSContext *cx, uintN argc, jsval *arglist) return JS_TRUE; } +static JSBool +js_get_public_key(JSContext *cx, uintN argc, jsval *arglist) +{ + struct private_data* p; + jsval *argv=JS_ARGV(cx, arglist); + int status; + jsrefcount rc; + JSObject *cert; + char* label = NULL; + JSString *jslabel; + CRYPT_CERTIFICATE ncert; + JSObject *obj=JS_THIS_OBJECT(cx, arglist); + + if (!js_argc(cx, argc, 1)) + return JS_FALSE; + if (argc > 1) { + JS_ReportError(cx, "Too many arguments"); + return JS_FALSE; + } + if ((jslabel = JS_ValueToString(cx, argv[0])) == NULL) { + JS_ReportError(cx, "Invalid label"); + return JS_FALSE; + } + + if ((p=(struct private_data *)JS_GetPrivate(cx,obj))==NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + + JSSTRING_TO_MSTRING(cx, jslabel, label, NULL); + HANDLE_PENDING(cx, label); + rc = JS_SUSPENDREQUEST(cx); + status = cryptGetPublicKey(p->ks, &ncert, CRYPT_KEYID_NAME, label); + free(label); + JS_RESUMEREQUEST(cx, rc); + if (cryptStatusError(status)) { + JS_ReportError(cx, "Error %d calling cryptGetPublicKey()\n", status); + return JS_FALSE; + } + cert = js_CreateCryptCertObject(cx, ncert); + if (cert == NULL) + return JS_FALSE; + JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(cert)); + + return JS_TRUE; +} + // Properties static JSBool @@ -290,6 +382,10 @@ static jsSyncMethodSpec js_cryptkeyset_functions[] = { ,JSDOCSTR("Add a private key to the keyset, encrypting it with <password>.") ,316 }, + {"add_public_key", js_add_public_key, 0, JSTYPE_VOID, "CryptCert" + ,JSDOCSTR("Add a public key (certificate) to the keyset.") + ,316 + }, {"close", js_close, 0, JSTYPE_VOID, "" ,JSDOCSTR("Close the keyset.") ,316 @@ -302,6 +398,10 @@ static jsSyncMethodSpec js_cryptkeyset_functions[] = { ,JSDOCSTR("Returns a CryptContext from the private key with <label> encrypted with <password>.") ,316 }, + {"get_public_key", js_get_public_key, 0, JSTYPE_OBJECT, "label" + ,JSDOCSTR("Returns a CryptCert from the public key with <label>.") + ,316 + }, {0} }; diff --git a/src/sbbs3/jsdoor.c b/src/sbbs3/jsdoor.c index b5d656355d77e754b6dbf42b3e51b258e82e8e80..3ca68134c8911d555dc4bb777ba11c0227229f2b 100644 --- a/src/sbbs3/jsdoor.c +++ b/src/sbbs3/jsdoor.c @@ -258,6 +258,10 @@ BOOL DLLCALL js_CreateCommonObjects(JSContext* js_cx if(js_CreateCryptKeysetClass(js_cx, *glob)==NULL) break; + /* CryptCert Class */ + if(js_CreateCryptCertClass(js_cx, *glob)==NULL) + break; + success=TRUE; } while(0); diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index 8712a440ac21d482931a8805cf35a0845194a29f..0f492065fb7c1af25243dfa9d39804eb4acec766 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -1370,6 +1370,10 @@ extern "C" BOOL DLLCALL js_CreateCommonObjects(JSContext* js_cx if(js_CreateCryptKeysetClass(js_cx, *glob)==NULL) break; + /* CryptCert Class */ + if(js_CreateCryptCertClass(js_cx, *glob)==NULL) + break; + /* Area Objects */ if(!js_CreateUserObjects(js_cx, *glob, cfg, /* user: */NULL, client, /* html_index_fname: */NULL, /* subscan: */NULL)) break; diff --git a/src/sbbs3/objects.mk b/src/sbbs3/objects.mk index 2aaffaf5f7ceae8162799e57d48ef85714f8ca22..74503ecd76ac83dd1e395352549e2b1187d71ca3 100644 --- a/src/sbbs3/objects.mk +++ b/src/sbbs3/objects.mk @@ -45,6 +45,7 @@ OBJS = $(MTOBJODIR)$(DIRSEP)ansiterm$(OFILE) \ $(MTOBJODIR)$(DIRSEP)js_client$(OFILE)\ $(MTOBJODIR)$(DIRSEP)js_com$(OFILE)\ $(MTOBJODIR)$(DIRSEP)js_console$(OFILE)\ + $(MTOBJODIR)$(DIRSEP)js_cryptcert$(OFILE)\ $(MTOBJODIR)$(DIRSEP)js_cryptcon$(OFILE)\ $(MTOBJODIR)$(DIRSEP)js_cryptkeyset$(OFILE)\ $(MTOBJODIR)$(DIRSEP)js_file$(OFILE)\ diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index a2d11d4a79542c3d80a6167a49836c908b7b283b..57839a9a870f221e6ae9fac64c476ceaa8c885e4 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -1337,6 +1337,9 @@ extern "C" { /* js_cryptkeyset.c */ DLLEXPORT JSObject* DLLCALL js_CreateCryptKeysetClass(JSContext* cx, JSObject* parent); + /* js_cryptcert.c */ + DLLEXPORT JSObject* DLLCALL js_CreateCryptCertClass(JSContext* cx, JSObject* parent); + #endif /* str_util.c */ diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c index da2154f5d70d30381b20ec2beb1e84a84b2dd1ff..a942366a1dd35764e68c588e27cefe5d42a1f947 100644 --- a/src/sbbs3/services.c +++ b/src/sbbs3/services.c @@ -807,6 +807,10 @@ js_initcx(JSRuntime* js_runtime, SOCKET sock, service_client_t* service_client, if(js_CreateCryptKeysetClass(js_cx, *glob)==NULL) break; + /* CryptCert Class */ + if(js_CreateCryptCertClass(js_cx, *glob)==NULL) + break; + /* user-specific objects */ if(!js_CreateUserObjects(js_cx, *glob, &scfg, /*user: */NULL, service_client->client, NULL, service_client->subscan)) break;