Skip to content

Commit 273ccee

Browse files
committed
added verification test
Signed-off-by: PatStLouis <[email protected]>
1 parent 9249d13 commit 273ccee

File tree

3 files changed

+157
-8
lines changed

3 files changed

+157
-8
lines changed

tests/90-algorithms-sd.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,20 @@ import {
88
assertDataIntegrityProof
99
} from './assertions.js';
1010
import {
11+
encodeSdDerivedProofValue,
1112
generateCredential,
12-
inspectSdProofValue,
13+
inspectSdBaseProofValue,
14+
inspectSdDerivedProofValue,
1315
isValidDatetime,
1416
proofExists,
1517
secureCredential,
1618
setupReportableTestSuite,
1719
setupRow,
20+
verifyError,
21+
verifySuccess
1822
} from './helpers.js';
1923
import chai from 'chai';
24+
import {ecdsaSdVectors} from './vectors.js';
2025
import {endpoints} from 'vc-test-suite-implementations';
2126
import {expect} from 'chai';
2227

@@ -107,7 +112,7 @@ describe('Algorithms - Base Proof Transformation (ecdsa-sd-2023)', function() {
107112
{issuer, vc: generateCredential()});
108113
const proof = proofExists(securedCredentialNoPointers);
109114
const decodedProof =
110-
await inspectSdProofValue(proof);
115+
await inspectSdBaseProofValue(proof);
111116
should.exist(decodedProof.mandatoryPointers,
112117
'Expected mandatoryPointers to be included in the proofValue.');
113118
});
@@ -123,7 +128,7 @@ describe('Algorithms - Base Proof Transformation (ecdsa-sd-2023)', function() {
123128
async function() {
124129
this.test.link = 'https://www.w3.org/TR/vc-di-ecdsa/#transformation-ecdsa-sd-2023';
125130
const proof = proofExists(securedCredential);
126-
const decodedProof = await inspectSdProofValue(proof);
131+
const decodedProof = await inspectSdBaseProofValue(proof);
127132
decodedProof.hmacKey.length.should.equal(32,
128133
'Expected HMAC key to be the same length as the digest size.'
129134
);
@@ -220,8 +225,22 @@ describe('Algorithms - Verify Derived Proof (ecdsa-sd-2023)', function() {
220225
'signature count does not match the non-mandatory message count.',
221226
async function() {
222227
this.test.link = 'https://www.w3.org/TR/vc-di-ecdsa/#proof-serialization-ecdsa-sd-2023';
223-
verifier;
224-
this.skip();
228+
229+
// const validBaseProof = structuredClone(ecdsaSdVectors.baseProof);
230+
// await verifySuccess(verifier, validBaseProof);
231+
232+
const validDerivedProof = structuredClone(ecdsaSdVectors.derivedProof);
233+
await verifySuccess(verifier, validDerivedProof);
234+
235+
// Instanciate a new signed credential and remove a signature
236+
const invalidDerivedProof = structuredClone(validDerivedProof);
237+
const decodedDerivedProofValue =
238+
await inspectSdDerivedProofValue(invalidDerivedProof.proof);
239+
decodedDerivedProofValue.signatures =
240+
decodedDerivedProofValue.signatures.slice(1);
241+
invalidDerivedProof.proof.proofValue =
242+
encodeSdDerivedProofValue(decodedDerivedProofValue);
243+
await verifyError(verifier, invalidDerivedProof);
225244
});
226245
});
227246
}

tests/helpers.js

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ import * as bs58 from 'base58-universal';
66
import * as bs64 from 'base64url-universal';
77
import * as didKey from '@digitalbazaar/did-method-key';
88
import * as EcdsaMultikey from '@digitalbazaar/ecdsa-multikey';
9-
import {base64url} from 'multiformats/bases/base64';
109
import {bases} from 'multiformats/basics';
1110
import {CachedResolver} from '@digitalbazaar/did-io';
1211
import cbor from 'cbor';
1312
import chai from 'chai';
14-
import {CID} from 'multiformats/cid';
1513
import {createRequire} from 'node:module';
1614
import {contexts as credContexts} from '@digitalbazaar/credentials-context';
1715
import {expect} from 'chai';
@@ -350,7 +348,7 @@ export async function multikeyFromVerificationMethod(
350348
return null;
351349
}
352350

353-
export async function inspectSdProofValue(proof) {
351+
export async function inspectSdBaseProofValue(proof) {
354352
const proofValue = proof.proofValue;
355353
expect(proof.proofValue.startsWith('u')).to.be.true;
356354
const cborProof = bases.base64url.decode(proofValue);
@@ -369,3 +367,29 @@ export async function inspectSdProofValue(proof) {
369367
mandatoryPointers: decodedProofValues[4]
370368
};
371369
}
370+
371+
export async function inspectSdDerivedProofValue(proof) {
372+
const proofValue = proof.proofValue;
373+
expect(proof.proofValue.startsWith('u')).to.be.true;
374+
const cborProof = bases.base64url.decode(proofValue);
375+
const decodedProof = await cbor.decodeFirst(cborProof, (error, obj) => {
376+
return obj;
377+
});
378+
const decodedProofValues = decodedProof.value;
379+
decodedProofValues.length.should.equal(5,
380+
'Expected decoded proof value to be of length 5.'
381+
);
382+
return {
383+
baseSignature: decodedProofValues[0],
384+
publicKey: decodedProofValues[1],
385+
signatures: decodedProofValues[2],
386+
labelMap: decodedProofValues[3],
387+
mandatoryIndexes: decodedProofValues[4]
388+
};
389+
}
390+
391+
export async function encodeSdDerivedProofValue(decodedPproof) {
392+
const cborProof = await cbor.encode(decodedPproof);
393+
const proofValue = bases.base64url.encode(cborProof);
394+
return proofValue;
395+
}

tests/vectors.js

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,112 @@ test vectors. */
77
/* eslint-disable max-len */
88
/* eslint-disable quote-props */
99
/* eslint-disable quotes */
10+
export const ecdsaSdVectors = {
11+
baseProof: {
12+
"@context": [
13+
"https://www.w3.org/ns/credentials/v2",
14+
{
15+
"@vocab": "https://windsurf.grotto-networking.com/selective#"
16+
}
17+
],
18+
"type": [
19+
"VerifiableCredential"
20+
],
21+
"issuer": "https://vc.example/windsurf/racecommittee",
22+
"credentialSubject": {
23+
"sailNumber": "Earth101",
24+
"sails": [
25+
{
26+
"size": 5.5,
27+
"sailName": "Kihei",
28+
"year": 2023
29+
},
30+
{
31+
"size": 6.1,
32+
"sailName": "Lahaina",
33+
"year": 2023
34+
},
35+
{
36+
"size": 7,
37+
"sailName": "Lahaina",
38+
"year": 2020
39+
},
40+
{
41+
"size": 7.8,
42+
"sailName": "Lahaina",
43+
"year": 2023
44+
}
45+
],
46+
"boards": [
47+
{
48+
"boardName": "CompFoil170",
49+
"brand": "Wailea",
50+
"year": 2022
51+
},
52+
{
53+
"boardName": "Kanaha Custom",
54+
"brand": "Wailea",
55+
"year": 2019
56+
}
57+
]
58+
},
59+
"proof": {
60+
"type": "DataIntegrityProof",
61+
"cryptosuite": "ecdsa-sd-2023",
62+
"created": "2023-08-15T23:36:38Z",
63+
"verificationMethod": "did:key:zDnaepBuvsQ8cpsWrVKw8fbpGpvPeNSjVPTWoq6cRqaYzBKVP#zDnaepBuvsQ8cpsWrVKw8fbpGpvPeNSjVPTWoq6cRqaYzBKVP",
64+
"proofPurpose": "assertionMethod",
65+
"proofValue": "u2V0AhVhAkWKMO8zpRmfcUMksHUMtZM7cJt8PmNLsljKTYhSi8gZ7wAWnK4BrOZkrH3dZvxKWlnxGG_0xlFXmU5sa5-j71VgjgCQCKnLOGbY_FuM-ASpSkkOxsIR2E8n7Ml2q1UQ6tEwzi5NYIAARIjNEVWZ3iJmqu8zd7v8AESIzRFVmd4iZqrvM3e7_jlhAKVYKM250DDcNWOYQpUmYC1Z5NZhJRwie8vVUev94QGst83WhoW7_UM6JULsKjNVHjxZlZQyovN4xw1M_mhn6TFhAsqMSgz0EeaPe0Hmo5SN1JNZmCjiZ-CNJB4ScmyK46s7hDotNZuGHxKGaAFC43O0FxcKeUC96q_z9PGeF5C3VpVhAmeoEU8I1ZzxFyR-QMxwoSkqRG9E8_CaSrhH8TD2t-tV32HKAC4hJkKl6xHuz6XL2G-V0cm6d_rWozjhmmVaMjVhAbQMMckpcMAEo15WC6C8Mo3bCEWFGtOTkMxND-LJMdfkCSovB7RnCR7SXzk5-0YVigtJ5Fzg71AAob5yg1WNNk1hApQHlYRGlUVkv-WX1OjJYJ19Ow7ipvVwUvm90Sn3IjNRLuy9pr5DHm3wVlVMPVpLqjS-E8_jJDeJV5pY0bfK_A1hAas2wx9bcEj0Sh7t8w9Cj-2FpceGpdRhaLZxYs1ZEG8-obUjb0CHOyH8S7uwDtn7oSW2oCW2SpZvlX-2jW17rmlhAe34eQ8-gJHyQahY0EmZh8mZoy0svnpTjkdcLnroLIBsiVkfCzMKLOWeEtWZUVnIBeugT8I2C7mnmpHNjdo2d4lhAM8okCUX8F4GYx9rlnSDvr5pTHPOjOOJ47JzFdDtX_Q4bZxWwLGwqltYojDecyt4oxQHYz55ZRnhTXLHqa74B7VhAO_Hj0vxsuJZzpVGtgoMKK2ZlGKvhLX3_vUCvdL-MTlszVr2iC3XJpCbOc8B_W_On-csaLPzUSvlSDtNec1ZVk1hAdm2Ht4sv_ec3s1HRqeul--yEGx4SrpwyNQRdLa5ZKyJDgqr4h-EtVNzc-J-VllvKrHN8wBKtUqarqI4Npnrx7VhAORMLXYz3l59Ozc7SDk2ej7clrer9Bn6eaBUQG773AqQ56bc-oGXeemekwZCNHjFLOESNoNq7qetO8FRbiFHb4FhAW-otSFVlUPFmg119n3TeSE7up5hBS34AqP2TGUQA5pDGyOTetrf8qq3bWj1lpCu1Z6yEZJlQ6nrLiCoaNVhpL1hA1wW_HhsTPUfUlqMX6ZMsLem8hbWaFe_rZDpPp5NN02vMHInDjO1Gn0BrXUyVAMnTY3fGrDjsuy2sGgMzR-bo11hAvOGSXH51eRoCWtV9LlpZD10ix0IuuVCnat5fRxU7hqGs0AzM09kGsmuDMRjowp51xhiFJ3iMajIOOhWUhPxHCoVnL2lzc3VlcngdL2NyZWRlbnRpYWxTdWJqZWN0L3NhaWxOdW1iZXJ4Gi9jcmVkZW50aWFsU3ViamVjdC9zYWlscy8xeCAvY3JlZGVudGlhbFN1YmplY3QvYm9hcmRzLzAveWVhcngaL2NyZWRlbnRpYWxTdWJqZWN0L3NhaWxzLzI"
66+
}
67+
},
68+
derivedProof: {
69+
"@context": [
70+
"https://www.w3.org/ns/credentials/v2",
71+
{
72+
"@vocab": "https://windsurf.grotto-networking.com/selective#"
73+
}
74+
],
75+
"type": [
76+
"VerifiableCredential"
77+
],
78+
"issuer": "https://vc.example/windsurf/racecommittee",
79+
"credentialSubject": {
80+
"sailNumber": "Earth101",
81+
"sails": [
82+
{
83+
"size": 6.1,
84+
"sailName": "Lahaina",
85+
"year": 2023
86+
},
87+
{
88+
"size": 7,
89+
"sailName": "Lahaina",
90+
"year": 2020
91+
}
92+
],
93+
"boards": [
94+
{
95+
"year": 2022,
96+
"boardName": "CompFoil170",
97+
"brand": "Wailea"
98+
},
99+
{
100+
"boardName": "Kanaha Custom",
101+
"brand": "Wailea",
102+
"year": 2019
103+
}
104+
]
105+
},
106+
"proof": {
107+
"type": "DataIntegrityProof",
108+
"cryptosuite": "ecdsa-sd-2023",
109+
"created": "2023-08-15T23:36:38Z",
110+
"verificationMethod": "did:key:zDnaepBuvsQ8cpsWrVKw8fbpGpvPeNSjVPTWoq6cRqaYzBKVP#zDnaepBuvsQ8cpsWrVKw8fbpGpvPeNSjVPTWoq6cRqaYzBKVP",
111+
"proofPurpose": "assertionMethod",
112+
"proofValue": "u2V0BhVhAkWKMO8zpRmfcUMksHUMtZM7cJt8PmNLsljKTYhSi8gZ7wAWnK4BrOZkrH3dZvxKWlnxGG_0xlFXmU5sa5-j71VgjgCQCKnLOGbY_FuM-ASpSkkOxsIR2E8n7Ml2q1UQ6tEwzi5OGWEBtAwxySlwwASjXlYLoLwyjdsIRYUa05OQzE0P4skx1-QJKi8HtGcJHtJfOTn7RhWKC0nkXODvUAChvnKDVY02TWEClAeVhEaVRWS_5ZfU6MlgnX07DuKm9XBS-b3RKfciM1Eu7L2mvkMebfBWVUw9WkuqNL4Tz-MkN4lXmljRt8r8DWEBqzbDH1twSPRKHu3zD0KP7YWlx4al1GFotnFizVkQbz6htSNvQIc7IfxLu7AO2fuhJbagJbZKlm-Vf7aNbXuuaWEA78ePS_Gy4lnOlUa2CgworZmUYq-Etff-9QK90v4xOWzNWvaILdcmkJs5zwH9b86f5yxos_NRK-VIO015zVlWTWEB2bYe3iy_95zezUdGp66X77IQbHhKunDI1BF0trlkrIkOCqviH4S1U3Nz4n5WWW8qsc3zAEq1Spquojg2mevHtWEA5EwtdjPeXn07NztIOTZ6PtyWt6v0Gfp5oFRAbvvcCpDnptz6gZd56Z6TBkI0eMUs4RI2g2rup607wVFuIUdvgpgBYIOGCDmZ9TBxEtWeCI9oVmRt0eHRGAaoOXx08gxL2IQt_AVggVkUuBrlOaELGVQWJD4M_qW5bcKEHWGNbOrPA_qAOKKwCWCBD6o5lQOWjNGwaTjq7H2Cn1-NPbwXLeDedy2YyiqL9TQNYIJEdvfdRibsv05I3pv8e6S1aUuAuBpGQHLhrYj4QX0knBFggk0AeXgJ4e6m1XsV5-xFud0L_1mUjZ9Mffhg5aZGTyDkFWCDYgT4e07o_IdCwae6qE7WZfpXtGRFESEXR3SxZmXE05o4AAQIFBggJCg4PEBESEw"
113+
}
114+
}
115+
};
10116
export const ecdsaRdfcVectors = {
11117
'P-256': {
12118
"@context": [

0 commit comments

Comments
 (0)