From 831aa09133a8b8ef1838b02fed6e4aa0542041f0 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Tue, 2 Jan 2024 18:12:19 +0000 Subject: [PATCH 1/5] Add createTimeStamp & test for validUntil + validFrom. --- tests/10-vcdm2.js | 16 +++++++++++++++- tests/data-generator.js | 6 ++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/tests/10-vcdm2.js b/tests/10-vcdm2.js index f4aaa18..0c5a134 100644 --- a/tests/10-vcdm2.js +++ b/tests/10-vcdm2.js @@ -5,11 +5,11 @@ import { createRequestBody, createVerifyRequestBody } from './mock.data.js'; +import {createTimeStamp, proveVP} from './data-generator.js'; import assert from 'node:assert/strict'; import {createRequire} from 'module'; import {filterByTag} from 'vc-api-test-suite-implementations'; import http from 'http'; -import {proveVP} from './data-generator.js'; import {randomFillSync} from 'node:crypto'; import receiveJson from './receive-json.js'; @@ -384,6 +384,20 @@ describe('Verifiable Credentials Data Model v2.0', function() { await assert.rejects( issue(require('./input/credential-validuntil-invalid-fail.json'))); }); + it2('If a validUntil value also exists, the validFrom value MUST ' + + 'express a datetime that is temporally the same or earlier than the ' + + 'datetime expressed by the validUntil value.', async function() { + const positiveTest = require( + './input-credential-validUntil-validFrom-ok.json'); + positiveTest.validFrom = createTimeStamp({skew: -2}); + positiveTest.validUntil = createTimeStamp({skew: 2}); + await issue(positiveTest); + const negativeTest = require( + './input-credential-validUntil-validFrom-fail.json'); + negativeTest.validFrom = createTimeStamp({skew: 2}); + negativeTest.validUntil = createTimeStamp({skew: -2}); + assert.rejects(issue(negativeTest)); + }); // FIXME remove as this doesn't seem to be in the spec it.skip('At least one proof mechanism, and the details necessary ' + 'to evaluate that proof, MUST be expressed for a credential or ' + diff --git a/tests/data-generator.js b/tests/data-generator.js index 0d43ffc..6509c1c 100644 --- a/tests/data-generator.js +++ b/tests/data-generator.js @@ -84,3 +84,9 @@ export async function proveVP({presentation, options = {}}) { ...options }); } + +export function createTimeStamp({date = new Date(), skew = 0}) { + date.setFullYear(date.getFullYear() + skew); + const isoString = date.toISOString(); + return `${isoString.substring(0, isoString.length - 5)}Z`; +} From 52a65cb140730d2c2b86a2c1bbf592b2fb208809 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Tue, 2 Jan 2024 18:18:48 +0000 Subject: [PATCH 2/5] Add test vectors for validUntil & validFrom VCs. --- tests/10-vcdm2.js | 4 ++-- .../credential-validUntil-validFrom-fail.json | 14 ++++++++++++++ .../input/credential-validUntil-validFrom-ok.json | 14 ++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/input/credential-validUntil-validFrom-fail.json create mode 100644 tests/input/credential-validUntil-validFrom-ok.json diff --git a/tests/10-vcdm2.js b/tests/10-vcdm2.js index 0c5a134..a818e26 100644 --- a/tests/10-vcdm2.js +++ b/tests/10-vcdm2.js @@ -388,12 +388,12 @@ describe('Verifiable Credentials Data Model v2.0', function() { 'express a datetime that is temporally the same or earlier than the ' + 'datetime expressed by the validUntil value.', async function() { const positiveTest = require( - './input-credential-validUntil-validFrom-ok.json'); + './input/credential-validUntil-validFrom-ok.json'); positiveTest.validFrom = createTimeStamp({skew: -2}); positiveTest.validUntil = createTimeStamp({skew: 2}); await issue(positiveTest); const negativeTest = require( - './input-credential-validUntil-validFrom-fail.json'); + './input/credential-validUntil-validFrom-fail.json'); negativeTest.validFrom = createTimeStamp({skew: 2}); negativeTest.validUntil = createTimeStamp({skew: -2}); assert.rejects(issue(negativeTest)); diff --git a/tests/input/credential-validUntil-validFrom-fail.json b/tests/input/credential-validUntil-validFrom-fail.json new file mode 100644 index 0000000..5b00825 --- /dev/null +++ b/tests/input/credential-validUntil-validFrom-fail.json @@ -0,0 +1,14 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2" + ], + "type": [ + "VerifiableCredential" + ], + "issuer": "did:example:issuer", + "validFrom": "FUTURE DATE", + "validUntil": "PAST DATE", + "credentialSubject": { + "id": "did:example:subject" + } +} diff --git a/tests/input/credential-validUntil-validFrom-ok.json b/tests/input/credential-validUntil-validFrom-ok.json new file mode 100644 index 0000000..e2ba3f7 --- /dev/null +++ b/tests/input/credential-validUntil-validFrom-ok.json @@ -0,0 +1,14 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2" + ], + "type": [ + "VerifiableCredential" + ], + "issuer": "did:example:issuer", + "validFrom": "PAST DATE", + "validUntil": "FUTURE DATE", + "credentialSubject": { + "id": "did:example:subject" + } +} From ee0d01766224aeb35a2fbddf4fcfa5fcdc0d594b Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Tue, 2 Jan 2024 20:10:37 +0000 Subject: [PATCH 3/5] Add test statement for validFrom and validUntil. --- tests/10-vcdm2.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/10-vcdm2.js b/tests/10-vcdm2.js index a818e26..19daeb4 100644 --- a/tests/10-vcdm2.js +++ b/tests/10-vcdm2.js @@ -398,6 +398,20 @@ describe('Verifiable Credentials Data Model v2.0', function() { negativeTest.validUntil = createTimeStamp({skew: -2}); assert.rejects(issue(negativeTest)); }); + it2('If a validFrom value also exists, the validUntil value MUST ' + + 'express a datetime that is temporally the same or later than the ' + + 'datetime expressed by the validFrom value.', async function() { + const positiveTest = require( + './input/credential-validUntil-validFrom-ok.json'); + positiveTest.validFrom = createTimeStamp({skew: -2}); + positiveTest.validUntil = createTimeStamp({skew: 2}); + await issue(positiveTest); + const negativeTest = require( + './input/credential-validUntil-validFrom-fail.json'); + negativeTest.validFrom = createTimeStamp({skew: 2}); + negativeTest.validUntil = createTimeStamp({skew: -2}); + assert.rejects(issue(negativeTest)); + }); // FIXME remove as this doesn't seem to be in the spec it.skip('At least one proof mechanism, and the details necessary ' + 'to evaluate that proof, MUST be expressed for a credential or ' + From 99965c5238319b23e520f8f4b2e36d2e80dd3b54 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Tue, 2 Jan 2024 21:31:25 +0000 Subject: [PATCH 4/5] Account for issuer or verifier rejecting invalid validUntils. --- tests/10-vcdm2.js | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/tests/10-vcdm2.js b/tests/10-vcdm2.js index 19daeb4..2f802af 100644 --- a/tests/10-vcdm2.js +++ b/tests/10-vcdm2.js @@ -396,7 +396,17 @@ describe('Verifiable Credentials Data Model v2.0', function() { './input/credential-validUntil-validFrom-fail.json'); negativeTest.validFrom = createTimeStamp({skew: 2}); negativeTest.validUntil = createTimeStamp({skew: -2}); - assert.rejects(issue(negativeTest)); + let error; + let result; + try { + result = await issue(negativeTest); + } catch(e) { + error = e; + } + if(error) { + return; + } + assert.rejects(verify(result)); }); it2('If a validFrom value also exists, the validUntil value MUST ' + 'express a datetime that is temporally the same or later than the ' + @@ -410,7 +420,17 @@ describe('Verifiable Credentials Data Model v2.0', function() { './input/credential-validUntil-validFrom-fail.json'); negativeTest.validFrom = createTimeStamp({skew: 2}); negativeTest.validUntil = createTimeStamp({skew: -2}); - assert.rejects(issue(negativeTest)); + let error; + let result; + try { + result = await issue(negativeTest); + } catch(e) { + error = e; + } + if(error) { + return; + } + assert.rejects(verify(result)); }); // FIXME remove as this doesn't seem to be in the spec it.skip('At least one proof mechanism, and the details necessary ' + From 493e5701979fa69d7b155ef9068383116907ea6b Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Thu, 4 Jan 2024 13:50:13 +0000 Subject: [PATCH 5/5] Add CHANGELOG entry for validFrom & validUntil interactions. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c09a8b4..04a1828 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Add a new test to ensure type URLs are treated as an unordered set. - Add new tests for `issuer.description` including Internationalization settings. - Add new tests for `issuer.id` as a url and not a url. +- Add tests for interactions between `validFrom ` and `validUntil`. ## 1.0.0 - 2023-11-10