public SignalMessage(byte[] serialized) { try { byte[][] messageParts = ByteUtil.Split(serialized, 1, serialized.Length - 1 - MacLength, MacLength); byte version = messageParts[0][0]; byte[] message = messageParts[1]; byte[] mac = messageParts[2]; if (ByteUtil.HighBitsToInt(version) <= UnsupportedVersion) { throw new LegacyMessageException("Legacy message: " + ByteUtil.HighBitsToInt(version)); } if (ByteUtil.HighBitsToInt(version) > CurrentVersion) { throw new InvalidMessageException("Unknown version: " + ByteUtil.HighBitsToInt(version)); } WhisperProtos.SignalMessage signalMessage = WhisperProtos.SignalMessage.ParseFrom(message); if (!signalMessage.HasCiphertext || !signalMessage.HasCounter || !signalMessage.HasRatchetKey) { throw new InvalidMessageException("Incomplete message."); } _serialized = serialized; _senderRatchetKey = Curve.DecodePoint(signalMessage.RatchetKey.ToByteArray(), 0); _messageVersion = (uint)ByteUtil.HighBitsToInt(version); _counter = signalMessage.Counter; _previousCounter = signalMessage.PreviousCounter; _ciphertext = signalMessage.Ciphertext.ToByteArray(); } catch (/*InvalidProtocolBufferException | InvalidKeyException | Parse*/ Exception e) { throw new InvalidMessageException(e); } }
public SignalMessage(byte[] serialized) { try { byte[][] messageParts = ByteUtil.split(serialized, 1, serialized.Length - 1 - MAC_LENGTH, MAC_LENGTH); byte version = messageParts[0][0]; byte[] message = messageParts[1]; byte[] mac = messageParts[2]; if (ByteUtil.highBitsToInt(version) <= CiphertextMessage.UNSUPPORTED_VERSION) { throw new LegacyMessageException("Legacy message: " + ByteUtil.highBitsToInt(version)); } if (ByteUtil.highBitsToInt(version) > CURRENT_VERSION) { throw new InvalidMessageException("Unknown version: " + ByteUtil.highBitsToInt(version)); } WhisperProtos.SignalMessage SignalMessage = WhisperProtos.SignalMessage.ParseFrom(message); if (!SignalMessage.HasCiphertext || !SignalMessage.HasCounter || !SignalMessage.HasRatchetKey) { throw new InvalidMessageException("Incomplete message."); } this.serialized = serialized; this.senderRatchetKey = Curve.decodePoint(SignalMessage.RatchetKey.ToByteArray(), 0); this.messageVersion = (uint)ByteUtil.highBitsToInt(version); this.counter = SignalMessage.Counter; this.previousCounter = SignalMessage.PreviousCounter; this.ciphertext = SignalMessage.Ciphertext.ToByteArray(); } catch (/*InvalidProtocolBufferException | InvalidKeyException | Parse*/ Exception e) { throw new InvalidMessageException(e); } }