readMessage method

Future<Uint8List?> readMessage(
  1. Uint8List message
)

Process an incoming handshake message. Returns the decrypted payload if present (msg2 and msg3 may contain payloads).

Implementation

Future<Uint8List?> readMessage(Uint8List message) async {
  if (_state.state == XXHandshakeState.error) {
    throw StateError('Cannot read message in error state');
  }

  try {
    _validateReadState();

    Uint8List? payload;
    switch (_state.state) {
      case XXHandshakeState.initial:
        _state = await _processInitialMessage(message);
        break;
      case XXHandshakeState.sentE:
        final result = await _processSecondMessageWithPayload(message);
        _state = result.$1;
        payload = result.$2;
        break;
      case XXHandshakeState.sentEES:
        final result = await _processFinalMessageWithPayload(message);
        _state = result.$1;
        payload = result.$2;
        break;
      default:
        throw StateError('Cannot read message in state: ${_state.state}');
    }
    return payload;
  } catch (e) {
    // Only set error state for non-validation errors
    if (e is! StateError) {
      _state = _state.copyWith(state: XXHandshakeState.error);
    }
    rethrow;
  }
}