crypto: add Date fields for `validTo` and `validFrom` · nodejs/node@349d2ed · GitHub
Skip to content

Commit 349d2ed

Browse files
RulerOfCakestargos
authored andcommitted
crypto: add Date fields for validTo and validFrom
Added equivalent fields to `X509Certificate` in Date form. PR-URL: #54159 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Tim Perry <pimterry@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Daeyeon Jeong <daeyeon.dev@gmail.com>
1 parent 23b628d commit 349d2ed

6 files changed

Lines changed: 197 additions & 0 deletions

File tree

deps/ncrypto/ncrypto.cc

Lines changed: 41 additions & 0 deletions

deps/ncrypto/ncrypto.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,8 @@ class X509View final {
462462
BIOPointer getInfoAccess() const;
463463
BIOPointer getValidFrom() const;
464464
BIOPointer getValidTo() const;
465+
int64_t getValidFromTime() const;
466+
int64_t getValidToTime() const;
465467
DataPointer getSerialNumber() const;
466468
Result<EVPKeyPointer, int> getPublicKey() const;
467469
StackOfASN1 getKeyUsage() const;

doc/api/crypto.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2863,6 +2863,16 @@ added: v15.6.0
28632863

28642864
The date/time from which this certificate is valid.
28652865

2866+
### `x509.validFromDate`
2867+
2868+
<!-- YAML
2869+
added: REPLACEME
2870+
-->
2871+
2872+
* Type: {Date}
2873+
2874+
The date/time from which this certificate is valid, encapsulated in a `Date` object.
2875+
28662876
### `x509.validTo`
28672877

28682878
<!-- YAML
@@ -2873,6 +2883,16 @@ added: v15.6.0
28732883

28742884
The date/time until which this certificate is valid.
28752885

2886+
### `x509.validToDate`
2887+
2888+
<!-- YAML
2889+
added: REPLACEME
2890+
-->
2891+
2892+
* Type: {Date}
2893+
2894+
The date/time until which this certificate is valid, encapsulated in a `Date` object.
2895+
28762896
### `x509.verify(publicKey)`
28772897

28782898
<!-- YAML

lib/internal/crypto/x509.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ class X509Certificate {
135135
infoAccess: this.infoAccess,
136136
validFrom: this.validFrom,
137137
validTo: this.validTo,
138+
validFromDate: this.validFromDate,
139+
validToDate: this.validToDate,
138140
fingerprint: this.fingerprint,
139141
fingerprint256: this.fingerprint256,
140142
fingerprint512: this.fingerprint512,
@@ -220,6 +222,24 @@ class X509Certificate {
220222
return value;
221223
}
222224

225+
get validFromDate() {
226+
let value = this[kInternalState].get('validFromDate');
227+
if (value === undefined) {
228+
value = this[kHandle].validFromDate();
229+
this[kInternalState].set('validFromDate', value);
230+
}
231+
return value;
232+
}
233+
234+
get validToDate() {
235+
let value = this[kInternalState].get('validToDate');
236+
if (value === undefined) {
237+
value = this[kHandle].validToDate();
238+
this[kInternalState].set('validToDate', value);
239+
}
240+
return value;
241+
}
242+
223243
get fingerprint() {
224244
let value = this[kInternalState].get('fingerprint');
225245
if (value === undefined) {

src/crypto/crypto_x509.cc

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ using v8::ArrayBufferView;
2121
using v8::BackingStore;
2222
using v8::Boolean;
2323
using v8::Context;
24+
using v8::Date;
2425
using v8::EscapableHandleScope;
2526
using v8::Function;
2627
using v8::FunctionCallbackInfo;
@@ -238,6 +239,18 @@ MaybeLocal<Value> GetValidTo(Environment* env, const ncrypto::X509View& view) {
238239
return ret;
239240
}
240241

242+
MaybeLocal<Value> GetValidFromDate(Environment* env,
243+
const ncrypto::X509View& view) {
244+
int64_t validFromTime = view.getValidFromTime();
245+
return Date::New(env->context(), validFromTime * 1000.);
246+
}
247+
248+
MaybeLocal<Value> GetValidToDate(Environment* env,
249+
const ncrypto::X509View& view) {
250+
int64_t validToTime = view.getValidToTime();
251+
return Date::New(env->context(), validToTime * 1000.);
252+
}
253+
241254
MaybeLocal<Value> GetSerialNumber(Environment* env,
242255
const ncrypto::X509View& view) {
243256
if (auto serial = view.getSerialNumber()) {
@@ -349,6 +362,26 @@ void ValidTo(const FunctionCallbackInfo<Value>& args) {
349362
}
350363
}
351364

365+
void ValidFromDate(const FunctionCallbackInfo<Value>& args) {
366+
Environment* env = Environment::GetCurrent(args);
367+
X509Certificate* cert;
368+
ASSIGN_OR_RETURN_UNWRAP(&cert, args.This());
369+
Local<Value> ret;
370+
if (GetValidFromDate(env, cert->view()).ToLocal(&ret)) {
371+
args.GetReturnValue().Set(ret);
372+
}
373+
}
374+
375+
void ValidToDate(const FunctionCallbackInfo<Value>& args) {
376+
Environment* env = Environment::GetCurrent(args);
377+
X509Certificate* cert;
378+
ASSIGN_OR_RETURN_UNWRAP(&cert, args.This());
379+
Local<Value> ret;
380+
if (GetValidToDate(env, cert->view()).ToLocal(&ret)) {
381+
args.GetReturnValue().Set(ret);
382+
}
383+
}
384+
352385
void SerialNumber(const FunctionCallbackInfo<Value>& args) {
353386
Environment* env = Environment::GetCurrent(args);
354387
X509Certificate* cert;
@@ -834,6 +867,8 @@ Local<FunctionTemplate> X509Certificate::GetConstructorTemplate(
834867
SetProtoMethodNoSideEffect(isolate, tmpl, "issuer", Issuer);
835868
SetProtoMethodNoSideEffect(isolate, tmpl, "validTo", ValidTo);
836869
SetProtoMethodNoSideEffect(isolate, tmpl, "validFrom", ValidFrom);
870+
SetProtoMethodNoSideEffect(isolate, tmpl, "validToDate", ValidToDate);
871+
SetProtoMethodNoSideEffect(isolate, tmpl, "validFromDate", ValidFromDate);
837872
SetProtoMethodNoSideEffect(
838873
isolate, tmpl, "fingerprint", Fingerprint<EVP_sha1>);
839874
SetProtoMethodNoSideEffect(
@@ -1001,6 +1036,8 @@ void X509Certificate::RegisterExternalReferences(
10011036
registry->Register(Issuer);
10021037
registry->Register(ValidTo);
10031038
registry->Register(ValidFrom);
1039+
registry->Register(ValidToDate);
1040+
registry->Register(ValidFromDate);
10041041
registry->Register(Fingerprint<EVP_sha1>);
10051042
registry->Register(Fingerprint<EVP_sha256>);
10061043
registry->Register(Fingerprint<EVP_sha512>);

test/parallel/test-crypto-x509.js

Lines changed: 77 additions & 0 deletions

0 commit comments

Comments
 (0)