Skip to content

Commit

Permalink
feat: Added secp256r1 key to createIdentifier() method
Browse files Browse the repository at this point in the history
  • Loading branch information
Maikel Maas committed Mar 29, 2024
1 parent 78b9f2f commit f8da68d
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 27 deletions.
56 changes: 31 additions & 25 deletions packages/did-provider-ebsi/src/EbsiDidProvider.ts
Original file line number Diff line number Diff line change
@@ -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')

Expand All @@ -28,29 +28,15 @@ export class EbsiDidProvider extends AbstractIdentifierProvider {
context: IContext
): Promise<Omit<IIdentifier, 'provider'>> {
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<MinimalImportableKey>, kms as string, context);
const secp256r1ManagedKeyInfo = await this.generateEbsiKeyPair('Secp256r1', secp256r1 as Partial<MinimalImportableKey>, kms as string, context);

const methodSpecificId = toMethodSpecificId(ebsiDIDSpecInfo.V1, options?.options?.methodSpecificId)
const identifier: Omit<IIdentifier, 'provider'> = {
did: ebsiDIDSpecInfo.V1.method + methodSpecificId,
controllerKeyId: key.kid,
keys: [key],
controllerKeyId: secp256k1ManagedKeyInfo.kid,
keys: [secp256k1ManagedKeyInfo, secp256r1ManagedKeyInfo],
services: [],
}
debug('Created', identifier.did)
Expand All @@ -61,6 +47,26 @@ export class EbsiDidProvider extends AbstractIdentifierProvider {
throw Error(`Type ${options.type} not supported`)
}

private async generateEbsiKeyPair(keyType: TKeyType, key: Partial<MinimalImportableKey>, kms: string, context: IAgentContext<IKeyManager>) {
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
Expand Down
7 changes: 5 additions & 2 deletions packages/did-provider-ebsi/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { IAgentContext, IKeyManager, MinimalImportableKey } from '@veramo/core'
import {IAgentContext, IKeyManager, MinimalImportableKey} from '@veramo/core'

export type IContext = IAgentContext<IKeyManager>

Expand Down Expand Up @@ -29,7 +29,10 @@ export const ebsiDIDSpecInfo: Record<string, EbsiDidSpecInfo> = {

export interface IKeyOpts {
methodSpecificId?: string // method specific id for import
key?: WithRequiredProperty<Partial<MinimalImportableKey>, 'privateKeyHex'> // Optional key to import with only privateKeyHex mandatory. If not specified a key with random kid will be created
keys?: {
secp256k1: WithRequiredProperty<Partial<MinimalImportableKey>, 'privateKeyHex'>
secp256r1: WithRequiredProperty<Partial<MinimalImportableKey>, '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*/
}
Expand Down

0 comments on commit f8da68d

Please sign in to comment.