From f8da68d0b79a8977128bcfa16673ab8bf8547b58 Mon Sep 17 00:00:00 2001 From: Maikel Maas Date: Fri, 29 Mar 2024 18:26:01 +0100 Subject: [PATCH] feat: Added secp256r1 key to createIdentifier() method --- .../did-provider-ebsi/src/EbsiDidProvider.ts | 56 ++++++++++--------- packages/did-provider-ebsi/src/types.ts | 7 ++- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/packages/did-provider-ebsi/src/EbsiDidProvider.ts b/packages/did-provider-ebsi/src/EbsiDidProvider.ts index abbe3cc2..d03b037f 100644 --- a/packages/did-provider-ebsi/src/EbsiDidProvider.ts +++ b/packages/did-provider-ebsi/src/EbsiDidProvider.ts @@ -1,11 +1,11 @@ -import { IAgentContext, IIdentifier, IKeyManager } from '@veramo/core' +import {IAgentContext, IIdentifier, IKeyManager, MinimalImportableKey, TKeyType} from '@veramo/core' import Debug from 'debug' -import { AbstractIdentifierProvider } from '@veramo/did-manager/build/abstract-identifier-provider' -import { DIDDocument } from 'did-resolver' -import { IKey, IService } from '@veramo/core/build/types/IIdentifier' +import {AbstractIdentifierProvider} from '@veramo/did-manager/build/abstract-identifier-provider' +import {DIDDocument} from 'did-resolver' +import {IKey, IService} from '@veramo/core/build/types/IIdentifier' import * as u8a from 'uint8arrays' -import { ebsiDIDSpecInfo, IContext, ICreateIdentifierArgs } from './types' -import { generateEbsiPrivateKeyHex, toMethodSpecificId } from './functions' +import {ebsiDIDSpecInfo, IContext, ICreateIdentifierArgs} from './types' +import {generateEbsiPrivateKeyHex, toMethodSpecificId} from './functions' const debug = Debug('sphereon:did-provider-ebsi') @@ -28,29 +28,15 @@ export class EbsiDidProvider extends AbstractIdentifierProvider { context: IContext ): Promise> { if (!options?.type || options.type === ebsiDIDSpecInfo.V1) { - let privateKeyHex = generateEbsiPrivateKeyHex( - ebsiDIDSpecInfo.V1, - options?.options?.key?.privateKeyHex ? u8a.fromString(options.options.key.privateKeyHex, 'base16') : undefined - ) - if (privateKeyHex.startsWith('0x')) { - privateKeyHex = privateKeyHex.substring(2) - } - if (!privateKeyHex || privateKeyHex.length !== 64) { - throw Error('Private key should be 32 bytes / 64 chars hex') - } - const key = await context.agent.keyManagerImport({ - type: 'Secp256k1', - kms: this.assertedKms(kms), - // meta: options?.options?.meta, - kid: options?.options?.key?.kid, - privateKeyHex, - }) + const { secp256k1, secp256r1 } = { ...options?.options?.keys } + const secp256k1ManagedKeyInfo = await this.generateEbsiKeyPair('Secp256k1', secp256k1 as Partial, kms as string, context); + const secp256r1ManagedKeyInfo = await this.generateEbsiKeyPair('Secp256r1', secp256r1 as Partial, kms as string, context); const methodSpecificId = toMethodSpecificId(ebsiDIDSpecInfo.V1, options?.options?.methodSpecificId) const identifier: Omit = { did: ebsiDIDSpecInfo.V1.method + methodSpecificId, - controllerKeyId: key.kid, - keys: [key], + controllerKeyId: secp256k1ManagedKeyInfo.kid, + keys: [secp256k1ManagedKeyInfo, secp256r1ManagedKeyInfo], services: [], } debug('Created', identifier.did) @@ -61,6 +47,26 @@ export class EbsiDidProvider extends AbstractIdentifierProvider { throw Error(`Type ${options.type} not supported`) } + private async generateEbsiKeyPair(keyType: TKeyType, key: Partial, kms: string, context: IAgentContext) { + let privateKeyHex = generateEbsiPrivateKeyHex( + ebsiDIDSpecInfo.V1, + key?.privateKeyHex ? u8a.fromString(key.privateKeyHex, 'base16') : undefined + ) + if (privateKeyHex.startsWith('0x')) { + privateKeyHex = privateKeyHex.substring(2) + } + if (!privateKeyHex || privateKeyHex.length !== 64) { + throw Error('Private key should be 32 bytes / 64 chars hex') + } + + return await context.agent.keyManagerImport({ + type: keyType, + kms: this.assertedKms(kms), + kid: key?.kid, + privateKeyHex, + }) + } + addKey( args: { identifier: IIdentifier diff --git a/packages/did-provider-ebsi/src/types.ts b/packages/did-provider-ebsi/src/types.ts index 2b39e883..6e523396 100644 --- a/packages/did-provider-ebsi/src/types.ts +++ b/packages/did-provider-ebsi/src/types.ts @@ -1,4 +1,4 @@ -import { IAgentContext, IKeyManager, MinimalImportableKey } from '@veramo/core' +import {IAgentContext, IKeyManager, MinimalImportableKey} from '@veramo/core' export type IContext = IAgentContext @@ -29,7 +29,10 @@ export const ebsiDIDSpecInfo: Record = { export interface IKeyOpts { methodSpecificId?: string // method specific id for import - key?: WithRequiredProperty, 'privateKeyHex'> // Optional key to import with only privateKeyHex mandatory. If not specified a key with random kid will be created + keys?: { + secp256k1: WithRequiredProperty, 'privateKeyHex'> + secp256r1: WithRequiredProperty, 'privateKeyHex'> + }// Optional key to import with only privateKeyHex mandatory. If not specified a key with random kid will be created /*type?: Key // The key type. Defaults to Secp256k1 use?: KeyUse // The key use*/ }