@sphereon/ssi-sdk.credential-vcdm
Version:
Plugin for working with W3C Verifiable Credentials DataModel 1 and 2 Credentials & Presentations.
282 lines (256 loc) • 16.3 kB
text/typescript
import { DIDResolutionResult, IAgentContext, ICredentialVerifier, IResolver } from '@veramo/core'
import { Message } from '@veramo/message-handler'
import { IContext, MessageTypes, W3cMessageHandler } from '../message-handler'
import { computeEntryHash } from '@veramo/utils'
import { describe, expect, it, vitest } from 'vitest'
describe('@sphereon/credential-vcdm', () => {
const handler = new W3cMessageHandler()
// don't need to replace rinkeby since test has mock resolver
const didEthr = 'did:ethr:rinkeby:0x3c357ba458933a19c1df1c7f6b473b3302bbbe61'
const didKey = 'did:key:z6Mkqjn1SMUbR88S7BZFAZnr7sfzPXmm3DfRdMy3Z5CdMqnd'
const context: IContext = {
agent: {
getSchema: vitest.fn(),
execute: vitest.fn(),
availableMethods: vitest.fn(),
emit: vitest.fn(),
resolveDid: async (args?): Promise<DIDResolutionResult> => {
if (!args?.didUrl) throw Error('DID required')
if (args?.didUrl === didEthr) {
return {
didResolutionMetadata: {},
didDocumentMetadata: {},
didDocument: {
'@context': 'https://www.w3.org/ns/did/v1',
id: args?.didUrl,
verificationMethod: [
{
id: `${didEthr}#owner`,
type: 'EcdsaSecp256k1RecoveryMethod2020',
controller: args?.didUrl,
blockchainAccountId: `eip155:1:${didEthr.slice(-42)}`,
},
],
authentication: [`${didEthr}#owner`],
},
}
} else {
return {
didResolutionMetadata: {},
didDocumentMetadata: {},
didDocument: {
'@context': 'https://www.w3.org/ns/did/v1',
id: didKey,
verificationMethod: [
{
id: '#z6Mkqjn1SMUbR88S7BZFAZnr7sfzPXmm3DfRdMy3Z5CdMqnd',
type: 'Ed25519VerificationKey2018',
controller: didKey,
publicKeyBase58: 'CHWxr7EA5adxzgiYUzq1Gn7zZxVudLR4wM47ioEcSd1F',
},
{
id: '#z6LSkpCZ3cLP76M3Q26rhZe6q98vMdcSPTt4iML4r9UT7LVt',
type: 'X25519KeyAgreementKey2019',
controller: didKey,
publicKeyBase58: 'A92PXJXX1ddJJdj6Av89WYvSWV5KgrhuqNcPMgpvPxj8',
},
],
authentication: ['#z6Mkqjn1SMUbR88S7BZFAZnr7sfzPXmm3DfRdMy3Z5CdMqnd'],
assertionMethod: ['#z6Mkqjn1SMUbR88S7BZFAZnr7sfzPXmm3DfRdMy3Z5CdMqnd'],
},
}
}
},
canVerifyDocumentType: vitest.fn(),
verifyCredential: vitest.fn(),
verifyPresentation: vitest.fn(),
getDIDComponentById: vitest.fn(),
},
} as IAgentContext<IResolver & ICredentialVerifier>
it('should reject unknown message type', async () => {
expect.assertions(1)
const message = new Message({ raw: 'test', metaData: [{ type: 'test' }] })
await expect(handler.handle(message, context)).rejects.toThrow('Unsupported message type')
})
const vcJwtSecp256k1 =
'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9.eyJpYXQiOjE1ODI2MTk2NzYsInN1YiI6ImRpZDpldGhyOnJpbmtlYnk6MHgzYzM1N2JhNDU4OTMzYTE5YzFkZjFjN2Y2YjQ3M2IzMzAyYmJiZTYxIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJuYW1lIjoiQWxpY2UifX0sImlzcyI6ImRpZDpldGhyOnJpbmtlYnk6MHgzYzM1N2JhNDU4OTMzYTE5YzFkZjFjN2Y2YjQ3M2IzMzAyYmJiZTYxIn0.IGF1LFOc4_PcGVeq7Yw7OGz4Gj7xXZK6p8bP9CSEIXz7mNFPM0v0nuevTZ47a0I8XgLfCFNkUrIIscjH8MFx_wE'
const vcPayloadSecp256k1 = {
iat: 1582619676,
sub: didEthr,
vc: {
'@context': ['https://www.w3.org/2018/credentials/v1'],
type: ['VerifiableCredential'],
credentialSubject: {
name: 'Alice',
},
},
iss: didEthr,
}
const vpJwtSecp256k1 =
'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9.eyJpYXQiOjE1ODI2MTk4NzUsImF1ZCI6ImRpZDpldGhyOnJpbmtlYnk6MHgzYzM1N2JhNDU4OTMzYTE5YzFkZjFjN2Y2YjQ3M2IzMzAyYmJiZTYxIiwidGFnIjoieHl6LTEyMyIsInZwIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZVByZXNlbnRhdGlvbiJdLCJ2ZXJpZmlhYmxlQ3JlZGVudGlhbCI6WyJleUowZVhBaU9pSktWMVFpTENKaGJHY2lPaUpGVXpJMU5rc3RVaUo5LmV5SnBZWFFpT2pFMU9ESTJNVGsyTnpZc0luTjFZaUk2SW1ScFpEcGxkR2h5T25KcGJtdGxZbms2TUhnell6TTFOMkpoTkRVNE9UTXpZVEU1WXpGa1pqRmpOMlkyWWpRM00ySXpNekF5WW1KaVpUWXhJaXdpZG1NaU9uc2lRR052Ym5SbGVIUWlPbHNpYUhSMGNITTZMeTkzZDNjdWR6TXViM0puTHpJd01UZ3ZZM0psWkdWdWRHbGhiSE12ZGpFaVhTd2lkSGx3WlNJNld5SldaWEpwWm1saFlteGxRM0psWkdWdWRHbGhiQ0pkTENKamNtVmtaVzUwYVdGc1UzVmlhbVZqZENJNmV5SnVZVzFsSWpvaVFXeHBZMlVpZlgwc0ltbHpjeUk2SW1ScFpEcGxkR2h5T25KcGJtdGxZbms2TUhnell6TTFOMkpoTkRVNE9UTXpZVEU1WXpGa1pqRmpOMlkyWWpRM00ySXpNekF5WW1KaVpUWXhJbjAuSUdGMUxGT2M0X1BjR1ZlcTdZdzdPR3o0R2o3eFhaSzZwOGJQOUNTRUlYejdtTkZQTTB2MG51ZXZUWjQ3YTBJOFhnTGZDRk5rVXJJSXNjakg4TUZ4X3dFIl19LCJpc3MiOiJkaWQ6ZXRocjpyaW5rZWJ5OjB4M2MzNTdiYTQ1ODkzM2ExOWMxZGYxYzdmNmI0NzNiMzMwMmJiYmU2MSJ9.7gIGq437moBKMwF3PUrycjCP4Op6dL6IJV6GygSq1KGV7QU0II16YzETsr412AlHl_kaYgUJjRav7unJdyJL0wA'
const vpPayloadSecp256k1 = {
iat: 1582619875,
aud: didEthr,
tag: 'xyz-123',
vp: {
'@context': ['https://www.w3.org/2018/credentials/v1'],
type: ['VerifiablePresentation'],
verifiableCredential: [
'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NkstUiJ9.eyJpYXQiOjE1ODI2MTk2NzYsInN1YiI6ImRpZDpldGhyOnJpbmtlYnk6MHgzYzM1N2JhNDU4OTMzYTE5YzFkZjFjN2Y2YjQ3M2IzMzAyYmJiZTYxIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJuYW1lIjoiQWxpY2UifX0sImlzcyI6ImRpZDpldGhyOnJpbmtlYnk6MHgzYzM1N2JhNDU4OTMzYTE5YzFkZjFjN2Y2YjQ3M2IzMzAyYmJiZTYxIn0.IGF1LFOc4_PcGVeq7Yw7OGz4Gj7xXZK6p8bP9CSEIXz7mNFPM0v0nuevTZ47a0I8XgLfCFNkUrIIscjH8MFx_wE',
],
},
iss: didEthr,
}
it('should return handled VC message (ES256K-R)', async () => {
expect.assertions(6)
const message = new Message({ raw: vcJwtSecp256k1, metaData: [{ type: 'test' }] })
// This would be done by '@veramo/did-jwt':
message.data = vcPayloadSecp256k1
message.addMetaData({ type: 'JWT', value: 'ES256K-R' })
const handled = await handler.handle(message, context)
expect(handled.isValid()).toEqual(true)
expect(handled.id).toEqual(computeEntryHash(vcJwtSecp256k1))
expect(handled.raw).toEqual(vcJwtSecp256k1)
expect(handled.type).toEqual(MessageTypes.vc)
expect(handled.from).toEqual(vcPayloadSecp256k1.iss)
expect(handled.to).toEqual(vcPayloadSecp256k1.sub)
// expect(handled.timestamp).toEqual(vcPayload.iat)
})
it('should return handled VP message (ES256K-R)', async () => {
expect.assertions(7)
const message = new Message({ raw: vpJwtSecp256k1, metaData: [{ type: 'test' }] })
// This would be done by '@veramo/did-jwt':
message.data = vpPayloadSecp256k1
message.addMetaData({ type: 'JWT', value: 'ES256K-R' })
const handled = await handler.handle(message, context)
expect(handled.isValid()).toEqual(true)
expect(handled.id).toEqual(computeEntryHash(vpJwtSecp256k1))
expect(handled.raw).toEqual(vpJwtSecp256k1)
expect(handled.type).toEqual(MessageTypes.vp)
expect(handled.from).toEqual(vpPayloadSecp256k1.iss)
expect(handled.to).toEqual(vpPayloadSecp256k1.aud)
expect(handled.threadId).toEqual(vpPayloadSecp256k1.tag)
// expect(handled.timestamp).toEqual(vpPayload.iat)
})
const vcJwtEd25519 =
'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJjcmVkZW50aWFsU3ViamVjdCI6eyJuYW1lIjoiQWxpY2UifSwiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlByb2ZpbGUiXX0sInN1YiI6ImRpZDprZXk6ejZNa3FqbjFTTVViUjg4UzdCWkZBWm5yN3NmelBYbW0zRGZSZE15M1o1Q2RNcW5kIiwibmJmIjoxNjIxOTczOTU0LCJpc3MiOiJkaWQ6a2V5Ono2TWtxam4xU01VYlI4OFM3QlpGQVpucjdzZnpQWG1tM0RmUmRNeTNaNUNkTXFuZCJ9.xFUvm49vS4dNoSURJwrCMwdePgrAyBRzs7GqvcUyD6KjfNM8eSgFeF8CEUHC21WcwrmbTNrzpQtgFQTFP_9HAA'
const vcPayloadEd25519 = {
vc: {
credentialSubject: {
name: 'Alice',
},
'@context': ['https://www.w3.org/2018/credentials/v1'],
type: ['VerifiableCredential', 'Profile'],
},
sub: didKey,
nbf: 1621973954,
iss: didKey,
}
const vpJwtEd25519 =
'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iLCJQcm9maWxlIl0sInZlcmlmaWFibGVDcmVkZW50aWFsIjpbImV5SmhiR2NpT2lKRlpFUlRRU0lzSW5SNWNDSTZJa3BYVkNKOS5leUoyWXlJNmV5SmpjbVZrWlc1MGFXRnNVM1ZpYW1WamRDSTZleUp1WVcxbElqb2lRV3hwWTJVaWZTd2lRR052Ym5SbGVIUWlPbHNpYUhSMGNITTZMeTkzZDNjdWR6TXViM0puTHpJd01UZ3ZZM0psWkdWdWRHbGhiSE12ZGpFaVhTd2lkSGx3WlNJNld5SldaWEpwWm1saFlteGxRM0psWkdWdWRHbGhiQ0lzSWxCeWIyWnBiR1VpWFgwc0luTjFZaUk2SW1ScFpEcHJaWGs2ZWpaTmEzRnFiakZUVFZWaVVqZzRVemRDV2taQldtNXlOM05tZWxCWWJXMHpSR1pTWkUxNU0xbzFRMlJOY1c1a0lpd2libUptSWpveE5qSXhPVGN6T1RVMExDSnBjM01pT2lKa2FXUTZhMlY1T25vMlRXdHhhbTR4VTAxVllsSTRPRk0zUWxwR1FWcHVjamR6Wm5wUVdHMXRNMFJtVW1STmVUTmFOVU5rVFhGdVpDSjkueEZVdm00OXZTNGROb1NVUkp3ckNNd2RlUGdyQXlCUnpzN0dxdmNVeUQ2S2pmTk04ZVNnRmVGOENFVUhDMjFXY3dybWJUTnJ6cFF0Z0ZRVEZQXzlIQUEiXX0sInRhZyI6Inh5ejEyMyIsIm5iZiI6MTYyMTk3NDM4MiwiaXNzIjoiZGlkOmtleTp6Nk1rcWpuMVNNVWJSODhTN0JaRkFabnI3c2Z6UFhtbTNEZlJkTXkzWjVDZE1xbmQiLCJhdWQiOlsiZGlkOmtleTp6Nk1rcWpuMVNNVWJSODhTN0JaRkFabnI3c2Z6UFhtbTNEZlJkTXkzWjVDZE1xbmQiXX0.Lju6nUthZXnCi3RyX-6IRowzWQMp5FpcHLHqL9J9AvVWlNa40eWTdhhXPkshLoxjY9sorIO39G_1fc09MWWlAQ'
const vpPayloadEd25519 = {
vp: {
'@context': ['https://www.w3.org/2018/credentials/v1'],
type: ['VerifiablePresentation', 'Profile'],
verifiableCredential: [
'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJjcmVkZW50aWFsU3ViamVjdCI6eyJuYW1lIjoiQWxpY2UifSwiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlByb2ZpbGUiXX0sInN1YiI6ImRpZDprZXk6ejZNa3FqbjFTTVViUjg4UzdCWkZBWm5yN3NmelBYbW0zRGZSZE15M1o1Q2RNcW5kIiwibmJmIjoxNjIxOTczOTU0LCJpc3MiOiJkaWQ6a2V5Ono2TWtxam4xU01VYlI4OFM3QlpGQVpucjdzZnpQWG1tM0RmUmRNeTNaNUNkTXFuZCJ9.xFUvm49vS4dNoSURJwrCMwdePgrAyBRzs7GqvcUyD6KjfNM8eSgFeF8CEUHC21WcwrmbTNrzpQtgFQTFP_9HAA',
],
},
tag: 'xyz123',
nbf: 1621974382,
iss: didKey,
aud: didKey,
}
it('should return handled VC message (Ed25519)', async () => {
expect.assertions(6)
const message = new Message({ raw: vcJwtEd25519, metaData: [{ type: 'test' }] })
// This would be done by '@veramo/did-jwt':
message.data = vcPayloadEd25519
message.addMetaData({ type: 'JWT', value: 'Ed25519' })
const handled = await handler.handle(message, context)
expect(handled.isValid()).toEqual(true)
expect(handled.id).toEqual(computeEntryHash(vcJwtEd25519))
expect(handled.raw).toEqual(vcJwtEd25519)
expect(handled.type).toEqual(MessageTypes.vc)
expect(handled.from).toEqual(vcPayloadEd25519.iss)
expect(handled.to).toEqual(vcPayloadEd25519.sub)
})
it('should return handled VP message (Ed25519)', async () => {
expect.assertions(7)
const message = new Message({ raw: vpJwtEd25519, metaData: [{ type: 'test' }] })
// This would be done by '@veramo/did-jwt':
message.data = vpPayloadEd25519
message.addMetaData({ type: 'JWT', value: 'Ed25519' })
const handled = await handler.handle(message, context)
expect(handled.isValid()).toEqual(true)
expect(handled.id).toEqual(computeEntryHash(vpJwtEd25519))
expect(handled.raw).toEqual(vpJwtEd25519)
expect(handled.type).toEqual(MessageTypes.vp)
expect(handled.from).toEqual(vpPayloadEd25519.iss)
expect(handled.to).toEqual(vpPayloadEd25519.aud)
expect(handled.threadId).toEqual(vpPayloadEd25519.tag)
})
const vpMultiAudJwt =
'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwidmVyaWZpYWJsZUNyZWRlbnRpYWwiOlsiZXlKaGJHY2lPaUpGVXpJMU5rc2lMQ0owZVhBaU9pSktWMVFpZlEuZXlKMll5STZleUpBWTI5dWRHVjRkQ0k2V3lKb2RIUndjem92TDNkM2R5NTNNeTV2Y21jdk1qQXhPQzlqY21Wa1pXNTBhV0ZzY3k5Mk1TSXNJbWgwZEhCek9pOHZkbVZ5WVcxdkxtbHZMMk52Ym5SbGVIUnpMM0J5YjJacGJHVXZkakVpWFN3aWRIbHdaU0k2V3lKV1pYSnBabWxoWW14bFEzSmxaR1Z1ZEdsaGJDSmRMQ0pqY21Wa1pXNTBhV0ZzVTNWaWFtVmpkQ0k2ZXlKdVlXMWxJam9pUVd4cFkyVWlmWDBzSW5OMVlpSTZJbVJwWkRwbGRHaHlPbWR2WlhKc2FUb3dlREF5WkdJMllqZ3pZVE00WlRNeFpHVmtabU5rTURBeE4yRTBPRE5qT0dJd01EY3pZV1EwTURRNU5UZG1OV1l6TXpjNFpEVmtPR1l6WkRneU5USXhNRFE0T1NJc0ltNWlaaUk2TVRZMk5UUTFNalUwT0N3aWFYTnpJam9pWkdsa09tVjBhSEk2WjI5bGNteHBPakI0TURKa1lqWmlPRE5oTXpobE16RmtaV1JtWTJRd01ERTNZVFE0TTJNNFlqQXdOek5oWkRRd05EazFOMlkxWmpNek56aGtOV1E0WmpOa09ESTFNakV3TkRnNUluMC56ZXRBSXVTVWtxNGlmbmxhelg3c1RodTlpd3VzNjZDVHBfaDVObW0xc2RyZXZ4ck02WklSZGJEVExrZlZ6MmxGR3BxeU1aLW9tMVBtUHNOOFluY2ZSZyJdfSwidGFnIjoidGFnMTIzIiwibmJmIjoxNjY1NDUzMDYwLCJpc3MiOiJkaWQ6ZXRocjpnb2VybGk6MHgwMmRiNmI4M2EzOGUzMWRlZGZjZDAwMTdhNDgzYzhiMDA3M2FkNDA0OTU3ZjVmMzM3OGQ1ZDhmM2Q4MjUyMTA0ODkiLCJhdWQiOlsiZGlkOmV4YW1wbGU6MzQ1NiIsImRpZDp3ZWI6dXBvcnQubWUiXX0.NfQjQb3_mo956o5guLTV5iKF9mna-Yy70MBZQlNDu9OujpDhbsaQ5MHFw5GGG1M47_74ZAaMTOx9Wc7iY7eLZw'
const vpMultiAudPayload = {
iat: 1588676739,
vp: {
'@context': ['https://www.w3.org/2018/credentials/v1'],
type: ['VerifiablePresentation'],
verifiableCredential: [vpMultiAudJwt],
},
tag: 'tag123',
aud: ['did:example:3456', 'did:web:uport.me'],
iss: 'did:ethr:goerli:0x02db6b83a38e31dedfcd0017a483c8b0073ad404957f5f3378d5d8f3d825210489',
}
it('should use the first audience did as a message.to field', async () => {
expect.assertions(7)
const message = new Message({ raw: vpMultiAudJwt, metaData: [{ type: 'test' }] })
// This would be done by '@veramo/did-jwt':
message.data = vpMultiAudPayload
message.addMetaData({ type: 'JWT', value: 'ES256K-R' })
const handled = await handler.handle(message, context)
expect(handled.isValid()).toEqual(true)
expect(handled.id).toEqual(computeEntryHash(vpMultiAudJwt))
expect(handled.raw).toEqual(vpMultiAudJwt)
expect(handled.type).toEqual(MessageTypes.vp)
expect(handled.from).toEqual(vpMultiAudPayload.iss)
expect(handled.to).toEqual(vpMultiAudPayload.aud[0])
expect(handled.threadId).toEqual(vpMultiAudPayload.tag)
})
it('should return handled VC message with credentialStatus', async () => {
expect.assertions(6)
const token =
'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJpYXQiOjE1ODgyNDkyNTgsInN1YiI6ImRpZDp3ZWI6dXBvcnQubWUiLCJub25jZSI6IjM4NzE4Njc0NTMiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiQXdlc29tZW5lc3NDcmVkZW50aWFsIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7Iml0IjoicmVhbGx5IHdoaXBzIHRoZSBsbGFtbWEncyBhc3MhIn19LCJjcmVkZW50aWFsU3RhdHVzIjp7InR5cGUiOiJFdGhyU3RhdHVzUmVnaXN0cnkyMDE5IiwiaWQiOiJyaW5rZWJ5OjB4OTdmZDI3ODkyY2RjRDAzNWRBZTFmZTcxMjM1YzYzNjA0NEI1OTM0OCJ9LCJpc3MiOiJkaWQ6ZXRocjoweDU0ZDU5ZTNmZmQ3NjkxN2Y2MmRiNzAyYWMzNTRiMTdmMzg0Mjk1NWUifQ.mtMt6-sJdaKH_sPUFPan1FzvWPtlrdKLRCHrh1aOS_zSVyTGHynA0-5AHcEujB1Rz1SuzuM3rkhHRO8eX2IAYg'
const message = new Message({
raw: token,
metaData: [{ type: 'test' }],
})
// This would be done by '@veramo/did-jwt':
message.data = {
iat: 1588249258,
sub: 'did:web:uport.me',
vc: {
'@context': ['https://www.w3.org/2018/credentials/v1'],
type: ['VerifiableCredential', 'AwesomenessCredential'],
credentialSubject: {
it: "really whips the llamma's ass!",
},
},
credentialStatus: {
type: 'EthrStatusRegistry2019',
// TODO(nickreynolds): deploy
id: 'sepolia:0x97fd27892cdcD035dAe1fe71235c636044B59348',
},
iss: 'did:ethr:0x54d59e3ffd76917f62db702ac354b17f3842955e',
}
message.addMetaData({ type: 'JWT', value: 'ES256K' })
const handled = await handler.handle(message, context)
expect(handled.isValid()).toEqual(true)
expect(handled.id).toEqual(computeEntryHash(token))
expect(handled.raw).toEqual(token)
expect(handled.type).toEqual(MessageTypes.vc)
expect(handled.from).toEqual('did:ethr:0x54d59e3ffd76917f62db702ac354b17f3842955e')
expect(handled.to).toEqual('did:web:uport.me')
})
})