예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
            }
        }