readMessage method
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;
}
}