diff --git a/src/sbbs3/js_cryptcert.c b/src/sbbs3/js_cryptcert.c index a1cace60b4610e9cbed22fe47da7a15d3af01d54..1e51b9bf7ccbfde68e71014b024f1588f098db2f 100644 --- a/src/sbbs3/js_cryptcert.c +++ b/src/sbbs3/js_cryptcert.c @@ -259,6 +259,39 @@ js_cryptcert_attrstr_get(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT return JS_TRUE; } +static JSBool +js_cryptcert_attrtime_get(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT_ATTRIBUTE_TYPE type) +{ + int status; + int len; + time_t t; + jsdouble msec; + JSObject *dobj; + + 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 (len != sizeof(t)) { + JS_ReportError(cx, "Time size %d not sizeof(time_t) (%d)\n", len, sizeof(t)); + return JS_FALSE; + } + status = cryptGetAttributeString(cert, type, &t, &len); + if (cryptStatusError(status)) { + js_cryptcert_error(cx, cert, status); + return JS_FALSE; + } + msec = t; + msec *= 1000; + dobj = JS_NewDateObjectMsec(cx, msec); + if(dobj==NULL) + return(JS_FALSE); + *vp = OBJECT_TO_JSVAL(dobj); + + return JS_TRUE; +} + enum { /**************************/ /* Certificate attributes */ @@ -849,9 +882,9 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_get(cx, vp, p->cert, CRYPT_CERTINFO_VALIDFROM); case CRYPTCERT_PROP_VALIDTO: - return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_VALIDTO); + return js_cryptcert_attrtime_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: @@ -861,11 +894,11 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_get(cx, vp, p->cert, CRYPT_CERTINFO_THISUPDATE); case CRYPTCERT_PROP_NEXTUPDATE: - return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_NEXTUPDATE); + return js_cryptcert_attrtime_get(cx, vp, p->cert, CRYPT_CERTINFO_NEXTUPDATE); case CRYPTCERT_PROP_REVOCATIONDATE: - return js_cryptcert_attr_get(cx, vp, p->cert, CRYPT_CERTINFO_REVOCATIONDATE); + return js_cryptcert_attrtime_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: @@ -973,7 +1006,7 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_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: @@ -987,7 +1020,7 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_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: @@ -1049,9 +1082,9 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_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); + return js_cryptcert_attrtime_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: @@ -1069,7 +1102,7 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_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: @@ -1185,13 +1218,13 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_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); + return js_cryptcert_attrtime_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: @@ -1201,7 +1234,7 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_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: @@ -1211,13 +1244,13 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_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); + return js_cryptcert_attrtime_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: @@ -1289,7 +1322,7 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_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: @@ -1363,7 +1396,7 @@ js_cryptcert_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) 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); + return js_cryptcert_attrtime_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: @@ -1520,6 +1553,46 @@ js_cryptcert_attrstr_set(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT return JS_TRUE; } +static JSBool +js_cryptcert_attrtime_set(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT_ATTRIBUTE_TYPE type) +{ + int status; + time_t t; + jsdouble sec; + + if (JSVAL_IS_OBJECT(*vp)) { + if (!JS_ObjectIsDate(cx, JSVAL_TO_OBJECT(*vp))) { + JS_ReportError(cx, "Invalid Date"); + return JS_FALSE; + } + if (!JS_ValueToNumber(cx, *vp, &sec)) { + JS_ReportError(cx, "Invalid Date"); + return JS_FALSE; + } + sec /= 1000; + } + else { + if (JSVAL_IS_NUMBER(*vp)) { + if (!JS_ValueToNumber(cx, *vp, &sec)) { + JS_ReportError(cx, "Invalid Date"); + return JS_FALSE; + } + } + else { + JS_ReportError(cx, "Invalid Date"); + return JS_FALSE; + } + } + t = sec; + + status = cryptSetAttributeString(cert, type, &t, sizeof(t)); + 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) { @@ -1571,9 +1644,9 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_set(cx, vp, p->cert, CRYPT_CERTINFO_VALIDFROM); case CRYPTCERT_PROP_VALIDTO: - return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_VALIDTO); + return js_cryptcert_attrtime_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: @@ -1583,11 +1656,11 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_set(cx, vp, p->cert, CRYPT_CERTINFO_THISUPDATE); case CRYPTCERT_PROP_NEXTUPDATE: - return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_NEXTUPDATE); + return js_cryptcert_attrtime_set(cx, vp, p->cert, CRYPT_CERTINFO_NEXTUPDATE); case CRYPTCERT_PROP_REVOCATIONDATE: - return js_cryptcert_attr_set(cx, vp, p->cert, CRYPT_CERTINFO_REVOCATIONDATE); + return js_cryptcert_attrtime_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: @@ -1695,7 +1768,7 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_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: @@ -1709,7 +1782,7 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_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: @@ -1771,9 +1844,9 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_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); + return js_cryptcert_attrtime_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: @@ -1791,7 +1864,7 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_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: @@ -1907,13 +1980,13 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_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); + return js_cryptcert_attrtime_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: @@ -1923,7 +1996,7 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_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: @@ -1933,13 +2006,13 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_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); + return js_cryptcert_attrtime_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: @@ -2011,7 +2084,7 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_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: @@ -2085,7 +2158,7 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp 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); + return js_cryptcert_attrtime_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: