Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/didcomm.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
23 changes: 23 additions & 0 deletions lib/src/did_resolver_manager.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import 'package:ssi/ssi.dart';

typedef DIDResolver = Future<DidDocument> 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<DidDocument> resolve(String did) {
return _didResolver(did, resolverAddress: _resolverAddress);
}
}
Comment thread
carlos-affinidi marked this conversation as resolved.
3 changes: 2 additions & 1 deletion lib/src/extensions/did_document_extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -128,7 +129,7 @@ extension DidDocumentExtension on DidDocument {
Future<void> addMediatorsFromResolvedDid(
String did,
) async {
final didDocument = await UniversalDIDResolver.resolve(did);
final didDocument = await DidResolverManager.resolve(did);
addMediatorsFromDidDocument(didDocument);
}

Expand Down
39 changes: 13 additions & 26 deletions lib/src/mediator_client/mediator_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -68,7 +71,7 @@ class MediatorClient {
required DidSigner signer,
}) async {
return MediatorClient(
mediatorDidDocument: await UniversalDIDResolver.resolve(
mediatorDidDocument: await DidResolverManager.resolve(
didDocumentUrl.toString(),
),
keyPair: keyPair,
Expand Down Expand Up @@ -109,9 +112,7 @@ class MediatorClient {
/// [accessToken] - Optional bearer token for authentication.
///
/// Returns a list of message IDs as strings.
Future<List<String>> listInboxMessageIds({
String? accessToken,
}) async {
Future<List<String>> listInboxMessageIds({String? accessToken}) async {
final actorDidDocument = await _getActorDidDocument();

final headers =
Expand All @@ -123,9 +124,7 @@ class MediatorClient {
);

return (response.data!['data'] as List<dynamic>)
.map(
(item) => (item as Map<String, dynamic>)['msg_id'] as String,
)
.map((item) => (item as Map<String, dynamic>)['msg_id'] as String)
.toList();
}

Expand Down Expand Up @@ -156,9 +155,8 @@ class MediatorClient {

return (data['success'] as List<dynamic>)
.map(
(item) => jsonDecode(
(item as Map<String, dynamic>)['msg'] as String,
) as Map<String, dynamic>,
(item) => jsonDecode((item as Map<String, dynamic>)['msg'] as String)
as Map<String, dynamic>,
)
.toList();
}
Expand All @@ -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<String, dynamic>,
),
(data) => onMessage(jsonDecode(data as String) as Map<String, dynamic>),
onError: onError,
onDone: onDone,
cancelOnError: cancelOnError,
Expand Down Expand Up @@ -239,9 +233,7 @@ class MediatorClient {
}

Future<DidDocument> _getActorDidDocument() async {
return DidKey.generateDocument(
keyPair.publicKey,
);
return DidKey.generateDocument(keyPair.publicKey);
}

Future<DidcommMessage> _packMessage(
Expand All @@ -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) {
Expand All @@ -278,8 +267,6 @@ class MediatorClient {
);
}

_channel.sink.add(
jsonEncode(message),
);
_channel.sink.add(jsonEncode(message));
}
}
33 changes: 18 additions & 15 deletions lib/src/messages/core/encrypted_message/encrypted_message.dart
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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<Map<String, dynamic>> unpack({
required Wallet recipientWallet,
}) async {
Future<Map<String, dynamic>> unpack({required Wallet recipientWallet}) async {
final self = await _findSelfAsRecipient(recipientWallet);
final jweHeader = _jweHeaderConverter.fromJson(protected);

Expand Down Expand Up @@ -237,9 +242,7 @@ class EncryptedMessage extends DidcommMessage {
cipherText,
initializationVector: initializationVector,
authenticationTag: authenticationTag,
additionalAuthenticatedData: ascii.encode(
protected,
),
additionalAuthenticatedData: ascii.encode(protected),
),
);

Expand All @@ -249,17 +252,16 @@ class EncryptedMessage extends DidcommMessage {

Future<Jwk> _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;
}
Expand Down Expand Up @@ -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);
}

Expand Down
Loading