jsonld-signatures-merkleproof2019
Version:
A jsonld signature implementation to support MerkleProof2019 verification in Verifiable Credential context
209 lines (187 loc) • 6.57 kB
text/typescript
import { describe, it, expect } from 'vitest';
import fixture from '../fixtures/mocknet-vc-v2-data-integrity-proof.json';
import { LDMerkleProof2019 } from '../../src';
import fixtureIssuerProfile from '../fixtures/issuer-blockcerts.json';
import type IVerificationMethod from '../../src/models/VerificationMethod';
describe('given the document is signed following the DataIntegrityProof spec', function () {
describe('and is a valid MerkleProof2019 signature', function () {
it('should verify successfully', async function () {
const instance = new LDMerkleProof2019({
document: fixture,
proof: fixture.proof // merkle proof
});
const result = await instance.verifyProof();
expect(result).toEqual({
verified: true,
verificationMethod: null,
error: ''
});
});
});
describe('given the proofPurpose property of the proof is missing', function () {
it('should throw an error', async function () {
const proof = {
...fixture.proof
};
delete proof.proofPurpose;
const instance = new LDMerkleProof2019({
document: fixture,
proof
});
const result = await instance.verifyProof();
expect(result).toEqual({
verified: false,
verificationMethod: null,
error: '`proofPurpose` property is missing from proof'
});
});
});
describe('given the proofPurpose of the proof does not match the one of the verifier', function () {
it('should throw an error', async function () {
const instance = new LDMerkleProof2019({
document: fixture,
proof: fixture.proof,
proofPurpose: 'authentication'
});
const result = await instance.verifyProof();
expect(result).toEqual({
verified: false,
verificationMethod: null,
error: 'Invalid proof purpose. Expected authentication but received assertionMethod'
});
});
});
describe('given the proofPurpose of the proof does not match the one of the issuer\'s key', function () {
it('should throw an error', async function () {
const instance = new LDMerkleProof2019({
document: fixture,
proof: {
...fixture.proof,
proofPurpose: 'authentication'
},
proofPurpose: 'authentication',
issuer: fixtureIssuerProfile
});
const result = await instance.verifyProof();
expect(result).toEqual({
verified: false,
verificationMethod: null,
error: 'The verification method https://www.blockcerts.org/samples/3.0/issuer-blockcerts.json#key-1 is not allowed for the proof purpose authentication'
});
});
});
describe('given the domain property of the proof does not match the verifier\'s domain', function () {
it('should throw an error', async function () {
const instance = new LDMerkleProof2019({
document: fixture,
proof: {
...fixture.proof,
domain: 'blockcerts.org'
},
proofPurpose: 'assertionMethod',
issuer: fixtureIssuerProfile,
domain: ['example.com', 'another-domain.com']
});
const result = await instance.verifyProof();
expect(result).toEqual({
verified: false,
verificationMethod: null,
error: 'The proof is not authorized for this domain'
});
});
});
describe('given the challenge provided by the proof does not match the verifier\'s challenge', function () {
it('should throw an error', async function () {
const instance = new LDMerkleProof2019({
document: fixture,
proof: {
...fixture.proof,
domain: 'blockcerts.org',
challenge: 'another-challenge'
},
proofPurpose: 'assertionMethod',
issuer: fixtureIssuerProfile,
domain: 'blockcerts.org',
challenge: 'challenge'
});
const result = await instance.verifyProof();
expect(result).toEqual({
verified: false,
verificationMethod: null,
error: 'The proof\'s challenge does not match the verifier\'s challenge'
});
});
});
describe('given the created property is missing', function () {
it('should throw an error', async function () {
const proof = {
...fixture.proof
};
delete proof.created;
const instance = new LDMerkleProof2019({
document: fixture,
proof,
proofPurpose: 'assertionMethod',
issuer: fixtureIssuerProfile
});
const result = await instance.verifyProof();
expect(result).toEqual({
verified: false,
verificationMethod: null,
error: '`created` property is missing from proof'
});
});
});
describe('given the specified verification method has expired', function () {
it('should throw an error', async function () {
const issuer = {
...fixtureIssuerProfile
};
const issuerVerificationMethod: IVerificationMethod = issuer.verificationMethod
.find(vm => vm.id === fixture.proof.verificationMethod);
const verificationMethod = {
...issuerVerificationMethod,
expires: '2023-04-05T18:45:30Z'
};
const instance = new LDMerkleProof2019({
document: fixture,
proof: fixture.proof,
proofPurpose: 'assertionMethod',
verificationMethod,
issuer
});
const result = await instance.verifyProof();
expect(result).toEqual({
verified: false,
verificationMethod,
error: 'Error: The verification key has expired'
});
});
});
describe('given the specified verification method has been revoked', function () {
it('should throw an error', async function () {
const issuer = {
...fixtureIssuerProfile
};
const issuerVerificationMethod: IVerificationMethod = issuer.verificationMethod
.find(vm => vm.id === fixture.proof.verificationMethod);
const verificationMethod = {
...issuerVerificationMethod,
revoked: '2023-04-05T18:45:30Z'
};
const instance = new LDMerkleProof2019({
document: fixture,
proof: fixture.proof,
proofPurpose: 'assertionMethod',
verificationMethod,
issuer
});
const result = await instance.verifyProof();
expect(result).toEqual({
verified: false,
verificationMethod,
error: 'Error: The verification key has been revoked'
});
});
});
});