Skip to content

Commit

Permalink
Add test vectors from vc-di-eddsa spec.
Browse files Browse the repository at this point in the history
  • Loading branch information
dlongley committed Aug 22, 2024
1 parent c5eeec1 commit e482a15
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 6 deletions.
10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,23 @@
"lib/**/*.js"
],
"dependencies": {
"@digitalbazaar/ed25519-multikey": "^1.1.0",
"@digitalbazaar/ed25519-multikey": "^1.2.0",
"@digitalbazaar/ed25519-verification-key-2020": "^4.1.0",
"base58-universal": "^2.0.0",
"ed25519-signature-2020-context": "^1.1.0",
"jsonld-signatures": "^11.3.0"
},
"devDependencies": {
"@digitalbazaar/ed25519-verification-key-2018": "^4.0.0",
"@digitalbazaar/security-document-loader": "^2.0.0",
"@digitalbazaar/security-document-loader": "^3.0.0",
"c8": "^7.12.0",
"chai": "^4.3.7",
"cross-env": "^7.0.3",
"ed25519-signature-2018-context": "^1.1.0",
"eslint": "^8.34.0",
"eslint-config-digitalbazaar": "^4.2.0",
"eslint-plugin-jsdoc": "^40.0.0",
"eslint-plugin-unicorn": "^45.0.2",
"eslint-config-digitalbazaar": "^5.2.0",
"eslint-plugin-jsdoc": "^50.2.2",
"eslint-plugin-unicorn": "^55.0.0",
"karma": "^6.4.1",
"karma-chai": "^0.1.0",
"karma-chrome-launcher": "^3.1.1",
Expand Down
10 changes: 9 additions & 1 deletion test/documentLoader.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*!
* Copyright (c) 2021-2022 Digital Bazaar, Inc. All rights reserved.
* Copyright (c) 2021-2024 Digital Bazaar, Inc. All rights reserved.
*/
import {
controllerDoc2020,
Expand All @@ -15,3 +15,11 @@ loader.addStatic(mockKeyPair2020.controller, controllerDoc2020);
loader.addStatic(mockPublicKey2020.id, mockPublicKey2020);
loader.addStatic(ed25519Context2018.constants.CONTEXT_URL,
ed25519Context2018.contexts.get(ed25519Context2018.constants.CONTEXT_URL));

loader.addStatic(
'https://www.w3.org/ns/credentials/examples/v2',
{
'@context': {
'@vocab': 'https://www.w3.org/ns/credentials/examples#'
}
});
61 changes: 61 additions & 0 deletions test/test-vectors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*!
* Copyright (c) 2023-2024 Digital Bazaar, Inc. All rights reserved.
*/
/* Note: This file contains data generated from the vc-di-eddsa specification
test vectors. */

/* eslint-disable max-len */
/* eslint-disable quote-props */
/* eslint-disable quotes */
export const keyMaterial = {
"publicKeyMultibase": "z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2",
"secretKeyMultibase": "z3u2en7t5LR2WtQH5PfFqMqwVHBeXouLzo6haApm8XHqvjxq"
};

// public key above converted to multikey format + controller doc:
export const publicKey = {
'@context': 'https://w3id.org/security/multikey/v1',
id: 'did:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2#z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2',
type: 'Multikey',
controller: 'did:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2',
publicKeyMultibase: 'z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2'
};
export const controllerDoc = {
'@context': [
'https://www.w3.org/ns/did/v1',
'https://w3id.org/security/multikey/v1'
],
id: publicKey.controller,
assertionMethod: [publicKey]
};

export const signedFixture = {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2",
"https://w3id.org/security/suites/ed25519-2020/v1"
],
"id": "urn:uuid:58172aac-d8ba-11ed-83dd-0b3aef56cc33",
"type": [
"VerifiableCredential",
"AlumniCredential"
],
"name": "Alumni Credential",
"description": "A minimum viable example of an Alumni Credential.",
"issuer": "https://vc.example/issuers/5678",
"validFrom": "2023-01-01T00:00:00Z",
"credentialSubject": {
"id": "did:example:abcdefgh",
"alumniOf": "The School of Examples"
},
"proof": {
"type": "Ed25519Signature2020",
"created": "2023-02-24T23:36:38Z",
"verificationMethod": "did:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2#z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2",
"proofPurpose": "assertionMethod",
"proofValue": "z57Mm1vboMtZiCyJ4aReZsv8co4Re64Y8GEjL1ZARzMbXZgkARFLqFs1P345NpPGG2hgCrS4nNdvJhpwnrNyG3kEF"
}
};
/* eslint-enable quotes */
/* eslint-enable quote-props */
/* eslint-enable max-len */
60 changes: 60 additions & 0 deletions test/test-vectors.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*!
* Copyright (c) 2023-2024 Digital Bazaar, Inc. All rights reserved.
*/
import * as Ed25519Multikey from '@digitalbazaar/ed25519-multikey';
import {Ed25519Signature2020} from '../lib/index.js';
import {expect} from 'chai';
import jsigs from 'jsonld-signatures';
import {loader} from './documentLoader.js';

import * as testVectors from './test-vectors.js';

const {purposes: {AssertionProofPurpose}} = jsigs;

const documentLoader = loader.build();

describe('test vectors', () => {
let keyPair;
before(async () => {
const {keyMaterial} = testVectors;
keyPair = await Ed25519Multikey.from(keyMaterial);
keyPair.controller = `did:key:${keyPair.publicKeyMultibase}`;
keyPair.id = `${keyPair.controller}#${keyPair.publicKeyMultibase}`;
});

it('should create proof', async () => {
const {signedFixture} = testVectors;
const unsigned = {...signedFixture};
delete unsigned.proof;

const signer = keyPair.signer();
const date = new Date(signedFixture.proof.created);

let error;
let signed;
try {
signed = await jsigs.sign(unsigned, {
suite: new Ed25519Signature2020({signer, date}),
purpose: new AssertionProofPurpose(),
documentLoader
});
} catch(e) {
error = e;
}

expect(error).to.not.exist;
expect(signed).to.deep.equal(signedFixture);
});

it('should verify signed fixture', async () => {
const {signedFixture} = testVectors;

const result = await jsigs.verify(signedFixture, {
suite: new Ed25519Signature2020(),
purpose: new AssertionProofPurpose(),
documentLoader
});

expect(result.verified).to.be.true;
});
});

0 comments on commit e482a15

Please sign in to comment.