diff --git a/lib/didcomm.dart b/lib/didcomm.dart index b36ad0b..8757d27 100644 --- a/lib/didcomm.dart +++ b/lib/didcomm.dart @@ -1,7 +1,9 @@ library; +export 'src/did_resolver_manager.dart'; export 'src/errors/errors.dart'; export 'src/extensions/affinidi_authenticator_extension.dart'; +export 'src/extensions/did_document_extension.dart'; export 'src/extensions/wallet_extension.dart'; export 'src/mediator_client.dart'; export 'src/messages/algorithm_types/algorithms_types.dart'; diff --git a/lib/src/did_resolver_manager.dart b/lib/src/did_resolver_manager.dart new file mode 100644 index 0000000..7460535 --- /dev/null +++ b/lib/src/did_resolver_manager.dart @@ -0,0 +1,23 @@ +import 'package:ssi/ssi.dart'; + +typedef DIDResolver = Future Function( + String did, { + String? resolverAddress, +}); + +class DidResolverManager { + static DIDResolver _didResolver = UniversalDIDResolver.resolve; + static String? _resolverAddress; + + static void setResolver(DIDResolver didResolver) { + DidResolverManager._didResolver = didResolver; + } + + static void setResolverAddress(String resolverAddress) { + _resolverAddress = resolverAddress; + } + + static Future resolve(String did) { + return _didResolver(did, resolverAddress: _resolverAddress); + } +} diff --git a/lib/src/extensions/did_document_extension.dart b/lib/src/extensions/did_document_extension.dart index f90fd3e..af13b1e 100644 --- a/lib/src/extensions/did_document_extension.dart +++ b/lib/src/extensions/did_document_extension.dart @@ -6,6 +6,7 @@ import 'package:web_socket_channel/io.dart'; import '../common/did.dart'; import '../common/did_document_service_type.dart'; import '../curves/curve_type.dart'; +import '../did_resolver_manager.dart'; import '../jwks/jwk.dart'; import 'wallet_extension.dart'; @@ -128,7 +129,7 @@ extension DidDocumentExtension on DidDocument { Future addMediatorsFromResolvedDid( String did, ) async { - final didDocument = await UniversalDIDResolver.resolve(did); + final didDocument = await DidResolverManager.resolve(did); addMediatorsFromDidDocument(didDocument); } diff --git a/lib/src/mediator_client/mediator_client.dart b/lib/src/mediator_client/mediator_client.dart index 253c079..4f5df61 100644 --- a/lib/src/mediator_client/mediator_client.dart +++ b/lib/src/mediator_client/mediator_client.dart @@ -2,6 +2,9 @@ import 'dart:async'; import 'dart:convert'; import 'package:crypto/crypto.dart'; +import 'package:didcomm/didcomm.dart'; +import 'package:didcomm/src/did_resolver_manager.dart'; +import 'package:didcomm/src/extensions/verification_method_list_extention.dart'; import 'package:dio/dio.dart'; import 'package:ssi/ssi.dart'; import 'package:uuid/uuid.dart'; @@ -68,7 +71,7 @@ class MediatorClient { required DidSigner signer, }) async { return MediatorClient( - mediatorDidDocument: await UniversalDIDResolver.resolve( + mediatorDidDocument: await DidResolverManager.resolve( didDocumentUrl.toString(), ), keyPair: keyPair, @@ -109,9 +112,7 @@ class MediatorClient { /// [accessToken] - Optional bearer token for authentication. /// /// Returns a list of message IDs as strings. - Future> listInboxMessageIds({ - String? accessToken, - }) async { + Future> listInboxMessageIds({String? accessToken}) async { final actorDidDocument = await _getActorDidDocument(); final headers = @@ -123,9 +124,7 @@ class MediatorClient { ); return (response.data!['data'] as List) - .map( - (item) => (item as Map)['msg_id'] as String, - ) + .map((item) => (item as Map)['msg_id'] as String) .toList(); } @@ -156,9 +155,8 @@ class MediatorClient { return (data['success'] as List) .map( - (item) => jsonDecode( - (item as Map)['msg'] as String, - ) as Map, + (item) => jsonDecode((item as Map)['msg'] as String) + as Map, ) .toList(); } @@ -179,16 +177,12 @@ class MediatorClient { bool? cancelOnError, String? accessToken, }) async { - _channel = mediatorDidDocument.toWebSocketChannel( - accessToken: accessToken, - ); + _channel = mediatorDidDocument.toWebSocketChannel(accessToken: accessToken); await _channel!.ready; final subscription = _channel.stream.listen( - (data) => onMessage( - jsonDecode(data as String) as Map, - ), + (data) => onMessage(jsonDecode(data as String) as Map), onError: onError, onDone: onDone, cancelOnError: cancelOnError, @@ -239,9 +233,7 @@ class MediatorClient { } Future _getActorDidDocument() async { - return DidKey.generateDocument( - keyPair.publicKey, - ); + return DidKey.generateDocument(keyPair.publicKey); } Future _packMessage( @@ -251,10 +243,7 @@ class MediatorClient { DidcommMessage messageToSend = message; if (messageOptions.shouldSign) { - messageToSend = await SignedMessage.pack( - message, - signer: signer, - ); + messageToSend = await SignedMessage.pack(message, signer: signer); } if (messageOptions.shouldEncrypt) { @@ -278,8 +267,6 @@ class MediatorClient { ); } - _channel.sink.add( - jsonEncode(message), - ); + _channel.sink.add(jsonEncode(message)); } } diff --git a/lib/src/messages/core/encrypted_message/encrypted_message.dart b/lib/src/messages/core/encrypted_message/encrypted_message.dart index 2abd262..38bb4cb 100644 --- a/lib/src/messages/core/encrypted_message/encrypted_message.dart +++ b/lib/src/messages/core/encrypted_message/encrypted_message.dart @@ -1,6 +1,11 @@ import 'dart:convert'; import 'dart:typed_data'; +import 'package:didcomm/src/did_resolver_manager.dart'; +import 'package:didcomm/src/errors/missing_authentication_tag_error.dart'; +import 'package:didcomm/src/errors/missing_initialization_vector_error.dart'; +import 'package:didcomm/src/errors/missing_key_agreement_error.dart'; +import 'package:json_annotation/json_annotation.dart'; import 'package:crypto_keys_plus/crypto_keys.dart' as ck; import 'package:json_annotation/json_annotation.dart'; import 'package:ssi/ssi.dart' hide Jwk; @@ -165,12 +170,14 @@ class EncryptedMessage extends DidcommMessage { if (encryptedInnerMessage.initializationVector == null) { throw MissingInitializationVectorError( - 'Initialization vector not set after encryption'); + 'Initialization vector not set after encryption', + ); } if (encryptedInnerMessage.authenticationTag == null) { throw MissingAuthenticationTag( - 'Authentication tag not set after encryption'); + 'Authentication tag not set after encryption', + ); } final recipients = await _createRecipients( @@ -201,9 +208,7 @@ class EncryptedMessage extends DidcommMessage { /// [recipientWallet]: The wallet to use for decryption. /// /// Returns the decrypted inner message as a JSON map. - Future> unpack({ - required Wallet recipientWallet, - }) async { + Future> unpack({required Wallet recipientWallet}) async { final self = await _findSelfAsRecipient(recipientWallet); final jweHeader = _jweHeaderConverter.fromJson(protected); @@ -237,9 +242,7 @@ class EncryptedMessage extends DidcommMessage { cipherText, initializationVector: initializationVector, authenticationTag: authenticationTag, - additionalAuthenticatedData: ascii.encode( - protected, - ), + additionalAuthenticatedData: ascii.encode(protected), ), ); @@ -249,17 +252,16 @@ class EncryptedMessage extends DidcommMessage { Future _getSenderJwk(String subjectKeyId) async { final senderDid = subjectKeyId.split('#').first; - final senderDidDocument = await UniversalDIDResolver.resolve(senderDid); + final senderDidDocument = await DidResolverManager.resolve(senderDid); final keyAgreement = senderDidDocument.keyAgreement.firstWhere( (keyAgreement) => keyAgreement.id == subjectKeyId, orElse: () => throw MissingKeyAgreementError( - 'Can not find a key agreement for subject ID'), + 'Can not find a key agreement for subject ID', + ), ); - final senderJwk = Jwk.fromJson( - keyAgreement.asJwk().toJson(), - ); + final senderJwk = Jwk.fromJson(keyAgreement.asJwk().toJson()); return senderJwk; } @@ -298,8 +300,9 @@ class EncryptedMessage extends DidcommMessage { EncryptionAlgorithm encryptionAlgorithm, ) { // TODO: clarify why 512 for a256cbc - final keySize = - encryptionAlgorithm == EncryptionAlgorithm.a256cbc ? 512 : 256; + final keySize = encryptionAlgorithm == EncryptionAlgorithm.a256cbc + ? 512 + : 256; return ck.SymmetricKey.generate(keySize); }