Skip to content

Commit f8da68d

Browse files
author
Maikel Maas
committed
feat: Added secp256r1 key to createIdentifier() method
1 parent 78b9f2f commit f8da68d

File tree

2 files changed

+36
-27
lines changed

2 files changed

+36
-27
lines changed

packages/did-provider-ebsi/src/EbsiDidProvider.ts

+31-25
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { IAgentContext, IIdentifier, IKeyManager } from '@veramo/core'
1+
import {IAgentContext, IIdentifier, IKeyManager, MinimalImportableKey, TKeyType} from '@veramo/core'
22
import Debug from 'debug'
3-
import { AbstractIdentifierProvider } from '@veramo/did-manager/build/abstract-identifier-provider'
4-
import { DIDDocument } from 'did-resolver'
5-
import { IKey, IService } from '@veramo/core/build/types/IIdentifier'
3+
import {AbstractIdentifierProvider} from '@veramo/did-manager/build/abstract-identifier-provider'
4+
import {DIDDocument} from 'did-resolver'
5+
import {IKey, IService} from '@veramo/core/build/types/IIdentifier'
66
import * as u8a from 'uint8arrays'
7-
import { ebsiDIDSpecInfo, IContext, ICreateIdentifierArgs } from './types'
8-
import { generateEbsiPrivateKeyHex, toMethodSpecificId } from './functions'
7+
import {ebsiDIDSpecInfo, IContext, ICreateIdentifierArgs} from './types'
8+
import {generateEbsiPrivateKeyHex, toMethodSpecificId} from './functions'
99

1010
const debug = Debug('sphereon:did-provider-ebsi')
1111

@@ -28,29 +28,15 @@ export class EbsiDidProvider extends AbstractIdentifierProvider {
2828
context: IContext
2929
): Promise<Omit<IIdentifier, 'provider'>> {
3030
if (!options?.type || options.type === ebsiDIDSpecInfo.V1) {
31-
let privateKeyHex = generateEbsiPrivateKeyHex(
32-
ebsiDIDSpecInfo.V1,
33-
options?.options?.key?.privateKeyHex ? u8a.fromString(options.options.key.privateKeyHex, 'base16') : undefined
34-
)
35-
if (privateKeyHex.startsWith('0x')) {
36-
privateKeyHex = privateKeyHex.substring(2)
37-
}
38-
if (!privateKeyHex || privateKeyHex.length !== 64) {
39-
throw Error('Private key should be 32 bytes / 64 chars hex')
40-
}
41-
const key = await context.agent.keyManagerImport({
42-
type: 'Secp256k1',
43-
kms: this.assertedKms(kms),
44-
// meta: options?.options?.meta,
45-
kid: options?.options?.key?.kid,
46-
privateKeyHex,
47-
})
31+
const { secp256k1, secp256r1 } = { ...options?.options?.keys }
32+
const secp256k1ManagedKeyInfo = await this.generateEbsiKeyPair('Secp256k1', secp256k1 as Partial<MinimalImportableKey>, kms as string, context);
33+
const secp256r1ManagedKeyInfo = await this.generateEbsiKeyPair('Secp256r1', secp256r1 as Partial<MinimalImportableKey>, kms as string, context);
4834

4935
const methodSpecificId = toMethodSpecificId(ebsiDIDSpecInfo.V1, options?.options?.methodSpecificId)
5036
const identifier: Omit<IIdentifier, 'provider'> = {
5137
did: ebsiDIDSpecInfo.V1.method + methodSpecificId,
52-
controllerKeyId: key.kid,
53-
keys: [key],
38+
controllerKeyId: secp256k1ManagedKeyInfo.kid,
39+
keys: [secp256k1ManagedKeyInfo, secp256r1ManagedKeyInfo],
5440
services: [],
5541
}
5642
debug('Created', identifier.did)
@@ -61,6 +47,26 @@ export class EbsiDidProvider extends AbstractIdentifierProvider {
6147
throw Error(`Type ${options.type} not supported`)
6248
}
6349

50+
private async generateEbsiKeyPair(keyType: TKeyType, key: Partial<MinimalImportableKey>, kms: string, context: IAgentContext<IKeyManager>) {
51+
let privateKeyHex = generateEbsiPrivateKeyHex(
52+
ebsiDIDSpecInfo.V1,
53+
key?.privateKeyHex ? u8a.fromString(key.privateKeyHex, 'base16') : undefined
54+
)
55+
if (privateKeyHex.startsWith('0x')) {
56+
privateKeyHex = privateKeyHex.substring(2)
57+
}
58+
if (!privateKeyHex || privateKeyHex.length !== 64) {
59+
throw Error('Private key should be 32 bytes / 64 chars hex')
60+
}
61+
62+
return await context.agent.keyManagerImport({
63+
type: keyType,
64+
kms: this.assertedKms(kms),
65+
kid: key?.kid,
66+
privateKeyHex,
67+
})
68+
}
69+
6470
addKey(
6571
args: {
6672
identifier: IIdentifier

packages/did-provider-ebsi/src/types.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { IAgentContext, IKeyManager, MinimalImportableKey } from '@veramo/core'
1+
import {IAgentContext, IKeyManager, MinimalImportableKey} from '@veramo/core'
22

33
export type IContext = IAgentContext<IKeyManager>
44

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

3030
export interface IKeyOpts {
3131
methodSpecificId?: string // method specific id for import
32-
key?: WithRequiredProperty<Partial<MinimalImportableKey>, 'privateKeyHex'> // Optional key to import with only privateKeyHex mandatory. If not specified a key with random kid will be created
32+
keys?: {
33+
secp256k1: WithRequiredProperty<Partial<MinimalImportableKey>, 'privateKeyHex'>
34+
secp256r1: WithRequiredProperty<Partial<MinimalImportableKey>, 'privateKeyHex'>
35+
}// Optional key to import with only privateKeyHex mandatory. If not specified a key with random kid will be created
3336
/*type?: Key // The key type. Defaults to Secp256k1
3437
use?: KeyUse // The key use*/
3538
}

0 commit comments

Comments
 (0)