respondToSession method
Future<Map<String, dynamic> >
respondToSession(
- Map<
String, dynamic> initiationMessage, - CryptoPeerCapabilities localCapabilities
override
Responds to a session initiation from a remote peer. Returns the response message to send back.
Implementation
@override
Future<Map<String, dynamic>> respondToSession(
Map<String, dynamic> initiationMessage,
CryptoPeerCapabilities localCapabilities,
) async {
// Parse remote capabilities
final remoteCapabilities = _negotiator.parseHandshakeMessage(initiationMessage);
// Negotiate algorithms
_negotiationResult = _negotiator.negotiateAlgorithms(
localCapabilities,
remoteCapabilities,
isInitiator: false,
);
if (_negotiationResult == null) {
throw StateError('No compatible algorithms found');
}
if (!_negotiator.validateNegotiation(_negotiationResult!)) {
throw StateError('Invalid negotiation result');
}
// Generate our ECDH key pair
// Generate ECDH key pair for session
final keyPairData = await ECDHKeyExchange.generateKeyPair();
_keyExchange = ECDHKeyExchange(
InputECDHKeyExchange(
parent: InputKeyExchangeBase(
algorithm: KeyExchangeAlgorithm.ecdh,
expirationDate: DateTime.now().add(const Duration(hours: 24)),
expirationTimes: null,
),
publicKey: keyPairData['publicKey']!,
privateKey: keyPairData['privateKey']!,
curve: keyPairData['curve']!,
),
);
// Calculate shared secret with initiator's public key
final initiatorPublicKey = initiationMessage['keyExchangeData']['publicKey'];
_sharedSecret = _keyExchange!.generateSharedSecret(initiatorPublicKey);
// Create response message
final responseMessage = _negotiator.createHandshakeMessage(localCapabilities);
responseMessage['negotiation'] = {
'keyExchange': _negotiationResult!.keyExchange.name,
'asymmetric': _algorithmToString(_negotiationResult!.asymmetric),
'symmetric': _algorithmToString(_negotiationResult!.symmetric),
};
responseMessage['keyExchangeData'] = {
'type': 'ecdh',
'publicKey': _keyExchange!.getPublicKey(),
'curve': _keyExchange!.curve,
};
return responseMessage;
}