Skip to content

Commit

Permalink
fix(credentials-w3c): accept Presentations without Credentials (#616)
Browse files Browse the repository at this point in the history
* fix(deps): update dependency did-jwt-vc to v2.1.6

* fix(credentials-w3c): accept Presentations without Credentials
  • Loading branch information
renovate[bot] committed Jul 22, 2021
1 parent 917ae6d commit 2389cd0
Show file tree
Hide file tree
Showing 14 changed files with 59 additions and 72 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"build-clean": "rimraf ./packages/*/build ./packages/*/api ./packages/*/node_modules ./packages/*/tsconfig.tsbuildinfo && jest --clearCache",
"publish:latest": "lerna publish --conventional-commits --include-merged-tags --create-release github --yes --dist-tag latest --registry https://registry.npmjs.org/:_authToken=${NPM_TOKEN}",
"publish:next": "lerna publish --conventional-prerelease --force-publish --canary --no-git-tag-version --include-merged-tags --preid next --pre-dist-tag next --yes --registry https://registry.npmjs.org/:_authToken=${NPM_TOKEN}",
"publish:unstable": "lerna publish --repo-version 0.0.42 --conventional-prerelease --force-publish --canary --no-git-tag-version --include-merged-tags --preid unstable --pre-dist-tag unstable --yes --registry https://registry.npmjs.org/:_authToken=${NPM_TOKEN}"
"publish:unstable": "lerna publish --conventional-prerelease --force-publish --canary --no-git-tag-version --include-merged-tags --preid unstable --pre-dist-tag unstable --yes --registry https://registry.npmjs.org/:_authToken=${NPM_TOKEN}"
},
"workspaces": [
"packages/*"
Expand Down
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
},
"dependencies": {
"debug": "^4.1.1",
"did-jwt-vc": "2.1.3",
"did-jwt-vc": "2.1.6",
"events": "^3.2.0",
"z-schema": "^5.0.0"
},
Expand Down
2 changes: 0 additions & 2 deletions packages/core/plugin.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -1560,7 +1560,6 @@
"@context",
"type",
"verifier",
"verifiableCredential",
"proof"
],
"description": "Verifiable Presentation {@link https://github.com/decentralized-identifier/did-jwt-vc }"
Expand Down Expand Up @@ -1955,7 +1954,6 @@
"@context",
"type",
"verifier",
"verifiableCredential",
"proof"
],
"description": "Verifiable Presentation {@link https://github.com/decentralized-identifier/did-jwt-vc }"
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/types/IMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export interface VerifiablePresentation {
'@context': string[]
type: string[]
verifier: string[]
verifiableCredential: VerifiableCredential[]
verifiableCredential?: VerifiableCredential[]
proof: {
type?: string
[x: string]: any
Expand Down Expand Up @@ -78,7 +78,7 @@ export interface W3CPresentation {
'@context': string[]
type: string[]
verifier: string[]
verifiableCredential: VerifiableCredential[]
verifiableCredential?: VerifiableCredential[]
[x: string]: any
}

Expand Down
2 changes: 1 addition & 1 deletion packages/credential-w3c/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"@veramo/message-handler": "^2.0.0",
"blakejs": "^1.1.0",
"debug": "^4.1.1",
"did-jwt-vc": "2.1.3",
"did-jwt-vc": "2.1.6",
"did-resolver": "3.1.0"
},
"devDependencies": {
Expand Down
1 change: 0 additions & 1 deletion packages/credential-w3c/plugin.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,6 @@
"@context",
"type",
"verifier",
"verifiableCredential",
"proof"
],
"description": "Verifiable Presentation {@link https://github.com/decentralized-identifier/did-jwt-vc }"
Expand Down
97 changes: 45 additions & 52 deletions packages/credential-w3c/src/action-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,20 @@ import {
IDIDManager,
IKeyManager,
IPluginMethodMap,
W3CCredential,
W3CPresentation,
VerifiableCredential,
VerifiablePresentation,
IDataStore,
IKey,
IIdentifier,
} from '@veramo/core'

import {
createVerifiableCredentialJwt,
createVerifiablePresentationJwt,
CredentialPayload,
normalizeCredential,
normalizePresentation,
PresentationPayload,
} from 'did-jwt-vc'

import { schema } from './'
Expand Down Expand Up @@ -50,17 +51,7 @@ export interface ICreateVerifiablePresentationArgs {
*
* '@context', 'type' and 'issuanceDate' will be added automatically if omitted
*/
presentation: {
id?: string
holder: string
issuanceDate?: string
expirationDate?: string
'@context'?: string[]
type?: string[]
verifier: string[]
verifiableCredential: VerifiableCredential[]
[x: string]: any
}
presentation: Partial<PresentationPayload>

/**
* If this parameter is true, the resulting VerifiablePresentation is sent to the
Expand Down Expand Up @@ -97,23 +88,7 @@ export interface ICreateVerifiableCredentialArgs {
*
* '@context', 'type' and 'issuanceDate' will be added automatically if omitted
*/
credential: {
'@context'?: string[]
id?: string
type?: string[]
issuer: { id: string; [x: string]: any }
issuanceDate?: string
expirationDate?: string
credentialSubject: {
id?: string
[x: string]: any
}
credentialStatus?: {
id: string
type: string
}
[x: string]: any
}
credential: Partial<CredentialPayload>

/**
* If this parameter is true, the resulting VerifiablePresentation is sent to the
Expand Down Expand Up @@ -211,17 +186,25 @@ export class CredentialIssuer implements IAgentPlugin {
args: ICreateVerifiablePresentationArgs,
context: IContext,
): Promise<VerifiablePresentation> {
try {
const presentation: W3CPresentation = {
...args.presentation,
'@context': args.presentation['@context'] || ['https://www.w3.org/2018/credentials/v1'],
//FIXME: make sure 'VerifiablePresentation' is the first element in this array:
type: args.presentation.type || ['VerifiablePresentation'],
issuanceDate: args.presentation.issuanceDate || new Date().toISOString(),
}
const presentation: Partial<PresentationPayload> = {
...args?.presentation,
'@context': args?.presentation['@context'] || ['https://www.w3.org/2018/credentials/v1'],
//FIXME: make sure 'VerifiablePresentation' is the first element in this array:
type: args?.presentation?.type || ['VerifiablePresentation'],
issuanceDate: args?.presentation?.issuanceDate || new Date().toISOString(),
}

//FIXME: if the identifier is not found, the error message should reflect that.
const identifier = await context.agent.didManagerGet({ did: presentation.holder })
if (!presentation.holder || typeof presentation.holder === 'undefined') {
throw new Error('invalid_argument: args.presentation.holder must not be empty')
}

let identifier: IIdentifier
try {
identifier = await context.agent.didManagerGet({ did: presentation.holder })
} catch (e) {
throw new Error('invalid_argument: args.presentation.holder must be a DID managed by this agent')
}
try {
//FIXME: `args` should allow picking a key or key type
const key = identifier.keys.find((k) => k.type === 'Secp256k1' || k.type === 'Ed25519')
if (!key) throw Error('No signing key for ' + identifier.did)
Expand All @@ -234,7 +217,7 @@ export class CredentialIssuer implements IAgentPlugin {
const signer = wrapSigner(context, key, alg)

const jwt = await createVerifiablePresentationJwt(
presentation,
presentation as PresentationPayload,
{ did: identifier.did, signer, alg },
{ removeOriginalFields: args.removeOriginalFields },
)
Expand All @@ -256,17 +239,27 @@ export class CredentialIssuer implements IAgentPlugin {
args: ICreateVerifiableCredentialArgs,
context: IContext,
): Promise<VerifiableCredential> {
try {
const credential: W3CCredential = {
...args.credential,
'@context': args.credential['@context'] || ['https://www.w3.org/2018/credentials/v1'],
//FIXME: make sure 'VerifiableCredential' is the first element in this array:
type: args.credential.type || ['VerifiableCredential'],
issuanceDate: args.credential.issuanceDate || new Date().toISOString(),
}
const credential: Partial<CredentialPayload> = {
...args?.credential,
'@context': args?.credential?.['@context'] || ['https://www.w3.org/2018/credentials/v1'],
//FIXME: make sure 'VerifiableCredential' is the first element in this array:
type: args?.credential?.type || ['VerifiableCredential'],
issuanceDate: args?.credential?.issuanceDate || new Date().toISOString(),
}

//FIXME: if the identifier is not found, the error message should reflect that.
const identifier = await context.agent.didManagerGet({ did: credential.issuer.id })
//FIXME: if the identifier is not found, the error message should reflect that.
const issuer = typeof credential.issuer === 'string' ? credential.issuer : credential?.issuer?.id
if (!issuer || typeof issuer === 'undefined') {
throw new Error('invalid_argument: args.credential.issuer must not be empty')
}

let identifier: IIdentifier
try {
identifier = await context.agent.didManagerGet({ did: issuer })
} catch (e) {
throw new Error(`invalid_argument: args.credential.issuer must be a DID managed by this agent. ${e}`)
}
try {
//FIXME: `args` should allow picking a key or key type
const key = identifier.keys.find((k) => k.type === 'Secp256k1' || k.type === 'Ed25519')
if (!key) throw Error('No signing key for ' + identifier.did)
Expand All @@ -278,7 +271,7 @@ export class CredentialIssuer implements IAgentPlugin {
}
const signer = wrapSigner(context, key, alg)
const jwt = await createVerifiableCredentialJwt(
credential,
credential as CredentialPayload,
{ did: identifier.did, signer, alg },
{ removeOriginalFields: args.removeOriginalFields },
)
Expand Down
1 change: 0 additions & 1 deletion packages/data-store/plugin.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,6 @@
"@context",
"type",
"verifier",
"verifiableCredential",
"proof"
],
"description": "Verifiable Presentation {@link https://github.com/decentralized-identifier/did-jwt-vc }"
Expand Down
2 changes: 1 addition & 1 deletion packages/data-store/src/__tests__/data-store-orm.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ describe('@veramo/data-store entities', () => {
}

const presentations = await agent.dataStoreORMGetVerifiablePresentations(args)
expect(presentations[0].verifiablePresentation.verifiableCredential[0].id).toEqual('vc6')
expect(presentations[0].verifiablePresentation.verifiableCredential?.[0]?.id).toEqual('vc6')
})

it('should query identifiers', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/data-store/src/entities/presentation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,6 @@ export const createPresentationEntity = (vp: VerifiablePresentation): Presentati

presentation.raw = vp

presentation.credentials = vp.verifiableCredential.map(createCredentialEntity)
presentation.credentials = (vp.verifiableCredential || []).map(createCredentialEntity)
return presentation
}
1 change: 0 additions & 1 deletion packages/did-comm/plugin.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,6 @@
"@context",
"type",
"verifier",
"verifiableCredential",
"proof"
],
"description": "Verifiable Presentation {@link https://github.com/decentralized-identifier/did-jwt-vc }"
Expand Down
1 change: 0 additions & 1 deletion packages/selective-disclosure/plugin.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,6 @@
"@context",
"type",
"verifier",
"verifiableCredential",
"proof"
],
"description": "Verifiable Presentation {@link https://github.com/decentralized-identifier/did-jwt-vc }"
Expand Down
2 changes: 1 addition & 1 deletion packages/selective-disclosure/src/action-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ export class SelectiveDisclosure implements IAgentPlugin {
let valid = true
let claims = []
for (const credentialRequest of args.sdr.claims) {
let credentials = args.presentation.verifiableCredential.filter((credential) => {
let credentials = (args.presentation?.verifiableCredential || []).filter((credential) => {
if (
credentialRequest.claimType &&
credentialRequest.claimValue &&
Expand Down
12 changes: 6 additions & 6 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4332,15 +4332,15 @@ dezalgo@^1.0.0:
asap "^2.0.0"
wrappy "1"

did-jwt-vc@2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/did-jwt-vc/-/did-jwt-vc-2.1.3.tgz#cb8139e38eca874657e907300bf86d624cd848dd"
integrity sha512-bzrkeNCJmz5TlR4VBHRiKKWI3fItOnzHHe6ecTlHnuyPUPUHb0ogygGdkCwA6xb01HB68pytnfvqHW1GMle/sw==
did-jwt-vc@2.1.6:
version "2.1.6"
resolved "https://registry.yarnpkg.com/did-jwt-vc/-/did-jwt-vc-2.1.6.tgz#9fde530800e9b96ba5747775467b4a6aefabd05b"
integrity sha512-lLYRTyYI0q4rPuHEFZ8B+TCXYBlrkpXuzjNHjDfSKqhBEHrG6NVnRF1N3P/9nre4qzY0kw3yI1gNm5Yd+umOoA==
dependencies:
did-jwt "^5.4.0"
did-jwt "^5.6.1"
did-resolver "^3.1.0"

did-jwt@5.6.2, did-jwt@^5.4.0:
did-jwt@5.6.2, did-jwt@^5.4.0, did-jwt@^5.6.1:
version "5.6.2"
resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-5.6.2.tgz#6b84f91db614bd844b58b45e94fb93ac748bdcd1"
integrity sha512-WNX6haTfgNZZrOLxyeGdxKUh7tQJ07jJCcWIvXaq+wms0UxA7XGbdcEuz9h3uJsuIE+/7a3HgAy1FjD1DTcfww==
Expand Down

0 comments on commit 2389cd0

Please sign in to comment.