@ebsifnmt/verifiable-presentation v1.0.0-rc.12
Verifiable Presentation Library
The Verifiable Presentation Library provides a Core Service of the EBSI platform providing the capability of creating W3C presentations ready for signing and validating W3C Verifiable Presentations.
This library implements Verifiable Credentials Data Model 1.0 - W3C Recommendation 19 November 2019
Additional resources worth reading:
- Verifiable Credentials Implementation Guidelines 1.0 - W3C Working Group Note 24 September 2019
Table of Contents
Installing
Using npm:
$ npm i --save @cef-ebsi/verifiable-presentation
Using yarn:
$ yarn add @cef-ebsi/verifiable-presentation
Examples
Creating a new presentation
The createPresentation
just validates the input parameters and returns a
presentation ready to be signed, with the correct type
and @context
:
import { createPresentation } from "@cef-ebsi/verifiable-presentation";
const presentation = createPresentation({
verifiableCredential: [
{
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://EBSI-WEBSITE.EU/schemas/vc/2019/v1#",
"https://EBSI-WEBSITE.EU/schemas/eidas/2019/v1#",
],
type: ["VerifiableCredential"],
issuanceDate: "2020-11-23T00:00:00Z",
credentialSubject: {
name: "alice",
},
issuer: "did:ebsi:zsSgDXeYPhZ3AuKhTFneDf1",
proof: {
type: "EcdsaSecp256k1Signature2019",
created: "2020-11-12T12:08:08.163Z",
proofPurpose: "assertionMethod",
verificationMethod: "did:ebsi:zsSgDXeYPhZ3AuKhTFneDf1#keys-1",
jws: "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9..xSfnO21PsmCPgLkE34wZQ5mLOcRmb4NPiBSKw3EULCBZiVSWrR_VhddwMuyydBwkimA04f2NJQofD3gF3t5tuAE",
},
},
],
holder: "did:ebsi:zwDb6tWecUjaoShWYx9fmqZ",
});
console.log(presentation);
/*
{
"@context": ["https://www.w3.org/2018/credentials/v1"],
type: "VerifiablePresentation",
verifiableCredential: [
{
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://EBSI-WEBSITE.EU/schemas/vc/2019/v1#",
"https://EBSI-WEBSITE.EU/schemas/eidas/2019/v1#",
],
type: ["VerifiableCredential"],
issuanceDate: "2020-11-23T00:00:00Z",
credentialSubject: {
name: "alice",
},
issuer: "did:ebsi:zsSgDXeYPhZ3AuKhTFneDf1",
proof: {
type: "EcdsaSecp256k1Signature2019",
created: "2020-11-12T12:08:08.163Z",
proofPurpose: "assertionMethod",
verificationMethod:
"did:ebsi:zsSgDXeYPhZ3AuKhTFneDf1#keys-1",
jws:
"eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9..xSfnO21PsmCPgLkE34wZQ5mLOcRmb4NPiBSKw3EULCBZiVSWrR_VhddwMuyydBwkimA04f2NJQofD3gF3t5tuAE",
},
},
],
holder: "did:ebsi:zwDb6tWecUjaoShWYx9fmqZ"
}
*/
Validating a presentation
Use validatePresentation
only verifies that a presentation object is valid. This function throws a
(ValidationError if the input is not a valid
presentation object.
import { validatePresentation } from "@cef-ebsi/verifiable-presentation";
// This code will throw an error because the `@context` is not valid
validatePresentation(
{
"@context": ["https://custom-context.io"],
type: "VerifiablePresentation",
verifiableCredential: [
{
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://EBSI-WEBSITE.EU/schemas/vc/2019/v1#",
"https://EBSI-WEBSITE.EU/schemas/eidas/2019/v1#",
],
type: ["VerifiableCredential"],
issuanceDate: "2020-11-23T00:00:00Z",
credentialSubject: {
name: "alice",
},
issuer: "did:ebsi:zsSgDXeYPhZ3AuKhTFneDf1",
proof: {
type: "EcdsaSecp256k1Signature2019",
created: "2020-11-12T12:08:08.163Z",
proofPurpose: "assertionMethod",
verificationMethod: "did:ebsi:zsSgDXeYPhZ3AuKhTFneDf1#keys-1",
jws: "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9..xSfnO21PsmCPgLkE34wZQ5mLOcRmb4NPiBSKw3EULCBZiVSWrR_VhddwMuyydBwkimA04f2NJQofD3gF3t5tuAE",
},
},
],
holder: "did:ebsi:zwDb6tWecUjaoShWYx9fmqZ",
},
{
tirUrl: "https://api.preprod.ebsi.eu/trusted-issuers-registry/v2/issuers",
resolver: "https://api.preprod.ebsi.eu/did-registry/v2/identifiers",
}
);
You can also integrate the joi presentationSchema
into other joi schemas, e.g. if you expect to
receive an object containing a set of presentations:
import Joi from "joi";
import { presentationSchema } from "@cef-ebsi/verifiable-presentation";
Joi.assert(
// Object to validate
{},
// Schema
{
name: Joi.string().required(),
presentations: Joi.array().items(presentationSchema).min(1).required(),
}
);
Creating a new Verifiable Presentation
The createVerifiablePresentation
function takes the following parameters as input:
- a valid presentation, e.g. one that has been created with
createPresentation
- a proof
- a signature object
- options parameter specifying how to validate the vcs included in the vp, i.e. the did document resolver and trusted issuer registry endpoints
It returns a Verifiable Presentation document.
import {
createPresentation,
createVerifiablePresentation,
} from "@cef-ebsi/verifiable-presentation";
const presentation = createPresentation({
/* check first example to see what is expected */
});
const proof = {
type: "EcdsaSecp256k1Signature2019",
proofPurpose: "assertionMethod",
verificationMethod: "did:ebsi:zwDb6tWecUjaoShWYx9fmqZ#keys-1",
};
const signature = {
proofValue:
"eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9..xSfnO21PsmCPgLkE34wZQ5mLOcRmb4NPiBSKw3EULCBZiVSWrR_VhddwMuyydBwkimA04f2NJQofD3gF3t5tuAE",
proofValueName: "jws",
};
const options = {
tirUrl: "https://api.preprod.ebsi.eu/trusted-issuers-registry/v2/issuers",
resolver: "https://api.preprod.ebsi.eu/did-registry/v2/identifiers",
};
const verifiablePresentation = createVerifiablePresentation(
presentation,
proof,
signature,
options
);
console.log(verifiablePresentation);
/*
{
"@context": ["https://www.w3.org/2018/credentials/v1"],
type: "VerifiablePresentation",
verifiableCredential: [
{
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://EBSI-WEBSITE.EU/schemas/vc/2019/v1#",
"https://EBSI-WEBSITE.EU/schemas/eidas/2019/v1#",
],
type: ["VerifiableCredential"],
issuanceDate: "2020-11-23T00:00:00Z",
credentialSubject: { name: "alice" },
issuer: "did:ebsi:zsSgDXeYPhZ3AuKhTFneDf1",
proof: {
type: "EcdsaSecp256k1Signature2019",
created: "2020-11-12T12:08:08.163Z",
proofPurpose: "assertionMethod",
verificationMethod:
"did:ebsi:zsSgDXeYPhZ3AuKhTFneDf1#keys-1",
jws:
"eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9..xSfnO21PsmCPgLkE34wZQ5mLOcRmb4NPiBSKw3EULCBZiVSWrR_VhddwMuyydBwkimA04f2NJQofD3gF3t5tuAE",
},
},
],
holder: "did:ebsi:zwDb6tWecUjaoShWYx9fmqZ",
proof: {
type: "EcdsaSecp256k1Signature2019",
created: "2020-12-04T09:00:54Z",
proofPurpose: "authentication",
verificationMethod:
"did:ebsi:zwDb6tWecUjaoShWYx9fmqZ#keys-1",
jws:
"eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9..xSfnO21PsmCPgLkE34wZQ5mLOcRmb4NPiBSKw3EULCBZiVSWrR_VhddwMuyydBwkimA04f2NJQofD3gF3t5tuAE",
},
}
*/
Validating a Verifiable Pesentation
Use validateVerifiablePresentation
to verify that a verifiable presentation object is valid. This function throws a
(ValidationError if the input is not a valid
presentation object.
import { validatePresentation } from "@cef-ebsi/verifiable-presentation";
const options = {
tirUrl: "https://api.preprod.ebsi.eu/trusted-issuers-registry/v2/issuers",
resolver: "https://api.preprod.ebsi.eu/did-registry/v2/identifiers",
didMethodsUrl: "https://api.preprod.ebsi.eu/did-registry/v2/did-methods",
};
// This code will throw an error because the `proof.type` is not valid
await validateVerifiablePresentation(
{
"@context": ["https://www.w3.org/2018/credentials/v1"],
type: "VerifiablePresentation",
verifiableCredential: [
{
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://EBSI-WEBSITE.EU/schemas/vc/2019/v1#",
"https://EBSI-WEBSITE.EU/schemas/eidas/2019/v1#",
],
type: ["VerifiableCredential"],
issuanceDate: "2020-11-23T00:00:00Z",
credentialSubject: { name: "alice" },
issuer: "did:ebsi:zsSgDXeYPhZ3AuKhTFneDf1",
proof: {
type: "EcdsaSecp256k1Signature2019",
created: "2020-11-12T12:08:08.163Z",
proofPurpose: "assertionMethod",
verificationMethod: "did:ebsi:zsSgDXeYPhZ3AuKhTFneDf1#keys-1",
jws: "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9..xSfnO21PsmCPgLkE34wZQ5mLOcRmb4NPiBSKw3EULCBZiVSWrR_VhddwMuyydBwkimA04f2NJQofD3gF3t5tuAE",
},
},
],
holder: "did:ebsi:zwDb6tWecUjaoShWYx9fmqZ",
proof: {
type: "EcdsaSecp256k1Signature2019",
created: "2020-12-04T09:00:54Z",
proofPurpose: "authentication",
verificationMethod: "did:ebsi:zwDb6tWecUjaoShWYx9fmqZ#keys-1",
jws: "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9..xSfnO21PsmCPgLkE34wZQ5mLOcRmb4NPiBSKw3EULCBZiVSWrR_VhddwMuyydBwkimA04f2NJQofD3gF3t5tuAE",
},
},
options
);
You can also integrate the joi verifiablePresentationSchema
into other joi schemas, e.g. if you expect to
receive an object containing a set of Verifiable Presentations:
import Joi from "joi";
import { verifiablePresentationSchema } from "@cef-ebsi/verifiable-presentation";
Joi.assert(
// Object to validate
{},
// Schema
{
name: Joi.string().required(),
verifiablePresentations: Joi.array()
.items(verifiablePresentationSchema)
.min(1)
.required(),
}
);
Linting
$ yarn lint
Auditing
$ yarn run audit
Testing
$ yarn test
Licensing
Copyright (c) 2019 European Commission
Licensed under the EUPL, Version 1.2 or - as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence");
You may not use this work except in compliance with the Licence.
You may obtain a copy of the Licence at:
Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licence for the specific language governing permissions and limitations under the Licence.