From c7af3e10cda8ef7e832a566693f33ee1654509b4 Mon Sep 17 00:00:00 2001 From: Berend Sliedrecht <61358536+blu3beri@users.noreply.github.com> Date: Mon, 2 May 2022 13:57:55 +0200 Subject: [PATCH] feat: bbs createKey, sign and verify (#684) Signed-off-by: Berend Sliedrecht --- packages/core/package.json | 1 + packages/core/src/agent/EnvelopeService.ts | 3 +- packages/core/src/agent/MessageSender.ts | 3 +- .../src/agent/__tests__/MessageSender.test.ts | 4 +- packages/core/src/agent/helpers.ts | 2 +- .../src/agent/models/InboundMessageContext.ts | 2 +- packages/core/src/crypto/BbsService.ts | 151 +++++++++++ packages/core/src/crypto/JwsService.ts | 11 +- .../{modules/dids/domain => crypto}/Key.ts | 6 +- .../src/crypto/__tests__/JwsService.test.ts | 3 +- packages/core/src/crypto/index.ts | 1 + .../key-type => crypto}/multiCodecKey.ts | 2 +- .../signature/SignatureDecoratorUtils.ts | 8 +- .../modules/connections/ConnectionsModule.ts | 10 +- .../connections/DidExchangeProtocol.ts | 4 +- .../__tests__/ConnectionService.test.ts | 4 +- .../connections/services/ConnectionService.ts | 3 +- .../modules/connections/services/helpers.ts | 4 +- packages/core/src/modules/dids/DidsModule.ts | 2 +- .../modules/dids/__tests__/peer-did.test.ts | 4 +- .../src/modules/dids/domain/DidDocument.ts | 3 +- .../dids/domain/createPeerDidFromServices.ts | 3 +- .../core/src/modules/dids/domain/index.ts | 1 - .../key-type/__tests__/bls12381g1.test.ts | 4 +- .../key-type/__tests__/bls12381g1g2.test.ts | 4 +- .../key-type/__tests__/bls12381g2.test.ts | 4 +- .../domain/key-type/__tests__/ed25519.test.ts | 4 +- .../domain/key-type/__tests__/x25519.test.ts | 4 +- .../dids/domain/key-type/bls12381g1.ts | 2 +- .../dids/domain/key-type/bls12381g1g2.ts | 2 +- .../dids/domain/key-type/bls12381g2.ts | 2 +- .../modules/dids/domain/key-type/ed25519.ts | 2 +- .../src/modules/dids/domain/key-type/index.ts | 1 - .../dids/domain/key-type/keyDidMapping.ts | 2 +- .../modules/dids/domain/key-type/x25519.ts | 2 +- .../src/modules/dids/domain/keyDidDocument.ts | 3 +- packages/core/src/modules/dids/helpers.ts | 3 +- .../src/modules/dids/methods/key/DidKey.ts | 2 +- .../dids/methods/key/__tests__/DidKey.test.ts | 2 +- .../peer/__tests__/peerDidNumAlgo0.test.ts | 2 +- .../dids/methods/peer/peerDidNumAlgo0.ts | 2 +- .../dids/methods/peer/peerDidNumAlgo2.ts | 3 +- .../modules/dids/repository/DidRepository.ts | 2 +- .../core/src/modules/oob/OutOfBandModule.ts | 6 +- .../core/src/modules/oob/OutOfBandService.ts | 2 +- .../oob/__tests__/OutOfBandService.test.ts | 3 +- .../oob/messages/OutOfBandInvitation.ts | 2 +- .../services/MediationRecipientService.ts | 5 +- .../routing/services/RoutingService.ts | 3 +- .../MediationRecipientService.test.ts | 2 +- .../services/__tests__/RoutingService.test.ts | 2 +- packages/core/src/types.ts | 2 +- packages/core/src/utils/TypedArrayEncoder.ts | 14 + .../utils/__tests__/TypedArrayEncoder.test.ts | 17 ++ packages/core/src/wallet/IndyWallet.test.ts | 142 ++++++++++ packages/core/src/wallet/IndyWallet.ts | 169 ++++++++++-- packages/core/src/wallet/Wallet.test.ts | 24 -- packages/core/src/wallet/Wallet.ts | 25 +- packages/core/tests/helpers.ts | 24 +- packages/core/tests/oob.test.ts | 2 +- packages/react-native/package.json | 1 + yarn.lock | 244 +++++++++++++++++- 62 files changed, 826 insertions(+), 150 deletions(-) create mode 100644 packages/core/src/crypto/BbsService.ts rename packages/core/src/{modules/dids/domain => crypto}/Key.ts (89%) rename packages/core/src/{modules/dids/domain/key-type => crypto}/multiCodecKey.ts (95%) create mode 100644 packages/core/src/wallet/IndyWallet.test.ts delete mode 100644 packages/core/src/wallet/Wallet.test.ts diff --git a/packages/core/package.json b/packages/core/package.json index 70865022be..20eb074d14 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -23,6 +23,7 @@ "prepublishOnly": "yarn run build" }, "dependencies": { + "@mattrglobal/bbs-signatures": "^1.0.0", "@multiformats/base-x": "^4.0.1", "@stablelib/ed25519": "^1.0.2", "@stablelib/sha256": "^1.0.1", diff --git a/packages/core/src/agent/EnvelopeService.ts b/packages/core/src/agent/EnvelopeService.ts index 9b713f927c..de6e7e9e5b 100644 --- a/packages/core/src/agent/EnvelopeService.ts +++ b/packages/core/src/agent/EnvelopeService.ts @@ -3,8 +3,7 @@ import type { EncryptedMessage, PlaintextMessage } from '../types' import type { AgentMessage } from './AgentMessage' import { InjectionSymbols } from '../constants' -import { KeyType } from '../crypto' -import { Key } from '../modules/dids' +import { Key, KeyType } from '../crypto' import { ForwardMessage } from '../modules/routing/messages' import { inject, injectable } from '../plugins' import { Wallet } from '../wallet/Wallet' diff --git a/packages/core/src/agent/MessageSender.ts b/packages/core/src/agent/MessageSender.ts index 83e5a717b7..46fe9a86a2 100644 --- a/packages/core/src/agent/MessageSender.ts +++ b/packages/core/src/agent/MessageSender.ts @@ -1,5 +1,6 @@ +import type { Key } from '../crypto' import type { ConnectionRecord } from '../modules/connections' -import type { DidDocument, Key } from '../modules/dids' +import type { DidDocument } from '../modules/dids' import type { OutOfBandRecord } from '../modules/oob/repository' import type { OutboundTransport } from '../transport/OutboundTransport' import type { OutboundMessage, OutboundPackage, EncryptedMessage } from '../types' diff --git a/packages/core/src/agent/__tests__/MessageSender.test.ts b/packages/core/src/agent/__tests__/MessageSender.test.ts index f2c0d363e1..d7158a9f47 100644 --- a/packages/core/src/agent/__tests__/MessageSender.test.ts +++ b/packages/core/src/agent/__tests__/MessageSender.test.ts @@ -8,9 +8,9 @@ import type { ResolvedDidCommService } from '../MessageSender' import { TestMessage } from '../../../tests/TestMessage' import { getAgentConfig, getMockConnection, mockFunction } from '../../../tests/helpers' import testLogger from '../../../tests/logger' -import { KeyType } from '../../crypto' +import { Key, KeyType } from '../../crypto' import { ReturnRouteTypes } from '../../decorators/transport/TransportDecorator' -import { Key, DidDocument, VerificationMethod } from '../../modules/dids' +import { DidDocument, VerificationMethod } from '../../modules/dids' import { DidCommV1Service } from '../../modules/dids/domain/service/DidCommV1Service' import { DidResolverService } from '../../modules/dids/services/DidResolverService' import { InMemoryMessageRepository } from '../../storage/InMemoryMessageRepository' diff --git a/packages/core/src/agent/helpers.ts b/packages/core/src/agent/helpers.ts index b3516a1f25..8bce437d96 100644 --- a/packages/core/src/agent/helpers.ts +++ b/packages/core/src/agent/helpers.ts @@ -1,5 +1,5 @@ +import type { Key } from '../crypto' import type { ConnectionRecord } from '../modules/connections' -import type { Key } from '../modules/dids/domain/Key' import type { OutOfBandRecord } from '../modules/oob/repository' import type { OutboundMessage, OutboundServiceMessage } from '../types' import type { AgentMessage } from './AgentMessage' diff --git a/packages/core/src/agent/models/InboundMessageContext.ts b/packages/core/src/agent/models/InboundMessageContext.ts index 34ea296f49..be7e1d4eb9 100644 --- a/packages/core/src/agent/models/InboundMessageContext.ts +++ b/packages/core/src/agent/models/InboundMessageContext.ts @@ -1,5 +1,5 @@ +import type { Key } from '../../crypto' import type { ConnectionRecord } from '../../modules/connections' -import type { Key } from '../../modules/dids' import type { AgentMessage } from '../AgentMessage' import { AriesFrameworkError } from '../../error' diff --git a/packages/core/src/crypto/BbsService.ts b/packages/core/src/crypto/BbsService.ts new file mode 100644 index 0000000000..c00e814249 --- /dev/null +++ b/packages/core/src/crypto/BbsService.ts @@ -0,0 +1,151 @@ +import type { CreateKeyOptions } from '../wallet' +import type { BlsKeyPair as _BlsKeyPair } from '@mattrglobal/bbs-signatures' + +import { + bls12381toBbs, + generateBls12381G2KeyPair, + generateBls12381G1KeyPair, + sign, + verify, +} from '@mattrglobal/bbs-signatures' + +import { TypedArrayEncoder } from '../utils/TypedArrayEncoder' +import { Buffer } from '../utils/buffer' +import { WalletError } from '../wallet/error' + +import { KeyType } from './KeyType' + +export interface BlsKeyPair { + publicKeyBase58: string + privateKeyBase58: string + keyType: Extract +} + +interface BbsCreateKeyOptions extends CreateKeyOptions { + keyType: Extract +} + +interface BbsSignOptions { + messages: Buffer | Buffer[] + publicKey: Buffer + privateKey: Buffer +} + +interface BbsVerifyOptions { + publicKey: Buffer + signature: Buffer + messages: Buffer | Buffer[] +} + +export class BbsService { + /** + * Create an instance of a Key class for the following key types: + * - Bls12381g1 + * - Bls12381g2 + * + * @param keyType KeyType The type of key to be created (see above for the accepted types) + * + * @returns A Key class with the public key and key type + * + * @throws {WalletError} When a key could not be created + * @throws {WalletError} When the method is called with an invalid keytype + */ + public static async createKey({ keyType, seed }: BbsCreateKeyOptions): Promise { + // Generate bytes from the seed as required by the bbs-signatures libraries + const seedBytes = seed ? TypedArrayEncoder.fromString(seed) : undefined + + // Temporary keypair holder + let blsKeyPair: Required<_BlsKeyPair> + + switch (keyType) { + case KeyType.Bls12381g1: + // Generate a bls12-381G1 keypair + blsKeyPair = await generateBls12381G1KeyPair(seedBytes) + break + case KeyType.Bls12381g2: + // Generate a bls12-381G2 keypair + blsKeyPair = await generateBls12381G2KeyPair(seedBytes) + break + default: + // additional check. Should never be hit as this function will only be called from a place where + // a key type check already happened. + throw new WalletError(`Cannot create key with the BbsService for key type: ${keyType}`) + } + + return { + keyType, + publicKeyBase58: TypedArrayEncoder.toBase58(blsKeyPair.publicKey), + privateKeyBase58: TypedArrayEncoder.toBase58(blsKeyPair.secretKey), + } + } + + /** + * Sign an arbitrary amount of messages, in byte form, with a keypair + * + * @param messages Buffer[] List of messages in Buffer form + * @param publicKey Buffer Publickey required for the signing process + * @param privateKey Buffer PrivateKey required for the signing process + * + * @returns A Buffer containing the signature of the messages + * + * @throws {WalletError} When there are no supplied messages + */ + public static async sign({ messages, publicKey, privateKey }: BbsSignOptions): Promise { + if (messages.length === 0) throw new WalletError('Unable to create a signature without any messages') + // Check if it is a single message or list and if it is a single message convert it to a list + const normalizedMessages = (TypedArrayEncoder.isTypedArray(messages) ? [messages as Buffer] : messages) as Buffer[] + + // Get the Uint8Array variant of all the messages + const messageBuffers = normalizedMessages.map((m) => Uint8Array.from(m)) + + const bbsKeyPair = await bls12381toBbs({ + keyPair: { publicKey: Uint8Array.from(publicKey), secretKey: Uint8Array.from(privateKey) }, + messageCount: normalizedMessages.length, + }) + + // Sign the messages via the keyPair + const signature = await sign({ + keyPair: bbsKeyPair, + messages: messageBuffers, + }) + + // Convert the Uint8Array signature to a Buffer type + return Buffer.from(signature) + } + + /** + * Verify an arbitrary amount of messages with their signature created with their key pair + * + * @param publicKey Buffer The public key used to sign the messages + * @param messages Buffer[] The messages that have to be verified if they are signed + * @param signature Buffer The signature that has to be verified if it was created with the messages and public key + * + * @returns A boolean whether the signature is create with the public key over the messages + * + * @throws {WalletError} When the message list is empty + * @throws {WalletError} When the verification process failed + */ + public static async verify({ signature, messages, publicKey }: BbsVerifyOptions): Promise { + if (messages.length === 0) throw new WalletError('Unable to create a signature without any messages') + // Check if it is a single message or list and if it is a single message convert it to a list + const normalizedMessages = (TypedArrayEncoder.isTypedArray(messages) ? [messages as Buffer] : messages) as Buffer[] + + // Get the Uint8Array variant of all the messages + const messageBuffers = normalizedMessages.map((m) => Uint8Array.from(m)) + + const bbsKeyPair = await bls12381toBbs({ + keyPair: { publicKey: Uint8Array.from(publicKey) }, + messageCount: normalizedMessages.length, + }) + + // Verify the signature against the messages with their public key + const { verified, error } = await verify({ signature, messages: messageBuffers, publicKey: bbsKeyPair.publicKey }) + + // If the messages could not be verified and an error occured + if (!verified && error) { + throw new WalletError(`Could not verify the signature against the messages: ${error}`) + } + + return verified + } +} diff --git a/packages/core/src/crypto/JwsService.ts b/packages/core/src/crypto/JwsService.ts index 2a06e71cb5..8e631d4185 100644 --- a/packages/core/src/crypto/JwsService.ts +++ b/packages/core/src/crypto/JwsService.ts @@ -8,6 +8,9 @@ import { JsonEncoder, TypedArrayEncoder } from '../utils' import { Wallet } from '../wallet' import { WalletError } from '../wallet/error' +import { Key } from './Key' +import { KeyType } from './KeyType' + // TODO: support more key types, more generic jws format const JWS_KEY_TYPE = 'OKP' const JWS_CURVE = 'Ed25519' @@ -24,9 +27,10 @@ export class JwsService { public async createJws({ payload, verkey, header }: CreateJwsOptions): Promise { const base64Payload = TypedArrayEncoder.toBase64URL(payload) const base64Protected = JsonEncoder.toBase64URL(this.buildProtected(verkey)) + const key = Key.fromPublicKeyBase58(verkey, KeyType.Ed25519) const signature = TypedArrayEncoder.toBase64URL( - await this.wallet.sign(TypedArrayEncoder.fromString(`${base64Protected}.${base64Payload}`), verkey) + await this.wallet.sign({ data: TypedArrayEncoder.fromString(`${base64Protected}.${base64Payload}`), key }) ) return { @@ -37,7 +41,7 @@ export class JwsService { } /** - * Verify a a JWS + * Verify a JWS */ public async verifyJws({ jws, payload }: VerifyJwsOptions): Promise { const base64Payload = TypedArrayEncoder.toBase64URL(payload) @@ -63,10 +67,11 @@ export class JwsService { const signature = TypedArrayEncoder.fromBase64(jws.signature) const verkey = TypedArrayEncoder.toBase58(TypedArrayEncoder.fromBase64(protectedJson?.jwk?.x)) + const key = Key.fromPublicKeyBase58(verkey, KeyType.Ed25519) signerVerkeys.push(verkey) try { - const isValid = await this.wallet.verify(verkey, data, signature) + const isValid = await this.wallet.verify({ key, data, signature }) if (!isValid) { return { diff --git a/packages/core/src/modules/dids/domain/Key.ts b/packages/core/src/crypto/Key.ts similarity index 89% rename from packages/core/src/modules/dids/domain/Key.ts rename to packages/core/src/crypto/Key.ts index f9c9595966..c5d03507f0 100644 --- a/packages/core/src/modules/dids/domain/Key.ts +++ b/packages/core/src/crypto/Key.ts @@ -1,8 +1,8 @@ -import type { KeyType } from '../../../crypto' +import type { KeyType } from './KeyType' -import { Buffer, TypedArrayEncoder, MultiBaseEncoder, VarintEncoder } from '../../../utils' +import { Buffer, MultiBaseEncoder, TypedArrayEncoder, VarintEncoder } from '../utils' -import { getKeyTypeByMultiCodecPrefix, getMultiCodecPrefixByKeytype } from './key-type/multiCodecKey' +import { getKeyTypeByMultiCodecPrefix, getMultiCodecPrefixByKeytype } from './multiCodecKey' export class Key { public readonly publicKey: Buffer diff --git a/packages/core/src/crypto/__tests__/JwsService.test.ts b/packages/core/src/crypto/__tests__/JwsService.test.ts index c1f4be7721..87ced7bd95 100644 --- a/packages/core/src/crypto/__tests__/JwsService.test.ts +++ b/packages/core/src/crypto/__tests__/JwsService.test.ts @@ -1,10 +1,11 @@ import type { Wallet } from '@aries-framework/core' import { getAgentConfig } from '../../../tests/helpers' -import { DidKey, Key } from '../../modules/dids' +import { DidKey } from '../../modules/dids' import { Buffer, JsonEncoder } from '../../utils' import { IndyWallet } from '../../wallet/IndyWallet' import { JwsService } from '../JwsService' +import { Key } from '../Key' import { KeyType } from '../KeyType' import * as didJwsz6Mkf from './__fixtures__/didJwsz6Mkf' diff --git a/packages/core/src/crypto/index.ts b/packages/core/src/crypto/index.ts index 208a940d03..4c598a5a2a 100644 --- a/packages/core/src/crypto/index.ts +++ b/packages/core/src/crypto/index.ts @@ -1 +1,2 @@ export { KeyType } from './KeyType' +export { Key } from './Key' diff --git a/packages/core/src/modules/dids/domain/key-type/multiCodecKey.ts b/packages/core/src/crypto/multiCodecKey.ts similarity index 95% rename from packages/core/src/modules/dids/domain/key-type/multiCodecKey.ts rename to packages/core/src/crypto/multiCodecKey.ts index 884145f1da..20d3f4b070 100644 --- a/packages/core/src/modules/dids/domain/key-type/multiCodecKey.ts +++ b/packages/core/src/crypto/multiCodecKey.ts @@ -1,4 +1,4 @@ -import { KeyType } from '../../../../crypto' +import { KeyType } from './KeyType' // based on https://github.com/multiformats/multicodec/blob/master/table.csv const multiCodecPrefixMap: Record = { diff --git a/packages/core/src/decorators/signature/SignatureDecoratorUtils.ts b/packages/core/src/decorators/signature/SignatureDecoratorUtils.ts index 4518f67b33..dedbde2610 100644 --- a/packages/core/src/decorators/signature/SignatureDecoratorUtils.ts +++ b/packages/core/src/decorators/signature/SignatureDecoratorUtils.ts @@ -1,5 +1,6 @@ import type { Wallet } from '../../wallet/Wallet' +import { Key, KeyType } from '../../crypto' import { AriesFrameworkError } from '../../error' import { JsonEncoder } from '../../utils/JsonEncoder' import { TypedArrayEncoder } from '../../utils/TypedArrayEncoder' @@ -21,12 +22,14 @@ export async function unpackAndVerifySignatureDecorator( wallet: Wallet ): Promise> { const signerVerkey = decorator.signer + const key = Key.fromPublicKeyBase58(signerVerkey, KeyType.Ed25519) // first 8 bytes are for 64 bit integer from unix epoch const signedData = TypedArrayEncoder.fromBase64(decorator.signatureData) const signature = TypedArrayEncoder.fromBase64(decorator.signature) - const isValid = await wallet.verify(signerVerkey, signedData, signature) + // const isValid = await wallet.verify(signerVerkey, signedData, signature) + const isValid = await wallet.verify({ signature, data: signedData, key }) if (!isValid) { throw new AriesFrameworkError('Signature is not valid') @@ -47,8 +50,9 @@ export async function unpackAndVerifySignatureDecorator( */ export async function signData(data: unknown, wallet: Wallet, signerKey: string): Promise { const dataBuffer = Buffer.concat([timestamp(), JsonEncoder.toBuffer(data)]) + const key = Key.fromPublicKeyBase58(signerKey, KeyType.Ed25519) - const signatureBuffer = await wallet.sign(dataBuffer, signerKey) + const signatureBuffer = await wallet.sign({ key, data: dataBuffer }) const signatureDecorator = new SignatureDecorator({ signatureType: 'https://didcomm.org/signature/1.0/ed25519Sha512_single', diff --git a/packages/core/src/modules/connections/ConnectionsModule.ts b/packages/core/src/modules/connections/ConnectionsModule.ts index 697b4492de..1685c183c4 100644 --- a/packages/core/src/modules/connections/ConnectionsModule.ts +++ b/packages/core/src/modules/connections/ConnectionsModule.ts @@ -1,5 +1,5 @@ +import type { Key } from '../../crypto' import type { DependencyManager } from '../../plugins' -import type { Key } from '../dids' import type { OutOfBandRecord } from '../oob/repository' import type { ConnectionRecord } from './repository/ConnectionRecord' import type { Routing } from './services' @@ -18,14 +18,14 @@ import { RoutingService } from '../routing/services/RoutingService' import { DidExchangeProtocol } from './DidExchangeProtocol' import { + AckMessageHandler, ConnectionRequestHandler, ConnectionResponseHandler, - AckMessageHandler, - TrustPingMessageHandler, - TrustPingResponseMessageHandler, + DidExchangeCompleteHandler, DidExchangeRequestHandler, DidExchangeResponseHandler, - DidExchangeCompleteHandler, + TrustPingMessageHandler, + TrustPingResponseMessageHandler, } from './handlers' import { HandshakeProtocol } from './models' import { ConnectionRepository } from './repository' diff --git a/packages/core/src/modules/connections/DidExchangeProtocol.ts b/packages/core/src/modules/connections/DidExchangeProtocol.ts index e3f2ad741b..e5e8554a9f 100644 --- a/packages/core/src/modules/connections/DidExchangeProtocol.ts +++ b/packages/core/src/modules/connections/DidExchangeProtocol.ts @@ -8,14 +8,14 @@ import type { ConnectionRecord } from './repository' import type { Routing } from './services/ConnectionService' import { AgentConfig } from '../../agent/AgentConfig' -import { KeyType } from '../../crypto' +import { Key, KeyType } from '../../crypto' import { JwsService } from '../../crypto/JwsService' import { Attachment, AttachmentData } from '../../decorators/attachment/Attachment' import { AriesFrameworkError } from '../../error' import { injectable } from '../../plugins' import { JsonEncoder } from '../../utils/JsonEncoder' import { JsonTransformer } from '../../utils/JsonTransformer' -import { DidDocument, Key } from '../dids' +import { DidDocument } from '../dids' import { DidDocumentRole } from '../dids/domain/DidDocumentRole' import { createDidDocumentFromServices } from '../dids/domain/createPeerDidFromServices' import { getKeyDidMappingByVerificationMethod } from '../dids/domain/key-type' diff --git a/packages/core/src/modules/connections/__tests__/ConnectionService.test.ts b/packages/core/src/modules/connections/__tests__/ConnectionService.test.ts index 97ef3fbd3d..b27ec3fed1 100644 --- a/packages/core/src/modules/connections/__tests__/ConnectionService.test.ts +++ b/packages/core/src/modules/connections/__tests__/ConnectionService.test.ts @@ -5,13 +5,13 @@ import { getAgentConfig, getMockConnection, getMockOutOfBand, mockFunction } fro import { AgentMessage } from '../../../agent/AgentMessage' import { EventEmitter } from '../../../agent/EventEmitter' import { InboundMessageContext } from '../../../agent/models/InboundMessageContext' -import { KeyType } from '../../../crypto' +import { Key, KeyType } from '../../../crypto' import { signData, unpackAndVerifySignatureDecorator } from '../../../decorators/signature/SignatureDecoratorUtils' import { JsonTransformer } from '../../../utils/JsonTransformer' import { uuid } from '../../../utils/uuid' import { IndyWallet } from '../../../wallet/IndyWallet' import { AckMessage, AckStatus } from '../../common' -import { DidKey, IndyAgentService, Key } from '../../dids' +import { DidKey, IndyAgentService } from '../../dids' import { DidCommV1Service } from '../../dids/domain/service/DidCommV1Service' import { didDocumentJsonToNumAlgo1Did } from '../../dids/methods/peer/peerDidNumAlgo1' import { DidRepository } from '../../dids/repository' diff --git a/packages/core/src/modules/connections/services/ConnectionService.ts b/packages/core/src/modules/connections/services/ConnectionService.ts index 570c314de9..07fa99743b 100644 --- a/packages/core/src/modules/connections/services/ConnectionService.ts +++ b/packages/core/src/modules/connections/services/ConnectionService.ts @@ -14,13 +14,14 @@ import { first, map, timeout } from 'rxjs/operators' import { AgentConfig } from '../../../agent/AgentConfig' import { EventEmitter } from '../../../agent/EventEmitter' import { InjectionSymbols } from '../../../constants' +import { Key } from '../../../crypto' import { signData, unpackAndVerifySignatureDecorator } from '../../../decorators/signature/SignatureDecoratorUtils' import { AriesFrameworkError } from '../../../error' import { inject, injectable } from '../../../plugins' import { JsonTransformer } from '../../../utils/JsonTransformer' import { indyDidFromPublicKeyBase58 } from '../../../utils/did' import { Wallet } from '../../../wallet/Wallet' -import { DidKey, Key, IndyAgentService } from '../../dids' +import { DidKey, IndyAgentService } from '../../dids' import { DidDocumentRole } from '../../dids/domain/DidDocumentRole' import { didKeyToVerkey } from '../../dids/helpers' import { didDocumentJsonToNumAlgo1Did } from '../../dids/methods/peer/peerDidNumAlgo1' diff --git a/packages/core/src/modules/connections/services/helpers.ts b/packages/core/src/modules/connections/services/helpers.ts index c54b3030fc..52879d798f 100644 --- a/packages/core/src/modules/connections/services/helpers.ts +++ b/packages/core/src/modules/connections/services/helpers.ts @@ -1,9 +1,9 @@ import type { DidDocument } from '../../dids' import type { DidDoc, PublicKey } from '../models' -import { KeyType } from '../../../crypto' +import { Key, KeyType } from '../../../crypto' import { AriesFrameworkError } from '../../../error' -import { IndyAgentService, DidCommV1Service, Key, DidDocumentBuilder } from '../../dids' +import { IndyAgentService, DidCommV1Service, DidDocumentBuilder } from '../../dids' import { getEd25519VerificationMethod } from '../../dids/domain/key-type/ed25519' import { didDocumentJsonToNumAlgo1Did } from '../../dids/methods/peer/peerDidNumAlgo1' import { EmbeddedAuthentication } from '../models' diff --git a/packages/core/src/modules/dids/DidsModule.ts b/packages/core/src/modules/dids/DidsModule.ts index 1fddb47453..7fe57d25d6 100644 --- a/packages/core/src/modules/dids/DidsModule.ts +++ b/packages/core/src/modules/dids/DidsModule.ts @@ -1,5 +1,5 @@ +import type { Key } from '../../crypto' import type { DependencyManager } from '../../plugins' -import type { Key } from './domain/Key' import type { DidResolutionOptions } from './types' import { injectable, module } from '../../plugins' diff --git a/packages/core/src/modules/dids/__tests__/peer-did.test.ts b/packages/core/src/modules/dids/__tests__/peer-did.test.ts index 5e5b64f872..c5205f1e60 100644 --- a/packages/core/src/modules/dids/__tests__/peer-did.test.ts +++ b/packages/core/src/modules/dids/__tests__/peer-did.test.ts @@ -2,11 +2,11 @@ import type { IndyLedgerService } from '../../ledger' import { getAgentConfig } from '../../../../tests/helpers' import { EventEmitter } from '../../../agent/EventEmitter' -import { KeyType } from '../../../crypto' +import { Key, KeyType } from '../../../crypto' import { IndyStorageService } from '../../../storage/IndyStorageService' import { JsonTransformer } from '../../../utils' import { IndyWallet } from '../../../wallet/IndyWallet' -import { DidCommV1Service, DidDocument, DidDocumentBuilder, Key } from '../domain' +import { DidCommV1Service, DidDocument, DidDocumentBuilder } from '../domain' import { DidDocumentRole } from '../domain/DidDocumentRole' import { convertPublicKeyToX25519, getEd25519VerificationMethod } from '../domain/key-type/ed25519' import { getX25519VerificationMethod } from '../domain/key-type/x25519' diff --git a/packages/core/src/modules/dids/domain/DidDocument.ts b/packages/core/src/modules/dids/domain/DidDocument.ts index 28bcfb3f8b..4f3a066835 100644 --- a/packages/core/src/modules/dids/domain/DidDocument.ts +++ b/packages/core/src/modules/dids/domain/DidDocument.ts @@ -3,11 +3,10 @@ import type { DidDocumentService } from './service' import { Expose, Type } from 'class-transformer' import { IsArray, IsOptional, IsString, ValidateNested } from 'class-validator' -import { KeyType } from '../../../crypto' +import { KeyType, Key } from '../../../crypto' import { JsonTransformer } from '../../../utils/JsonTransformer' import { IsStringOrStringArray } from '../../../utils/transformers' -import { Key } from './Key' import { getKeyDidMappingByVerificationMethod } from './key-type' import { IndyAgentService, ServiceTransformer, DidCommV1Service } from './service' import { VerificationMethodTransformer, VerificationMethod, IsStringOrVerificationMethod } from './verificationMethod' diff --git a/packages/core/src/modules/dids/domain/createPeerDidFromServices.ts b/packages/core/src/modules/dids/domain/createPeerDidFromServices.ts index 3fe2375a35..6f4dfe6a00 100644 --- a/packages/core/src/modules/dids/domain/createPeerDidFromServices.ts +++ b/packages/core/src/modules/dids/domain/createPeerDidFromServices.ts @@ -2,13 +2,12 @@ import type { ResolvedDidCommService } from '../../../agent/MessageSender' import { convertPublicKeyToX25519 } from '@stablelib/ed25519' -import { KeyType } from '../../../crypto' +import { KeyType, Key } from '../../../crypto' import { AriesFrameworkError } from '../../../error' import { uuid } from '../../../utils/uuid' import { DidKey } from '../methods/key' import { DidDocumentBuilder } from './DidDocumentBuilder' -import { Key } from './Key' import { getEd25519VerificationMethod } from './key-type/ed25519' import { getX25519VerificationMethod } from './key-type/x25519' import { DidCommV1Service } from './service/DidCommV1Service' diff --git a/packages/core/src/modules/dids/domain/index.ts b/packages/core/src/modules/dids/domain/index.ts index 5e2bbcd60f..bf0ff1c854 100644 --- a/packages/core/src/modules/dids/domain/index.ts +++ b/packages/core/src/modules/dids/domain/index.ts @@ -2,4 +2,3 @@ export * from './service' export * from './verificationMethod' export * from './DidDocument' export * from './DidDocumentBuilder' -export * from './Key' diff --git a/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g1.test.ts b/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g1.test.ts index ef18f6b92e..7fdbf067ab 100644 --- a/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g1.test.ts +++ b/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g1.test.ts @@ -1,7 +1,7 @@ import { KeyType } from '../../../../../crypto' -import { JsonTransformer, TypedArrayEncoder, Buffer } from '../../../../../utils' +import { Key } from '../../../../../crypto/Key' +import { Buffer, JsonTransformer, TypedArrayEncoder } from '../../../../../utils' import keyBls12381g1Fixture from '../../../__tests__/__fixtures__/didKeyBls12381g1.json' -import { Key } from '../../Key' import { VerificationMethod } from '../../verificationMethod' import { keyDidBls12381g1 } from '../bls12381g1' diff --git a/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g1g2.test.ts b/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g1g2.test.ts index c1a53d2217..442422f2cb 100644 --- a/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g1g2.test.ts +++ b/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g1g2.test.ts @@ -1,7 +1,7 @@ import { KeyType } from '../../../../../crypto' -import { JsonTransformer, TypedArrayEncoder, Buffer } from '../../../../../utils' +import { Key } from '../../../../../crypto/Key' +import { Buffer, JsonTransformer, TypedArrayEncoder } from '../../../../../utils' import keyBls12381g1g2Fixture from '../../../__tests__/__fixtures__/didKeyBls12381g1g2.json' -import { Key } from '../../Key' import { VerificationMethod } from '../../verificationMethod' import { keyDidBls12381g1g2 } from '../bls12381g1g2' diff --git a/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g2.test.ts b/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g2.test.ts index a9f82d19a9..5b326f1f3b 100644 --- a/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g2.test.ts +++ b/packages/core/src/modules/dids/domain/key-type/__tests__/bls12381g2.test.ts @@ -1,7 +1,7 @@ import { KeyType } from '../../../../../crypto' -import { JsonTransformer, TypedArrayEncoder, Buffer } from '../../../../../utils' +import { Key } from '../../../../../crypto/Key' +import { Buffer, JsonTransformer, TypedArrayEncoder } from '../../../../../utils' import keyBls12381g2Fixture from '../../../__tests__/__fixtures__/didKeyBls12381g2.json' -import { Key } from '../../Key' import { VerificationMethod } from '../../verificationMethod' import { keyDidBls12381g2 } from '../bls12381g2' diff --git a/packages/core/src/modules/dids/domain/key-type/__tests__/ed25519.test.ts b/packages/core/src/modules/dids/domain/key-type/__tests__/ed25519.test.ts index c9c9911e11..cd93ada9cd 100644 --- a/packages/core/src/modules/dids/domain/key-type/__tests__/ed25519.test.ts +++ b/packages/core/src/modules/dids/domain/key-type/__tests__/ed25519.test.ts @@ -1,7 +1,7 @@ import { KeyType } from '../../../../../crypto' -import { JsonTransformer, TypedArrayEncoder, Buffer } from '../../../../../utils' +import { Key } from '../../../../../crypto/Key' +import { Buffer, JsonTransformer, TypedArrayEncoder } from '../../../../../utils' import didKeyEd25519Fixture from '../../../__tests__/__fixtures__//didKeyEd25519.json' -import { Key } from '../../../domain/Key' import { VerificationMethod } from '../../../domain/verificationMethod' import { keyDidEd25519 } from '../ed25519' diff --git a/packages/core/src/modules/dids/domain/key-type/__tests__/x25519.test.ts b/packages/core/src/modules/dids/domain/key-type/__tests__/x25519.test.ts index 2908c0939b..9562434057 100644 --- a/packages/core/src/modules/dids/domain/key-type/__tests__/x25519.test.ts +++ b/packages/core/src/modules/dids/domain/key-type/__tests__/x25519.test.ts @@ -1,7 +1,7 @@ import { KeyType } from '../../../../../crypto' -import { JsonTransformer, TypedArrayEncoder, Buffer } from '../../../../../utils' +import { Key } from '../../../../../crypto/Key' +import { Buffer, JsonTransformer, TypedArrayEncoder } from '../../../../../utils' import didKeyX25519Fixture from '../../../__tests__/__fixtures__/didKeyX25519.json' -import { Key } from '../../Key' import { VerificationMethod } from '../../verificationMethod' import { keyDidX25519 } from '../x25519' diff --git a/packages/core/src/modules/dids/domain/key-type/bls12381g1.ts b/packages/core/src/modules/dids/domain/key-type/bls12381g1.ts index 50d208d119..6ac241f5d9 100644 --- a/packages/core/src/modules/dids/domain/key-type/bls12381g1.ts +++ b/packages/core/src/modules/dids/domain/key-type/bls12381g1.ts @@ -2,7 +2,7 @@ import type { VerificationMethod } from '../verificationMethod' import type { KeyDidMapping } from './keyDidMapping' import { KeyType } from '../../../../crypto' -import { Key } from '../Key' +import { Key } from '../../../../crypto/Key' const VERIFICATION_METHOD_TYPE_BLS12381G1_KEY_2020 = 'Bls12381G1Key2020' diff --git a/packages/core/src/modules/dids/domain/key-type/bls12381g1g2.ts b/packages/core/src/modules/dids/domain/key-type/bls12381g1g2.ts index a84456e0a5..55b0d8c949 100644 --- a/packages/core/src/modules/dids/domain/key-type/bls12381g1g2.ts +++ b/packages/core/src/modules/dids/domain/key-type/bls12381g1g2.ts @@ -1,7 +1,7 @@ import type { KeyDidMapping } from './keyDidMapping' import { KeyType } from '../../../../crypto' -import { Key } from '../Key' +import { Key } from '../../../../crypto/Key' import { getBls12381g1VerificationMethod } from './bls12381g1' import { getBls12381g2VerificationMethod } from './bls12381g2' diff --git a/packages/core/src/modules/dids/domain/key-type/bls12381g2.ts b/packages/core/src/modules/dids/domain/key-type/bls12381g2.ts index 0c476e86bb..a17d20130a 100644 --- a/packages/core/src/modules/dids/domain/key-type/bls12381g2.ts +++ b/packages/core/src/modules/dids/domain/key-type/bls12381g2.ts @@ -2,7 +2,7 @@ import type { VerificationMethod } from '../verificationMethod' import type { KeyDidMapping } from './keyDidMapping' import { KeyType } from '../../../../crypto' -import { Key } from '../Key' +import { Key } from '../../../../crypto/Key' const VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020 = 'Bls12381G2Key2020' diff --git a/packages/core/src/modules/dids/domain/key-type/ed25519.ts b/packages/core/src/modules/dids/domain/key-type/ed25519.ts index 6fe91cc67e..eb360c72fb 100644 --- a/packages/core/src/modules/dids/domain/key-type/ed25519.ts +++ b/packages/core/src/modules/dids/domain/key-type/ed25519.ts @@ -4,7 +4,7 @@ import type { KeyDidMapping } from './keyDidMapping' import { convertPublicKeyToX25519 } from '@stablelib/ed25519' import { KeyType } from '../../../../crypto' -import { Key } from '../Key' +import { Key } from '../../../../crypto/Key' const VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018 = 'Ed25519VerificationKey2018' diff --git a/packages/core/src/modules/dids/domain/key-type/index.ts b/packages/core/src/modules/dids/domain/key-type/index.ts index ce5cbb0a5d..8e0d752102 100644 --- a/packages/core/src/modules/dids/domain/key-type/index.ts +++ b/packages/core/src/modules/dids/domain/key-type/index.ts @@ -1,2 +1 @@ -export { getKeyTypeByMultiCodecPrefix, getMultiCodecPrefixByKeytype } from './multiCodecKey' export { getKeyDidMappingByKeyType, getKeyDidMappingByVerificationMethod } from './keyDidMapping' diff --git a/packages/core/src/modules/dids/domain/key-type/keyDidMapping.ts b/packages/core/src/modules/dids/domain/key-type/keyDidMapping.ts index deafe72518..713817d1bb 100644 --- a/packages/core/src/modules/dids/domain/key-type/keyDidMapping.ts +++ b/packages/core/src/modules/dids/domain/key-type/keyDidMapping.ts @@ -1,4 +1,4 @@ -import type { Key } from '../Key' +import type { Key } from '../../../../crypto/Key' import type { VerificationMethod } from '../verificationMethod' import { KeyType } from '../../../../crypto' diff --git a/packages/core/src/modules/dids/domain/key-type/x25519.ts b/packages/core/src/modules/dids/domain/key-type/x25519.ts index 359e48b2a3..5ce7ff0683 100644 --- a/packages/core/src/modules/dids/domain/key-type/x25519.ts +++ b/packages/core/src/modules/dids/domain/key-type/x25519.ts @@ -2,7 +2,7 @@ import type { VerificationMethod } from '../verificationMethod' import type { KeyDidMapping } from './keyDidMapping' import { KeyType } from '../../../../crypto' -import { Key } from '../Key' +import { Key } from '../../../../crypto/Key' const VERIFICATION_METHOD_TYPE_X25519_KEY_AGREEMENT_KEY_2019 = 'X25519KeyAgreementKey2019' diff --git a/packages/core/src/modules/dids/domain/keyDidDocument.ts b/packages/core/src/modules/dids/domain/keyDidDocument.ts index bd628721ab..893436aeb3 100644 --- a/packages/core/src/modules/dids/domain/keyDidDocument.ts +++ b/packages/core/src/modules/dids/domain/keyDidDocument.ts @@ -1,9 +1,8 @@ import type { VerificationMethod } from './verificationMethod/VerificationMethod' -import { KeyType } from '../../../crypto' +import { KeyType, Key } from '../../../crypto' import { DidDocumentBuilder } from './DidDocumentBuilder' -import { Key } from './Key' import { getBls12381g1VerificationMethod } from './key-type/bls12381g1' import { getBls12381g1g2VerificationMethod } from './key-type/bls12381g1g2' import { getBls12381g2VerificationMethod } from './key-type/bls12381g2' diff --git a/packages/core/src/modules/dids/helpers.ts b/packages/core/src/modules/dids/helpers.ts index 2a8316a59f..ef3c68ab07 100644 --- a/packages/core/src/modules/dids/helpers.ts +++ b/packages/core/src/modules/dids/helpers.ts @@ -1,6 +1,5 @@ -import { KeyType } from '../../crypto' +import { KeyType, Key } from '../../crypto' -import { Key } from './domain/Key' import { DidKey } from './methods/key' export function didKeyToVerkey(key: string) { diff --git a/packages/core/src/modules/dids/methods/key/DidKey.ts b/packages/core/src/modules/dids/methods/key/DidKey.ts index e2e190120d..fb377d63c0 100644 --- a/packages/core/src/modules/dids/methods/key/DidKey.ts +++ b/packages/core/src/modules/dids/methods/key/DidKey.ts @@ -1,4 +1,4 @@ -import { Key } from '../../domain/Key' +import { Key } from '../../../../crypto/Key' import { getDidDocumentForKey } from '../../domain/keyDidDocument' import { parseDid } from '../../domain/parse' diff --git a/packages/core/src/modules/dids/methods/key/__tests__/DidKey.test.ts b/packages/core/src/modules/dids/methods/key/__tests__/DidKey.test.ts index 77127532e8..bacfb3f1a9 100644 --- a/packages/core/src/modules/dids/methods/key/__tests__/DidKey.test.ts +++ b/packages/core/src/modules/dids/methods/key/__tests__/DidKey.test.ts @@ -1,10 +1,10 @@ import { KeyType } from '../../../../../crypto' +import { Key } from '../../../../../crypto/Key' import didKeyBls12381g1 from '../../../__tests__/__fixtures__/didKeyBls12381g1.json' import didKeyBls12381g1g2 from '../../../__tests__/__fixtures__/didKeyBls12381g1g2.json' import didKeyBls12381g2 from '../../../__tests__/__fixtures__/didKeyBls12381g2.json' import didKeyEd25519 from '../../../__tests__/__fixtures__/didKeyEd25519.json' import didKeyX25519 from '../../../__tests__/__fixtures__/didKeyX25519.json' -import { Key } from '../../../domain/Key' import { DidKey } from '../DidKey' describe('DidKey', () => { diff --git a/packages/core/src/modules/dids/methods/peer/__tests__/peerDidNumAlgo0.test.ts b/packages/core/src/modules/dids/methods/peer/__tests__/peerDidNumAlgo0.test.ts index 7433903849..efc938ae2d 100644 --- a/packages/core/src/modules/dids/methods/peer/__tests__/peerDidNumAlgo0.test.ts +++ b/packages/core/src/modules/dids/methods/peer/__tests__/peerDidNumAlgo0.test.ts @@ -1,9 +1,9 @@ +import { Key } from '../../../../../crypto' import didKeyBls12381g1 from '../../../__tests__/__fixtures__/didKeyBls12381g1.json' import didKeyBls12381g1g2 from '../../../__tests__/__fixtures__/didKeyBls12381g1g2.json' import didKeyBls12381g2 from '../../../__tests__/__fixtures__/didKeyBls12381g2.json' import didKeyEd25519 from '../../../__tests__/__fixtures__/didKeyEd25519.json' import didKeyX25519 from '../../../__tests__/__fixtures__/didKeyX25519.json' -import { Key } from '../../../domain' import { didToNumAlgo0DidDocument, keyToNumAlgo0DidDocument } from '../peerDidNumAlgo0' describe('peerDidNumAlgo0', () => { diff --git a/packages/core/src/modules/dids/methods/peer/peerDidNumAlgo0.ts b/packages/core/src/modules/dids/methods/peer/peerDidNumAlgo0.ts index 9842b99f44..934156d5d8 100644 --- a/packages/core/src/modules/dids/methods/peer/peerDidNumAlgo0.ts +++ b/packages/core/src/modules/dids/methods/peer/peerDidNumAlgo0.ts @@ -1,4 +1,4 @@ -import { Key } from '../../domain/Key' +import { Key } from '../../../../crypto' import { getDidDocumentForKey } from '../../domain/keyDidDocument' import { parseDid } from '../../domain/parse' diff --git a/packages/core/src/modules/dids/methods/peer/peerDidNumAlgo2.ts b/packages/core/src/modules/dids/methods/peer/peerDidNumAlgo2.ts index 880cfd9ce4..4b26cd5efa 100644 --- a/packages/core/src/modules/dids/methods/peer/peerDidNumAlgo2.ts +++ b/packages/core/src/modules/dids/methods/peer/peerDidNumAlgo2.ts @@ -2,8 +2,9 @@ import type { JsonObject } from '../../../../types' import type { OutOfBandDidCommService } from '../../../oob/domain/OutOfBandDidCommService' import type { DidDocument, VerificationMethod } from '../../domain' +import { Key } from '../../../../crypto' import { JsonEncoder, JsonTransformer } from '../../../../utils' -import { DidCommV1Service, DidDocumentService, Key } from '../../domain' +import { DidCommV1Service, DidDocumentService } from '../../domain' import { DidDocumentBuilder } from '../../domain/DidDocumentBuilder' import { getKeyDidMappingByKeyType, getKeyDidMappingByVerificationMethod } from '../../domain/key-type' import { parseDid } from '../../domain/parse' diff --git a/packages/core/src/modules/dids/repository/DidRepository.ts b/packages/core/src/modules/dids/repository/DidRepository.ts index b5edff754a..cb397cd1fe 100644 --- a/packages/core/src/modules/dids/repository/DidRepository.ts +++ b/packages/core/src/modules/dids/repository/DidRepository.ts @@ -1,4 +1,4 @@ -import type { Key } from '../domain/Key' +import type { Key } from '../../../crypto' import { EventEmitter } from '../../../agent/EventEmitter' import { InjectionSymbols } from '../../../constants' diff --git a/packages/core/src/modules/oob/OutOfBandModule.ts b/packages/core/src/modules/oob/OutOfBandModule.ts index 333af57332..18796d7876 100644 --- a/packages/core/src/modules/oob/OutOfBandModule.ts +++ b/packages/core/src/modules/oob/OutOfBandModule.ts @@ -1,11 +1,11 @@ import type { AgentMessage } from '../../agent/AgentMessage' import type { AgentMessageReceivedEvent } from '../../agent/Events' +import type { Key } from '../../crypto' import type { Attachment } from '../../decorators/attachment/Attachment' import type { Logger } from '../../logger' -import type { ConnectionRecord, Routing, ConnectionInvitationMessage } from '../../modules/connections' +import type { ConnectionInvitationMessage, ConnectionRecord, Routing } from '../../modules/connections' import type { DependencyManager } from '../../plugins' import type { PlaintextMessage } from '../../types' -import type { Key } from '../dids' import type { HandshakeReusedEvent } from './domain/OutOfBandEvents' import { catchError, EmptyError, first, firstValueFrom, map, of, timeout } from 'rxjs' @@ -18,7 +18,7 @@ import { MessageSender } from '../../agent/MessageSender' import { createOutboundMessage } from '../../agent/helpers' import { ServiceDecorator } from '../../decorators/service/ServiceDecorator' import { AriesFrameworkError } from '../../error' -import { DidExchangeState, HandshakeProtocol, ConnectionsModule } from '../../modules/connections' +import { ConnectionsModule, DidExchangeState, HandshakeProtocol } from '../../modules/connections' import { injectable, module } from '../../plugins' import { DidCommMessageRepository, DidCommMessageRole } from '../../storage' import { JsonEncoder, JsonTransformer } from '../../utils' diff --git a/packages/core/src/modules/oob/OutOfBandService.ts b/packages/core/src/modules/oob/OutOfBandService.ts index b84d332e0f..ce64b5513d 100644 --- a/packages/core/src/modules/oob/OutOfBandService.ts +++ b/packages/core/src/modules/oob/OutOfBandService.ts @@ -1,6 +1,6 @@ import type { InboundMessageContext } from '../../agent/models/InboundMessageContext' +import type { Key } from '../../crypto' import type { ConnectionRecord } from '../connections' -import type { Key } from '../dids/domain/Key' import type { HandshakeReusedEvent, OutOfBandStateChangedEvent } from './domain/OutOfBandEvents' import type { OutOfBandRecord } from './repository' diff --git a/packages/core/src/modules/oob/__tests__/OutOfBandService.test.ts b/packages/core/src/modules/oob/__tests__/OutOfBandService.test.ts index 9bfd317ddb..dd1c98098b 100644 --- a/packages/core/src/modules/oob/__tests__/OutOfBandService.test.ts +++ b/packages/core/src/modules/oob/__tests__/OutOfBandService.test.ts @@ -3,11 +3,10 @@ import type { Wallet } from '../../../wallet/Wallet' import { getAgentConfig, getMockConnection, getMockOutOfBand, mockFunction } from '../../../../tests/helpers' import { EventEmitter } from '../../../agent/EventEmitter' import { InboundMessageContext } from '../../../agent/models/InboundMessageContext' -import { KeyType } from '../../../crypto' +import { KeyType, Key } from '../../../crypto' import { AriesFrameworkError } from '../../../error' import { IndyWallet } from '../../../wallet/IndyWallet' import { DidExchangeState } from '../../connections/models' -import { Key } from '../../dids' import { OutOfBandService } from '../OutOfBandService' import { OutOfBandEventTypes } from '../domain/OutOfBandEvents' import { OutOfBandRole } from '../domain/OutOfBandRole' diff --git a/packages/core/src/modules/oob/messages/OutOfBandInvitation.ts b/packages/core/src/modules/oob/messages/OutOfBandInvitation.ts index 5b6b776499..6e3f5d4018 100644 --- a/packages/core/src/modules/oob/messages/OutOfBandInvitation.ts +++ b/packages/core/src/modules/oob/messages/OutOfBandInvitation.ts @@ -1,6 +1,6 @@ +import type { Key } from '../../../crypto' import type { PlaintextMessage } from '../../../types' import type { HandshakeProtocol } from '../../connections' -import type { Key } from '../../dids' import { Expose, Transform, TransformationType, Type } from 'class-transformer' import { ArrayNotEmpty, IsArray, IsInstance, IsOptional, IsUrl, ValidateNested } from 'class-validator' diff --git a/packages/core/src/modules/routing/services/MediationRecipientService.ts b/packages/core/src/modules/routing/services/MediationRecipientService.ts index 94f4cbfa09..280372eb87 100644 --- a/packages/core/src/modules/routing/services/MediationRecipientService.ts +++ b/packages/core/src/modules/routing/services/MediationRecipientService.ts @@ -22,13 +22,11 @@ import { EventEmitter } from '../../../agent/EventEmitter' import { AgentEventTypes } from '../../../agent/Events' import { MessageSender } from '../../../agent/MessageSender' import { createOutboundMessage } from '../../../agent/helpers' -import { KeyType } from '../../../crypto' +import { Key, KeyType } from '../../../crypto' import { AriesFrameworkError } from '../../../error' import { injectable } from '../../../plugins' import { JsonTransformer } from '../../../utils' import { ConnectionService } from '../../connections/services/ConnectionService' -import { Key } from '../../dids' -import { didKeyToVerkey } from '../../dids/helpers' import { ProblemReportError } from '../../problem-reports' import { RoutingEventTypes } from '../RoutingEvents' import { RoutingProblemReportReason } from '../error' @@ -43,6 +41,7 @@ import { KeylistUpdate, KeylistUpdateMessage } from '../messages/KeylistUpdateMe import { MediationRole, MediationState } from '../models' import { MediationRecord } from '../repository/MediationRecord' import { MediationRepository } from '../repository/MediationRepository' +import { didKeyToVerkey } from '../../dids/helpers' @injectable() export class MediationRecipientService { diff --git a/packages/core/src/modules/routing/services/RoutingService.ts b/packages/core/src/modules/routing/services/RoutingService.ts index bde1779dde..134507b528 100644 --- a/packages/core/src/modules/routing/services/RoutingService.ts +++ b/packages/core/src/modules/routing/services/RoutingService.ts @@ -4,10 +4,9 @@ import type { RoutingCreatedEvent } from '../RoutingEvents' import { AgentConfig } from '../../../agent/AgentConfig' import { EventEmitter } from '../../../agent/EventEmitter' import { InjectionSymbols } from '../../../constants' -import { KeyType } from '../../../crypto' +import { Key, KeyType } from '../../../crypto' import { inject, injectable } from '../../../plugins' import { Wallet } from '../../../wallet' -import { Key } from '../../dids' import { RoutingEventTypes } from '../RoutingEvents' import { MediationRecipientService } from './MediationRecipientService' diff --git a/packages/core/src/modules/routing/services/__tests__/MediationRecipientService.test.ts b/packages/core/src/modules/routing/services/__tests__/MediationRecipientService.test.ts index 73748ce2d7..74056a48eb 100644 --- a/packages/core/src/modules/routing/services/__tests__/MediationRecipientService.test.ts +++ b/packages/core/src/modules/routing/services/__tests__/MediationRecipientService.test.ts @@ -6,13 +6,13 @@ import { EventEmitter } from '../../../../agent/EventEmitter' import { AgentEventTypes } from '../../../../agent/Events' import { MessageSender } from '../../../../agent/MessageSender' import { InboundMessageContext } from '../../../../agent/models/InboundMessageContext' +import { Key } from '../../../../crypto' import { Attachment } from '../../../../decorators/attachment/Attachment' import { AriesFrameworkError } from '../../../../error' import { IndyWallet } from '../../../../wallet/IndyWallet' import { DidExchangeState } from '../../../connections' import { ConnectionRepository } from '../../../connections/repository/ConnectionRepository' import { ConnectionService } from '../../../connections/services/ConnectionService' -import { Key } from '../../../dids' import { DidRepository } from '../../../dids/repository/DidRepository' import { DeliveryRequestMessage, diff --git a/packages/core/src/modules/routing/services/__tests__/RoutingService.test.ts b/packages/core/src/modules/routing/services/__tests__/RoutingService.test.ts index 9f343f575e..4a674a7f6d 100644 --- a/packages/core/src/modules/routing/services/__tests__/RoutingService.test.ts +++ b/packages/core/src/modules/routing/services/__tests__/RoutingService.test.ts @@ -1,7 +1,7 @@ import { getAgentConfig, mockFunction } from '../../../../../tests/helpers' import { EventEmitter } from '../../../../agent/EventEmitter' +import { Key } from '../../../../crypto' import { IndyWallet } from '../../../../wallet/IndyWallet' -import { Key } from '../../../dids' import { RoutingEventTypes } from '../../RoutingEvents' import { MediationRecipientService } from '../MediationRecipientService' import { RoutingService } from '../RoutingService' diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 482a446aca..5c2f404260 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1,9 +1,9 @@ import type { AgentMessage } from './agent/AgentMessage' import type { ResolvedDidCommService } from './agent/MessageSender' +import type { Key } from './crypto' import type { Logger } from './logger' import type { ConnectionRecord } from './modules/connections' import type { AutoAcceptCredential } from './modules/credentials/models/CredentialAutoAcceptType' -import type { Key } from './modules/dids/domain/Key' import type { IndyPoolConfig } from './modules/ledger/IndyPool' import type { OutOfBandRecord } from './modules/oob/repository' import type { AutoAcceptProof } from './modules/proofs' diff --git a/packages/core/src/utils/TypedArrayEncoder.ts b/packages/core/src/utils/TypedArrayEncoder.ts index 69cee41d27..685eac485c 100644 --- a/packages/core/src/utils/TypedArrayEncoder.ts +++ b/packages/core/src/utils/TypedArrayEncoder.ts @@ -60,4 +60,18 @@ export class TypedArrayEncoder { public static toUtf8String(buffer: Buffer | Uint8Array) { return Buffer.from(buffer).toString() } + + /** + * Check whether an array is byte, or typed, array + * + * @param array unknown The array that has to be checked + * + * @returns A boolean if the array is a byte array + */ + public static isTypedArray(array: unknown): boolean { + // Checks whether the static property 'BYTES_PER_ELEMENT' exists on the provided array. + // This has to be done, since the TypedArrays, e.g. Uint8Array and Float32Array, do not + // extend a single base class + return 'BYTES_PER_ELEMENT' in (array as Record) + } } diff --git a/packages/core/src/utils/__tests__/TypedArrayEncoder.test.ts b/packages/core/src/utils/__tests__/TypedArrayEncoder.test.ts index 6d2d42d7bd..925bf97f82 100644 --- a/packages/core/src/utils/__tests__/TypedArrayEncoder.test.ts +++ b/packages/core/src/utils/__tests__/TypedArrayEncoder.test.ts @@ -26,6 +26,23 @@ describe('TypedArrayEncoder', () => { }) ) + describe('isTypedArray', () => { + test('is array of type typedArray', () => { + const mockArray = [0, 1, 2] + expect(TypedArrayEncoder.isTypedArray(mockArray)).toStrictEqual(false) + }) + + test('is Uint8Array of type typedArray', () => { + const mockArray = new Uint8Array([0, 1, 2]) + expect(TypedArrayEncoder.isTypedArray(mockArray)).toStrictEqual(true) + }) + + test('is Buffer of type typedArray', () => { + const mockArray = new Buffer([0, 1, 2]) + expect(TypedArrayEncoder.isTypedArray(mockArray)).toStrictEqual(true) + }) + }) + describe('toBase64', () => { test('encodes buffer to Base64 string', () => { expect(TypedArrayEncoder.toBase64(mockCredentialRequestBuffer)).toEqual( diff --git a/packages/core/src/wallet/IndyWallet.test.ts b/packages/core/src/wallet/IndyWallet.test.ts new file mode 100644 index 0000000000..a1147a6260 --- /dev/null +++ b/packages/core/src/wallet/IndyWallet.test.ts @@ -0,0 +1,142 @@ +import { BBS_SIGNATURE_LENGTH } from '@mattrglobal/bbs-signatures' +import { SIGNATURE_LENGTH as ED25519_SIGNATURE_LENGTH } from '@stablelib/ed25519' + +import { getBaseConfig } from '../../tests/helpers' +import { Agent } from '../agent/Agent' +import { KeyType } from '../crypto' +import { TypedArrayEncoder } from '../utils' + +import { IndyWallet } from './IndyWallet' +import { WalletError } from './error' + +describe('IndyWallet', () => { + let indyWallet: IndyWallet + let agent: Agent + const seed = 'sample-seed' + const message = TypedArrayEncoder.fromString('sample-message') + + beforeEach(async () => { + const { config, agentDependencies } = getBaseConfig('IndyWallettest') + agent = new Agent(config, agentDependencies) + indyWallet = agent.injectionContainer.resolve(IndyWallet) + await agent.initialize() + }) + + afterEach(async () => { + await agent.shutdown() + await agent.wallet.delete() + }) + + test('Get the public DID', () => { + expect(indyWallet.publicDid).toMatchObject({ + did: expect.any(String), + verkey: expect.any(String), + }) + }) + + test('Get the Master Secret', () => { + expect(indyWallet.masterSecretId).toEqual('Wallet: IndyWallettest') + }) + + test('Get the wallet handle', () => { + expect(indyWallet.handle).toEqual(expect.any(Number)) + }) + + test('Initializes a public did', async () => { + await indyWallet.initPublicDid({ seed: '00000000000000000000000Forward01' }) + + expect(indyWallet.publicDid).toEqual({ + did: 'DtWRdd6C5dN5vpcN6XRAvu', + verkey: '82RBSn3heLgXzZd74UsMC8Q8YRfEEhQoAM7LUqE6bevJ', + }) + }) + + test('Create DID', async () => { + const didInfo = await indyWallet.createDid({ seed: '00000000000000000000000Forward01' }) + expect(didInfo).toMatchObject({ + did: 'DtWRdd6C5dN5vpcN6XRAvu', + verkey: '82RBSn3heLgXzZd74UsMC8Q8YRfEEhQoAM7LUqE6bevJ', + }) + }) + + test('Generate Nonce', async () => { + await expect(indyWallet.generateNonce()).resolves.toEqual(expect.any(String)) + }) + + test('Create ed25519 keypair', async () => { + await expect( + indyWallet.createKey({ seed: '2103de41b4ae37e8e28586d84a342b67', keyType: KeyType.Ed25519 }) + ).resolves.toMatchObject({ + keyType: KeyType.Ed25519, + }) + }) + + test('Create blsg12381g1 keypair', async () => { + await expect(indyWallet.createKey({ seed, keyType: KeyType.Bls12381g1 })).resolves.toMatchObject({ + publicKeyBase58: '6RhvX1RK5rA9uXdTtV6WvHWNQqcCW86BQxz1aBPr6ebBcppCYMD3LLy7QLg4cGcWaq', + keyType: KeyType.Bls12381g1, + }) + }) + + test('Create bls12381g2 keypair', async () => { + await expect(indyWallet.createKey({ seed, keyType: KeyType.Bls12381g2 })).resolves.toMatchObject({ + publicKeyBase58: + 't54oLBmhhRcDLUyWTvfYRWw8VRXRy1p43pVm62hrpShrYPuHe9WNAgS33DPfeTK6xK7iPrtJDwCHZjYgbFYDVTJHxXex9xt2XEGF8D356jBT1HtqNeucv3YsPLfTWcLcpFA', + keyType: KeyType.Bls12381g2, + }) + }) + + test('Fail to create bls12381g1g2 keypair', async () => { + await expect(indyWallet.createKey({ seed, keyType: KeyType.Bls12381g1g2 })).rejects.toThrowError(WalletError) + }) + + test('Fail to create x25519 keypair', async () => { + await expect(indyWallet.createKey({ seed, keyType: KeyType.X25519 })).rejects.toThrowError(WalletError) + }) + + test('Create a signature with a ed25519 keypair', async () => { + const ed25519Key = await indyWallet.createKey({ keyType: KeyType.Ed25519 }) + const signature = await indyWallet.sign({ + data: message, + key: ed25519Key, + }) + expect(signature.length).toStrictEqual(ED25519_SIGNATURE_LENGTH) + }) + + test('Create a signature with a bls12381g2 keypair', async () => { + const bls12381g2Key = await indyWallet.createKey({ seed, keyType: KeyType.Bls12381g2 }) + const signature = await indyWallet.sign({ + data: message, + key: bls12381g2Key, + }) + expect(signature.length).toStrictEqual(BBS_SIGNATURE_LENGTH) + }) + + test('Fail to create a signature with a bls12381g1 keypair', async () => { + const bls12381g1Key = await indyWallet.createKey({ seed, keyType: KeyType.Bls12381g1 }) + await expect( + indyWallet.sign({ + data: message, + key: bls12381g1Key, + }) + ).rejects.toThrowError(WalletError) + }) + + test('Verify a signed message with a ed25519 publicKey', async () => { + const ed25519Key = await indyWallet.createKey({ keyType: KeyType.Ed25519 }) + const signature = await indyWallet.sign({ + data: message, + key: ed25519Key, + }) + await expect(indyWallet.verify({ key: ed25519Key, data: message, signature })).resolves.toStrictEqual(true) + }) + + test('Verify a signed message with a bls12381g2 publicKey', async () => { + const bls12381g2Key = await indyWallet.createKey({ seed, keyType: KeyType.Bls12381g2 }) + const signature = await indyWallet.sign({ + data: message, + key: bls12381g2Key, + }) + await expect(indyWallet.verify({ key: bls12381g2Key, data: message, signature })).resolves.toStrictEqual(true) + }) +}) diff --git a/packages/core/src/wallet/IndyWallet.ts b/packages/core/src/wallet/IndyWallet.ts index 5411041ae2..117b4d3e5d 100644 --- a/packages/core/src/wallet/IndyWallet.ts +++ b/packages/core/src/wallet/IndyWallet.ts @@ -1,22 +1,34 @@ +import type { BlsKeyPair } from '../crypto/BbsService' import type { Logger } from '../logger' import type { EncryptedMessage, + KeyDerivationMethod, WalletConfig, - WalletExportImportConfig, WalletConfigRekey, - KeyDerivationMethod, + WalletExportImportConfig, } from '../types' import type { Buffer } from '../utils/buffer' -import type { Wallet, DidInfo, DidConfig, UnpackedMessageContext } from './Wallet' +import type { + CreateKeyOptions, + DidConfig, + DidInfo, + SignOptions, + UnpackedMessageContext, + VerifyOptions, + Wallet, +} from './Wallet' import type { default as Indy, WalletStorageConfig } from 'indy-sdk' import { AgentConfig } from '../agent/AgentConfig' -import { AriesFrameworkError } from '../error' +import { KeyType } from '../crypto' +import { BbsService } from '../crypto/BbsService' +import { Key } from '../crypto/Key' +import { AriesFrameworkError, IndySdkError, RecordDuplicateError, RecordNotFoundError } from '../error' import { injectable } from '../plugins' -import { JsonEncoder } from '../utils/JsonEncoder' +import { JsonEncoder, TypedArrayEncoder } from '../utils' import { isIndyError } from '../utils/indyError' -import { WalletDuplicateError, WalletNotFoundError, WalletError } from './error' +import { WalletDuplicateError, WalletError, WalletNotFoundError } from './error' import { WalletInvalidKeyError } from './error/WalletInvalidKeyError' @injectable() @@ -399,6 +411,110 @@ export class IndyWallet implements Wallet { } } + /** + * Create a key with an optional seed and keyType. + * The keypair is also automatically stored in the wallet afterwards + * + * Bls12381g1g2 and X25519 are not supported. + * + * @param seed string The seed for creating a key + * @param keyType KeyType the type of key that should be created + * + * @returns a Key instance with a publicKeyBase58 + * + * @throws {WalletError} When an unsupported keytype is requested + * @throws {WalletError} When the key could not be created + */ + public async createKey({ seed, keyType }: CreateKeyOptions): Promise { + try { + if (keyType === KeyType.Ed25519) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + const verkey = await this.indy.createKey(this.handle, { seed, crypto_type: 'ed25519' }) + return Key.fromPublicKeyBase58(verkey, keyType) + } + + if (keyType === KeyType.Bls12381g1 || keyType === KeyType.Bls12381g2) { + const blsKeyPair = await BbsService.createKey({ keyType, seed }) + await this.storeKeyPair(blsKeyPair) + return Key.fromPublicKeyBase58(blsKeyPair.publicKeyBase58, keyType) + } + } catch (error) { + throw new WalletError(`Error creating key with key type '${keyType}': ${error.message}`, { cause: error }) + } + + throw new WalletError(`Unsupported key type: '${keyType}' for wallet IndyWallet`) + } + + /** + * sign a Buffer with an instance of a Key class + * + * Bls12381g1g2, Bls12381g1 and X25519 are not supported. + * + * @param data Buffer The data that needs to be signed + * @param key Key The key that is used to sign the data + * + * @returns A signature for the data + */ + public async sign({ data, key }: SignOptions): Promise { + try { + if (key.keyType === KeyType.Ed25519) { + // Checks to see if it is an not an Array of messages, but just a single one + if (!TypedArrayEncoder.isTypedArray(data)) { + throw new WalletError(`${KeyType.Ed25519} does not support multiple singing of multiple messages`) + } + return await this.indy.cryptoSign(this.handle, key.publicKeyBase58, data as Buffer) + } + + if (key.keyType === KeyType.Bls12381g2) { + const blsKeyPair = await this.retrieveKeyPair(key.publicKeyBase58) + return BbsService.sign({ + messages: data, + publicKey: key.publicKey, + privateKey: TypedArrayEncoder.fromBase58(blsKeyPair.privateKeyBase58), + }) + } + } catch (error) { + throw new WalletError(`Error signing data with verkey ${key.publicKeyBase58}`, { cause: error }) + } + throw new WalletError(`Unsupported keyType: ${key.keyType}`) + } + + /** + * Verify the signature with the data and the used key + * + * Bls12381g1g2, Bls12381g1 and X25519 are not supported. + * + * @param data Buffer The data that has to be confirmed to be signed + * @param key Key The key that was used in the signing process + * @param signature Buffer The signature that was created by the signing process + * + * @returns A boolean whether the signature was created with the supplied data and key + * + * @throws {WalletError} When it could not do the verification + * @throws {WalletError} When an unsupported keytype is used + */ + public async verify({ data, key, signature }: VerifyOptions): Promise { + try { + if (key.keyType === KeyType.Ed25519) { + // Checks to see if it is an not an Array of messages, but just a single one + if (!TypedArrayEncoder.isTypedArray(data)) { + throw new WalletError(`${KeyType.Ed25519} does not support multiple singing of multiple messages`) + } + return await this.indy.cryptoVerify(key.publicKeyBase58, data as Buffer, signature) + } + + if (key.keyType === KeyType.Bls12381g2) { + return await BbsService.verify({ signature, publicKey: key.publicKey, messages: data }) + } + } catch (error) { + throw new WalletError(`Error verifying signature of data signed with verkey ${key.publicKeyBase58}`, { + cause: error, + }) + } + throw new WalletError(`Unsupported keyType: ${key.keyType}`) + } + public async pack( payload: Record, recipientKeys: string[], @@ -427,30 +543,47 @@ export class IndyWallet implements Wallet { } } - public async sign(data: Buffer, verkey: string): Promise { + public async generateNonce(): Promise { try { - return await this.indy.cryptoSign(this.handle, verkey, data) + return await this.indy.generateNonce() } catch (error) { - throw new WalletError(`Error signing data with verkey ${verkey}`, { cause: error }) + throw new WalletError('Error generating nonce', { cause: error }) } } - public async verify(signerVerkey: string, data: Buffer, signature: Buffer): Promise { + private async retrieveKeyPair(publicKeyBase58: string): Promise { try { - // check signature - const isValid = await this.indy.cryptoVerify(signerVerkey, data, signature) - - return isValid + const { value } = await this.indy.getWalletRecord(this.handle, 'KeyPairRecord', `keypair-${publicKeyBase58}`, {}) + if (value) { + return JsonEncoder.fromString(value) as BlsKeyPair + } else { + throw new WalletError(`No content found for record with public key: ${publicKeyBase58}`) + } } catch (error) { - throw new WalletError(`Error verifying signature of data signed with verkey ${signerVerkey}`, { cause: error }) + if (isIndyError(error, 'WalletItemNotFound')) { + throw new RecordNotFoundError(`KeyPairRecord not found for public key: ${publicKeyBase58}.`, { + recordType: 'KeyPairRecord', + cause: error, + }) + } + throw isIndyError(error) ? new IndySdkError(error) : error } } - public async generateNonce() { + private async storeKeyPair(blsKeyPair: BlsKeyPair): Promise { try { - return await this.indy.generateNonce() + await this.indy.addWalletRecord( + this.handle, + 'KeyPairRecord', + `keypair-${blsKeyPair.publicKeyBase58}`, + JSON.stringify(blsKeyPair), + {} + ) } catch (error) { - throw new WalletError('Error generating nonce', { cause: error }) + if (isIndyError(error, 'WalletItemAlreadyExists')) { + throw new RecordDuplicateError(`Record already exists`, { recordType: 'KeyPairRecord' }) + } + throw isIndyError(error) ? new IndySdkError(error) : error } } } diff --git a/packages/core/src/wallet/Wallet.test.ts b/packages/core/src/wallet/Wallet.test.ts deleted file mode 100644 index 6d6a85da7d..0000000000 --- a/packages/core/src/wallet/Wallet.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { getAgentConfig } from '../../tests/helpers' - -import { IndyWallet } from './IndyWallet' - -describe('Wallet', () => { - const config = getAgentConfig('WalletTest') - const wallet = new IndyWallet(config) - - test('initialize public did', async () => { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - await wallet.createAndOpen(config.walletConfig!) - - await wallet.initPublicDid({ seed: '00000000000000000000000Forward01' }) - - expect(wallet.publicDid).toEqual({ - did: 'DtWRdd6C5dN5vpcN6XRAvu', - verkey: '82RBSn3heLgXzZd74UsMC8Q8YRfEEhQoAM7LUqE6bevJ', - }) - }) - - afterEach(async () => { - await wallet.delete() - }) -}) diff --git a/packages/core/src/wallet/Wallet.ts b/packages/core/src/wallet/Wallet.ts index 649cc90a25..06a8899c4c 100644 --- a/packages/core/src/wallet/Wallet.ts +++ b/packages/core/src/wallet/Wallet.ts @@ -1,9 +1,10 @@ +import type { Key, KeyType } from '../crypto' import type { EncryptedMessage, WalletConfig, - WalletExportImportConfig, WalletConfigRekey, PlaintextMessage, + WalletExportImportConfig, } from '../types' import type { Buffer } from '../utils/buffer' @@ -21,12 +22,14 @@ export interface Wallet { export(exportConfig: WalletExportImportConfig): Promise import(walletConfig: WalletConfig, importConfig: WalletExportImportConfig): Promise + createKey(options: CreateKeyOptions): Promise + sign(options: SignOptions): Promise + verify(options: VerifyOptions): Promise + initPublicDid(didConfig: DidConfig): Promise createDid(didConfig?: DidConfig): Promise pack(payload: Record, recipientKeys: string[], senderVerkey?: string): Promise unpack(encryptedMessage: EncryptedMessage): Promise - sign(data: Buffer, verkey: string): Promise - verify(signerVerkey: string, data: Buffer, signature: Buffer): Promise generateNonce(): Promise } @@ -35,6 +38,22 @@ export interface DidInfo { verkey: string } +export interface CreateKeyOptions { + keyType: KeyType + seed?: string +} + +export interface SignOptions { + data: Buffer | Buffer[] + key: Key +} + +export interface VerifyOptions { + data: Buffer | Buffer[] + key: Key + signature: Buffer +} + export interface DidConfig { seed?: string } diff --git a/packages/core/tests/helpers.ts b/packages/core/tests/helpers.ts index c6e72564d7..91c4980b3f 100644 --- a/packages/core/tests/helpers.ts +++ b/packages/core/tests/helpers.ts @@ -15,40 +15,40 @@ import type { } from '../src' import type { AcceptOfferOptions } from '../src/modules/credentials' import type { IndyOfferCredentialFormat } from '../src/modules/credentials/formats/indy/IndyCredentialFormat' -import type { Schema, CredDef } from 'indy-sdk' +import type { CredDef, Schema } from 'indy-sdk' import type { Observable } from 'rxjs' import path from 'path' -import { firstValueFrom, Subject, ReplaySubject } from 'rxjs' +import { firstValueFrom, ReplaySubject, Subject } from 'rxjs' import { catchError, filter, map, timeout } from 'rxjs/operators' import { SubjectInboundTransport } from '../../../tests/transport/SubjectInboundTransport' import { SubjectOutboundTransport } from '../../../tests/transport/SubjectOutboundTransport' import { agentDependencies, WalletScheme } from '../../node/src' import { - PresentationPreview, - PresentationPreviewAttribute, - PresentationPreviewPredicate, - HandshakeProtocol, - DidExchangeState, - DidExchangeRole, - LogLevel, + Agent, AgentConfig, AriesFrameworkError, BasicMessageEventTypes, ConnectionRecord, CredentialEventTypes, CredentialState, + DidExchangeRole, + DidExchangeState, + HandshakeProtocol, + LogLevel, PredicateType, + PresentationPreview, + PresentationPreviewAttribute, + PresentationPreviewPredicate, ProofEventTypes, ProofState, - Agent, } from '../src' -import { KeyType } from '../src/crypto' +import { Key, KeyType } from '../src/crypto' import { Attachment, AttachmentData } from '../src/decorators/attachment/Attachment' import { AutoAcceptCredential } from '../src/modules/credentials/models/CredentialAutoAcceptType' import { V1CredentialPreview } from '../src/modules/credentials/protocol/v1/messages/V1CredentialPreview' -import { DidCommV1Service, DidKey, Key } from '../src/modules/dids' +import { DidCommV1Service, DidKey } from '../src/modules/dids' import { OutOfBandRole } from '../src/modules/oob/domain/OutOfBandRole' import { OutOfBandState } from '../src/modules/oob/domain/OutOfBandState' import { OutOfBandInvitation } from '../src/modules/oob/messages' diff --git a/packages/core/tests/oob.test.ts b/packages/core/tests/oob.test.ts index b256a4849e..bde3e6d1c3 100644 --- a/packages/core/tests/oob.test.ts +++ b/packages/core/tests/oob.test.ts @@ -9,8 +9,8 @@ import { Subject } from 'rxjs' import { SubjectInboundTransport } from '../../../tests/transport/SubjectInboundTransport' import { SubjectOutboundTransport } from '../../../tests/transport/SubjectOutboundTransport' import { Agent } from '../src/agent/Agent' +import { Key } from '../src/crypto' import { DidExchangeState, HandshakeProtocol } from '../src/modules/connections' -import { Key } from '../src/modules/dids' import { OutOfBandDidCommService } from '../src/modules/oob/domain/OutOfBandDidCommService' import { OutOfBandEventTypes } from '../src/modules/oob/domain/OutOfBandEvents' import { OutOfBandRole } from '../src/modules/oob/domain/OutOfBandRole' diff --git a/packages/react-native/package.json b/packages/react-native/package.json index f94520af4d..cd523a1f87 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -29,6 +29,7 @@ "events": "^3.3.0" }, "devDependencies": { + "@animo-id/react-native-bbs-signatures": "^0.1.0", "@types/indy-sdk-react-native": "npm:@types/indy-sdk@^1.16.19", "@types/react-native": "^0.64.10", "indy-sdk-react-native": "^0.2.2", diff --git a/yarn.lock b/yarn.lock index 085e3dc546..275981217c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,6 +10,11 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@animo-id/react-native-bbs-signatures@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@animo-id/react-native-bbs-signatures/-/react-native-bbs-signatures-0.1.0.tgz#f62bc16b867c9f690977982d66f0a03566b21ad2" + integrity sha512-7qvsiWhGfUev8ngE8YzF6ON9PtCID5LiYVYM4EC5eyj80gCdhx3R46CI7K1qbqIlGsoTYQ/Xx5Ubo5Ji9eaUEA== + "@azure/core-asynciterator-polyfill@^1.0.0": version "1.0.2" resolved "https://registry.yarnpkg.com/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.2.tgz#0dd3849fb8d97f062a39db0e5cadc9ffaf861fec" @@ -1710,6 +1715,23 @@ npmlog "^4.1.2" write-file-atomic "^3.0.3" +"@mattrglobal/bbs-signatures@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@mattrglobal/bbs-signatures/-/bbs-signatures-1.0.0.tgz#8ff272c6d201aadab7e08bd84dbfd6e0d48ba12d" + integrity sha512-FFzybdKqSCrS/e7pl5s6Tl/m/x8ZD5EMBbcTBQaqSOms/lebm91lFukYOIe2qc0a5o+gLhtRKye8OfKwD1Ex/g== + dependencies: + "@stablelib/random" "1.0.0" + optionalDependencies: + "@mattrglobal/node-bbs-signatures" "0.13.0" + +"@mattrglobal/node-bbs-signatures@0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@mattrglobal/node-bbs-signatures/-/node-bbs-signatures-0.13.0.tgz#3e431b915325d4b139706f8b26fd84b27c192a29" + integrity sha512-S2wOwDCQYxdjSEjVfcbP3bTq4ZMKeRw/wvBhWRff8CEwuH5u3Qiul+azwDGSesvve1DDceaEhXWiGkXeZTojfQ== + dependencies: + neon-cli "0.8.2" + node-pre-gyp "0.17.0" + "@multiformats/base-x@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" @@ -2082,7 +2104,7 @@ resolved "https://registry.yarnpkg.com/@sovpro/delimited-stream/-/delimited-stream-1.1.0.tgz#4334bba7ee241036e580fdd99c019377630d26b4" integrity sha512-kQpk267uxB19X3X2T1mvNMjyvIEonpNSHrMlK5ZaBU6aZxw7wPbpgKJOjHN3+/GPVpXgAV9soVT2oyHpLkLtyw== -"@stablelib/binary@^1.0.1": +"@stablelib/binary@^1.0.0", "@stablelib/binary@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== @@ -2108,6 +2130,14 @@ resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008" integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== +"@stablelib/random@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.0.tgz#f441495075cdeaa45de16d7ddcc269c0b8edb16b" + integrity sha512-G9vwwKrNCGMI/uHL6XeWe2Nk4BuxkYyWZagGaDU9wrsuV+9hUwNI1lok2WVo8uJDa2zx7ahNwN7Ij983hOUFEw== + dependencies: + "@stablelib/binary" "^1.0.0" + "@stablelib/wipe" "^1.0.0" + "@stablelib/random@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.1.tgz#4357a00cb1249d484a9a71e6054bc7b8324a7009" @@ -2134,7 +2164,7 @@ "@stablelib/hash" "^1.0.1" "@stablelib/wipe" "^1.0.1" -"@stablelib/wipe@^1.0.1": +"@stablelib/wipe@^1.0.0", "@stablelib/wipe@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== @@ -2824,6 +2854,16 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + array-differ@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" @@ -3658,6 +3698,33 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-commands@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/command-line-commands/-/command-line-commands-3.0.2.tgz#53872a1181db837f21906b1228e260a4eeb42ee4" + integrity sha512-ac6PdCtdR6q7S3HN+JiVLIWGHY30PRYIEl2qPo+FuEuzwAUk0UYyimrngrg7FvF/mCr4Jgoqv5ZnHZgads50rw== + dependencies: + array-back "^4.0.1" + +command-line-usage@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.1.tgz#c908e28686108917758a49f45efb4f02f76bc03f" + integrity sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA== + dependencies: + array-back "^4.0.1" + chalk "^2.4.2" + table-layout "^1.0.1" + typical "^5.2.0" + commander@^2.15.0, commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -4020,7 +4087,7 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, d dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.7: +debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -4060,6 +4127,11 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +deep-extend@^0.6.0, deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -4157,6 +4229,11 @@ detect-indent@^6.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -4908,6 +4985,13 @@ find-cache-dir@^2.0.0: make-dir "^2.0.0" pkg-dir "^3.0.0" +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -5195,6 +5279,13 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +git-config@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/git-config/-/git-config-0.0.7.tgz#a9c8a3ef07a776c3d72261356d8b727b62202b28" + integrity sha1-qcij7wendsPXImE1bYtye2IgKyg= + dependencies: + iniparser "~1.0.5" + git-raw-commits@^2.0.8: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" @@ -5292,7 +5383,7 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -handlebars@^4.7.7: +handlebars@^4.7.6, handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== @@ -5494,7 +5585,7 @@ husky@^7.0.1: resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5513,7 +5604,7 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-walk@^3.0.3: +ignore-walk@^3.0.1, ignore-walk@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== @@ -5603,11 +5694,16 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.2, ini@^1.3.4: +ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +iniparser@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/iniparser/-/iniparser-1.0.5.tgz#836d6befe6dfbfcee0bccf1cf9f2acc7027f783d" + integrity sha1-g21r7+bfv87gvM8c+fKsxwJ/eD0= + init-package-json@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-2.0.5.tgz#78b85f3c36014db42d8f32117252504f68022646" @@ -6880,6 +6976,11 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -7033,6 +7134,11 @@ make-fetch-happen@^9.0.1, make-fetch-happen@^9.1.0: socks-proxy-agent "^6.0.0" ssri "^8.0.0" +make-promises-safe@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/make-promises-safe/-/make-promises-safe-5.1.0.tgz#dd9d311f555bcaa144f12e225b3d37785f0aa8f2" + integrity sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g== + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -7620,6 +7726,15 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +needle@^2.5.2: + version "2.9.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.6.3, negotiator@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -7630,6 +7745,26 @@ neo-async@^2.5.0, neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +neon-cli@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/neon-cli/-/neon-cli-0.8.2.tgz#5111b0e9d5d90273bdf85a9aa40a1a47a32df2ef" + integrity sha512-vYRBmiLiwPVeBvR9huCFXRAtdLYfsoSG3hgsXrcuyMSXk7yqpnZlgvOGGuxfhrRb/iNfcd0M0cEs0j22mDgZ+A== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-commands "^3.0.1" + command-line-usage "^6.1.0" + git-config "0.0.7" + handlebars "^4.7.6" + inquirer "^7.3.3" + make-promises-safe "^5.1.0" + rimraf "^3.0.2" + semver "^7.3.2" + toml "^3.0.0" + ts-typed-json "^0.3.2" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^3.0.0" + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -7652,7 +7787,7 @@ node-dir@^0.1.17: dependencies: minimatch "^3.0.2" -node-fetch@2.6.7, node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@2.6.7, node-fetch@^2.0, node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -7718,6 +7853,22 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= +node-pre-gyp@0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.17.0.tgz#5af3f7b4c3848b5ed00edc3d298ff836daae5f1d" + integrity sha512-abzZt1hmOjkZez29ppg+5gGqdPLUuJeAEwVPtHYEJgx0qzttCbcKFpxrCQn2HYbwCv2c+7JwH4BgEzFkUGpn4A== + dependencies: + detect-libc "^1.0.3" + mkdirp "^0.5.5" + needle "^2.5.2" + nopt "^4.0.3" + npm-packlist "^1.4.8" + npmlog "^4.1.2" + rc "^1.2.8" + rimraf "^2.7.1" + semver "^5.7.1" + tar "^4.4.13" + node-releases@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" @@ -7728,7 +7879,7 @@ node-stream-zip@^1.9.1: resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== -nopt@^4.0.1: +nopt@^4.0.1, nopt@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== @@ -7780,7 +7931,7 @@ normalize-url@^6.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-bundled@^1.1.1: +npm-bundled@^1.0.1, npm-bundled@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== @@ -7822,6 +7973,15 @@ npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-pack semver "^7.3.4" validate-npm-package-name "^3.0.0" +npm-packlist@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + npm-packlist@^2.1.4: version "2.2.2" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" @@ -8602,6 +8762,16 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-devtools-core@^4.6.0: version "4.24.6" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.24.6.tgz#3262114f483465179c97a49b7ada845048f4f97e" @@ -8847,6 +9017,11 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + "ref-napi@^2.0.1 || ^3.0.2", ref-napi@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/ref-napi/-/ref-napi-3.0.3.tgz#e259bfc2bbafb3e169e8cd9ba49037dd00396b22" @@ -9067,7 +9242,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.5.4, rimraf@^2.6.3: +rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9161,7 +9336,7 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sax@^1.2.1: +sax@^1.2.1, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -9719,6 +9894,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + strong-log-transformer@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -9772,6 +9952,16 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +table-layout@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + table@^6.0.9: version "6.8.0" resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" @@ -9783,7 +9973,7 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" -tar@^4.4.12: +tar@^4.4.12, tar@^4.4.13: version "4.4.19" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== @@ -9950,6 +10140,11 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -10017,6 +10212,11 @@ ts-node@^10.0.0, ts-node@^10.4.0: v8-compile-cache-lib "^3.0.0" yn "3.1.1" +ts-typed-json@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ts-typed-json/-/ts-typed-json-0.3.2.tgz#f4f20f45950bae0a383857f7b0a94187eca1b56a" + integrity sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA== + tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -10149,6 +10349,16 @@ typescript@~4.3.0: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + uglify-es@^3.1.9: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" @@ -10523,6 +10733,14 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"