From 22c24e141b19bc624b02133f82161958af1f8227 Mon Sep 17 00:00:00 2001 From: finn Date: Mon, 18 Sep 2023 11:16:03 -0700 Subject: [PATCH] add some unit tests for VC and VP validation --- package-lock.json | 5 +- packages/credentials/src/ssi.ts | 4 +- .../tests/verifiable-credentials.spec.ts | 51 +++++++++++++++++++ 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 640b0f2a0..e74026100 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3607,9 +3607,10 @@ } }, "node_modules/glob": { - "version": "10.3.3", + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", + "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", diff --git a/packages/credentials/src/ssi.ts b/packages/credentials/src/ssi.ts index 3a1106fc9..030e824eb 100644 --- a/packages/credentials/src/ssi.ts +++ b/packages/credentials/src/ssi.ts @@ -107,9 +107,9 @@ export class VerifiableCredential { } else { vc = { id : uuidv4(), - '@context' : ['https://www.w3.org/2018/credentials/v1'], + '@context' : ['https://www.w3.org/2018/credentials/v1'], // should this be set to DEFAULT_CONTEXT from ./types.ts? credentialSubject : createVcOptions!.credentialSubject, - type : ['VerifiableCredential'], + type : ['VerifiableCredential'], // should this be set to DEFAULT_VC_TYPE from ./types.ts? issuer : createVcOptions!.issuer, issuanceDate : getCurrentXmlSchema112Timestamp(), credentialSchema : createVcOptions?.credentialSchema, diff --git a/packages/credentials/tests/verifiable-credentials.spec.ts b/packages/credentials/tests/verifiable-credentials.spec.ts index 8a81c23e9..e9e671a8a 100644 --- a/packages/credentials/tests/verifiable-credentials.spec.ts +++ b/packages/credentials/tests/verifiable-credentials.spec.ts @@ -3,6 +3,7 @@ import { expect } from 'chai'; import type { VerifiableCredentialTypeV1, CredentialSubject, Issuer } from '../src/types.js'; import { getCurrentXmlSchema112Timestamp, getFutureXmlSchema112Timestamp} from '../src/utils.js'; +import { VerifiableCredential, VerifiablePresentation } from '../src/ssi.js'; describe('VerifiableCredentials', () => { it('creates a vc', () => { @@ -59,4 +60,54 @@ describe('VerifiableCredentials', () => { expect(credential).to.have.property('issuanceDate'); expect(credential).to.have.property('credentialSubject'); }); + + const validVCjwts = { + 'neal-vc-1.jwt': 'eyJraWQiOiJkaWQ6aW9uOkVpRDZKY3dycWI1bEZMRld5VzU5dUxpem81bEJ1Q2hpZWlxdGQwVEZOMHhzbmc6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKNmNDMW1ObkZNVFcxRWF6WkNOREZxVEZoSVh5MWtkMHhPTFc5RFMybFRjREphYTE5V1EydDRYM1pGSWl3aWNIVmliR2xqUzJWNVNuZHJJanA3SW1OeWRpSTZJbk5sWTNBeU5UWnJNU0lzSW10MGVTSTZJa1ZESWl3aWVDSTZJak5tVkZrM1ZYcEJhVTlWTlZwR1owNVZWamwzYm01cGRFdEdRazUxUmtOUExXeGxSWEJEVnpoSE9ITWlMQ0o1SWpvaWRqSm9ObFJxVERGMFRuWXdTRE5XYjA5RmJsbDBVVkJ4UkhaT1ZDMHdiVmRaVVVkTFRHUlNha0ozYXlKOUxDSndkWEp3YjNObGN5STZXeUpoZFhSb1pXNTBhV05oZEdsdmJpSmRMQ0owZVhCbElqb2lTbk52YmxkbFlrdGxlVEl3TWpBaWZWMHNJbk5sY25acFkyVnpJanBiWFgxOVhTd2lkWEJrWVhSbFEyOXRiV2wwYldWdWRDSTZJa1ZwUWprM1NUSTJibVV3ZGtoWFlYZHVPRGsxWTFkblZsRTBjRkY1Tm1OMU9VRmxTelYyYVc0NFgzSlZlWGNpZlN3aWMzVm1abWw0UkdGMFlTSTZleUprWld4MFlVaGhjMmdpT2lKRmFVUnFTbWxFZG05UmVrc3RSbDk0VjA1VlZ6bHpNVEJVVm1scGRFSTBaMUpvUzA5aVlsaDJTMXB3ZGxOUklpd2ljbVZqYjNabGNubERiMjF0YVhSdFpXNTBJam9pUldsQ2JFazFOV3g2YjNKb2VFNDJUVkJxVWxadFYyWlpZM014TnpOS09GazNTMGhUZVU1TGNtWmlUelZmZHlKOWZRI3pwLWY2cUxNbURrNkI0MWpMWEhfLWR3TE4tb0NLaVNwMlprX1ZDa3hfdkUiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJzdWIiOiJkaWQ6a2V5Ono2TWtrVkNUTktYeWlQelVGRUxybUptb1N2NHlSNzFONVc4eWRVUTlNNDRoRTZ0dyIsIm5iZiI6MTY5NDcyNTQ3MSwiaXNzIjoiZGlkOmlvbjpFaUQ2SmN3cnFiNWxGTEZXeVc1OXVMaXpvNWxCdUNoaWVpcXRkMFRGTjB4c25nOmV5SmtaV3gwWVNJNmV5SndZWFJqYUdWeklqcGJleUpoWTNScGIyNGlPaUp5WlhCc1lXTmxJaXdpWkc5amRXMWxiblFpT25zaWNIVmliR2xqUzJWNWN5STZXM3NpYVdRaU9pSjZjQzFtTm5GTVRXMUVhelpDTkRGcVRGaElYeTFrZDB4T0xXOURTMmxUY0RKYWExOVdRMnQ0WDNaRklpd2ljSFZpYkdsalMyVjVTbmRySWpwN0ltTnlkaUk2SW5ObFkzQXlOVFpyTVNJc0ltdDBlU0k2SWtWRElpd2llQ0k2SWpObVZGazNWWHBCYVU5Vk5WcEdaMDVWVmpsM2JtNXBkRXRHUWs1MVJrTlBMV3hsUlhCRFZ6aEhPSE1pTENKNUlqb2lkakpvTmxScVRERjBUbll3U0ROV2IwOUZibGwwVVZCeFJIWk9WQzB3YlZkWlVVZExUR1JTYWtKM2F5SjlMQ0p3ZFhKd2IzTmxjeUk2V3lKaGRYUm9aVzUwYVdOaGRHbHZiaUpkTENKMGVYQmxJam9pU25OdmJsZGxZa3RsZVRJd01qQWlmVjBzSW5ObGNuWnBZMlZ6SWpwYlhYMTlYU3dpZFhCa1lYUmxRMjl0YldsMGJXVnVkQ0k2SWtWcFFqazNTVEkyYm1Vd2RraFhZWGR1T0RrMVkxZG5WbEUwY0ZGNU5tTjFPVUZsU3pWMmFXNDRYM0pWZVhjaWZTd2ljM1ZtWm1sNFJHRjBZU0k2ZXlKa1pXeDBZVWhoYzJnaU9pSkZhVVJxU21sRWRtOVJla3N0Umw5NFYwNVZWemx6TVRCVVZtbHBkRUkwWjFKb1MwOWlZbGgyUzFwd2RsTlJJaXdpY21WamIzWmxjbmxEYjIxdGFYUnRaVzUwSWpvaVJXbENiRWsxTld4NmIzSm9lRTQyVFZCcVVsWnRWMlpaWTNNeE56TktPRmszUzBoVGVVNUxjbVppVHpWZmR5SjlmUSIsImV4cCI6MTcyNjM0Nzg3MSwiaWF0IjoxNjk0NzI1NDcxLCJub25jZSI6IjczZDgzZmFhLTUzNmMtNDcyZi1iNjQyLWVjZmUzODk5ZmE5ZCIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sImlkIjoiNjg4Y2U4NDEtOTcxOC00ZDg1LWJmNWUtMzY4MGYxNGYzYjZmIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlNhbmN0aW9uQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOiJkaWQ6aW9uOkVpRDZKY3dycWI1bEZMRld5VzU5dUxpem81bEJ1Q2hpZWlxdGQwVEZOMHhzbmc6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKNmNDMW1ObkZNVFcxRWF6WkNOREZxVEZoSVh5MWtkMHhPTFc5RFMybFRjREphYTE5V1EydDRYM1pGSWl3aWNIVmliR2xqUzJWNVNuZHJJanA3SW1OeWRpSTZJbk5sWTNBeU5UWnJNU0lzSW10MGVTSTZJa1ZESWl3aWVDSTZJak5tVkZrM1ZYcEJhVTlWTlZwR1owNVZWamwzYm01cGRFdEdRazUxUmtOUExXeGxSWEJEVnpoSE9ITWlMQ0o1SWpvaWRqSm9ObFJxVERGMFRuWXdTRE5XYjA5RmJsbDBVVkJ4UkhaT1ZDMHdiVmRaVVVkTFRHUlNha0ozYXlKOUxDSndkWEp3YjNObGN5STZXeUpoZFhSb1pXNTBhV05oZEdsdmJpSmRMQ0owZVhCbElqb2lTbk52YmxkbFlrdGxlVEl3TWpBaWZWMHNJbk5sY25acFkyVnpJanBiWFgxOVhTd2lkWEJrWVhSbFEyOXRiV2wwYldWdWRDSTZJa1ZwUWprM1NUSTJibVV3ZGtoWFlYZHVPRGsxWTFkblZsRTBjRkY1Tm1OMU9VRmxTelYyYVc0NFgzSlZlWGNpZlN3aWMzVm1abWw0UkdGMFlTSTZleUprWld4MFlVaGhjMmdpT2lKRmFVUnFTbWxFZG05UmVrc3RSbDk0VjA1VlZ6bHpNVEJVVm1scGRFSTBaMUpvUzA5aVlsaDJTMXB3ZGxOUklpd2ljbVZqYjNabGNubERiMjF0YVhSdFpXNTBJam9pUldsQ2JFazFOV3g2YjNKb2VFNDJUVkJxVWxadFYyWlpZM014TnpOS09GazNTMGhUZVU1TGNtWmlUelZmZHlKOWZRIiwiaXNzdWFuY2VEYXRlIjoiMjAyMy0wOS0xNFQyMTowNDozMVoiLCJleHBpcmF0aW9uRGF0ZSI6IjIwMjQtMDktMTRUMjE6MDQ6MzFaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJkaWQ6a2V5Ono2TWtrVkNUTktYeWlQelVGRUxybUptb1N2NHlSNzFONVc4eWRVUTlNNDRoRTZ0dyIsInN1YmplY3QiOnsiZnVsbE5hbWUiOiJrIHAiLCJjb3VudHJ5IjoiVVMifSwic2NyZWVuaW5nIjp7InZlbmRvciI6IkNhc3RlbGx1bSIsIndhdGNoTGlzdHMiOlsiQ2FuYWRhIFB1YmxpYyBTYWZldHkiLCJDYW5hZGEgUkNNUCIsIkNhbmFkYSBTRU1BIiwiQ2FuYWRhIFVuaXRlZCBOYXRpb25zIEFjdCIsIkVVIFNhbmN0aW9ucyIsIlVLIEhNVCBPRlNJIiwiVU4gU2FuY3Rpb25zIiwiVVMgRmluY2VuIDMxMSBBY3Rpb25zIiwiVVMgT0ZBQyBOb24tU0ROIiwiVVMgT0ZBQyBTRE4iLCJVUyBPRkFDIFNTSSIsIlVTIFN0YXRlIERlcGFydG1lbnQgQ3ViYSBSZXN0cmljdGVkIExpc3QiLCJVUyBTdGF0ZSBEZXBhcnRtZW50IFRlcnJvcmlzdCBFeGNsdXNpb24iXSwiY2FkZW5jZSI6IkRhaWx5IiwiZnV6enlMb2dpY1BhcmFtZXRlciI6Ijg1JSIsInNjcmVlbmluZ1Jlc3VsdCI6Ik5vX01hdGNoIn19fSwianRpIjoiNjg4Y2U4NDEtOTcxOC00ZDg1LWJmNWUtMzY4MGYxNGYzYjZmIn0.viRRjlTZ6NgzKfvuVphY0tKBhL39UZHBrazlrE22i5zRTCRcspkAcLIoveyQkKCBaz3IFtkaI7hv7h6a1cs6IA', + + // neal-vc-2.jwt fails with "Error: invalid_signature: no matching public key found" for reasons that have yet to be discovered + // 'neal-vc-2.jwt' : 'eyJraWQiOiJkaWQ6aW9uOkVpRDZKY3dycWI1bEZMRld5VzU5dUxpem81bEJ1Q2hpZWlxdGQwVEZOMHhzbmc6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKNmNDMW1ObkZNVFcxRWF6WkNOREZxVEZoSVh5MWtkMHhPTFc5RFMybFRjREphYTE5V1EydDRYM1pGSWl3aWNIVmliR2xqUzJWNVNuZHJJanA3SW1OeWRpSTZJbk5sWTNBeU5UWnJNU0lzSW10MGVTSTZJa1ZESWl3aWVDSTZJak5tVkZrM1ZYcEJhVTlWTlZwR1owNVZWamwzYm01cGRFdEdRazUxUmtOUExXeGxSWEJEVnpoSE9ITWlMQ0o1SWpvaWRqSm9ObFJxVERGMFRuWXdTRE5XYjA5RmJsbDBVVkJ4UkhaT1ZDMHdiVmRaVVVkTFRHUlNha0ozYXlKOUxDSndkWEp3YjNObGN5STZXeUpoZFhSb1pXNTBhV05oZEdsdmJpSmRMQ0owZVhCbElqb2lTbk52YmxkbFlrdGxlVEl3TWpBaWZWMHNJbk5sY25acFkyVnpJanBiWFgxOVhTd2lkWEJrWVhSbFEyOXRiV2wwYldWdWRDSTZJa1ZwUWprM1NUSTJibVV3ZGtoWFlYZHVPRGsxWTFkblZsRTBjRkY1Tm1OMU9VRmxTelYyYVc0NFgzSlZlWGNpZlN3aWMzVm1abWw0UkdGMFlTSTZleUprWld4MFlVaGhjMmdpT2lKRmFVUnFTbWxFZG05UmVrc3RSbDk0VjA1VlZ6bHpNVEJVVm1scGRFSTBaMUpvUzA5aVlsaDJTMXB3ZGxOUklpd2ljbVZqYjNabGNubERiMjF0YVhSdFpXNTBJam9pUldsQ2JFazFOV3g2YjNKb2VFNDJUVkJxVWxadFYyWlpZM014TnpOS09GazNTMGhUZVU1TGNtWmlUelZmZHlKOWZRI3pwLWY2cUxNbURrNkI0MWpMWEhfLWR3TE4tb0NLaVNwMlprX1ZDa3hfdkUiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJzdWIiOiJkaWQ6a2V5Ono2TWtrVkNUTktYeWlQelVGRUxybUptb1N2NHlSNzFONVc4eWRVUTlNNDRoRTZ0dyIsIm5iZiI6MTY5NDcwNDU3MywiaXNzIjoiZGlkOmlvbjpFaUQ2SmN3cnFiNWxGTEZXeVc1OXVMaXpvNWxCdUNoaWVpcXRkMFRGTjB4c25nOmV5SmtaV3gwWVNJNmV5SndZWFJqYUdWeklqcGJleUpoWTNScGIyNGlPaUp5WlhCc1lXTmxJaXdpWkc5amRXMWxiblFpT25zaWNIVmliR2xqUzJWNWN5STZXM3NpYVdRaU9pSjZjQzFtTm5GTVRXMUVhelpDTkRGcVRGaElYeTFrZDB4T0xXOURTMmxUY0RKYWExOVdRMnQ0WDNaRklpd2ljSFZpYkdsalMyVjVTbmRySWpwN0ltTnlkaUk2SW5ObFkzQXlOVFpyTVNJc0ltdDBlU0k2SWtWRElpd2llQ0k2SWpObVZGazNWWHBCYVU5Vk5WcEdaMDVWVmpsM2JtNXBkRXRHUWs1MVJrTlBMV3hsUlhCRFZ6aEhPSE1pTENKNUlqb2lkakpvTmxScVRERjBUbll3U0ROV2IwOUZibGwwVVZCeFJIWk9WQzB3YlZkWlVVZExUR1JTYWtKM2F5SjlMQ0p3ZFhKd2IzTmxjeUk2V3lKaGRYUm9aVzUwYVdOaGRHbHZiaUpkTENKMGVYQmxJam9pU25OdmJsZGxZa3RsZVRJd01qQWlmVjBzSW5ObGNuWnBZMlZ6SWpwYlhYMTlYU3dpZFhCa1lYUmxRMjl0YldsMGJXVnVkQ0k2SWtWcFFqazNTVEkyYm1Vd2RraFhZWGR1T0RrMVkxZG5WbEUwY0ZGNU5tTjFPVUZsU3pWMmFXNDRYM0pWZVhjaWZTd2ljM1ZtWm1sNFJHRjBZU0k2ZXlKa1pXeDBZVWhoYzJnaU9pSkZhVVJxU21sRWRtOVJla3N0Umw5NFYwNVZWemx6TVRCVVZtbHBkRUkwWjFKb1MwOWlZbGgyUzFwd2RsTlJJaXdpY21WamIzWmxjbmxEYjIxdGFYUnRaVzUwSWpvaVJXbENiRWsxTld4NmIzSm9lRTQyVFZCcVVsWnRWMlpaWTNNeE56TktPRmszUzBoVGVVNUxjbVppVHpWZmR5SjlmUSIsImV4cCI6MTcyNjMyNjk3MywiaWF0IjoxNjk0NzA0NTczLCJub25jZSI6IjlhNjJiM2UyLTYyNTEtNGJiZC1hNmZlLTg5M2ZlYzhhMTI0ZCIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sImlkIjoiM2ViOWQ0NzItN2NlYi00YWVkLTlhMGQtOWIxZjFkZTI0M2U5IiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlNhbmN0aW9uQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOiJkaWQ6aW9uOkVpRDZKY3dycWI1bEZMRld5VzU5dUxpem81bEJ1Q2hpZWlxdGQwVEZOMHhzbmc6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKNmNDMW1ObkZNVFcxRWF6WkNOREZxVEZoSVh5MWtkMHhPTFc5RFMybFRjREphYTE5V1EydDRYM1pGSWl3aWNIVmliR2xqUzJWNVNuZHJJanA3SW1OeWRpSTZJbk5sWTNBeU5UWnJNU0lzSW10MGVTSTZJa1ZESWl3aWVDSTZJak5tVkZrM1ZYcEJhVTlWTlZwR1owNVZWamwzYm01cGRFdEdRazUxUmtOUExXeGxSWEJEVnpoSE9ITWlMQ0o1SWpvaWRqSm9ObFJxVERGMFRuWXdTRE5XYjA5RmJsbDBVVkJ4UkhaT1ZDMHdiVmRaVVVkTFRHUlNha0ozYXlKOUxDSndkWEp3YjNObGN5STZXeUpoZFhSb1pXNTBhV05oZEdsdmJpSmRMQ0owZVhCbElqb2lTbk52YmxkbFlrdGxlVEl3TWpBaWZWMHNJbk5sY25acFkyVnpJanBiWFgxOVhTd2lkWEJrWVhSbFEyOXRiV2wwYldWdWRDSTZJa1ZwUWprM1NUSTJibVV3ZGtoWFlYZHVPRGsxWTFkblZsRTBjRkY1Tm1OMU9VRmxTelYyYVc0NFgzSlZlWGNpZlN3aWMzVm1abWw0UkdGMFlTSTZleUprWld4MFlVaGhjMmdpT2lKRmFVUnFTbWxFZG05UmVrc3RSbDk0VjA1VlZ6bHpNVEJVVm1scGRFSTBaMUpvUzA5aVlsaDJTMXB3ZGxOUklpd2ljbVZqYjNabGNubERiMjF0YVhSdFpXNTBJam9pUldsQ2JFazFOV3g2YjNKb2VFNDJUVkJxVWxadFYyWlpZM014TnpOS09GazNTMGhUZVU1TGNtWmlUelZmZHlKOWZRIiwiaXNzdWFuY2VEYXRlIjoiMjAyMy0wOS0xNFQxNToxNjoxM1oiLCJleHBpcmF0aW9uRGF0ZSI6IjIwMjQtMDktMTRUMTU6MTY6MTNaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJkaWQ6a2V5Ono2TWtrVkNUTktYeWlQelVGRUxybUptb1N2NHlSNzFONVc4eWRVUTlNNDRoRTZ0dyIsInN1YmplY3QiOnsiZnVsbE5hbWUiOiJhbGljZSBqb25lcyIsImNvdW50cnkiOiJVUyJ9LCJzY3JlZW5pbmciOnsidmVuZG9yIjoiQ2FzdGVsbHVtIiwid2F0Y2hMaXN0cyI6WyJDYW5hZGEgUHVibGljIFNhZmV0eSIsIkNhbmFkYSBSQ01QIiwiQ2FuYWRhIFNFTUEiLCJDYW5hZGEgVW5pdGVkIE5hdGlvbnMgQWN0IiwiRVUgU2FuY3Rpb25zIiwiVUsgSE1UIE9GU0kiLCJVTiBTYW5jdGlvbnMiLCJVUyBGaW5jZW4gMzExIEFjdGlvbnMiLCJVUyBPRkFDIE5vbi1TRE4iLCJVUyBPRkFDIFNETiIsIlVTIE9GQUMgU1NJIiwiVVMgU3RhdGUgRGVwYXJ0bWVudCBDdWJhIFJlc3RyaWN0ZWQgTGlzdCIsIlVTIFN0YXRlIERlcGFydG1lbnQgVGVycm9yaXN0IEV4Y2x1c2lvbiJdLCJjYWRlbmNlIjoiRGFpbHkiLCJmdXp6eUxvZ2ljUGFyYW1ldGVyIjoiODUlIiwic2NyZWVuaW5nUmVzdWx0IjoiTm9fTWF0Y2gifX19LCJqdGkiOiIzZWI5ZDQ3Mi03Y2ViLTRhZWQtOWEwZC05YjFmMWRlMjQzZTkifQ.2zfa6BDdVWwMKmbYd2W27dRFnoOo4WWQ6DPNUFyAWACa8EGmNolju-pQ331vBZqKfZwu2qRQcI3cF-EZf3psTg', + }; + for(const [filename, jwt] of Object.entries(validVCjwts)) { + it('loads and validates valid VC ' + filename, async () => { + await VerifiableCredential.verify(jwt); + }); + } + + const validVCjsons = { + 'vc-example-1.json' : '{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"id":"http://example.edu/credentials/1872","type":["VerifiableCredential","AlumniCredential"],"issuer":"https://example.edu/issuers/565049","issuanceDate":"2010-01-01T19:23:24Z","credentialSubject":{"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","alumniOf":{"id":"did:example:c276e12ec21ebfeb1f712ebc6f1","name":[{"value":"Example University","lang":"en"},{"value":"Exemple d\'Université","lang":"fr"}]}},"proof":{"type":"RsaSignature2018","created":"2017-06-18T21:19:10Z","proofPurpose":"assertionMethod","verificationMethod":"https://example.edu/issuers/565049/keys/1","jws":"eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5XsITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUcX16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtjPAYuNzVBAh4vGHSrQyHUdBBPM"}}', + 'vc-example-11.json' : '{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"id":"http://example.gov/credentials/3732","type":["VerifiableCredential","UniversityDegreeCredential"],"issuer":"https://example.edu","issuanceDate":"2010-01-01T19:23:24Z","credentialSubject":{"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","degree":{"type":"BachelorDegree","name":"Bachelor of Science and Arts"}},"proof":{"type":"RsaSignature2018","created":"2018-06-18T21:19:10Z","proofPurpose":"assertionMethod","verificationMethod":"https://example.com/jdoe/keys/1","jws":"eyJhbGciOiJQUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19DJBMvvFAIC00nSGB6Tn0XKbbF9XrsaJZREWvR2aONYTQQxnyXirtXnlewJMBBn2h9hfcGZrvnC1b6PgWmukzFJ1IiH1dWgnDIS81BH-IxXnPkbuYDeySorc4QU9MJxdVkY5EL4HYbcIfwKj6X4LBQ2_ZHZIu1jdqLcRZqHcsDF5KKylKc1THn5VRWy5WhYg_gBnyWny8E6Qkrze53MR7OuAmmNJ1m1nN8SxDrG6a08L78J0-Fbas5OjAQz3c17GY8mVuDPOBIOVjMEghBlgl3nOi1ysxbRGhHLEK4s0KKbeRogZdgt1DkQxDFxxn41QWDw_mmMCjs9qxg0zcZzqEJw"}}', + 'vc-example-20.json' : '{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"id":"http://example.edu/credentials/3732","type":["VerifiableCredential","UniversityDegreeCredential"],"issuer":"https://example.edu/issuers/14","issuanceDate":"2010-01-01T19:23:24Z","credentialSubject":{"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","degree":{"type":"BachelorDegree","name":"Bachelor of Science and Arts"}},"refreshService":{"id":"https://example.edu/refresh/3732","type":"ManualRefreshService2018"}}', + 'vc-example-21.json' : '{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"id":"http://example.edu/credentials/3732","type":["VerifiableCredential","UniversityDegreeCredential"],"issuer":"https://example.edu/issuers/14","issuanceDate":"2010-01-01T19:23:24Z","credentialSubject":{"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","degree":{"type":"BachelorDegree","name":"Bachelor of Science and Arts"}},"termsOfUse":[{"type":"IssuerPolicy","id":"http://example.com/policies/credential/4","profile":"http://example.com/profiles/credential","prohibition":[{"assigner":"https://example.edu/issuers/14","assignee":"AllVerifiers","target":"http://example.edu/credentials/3732","action":["Archival"]}]}]}', + }; + for(const [filename, rawvc] of Object.entries(validVCjsons)) { + it('loads and validates valid VC ' + filename, () => { + const vc = JSON.parse(rawvc); + VerifiableCredential.validatePayload(vc); + }); + } + + const invalidVCjsons = { + // 'invalid-vc-1-no-issuance-date.json' : '{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"id":"http://example.edu/credentials/1872","type":["VerifiableCredential","AlumniCredential"],"issuer":"https://example.edu/issuers/565049","credentialSubject":{"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","alumniOf":{"id":"did:example:c276e12ec21ebfeb1f712ebc6f1","name":[{"value":"Example University","lang":"en"},{"value":"Exemple d\'Université","lang":"fr"}]}},"proof":{"type":"RsaSignature2018","created":"2017-06-18T21:19:10Z","proofPurpose":"assertionMethod","verificationMethod":"https://example.edu/issuers/565049/keys/1","jws":"eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5XsITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUcX16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtjPAYuNzVBAh4vGHSrQyHUdBBPM"}}', + // 'invalid-vc-2-no-issuer.json' : '{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"id":"http://example.edu/credentials/1872","type":["VerifiableCredential","AlumniCredential"],"issuanceDate":"2010-01-01T19:23:24Z","credentialSubject":{"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","alumniOf":{"id":"did:example:c276e12ec21ebfeb1f712ebc6f1","name":[{"value":"Example University","lang":"en"},{"value":"Exemple d\'Université","lang":"fr"}]}},"proof":{"type":"RsaSignature2018","created":"2017-06-18T21:19:10Z","proofPurpose":"assertionMethod","verificationMethod":"https://example.edu/issuers/565049/keys/1","jws":"eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5XsITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUcX16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtjPAYuNzVBAh4vGHSrQyHUdBBPM"}}', + 'invalid-vc-3-no-subject.json' : '{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"id":"http://example.edu/credentials/1872","type":["VerifiableCredential","AlumniCredential"],"issuer":"https://example.edu/issuers/565049","issuanceDate":"2010-01-01T19:23:24Z","proof":{"type":"RsaSignature2018","created":"2017-06-18T21:19:10Z","proofPurpose":"assertionMethod","verificationMethod":"https://example.edu/issuers/565049/keys/1","jws":"eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5XsITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUcX16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtjPAYuNzVBAh4vGHSrQyHUdBBPM"}}', + 'invalid-vc-4-wrong-context.json' : '{"@context":["https://www.w3.org/2018/fakelol/v1"],"id":"http://example.edu/credentials/1872","type":["VerifiableCredential","AlumniCredential"],"issuer":"https://example.edu/issuers/565049","issuanceDate":"2010-01-01T19:23:24Z","credentialSubject":{"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","alumniOf":{"id":"did:example:c276e12ec21ebfeb1f712ebc6f1","name":[{"value":"Example University","lang":"en"},{"value":"Exemple d\'Université","lang":"fr"}]}},"proof":{"type":"RsaSignature2018","created":"2017-06-18T21:19:10Z","proofPurpose":"assertionMethod","verificationMethod":"https://example.edu/issuers/565049/keys/1","jws":"eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5XsITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUcX16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtjPAYuNzVBAh4vGHSrQyHUdBBPM"}}', + 'invalid-vc-5-wrong-issuance-date-format.json' : '{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"id":"http://example.edu/credentials/1872","type":["VerifiableCredential","AlumniCredential"],"issuer":"https://example.edu/issuers/565049","issuanceDate":"20100101T192324Z","credentialSubject":{"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","alumniOf":{"id":"did:example:c276e12ec21ebfeb1f712ebc6f1","name":[{"value":"Example University","lang":"en"},{"value":"Exemple d\'Université","lang":"fr"}]}},"proof":{"type":"RsaSignature2018","created":"2017-06-18T21:19:10Z","proofPurpose":"assertionMethod","verificationMethod":"https://example.edu/issuers/565049/keys/1","jws":"eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5XsITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUcX16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtjPAYuNzVBAh4vGHSrQyHUdBBPM"}}', + }; + for(const [filename, rawvc] of Object.entries(invalidVCjsons)) { + it('refuses to validate invalid VC ' + filename, () => { + const vc = JSON.parse(rawvc); + expect(() => VerifiableCredential.validatePayload(vc)).to.throw(); + }); + } + + const validVPjsons = { + 'vp-example-2.json' : '{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"type":"VerifiablePresentation","verifiableCredential":[{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"id":"http://example.edu/credentials/1872","type":["VerifiableCredential","AlumniCredential"],"issuer":"https://example.edu/issuers/565049","issuanceDate":"2010-01-01T19:23:24Z","credentialSubject":{"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","alumniOf":{"id":"did:example:c276e12ec21ebfeb1f712ebc6f1","name":[{"value":"Example University","lang":"en"},{"value":"Exemple d\'Université","lang":"fr"}]}},"proof":{"type":"RsaSignature2018","created":"2017-06-18T21:19:10Z","proofPurpose":"assertionMethod","verificationMethod":"https://example.edu/issuers/565049/keys/1","jws":"eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5XsITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUcX16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtjPAYuNzVBAh4vGHSrQyHUdBBPM"}}],"proof":{"type":"RsaSignature2018","created":"2018-09-14T21:19:10Z","proofPurpose":"authentication","verificationMethod":"did:example:ebfeb1f712ebc6f1c276e12ec21#keys-1","challenge":"1f44d55f-f161-4938-a659-f8026467f126","domain":"4jt78h47fh47","jws":"eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..kTCYt5XsITJX1CxPCT8yAV-TVIw5WEuts01mq-pQy7UJiN5mgREEMGlv50aqzpqh4Qq_PbChOMqsLfRoPsnsgxD-WUcX16dUOqV0G_zS245-kronKb78cPktb3rk-BuQy72IFLN25DYuNzVBAh4vGHSrQyHUGlcTwLtjPAnKb78"}}', + 'vp-example-22.json' : '{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1",{"@protected":true,"VerifiablePresentationTermsOfUseExtension":{"@id":"https://www.w3.org/2018/credentials/examples#VerifiablePresentationExtension","@context":{"@protected":true,"termsOfUse":{"@id":"https://www.w3.org/2018/credentials#termsOfUse","@type":"@id"}}}}],"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","type":["VerifiablePresentation","VerifiablePresentationTermsOfUseExtension"],"verifiableCredential":[{"@context":["https://www.w3.org/2018/credentials/v1","https://www.w3.org/2018/credentials/examples/v1"],"id":"http://example.edu/credentials/3732","type":["VerifiableCredential","UniversityDegreeCredential"],"issuer":"https://example.edu/issuers/14","issuanceDate":"2010-01-01T19:23:24Z","credentialSubject":{"id":"did:example:ebfeb1f712ebc6f1c276e12ec21","degree":{"type":"BachelorDegree","name":"Bachelor of Science and Arts"}}}]}', + }; + for(const [filename, rawvc] of Object.entries(validVPjsons)) { + it('loads and validates valid VP ' + filename, () => { + const vc = JSON.parse(rawvc); + VerifiablePresentation.validatePayload(vc); + }); + } }); \ No newline at end of file