@veramo/did-comm
Version:
Veramo messaging plugin implementing DIDComm v2.
143 lines (132 loc) • 6.49 kB
text/typescript
import { DIDComm } from '../didcomm.js'
import { IDIDManager, IIdentifier, IKeyManager, IResolver, TAgent } from '../../../core-types/src'
import { createAgent } from '../../../core/src'
import { DIDManager, MemoryDIDStore } from '../../../did-manager/src'
import { KeyManager, MemoryKeyStore, MemoryPrivateKeyStore } from '../../../key-manager/src'
import { KeyManagementSystem } from '../../../kms-local/src'
import { DIDResolverPlugin } from '../../../did-resolver/src'
import { Resolver } from 'did-resolver'
import { IDIDComm } from '../types/IDIDComm.js'
import 'cross-fetch/polyfill'
import { base64ToBytes, bytesToHex } from '../../../utils/src'
import { getResolver as getDidPeerResolver, PeerDIDProvider } from '../../../did-provider-peer/src'
import * as u8a from 'uint8arrays'
import { v4 as uuidv4 } from 'uuid'
describe('basic didcomm interop', () => {
let sender: IIdentifier
let recipient: IIdentifier
let agent: TAgent<IResolver & IKeyManager & IDIDManager & IDIDComm>
const defaultKms = 'local'
beforeAll(async () => {
agent = createAgent<IResolver & IKeyManager & IDIDManager & IDIDComm>({
plugins: [
new KeyManager({
store: new MemoryKeyStore(),
kms: {
[defaultKms]: new KeyManagementSystem(new MemoryPrivateKeyStore()),
},
}),
new DIDManager({
providers: {
'did:peer': new PeerDIDProvider({ defaultKms }),
},
store: new MemoryDIDStore(),
defaultProvider: 'did:example',
}),
new DIDResolverPlugin({
resolver: new Resolver({
...getDidPeerResolver(),
}),
}),
new DIDComm(),
],
})
// https://identity.foundation/didcomm-messaging/spec/#a1-sender-secrets
const senderSecretEd25519X = 'G-boxFB6vOZBu-wXkm-9Lh79I8nf9Z50cILaOgKKGww'
const senderSecretEd25519D = 'pFRUKkyzx4kHdJtFSnlPA9WzqkDT1HWV0xZ5OYZd2SY'
const senderSecretX25519X = 'avH0O2Y4tqLAq8y9zpianr8ajii5m4F_mICrzNlatXs'
const senderSecretX25519D = 'r-jK2cO3taR8LQnJB1_ikLBTAnOtShJOsHXRUWT-aZA'
sender = await agent.didManagerImport({
did: 'did:example:alice',
keys: [
{
type: 'Ed25519',
kid: 'did:example:alice#key-1',
publicKeyHex: bytesToHex(base64ToBytes(senderSecretEd25519X)),
// we use stablelib/nacl for ed25519, and the preferred encoding for the privateKey there is a 64 byte
// string, where the second half is the precomputed 32 byte encoding of the publicKey. This seems to be the
// preferred encoding in other related libraries too, as the pre-computation speeds up the signing by a few
// milliseconds.
// https://github.com/StableLib/stablelib/blob/a89a438fcbf855de6b2e9faa2630f03c3f3b3a54/packages/ed25519/ed25519.ts#L669
// https://crypto.stackexchange.com/a/54367
// https://github.com/libp2p/specs/blob/master/peer-ids/peer-ids.md#ed25519
privateKeyHex: bytesToHex(
u8a.concat([base64ToBytes(senderSecretEd25519D), base64ToBytes(senderSecretEd25519X)]),
),
kms: 'local',
},
{
type: 'X25519',
kid: 'did:example:alice#key-x25519-1',
publicKeyHex: bytesToHex(base64ToBytes(senderSecretX25519X)),
privateKeyHex: bytesToHex(base64ToBytes(senderSecretX25519D)),
kms: 'local',
},
],
provider: 'did:example',
alias: 'alice',
})
recipient = await agent.didManagerImport({
did: 'did:example:bob',
keys: [
{
type: 'X25519',
kid: 'did:example:bob#key-x25519-1',
publicKeyHex: bytesToHex(base64ToBytes('GDTrI66K0pFfO54tlCSvfjjNapIs44dzpneBgyx0S3E')),
privateKeyHex: bytesToHex(base64ToBytes('b9NnuOCB0hm7YGNvaE9DMhwH_wjZA1-gWD6dA0JWdL0')),
kms: 'local',
},
{
type: 'X25519',
kid: 'did:example:bob#key-x25519-2',
publicKeyHex: bytesToHex(base64ToBytes('UT9S3F5ep16KSNBBShU2wh3qSfqYjlasZimn0mB8_VM')),
privateKeyHex: bytesToHex(base64ToBytes('p-vteoF1gopny1HXywt76xz_uC83UUmrgszsI-ThBKk')),
kms: 'local',
},
{
type: 'X25519',
kid: 'did:example:bob#key-x25519-3',
publicKeyHex: bytesToHex(base64ToBytes('82k2BTUiywKv49fKLZa-WwDi8RBf0tB0M8bvSAUQ3yY')),
privateKeyHex: bytesToHex(base64ToBytes('f9WJeuQXEItkGM8shN4dqFr5fLQLBasHnWZ-8dPaSo0')),
kms: 'local',
},
],
provider: 'did:example',
alias: 'bob',
})
})
it.skip('should send message to peer', async () => {
const remote =
// 'did:peer:2.Vz6MkiJHK4pcuKcsjUEbLTJu2qwKSzCXmKCWbjeYbnXJFYHt9.Ez6LSfy7HtbLKYn8mcxGs3D5VvLg3SQjicKSMhzknqr2T6aVu.SeyJ0IjoiZG0iLCJzIjp7InVyaSI6ImRpZDpwZWVyOjIuRXo2TFN0a1pnMTRvRzVMQ3hqYTNSaG90V0I3bTk0YWZFUjRFaUJMaFlwVVNva2J5Ui5WejZNa2dTWUJNNjNpSE5laVQyVlNRdTdiYnRYaEdZQ1FyUEo4dUVHdXJiZkdiYmdFLlNXM3NpZENJNkltUnRJaXdpY3lJNkltaDBkSEJ6T2k4dmRYTXRaV0Z6ZEM1d2RXSnNhV011YldWa2FXRjBiM0l1YVc1a2FXTnBiM1JsWTJndWFXOHZiV1Z6YzJGblpTSXNJbklpT2x0ZExDSmhJanBiSW1ScFpHTnZiVzB2ZGpJaUxDSmthV1JqYjIxdEwyRnBjREk3Wlc1MlBYSm1ZekU1SWwxOUxIc2lkQ0k2SW1SdElpd2ljeUk2SW5kemN6b3ZMM2R6TG5WekxXVmhjM1F1Y0hWaWJHbGpMbTFsWkdsaGRHOXlMbWx1WkdsamFXOTBaV05vTG1sdkwzZHpJaXdpY2lJNlcxMHNJbUVpT2xzaVpHbGtZMjl0YlM5Mk1pSXNJbVJwWkdOdmJXMHZZV2x3TWp0bGJuWTljbVpqTVRraVhYMWQiLCJhIjpbImRpZGNvbW0vdjIiXX19'
'did:peer:2.Ez6LStkZg14oG5LCxja3RhotWB7m94afER4EiBLhYpUSokbyR.Vz6MkgSYBM63iHNeiT2VSQu7bbtXhGYCQrPJ8uEGurbfGbbgE.SW3sidCI6ImRtIiwicyI6Imh0dHBzOi8vdXMtZWFzdC5wdWJsaWMubWVkaWF0b3IuaW5kaWNpb3RlY2guaW8vbWVzc2FnZSIsInIiOltdLCJhIjpbImRpZGNvbW0vdjIiLCJkaWRjb21tL2FpcDI7ZW52PXJmYzE5Il19LHsidCI6ImRtIiwicyI6IndzczovL3dzLnVzLWVhc3QucHVibGljLm1lZGlhdG9yLmluZGljaW90ZWNoLmlvL3dzIiwiciI6W10sImEiOlsiZGlkY29tbS92MiIsImRpZGNvbW0vYWlwMjtlbnY9cmZjMTkiXX1d'
console.log(`\n\n\nremote:\n${remote}\n\n\n`)
const msg1 = await agent.packDIDCommMessage({
packing: 'none',
message: {
// type: 'https://didcomm.org/basicmessage/2.0/message',
type: 'https://didcomm.org/trust-ping/2.0/ping',
id: uuidv4(),
body: {
response_requested: true,
},
to: [remote],
},
})
const rr = await agent.sendDIDCommMessage({
messageId: uuidv4(),
packedMessage: msg1,
recipientDidUrl: remote,
})
console.log(JSON.stringify(rr, null, 2))
})
})