diff --git a/packages/daf-w3c/src/action-handler.ts b/packages/daf-w3c/src/action-handler.ts index b277d0b3a..addf7192a 100644 --- a/packages/daf-w3c/src/action-handler.ts +++ b/packages/daf-w3c/src/action-handler.ts @@ -1,5 +1,4 @@ -import { IAgent, IAgentIdentityManager, IAgentExtension, Credential, Presentation } from 'daf-core' -import { IAgentResolve } from 'daf-resolver' +import { IAgentBase, IAgentResolve, IAgentIdentityManager, IAgentKeyManager, IAgentExtension, Credential, Presentation, VerifiableCredential, VerifiablePresentation, IAgentDataStore } from 'daf-core' import { createVerifiableCredential, createPresentation as createVerifiablePresentation, @@ -26,7 +25,7 @@ export interface ISignCredentialJwtArgs { } type TContext = { - agent: IAgent & IAgentIdentityManager & IAgentResolve + agent: IAgentBase & IAgentIdentityManager & IAgentResolve & IAgentDataStore & IAgentKeyManager dbConnection: Promise } @@ -41,21 +40,22 @@ export interface IAgentSignCredentialJwt { signCredentialJwt?: IAgentExtension } -export const signPresentationJwt: TSignPresentationJwt = async (args, ctx) => { +export const signPresentationJwt: TSignPresentationJwt = async (args, context) => { const { data, save } = args try { const payload = transformPresentationInput(data) - const identity = await ctx.agent.getIdentity({ did: data.issuer }) - const key = await identity.keyByType('Secp256k1') + const identity = await context.agent.identityManagerGetIdentity({ did: data.issuer }) + const key = identity.keys.find(k => k.type === 'Secp256k1') + const signer = (data: string) => context.agent.keyManagerSignJWT({kid: key.kid, data}) debug('Signing VP with', identity.did) // Removing duplicate JWT payload.vp.verifiableCredential = Array.from(new Set(payload.vp.verifiableCredential)) - const jwt = await createVerifiablePresentation(payload, { did: identity.did, signer: key.signer() }) + const jwt = await createVerifiablePresentation(payload, { did: identity.did, signer }) - const credentials: Credential[] = [] + const credentials: VerifiableCredential[] = [] for (const credentialJwt of payload.vp.verifiableCredential) { const verified = await verifyCredential(credentialJwt, { - resolve: (did: string) => ctx.agent.resolve({ did }), + resolve: (didUrl: string) => context.agent.resolveDid({ didUrl }), }) credentials.push(createCredential(verified.payload, credentialJwt)) } @@ -64,7 +64,7 @@ export const signPresentationJwt: TSignPresentationJwt = async (args, ctx) => { const decoded = decodeJWT(jwt) const presentation = createPresentation(decoded.payload as PresentationPayload, jwt, credentials) if (save) { - await (await ctx.dbConnection).getRepository(Presentation).save(presentation) + await context.agent.dataStoreSaveVerifiablePresentation(presentation) } return presentation } catch (error) { @@ -73,19 +73,21 @@ export const signPresentationJwt: TSignPresentationJwt = async (args, ctx) => { } } -export const signCredentialJwt: TSignCredentialJwt = async (args, ctx) => { +export const signCredentialJwt: TSignCredentialJwt = async (args, context) => { const { data, save } = args try { const payload = transformCredentialInput(data) - const identity = await ctx.agent.getIdentity({ did: data.issuer }) - const key = await identity.keyByType('Secp256k1') + const identity = await context.agent.identityManagerGetIdentity({ did: data.issuer }) + const key = identity.keys.find(k => k.type === 'Secp256k1') + const signer = (data: string) => context.agent.keyManagerSignJWT({kid: key.kid, data}) + debug('Signing VC with', identity.did) - const jwt = await createVerifiableCredential(payload, { did: identity.did, signer: key.signer() }) + const jwt = await createVerifiableCredential(payload, { did: identity.did, signer }) debug(jwt) const decoded = decodeJWT(jwt) const credential = createCredential(decoded.payload as VerifiableCredentialPayload, jwt) if (save) { - await (await ctx.dbConnection).getRepository(Credential).save(credential) + await context.agent.dataStoreSaveVerifiableCredential(credential) } return credential } catch (error) { diff --git a/packages/daf-w3c/src/message-handler.ts b/packages/daf-w3c/src/message-handler.ts index ab836fa77..d8405756d 100644 --- a/packages/daf-w3c/src/message-handler.ts +++ b/packages/daf-w3c/src/message-handler.ts @@ -1,5 +1,4 @@ -import { IAgent, AbstractMessageHandler, Message, Identity, Credential, Presentation } from 'daf-core' -import { IAgentResolve } from 'daf-resolver' +import { IAgentBase, IAgentResolve, AbstractMessageHandler, Message, IIdentity, Credential, Presentation, VerifiablePresentation, VerifiableCredential } from 'daf-core' import { blake2bHex } from 'blakejs' import { @@ -19,7 +18,7 @@ export const MessageTypes = { } interface IContext { - agent: IAgent & IAgentResolve + agent: IAgentBase & IAgentResolve } export class W3cMessageHandler extends AbstractMessageHandler { @@ -33,10 +32,10 @@ export class W3cMessageHandler extends AbstractMessageHandler { validatePresentationAttributes(data) debug('JWT is', MessageTypes.vp) - const credentials: Credential[] = [] + const credentials: VerifiableCredential[] = [] for (const jwt of data.vp.verifiableCredential) { const verified = await verifyCredential(jwt, { - resolve: (did: string) => context.agent.resolve({ did }), + resolve: (didUrl: string) => context.agent.resolveDid({ didUrl }), }) credentials.push(createCredential(verified.payload, jwt)) } @@ -44,12 +43,10 @@ export class W3cMessageHandler extends AbstractMessageHandler { message.id = blake2bHex(message.raw) message.type = MessageTypes.vp - message.from = new Identity() - message.from.did = message.data.iss + message.from = message.data.iss - message.to = new Identity() const audArray = Array.isArray(message.data.aud) ? (message.data.aud as string[]) : [message.data.aud] - message.to.did = audArray[0] + message.to = audArray[0] if (message.data.tag) { message.threadId = message.data.tag @@ -69,11 +66,9 @@ export class W3cMessageHandler extends AbstractMessageHandler { message.id = blake2bHex(message.raw) message.type = MessageTypes.vc - message.from = new Identity() - message.from.did = message.data.iss + message.from = message.data.iss - message.to = new Identity() - message.to.did = message.data.sub + message.to = message.data.sub if (message.data.tag) { message.threadId = message.data.tag @@ -89,77 +84,67 @@ export class W3cMessageHandler extends AbstractMessageHandler { } } -export function createCredential(payload: VerifiableCredentialPayload, jwt: string): Credential { - const vc = new Credential() - - vc.issuer = new Identity() - vc.issuer.did = payload.iss +export function createCredential(payload: VerifiableCredentialPayload, jwt: string): VerifiableCredential { + const vc: Partial = { + '@context': payload.vc['@context'], + type: payload.vc.type, + issuer: payload.iss, + proof: { + jwt + } + } if (payload.sub) { - vc.subject = new Identity() - vc.subject.did = payload.sub + vc.subject = payload.sub } - vc.raw = jwt - if (payload.jti) { vc.id = payload.jti } if (payload.nbf || payload.iat) { - vc.issuanceDate = timestampToDate(payload.nbf || payload.iat) + vc.issuanceDate = timestampToDate(payload.nbf || payload.iat).toISOString() } if (payload.exp) { - vc.expirationDate = timestampToDate(payload.exp) + vc.expirationDate = timestampToDate(payload.exp).toISOString() } - vc.context = payload.vc['@context'] - vc.type = payload.vc.type - vc.credentialSubject = payload.vc.credentialSubject - return vc + return vc as VerifiableCredential } export function createPresentation( payload: PresentationPayload, jwt: string, - credentials: Credential[], -): Presentation { - const vp = new Presentation() - - vp.issuer = new Identity() - vp.issuer.did = payload.iss - - const audArray = Array.isArray(payload.aud) ? (payload.aud as string[]) : [payload.aud] - - vp.audience = audArray.map((did: string) => { - const id = new Identity() - id.did = did - return id - }) - - vp.raw = jwt + credentials: VerifiableCredential[], +): VerifiablePresentation { + const vp: Partial = { + '@context': payload.vp['@context'], + type: payload.type, + issuer: payload.iss, + audience: Array.isArray(payload.aud) ? (payload.aud as string[]) : [payload.aud], + proof: { + jwt + } + } if (payload.jti) { vp.id = payload.jti } if (payload.nbf || payload.iat) { - vp.issuanceDate = timestampToDate(payload.nbf || payload.iat) + vp.issuanceDate = timestampToDate(payload.nbf || payload.iat).toISOString() } if (payload.exp) { - vp.expirationDate = timestampToDate(payload.exp) + vp.expirationDate = timestampToDate(payload.exp).toISOString() } - vp.context = payload.vp['@context'] - vp.type = payload.vp.type - - vp.credentials = credentials + vp.verifiableCredential = credentials - return vp + return vp as VerifiablePresentation } function timestampToDate(timestamp: number): Date {