UNPKG

@sphereon/gx-compliance-client

Version:

<!--suppress HtmlDeprecatedAttribute --> <h1 align="center"> <br> <a href="https://www.sphereon.com"><img src="https://sphereon.com/content/themes/sphereon/assets/img/logo.svg" alt="Sphereon" width="400"></a> <br>Gaia-X Compliance client (Typescript

106 lines (95 loc) 4.03 kB
import { GXComplianceClient } from './GXComplianceClient' import { AuthenticationProofPurpose, GXRequiredContext, ICheckVerifiableCredentialArgs, ICheckVerifiablePresentationArgs, IIssueVerifiableCredentialArgs, IIssueVerifiablePresentationArgs, } from '../types' import { v4 as uuidv4 } from 'uuid' import { UniqueVerifiableCredential, UniqueVerifiablePresentation } from '@veramo/core' import { asDID, extractSignInfo, extractSubjectDIDFromVCs } from '../utils' export class CredentialHandler { public readonly _client: GXComplianceClient constructor(client: GXComplianceClient) { this._client = client } private client() { return this._client } public config() { return this.client().config() } public async issueVerifiableCredential(args: IIssueVerifiableCredentialArgs, context: GXRequiredContext): Promise<UniqueVerifiableCredential> { const credential = args.credential if (!credential?.credentialSubject) { throw Error('Credential needs a subject') } if (!credential.credentialSubject?.id) { if (!args.domain) { throw Error('Either a credentialSubject.id value needs to be set, or a domain value needs to be supplied') } credential.credentialSubject.id = asDID(args.domain) } const did = extractSubjectDIDFromVCs(credential) const signInfo = await extractSignInfo({ did, section: 'assertionMethod', keyRef: args.keyRef }, context) const verifiableCredential = await context.agent.createVerifiableCredentialLDLocal({ credential: credential, keyRef: signInfo.keyRef, // todo: Purpose from signInfo }) let hash = '' //todo: determine id, without saving if (args.persist) { hash = await context.agent.dataStoreSaveVerifiableCredential({ verifiableCredential }) } return { verifiableCredential, hash } } public async checkVerifiableCredential(args: ICheckVerifiableCredentialArgs, context: GXRequiredContext): Promise<boolean> { const result = await context.agent.verifyCredentialLDLocal({ credential: args.verifiableCredential, fetchRemoteContexts: true, }) return result } /** {@inheritDoc IGXComplianceClient.issueVerifiablePresentation} */ public async issueVerifiablePresentation( args: IIssueVerifiablePresentationArgs, context: GXRequiredContext ): Promise<UniqueVerifiablePresentation> { const did = asDID(args.domain!) const signInfo = await extractSignInfo({ did, section: 'authentication', keyRef: args.keyRef }, context) const verifiablePresentation = await context.agent.createVerifiablePresentationLDLocal({ presentation: { id: uuidv4(), issuanceDate: new Date(), type: ['VerifiablePresentation'], '@context': ['https://www.w3.org/2018/credentials/v1'], verifiableCredential: args.verifiableCredentials, holder: did, }, // purpose: args.purpose, // todo: Make dynamic basied on signInfo and arg keyRef: signInfo.keyRef, challenge: args.challenge ? args.challenge : GXComplianceClient.getDateChallenge(), domain: this.config().complianceServiceUrl, }) let hash = '' //todo: determine id, without saving if (args.persist) { hash = await context.agent.dataStoreSaveVerifiablePresentation({ verifiablePresentation }) } return { verifiablePresentation, hash } } public async checkVerifiablePresentation(args: ICheckVerifiablePresentationArgs, context: GXRequiredContext): Promise<boolean> { const domain = this.config().complianceServiceUrl const challenge = args.challenge ? args.challenge : GXComplianceClient.getDateChallenge() const result = await context.agent.verifyPresentationLDLocal({ presentation: args.verifiablePresentation, challenge, domain, fetchRemoteContexts: true, presentationPurpose: new AuthenticationProofPurpose({ domain: args.verifiablePresentation.holder, challenge }), }) console.log(result) return result } }