respondToSession method

  1. @override
Future<Map<String, dynamic>> respondToSession(
  1. Map<String, dynamic> initiationMessage,
  2. 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;
}