Skip to content

Commit

Permalink
refactor: W3c
Browse files Browse the repository at this point in the history
  • Loading branch information
simonas-notcat authored and mirceanis committed Sep 7, 2020
1 parent 9fb27f3 commit 48427a8
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 66 deletions.
32 changes: 17 additions & 15 deletions packages/daf-w3c/src/action-handler.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -26,7 +25,7 @@ export interface ISignCredentialJwtArgs {
}

type TContext = {
agent: IAgent & IAgentIdentityManager & IAgentResolve
agent: IAgentBase & IAgentIdentityManager & IAgentResolve & IAgentDataStore & IAgentKeyManager
dbConnection: Promise<Connection>
}

Expand All @@ -41,21 +40,22 @@ export interface IAgentSignCredentialJwt {
signCredentialJwt?: IAgentExtension<TSignCredentialJwt>
}

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))
}
Expand All @@ -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) {
Expand All @@ -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) {
Expand Down
87 changes: 36 additions & 51 deletions packages/daf-w3c/src/message-handler.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -19,7 +18,7 @@ export const MessageTypes = {
}

interface IContext {
agent: IAgent & IAgentResolve
agent: IAgentBase & IAgentResolve
}

export class W3cMessageHandler extends AbstractMessageHandler {
Expand All @@ -33,23 +32,21 @@ 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))
}

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
Expand All @@ -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
Expand All @@ -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<VerifiableCredential> = {
'@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<VerifiablePresentation> = {
'@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 {
Expand Down

0 comments on commit 48427a8

Please sign in to comment.