Пример #1
0
        public SenderKeyMessage(UInt32 keyId, UInt32 iteration, byte[] ciphertext, ECPrivateKey signatureKey)
        {
            byte[] version = { ByteUtil.IntsToByteHighAndLow(CURRENT_VERSION, CURRENT_VERSION) };

            var messageObj = new WhisperProtos.SenderKeyMessage {
                id = (uint)keyId,
                iteration = (uint)iteration,
                ciphertext = ciphertext,
            };

            byte[] message;

            using(var stream = new MemoryStream())
            {
                Serializer.Serialize<WhisperProtos.SenderKeyMessage>(stream, messageObj);
                message = stream.ToArray();
            }

            byte[] signature = GetSignature(signatureKey, ByteUtil.Combine(version, message));

            _serialized = ByteUtil.Combine(version, message, signature);
            KeyId = keyId;
            Iteration = iteration;
            CipherText = ciphertext;
        }
        public SenderKeyMessage(byte[] serialized)
        {
            try
            {
                byte[][] messageParts = ByteUtil.Split(serialized, 1, serialized.Length - 1 - SignatureLength, SignatureLength);
                byte     version      = messageParts[0][0];
                byte[]   message      = messageParts[1];
                byte[]   signature    = messageParts[2];

                if (ByteUtil.HighBitsToInt(version) < 3)
                {
                    throw new LegacyMessageException("Legacy message: " + ByteUtil.HighBitsToInt(version));
                }

                if (ByteUtil.HighBitsToInt(version) > CurrentVersion)
                {
                    throw new InvalidMessageException("Unknown version: " + ByteUtil.HighBitsToInt(version));
                }

                WhisperProtos.SenderKeyMessage senderKeyMessage = WhisperProtos.SenderKeyMessage.ParseFrom(message);

                if (!senderKeyMessage.HasId ||
                    !senderKeyMessage.HasIteration ||
                    !senderKeyMessage.HasCiphertext)
                {
                    throw new InvalidMessageException("Incomplete message.");
                }

                _serialized     = serialized;
                _messageVersion = (uint)ByteUtil.HighBitsToInt(version);
                _keyId          = senderKeyMessage.Id;
                _iteration      = senderKeyMessage.Iteration;
                _ciphertext     = senderKeyMessage.Ciphertext.ToByteArray();
            }
            catch (/*InvalidProtocolBufferException | Parse*/ Exception e)
            {
                throw new InvalidMessageException(e);
            }
        }
        public SenderKeyMessage(byte[] serialized)
        {
            try
            {
                byte[][] messageParts = ByteUtil.split(serialized, 1, serialized.Length - 1 - SIGNATURE_LENGTH, SIGNATURE_LENGTH);
                byte     version      = messageParts[0][0];
                byte[]   message      = messageParts[1];
                byte[]   signature    = messageParts[2];

                if (ByteUtil.highBitsToInt(version) < 3)
                {
                    throw new LegacyMessageException("Legacy message: " + ByteUtil.highBitsToInt(version));
                }

                if (ByteUtil.highBitsToInt(version) > CURRENT_VERSION)
                {
                    throw new InvalidMessageException("Unknown version: " + ByteUtil.highBitsToInt(version));
                }

                WhisperProtos.SenderKeyMessage senderKeyMessage = WhisperProtos.SenderKeyMessage.ParseFrom(message);

                if (!senderKeyMessage.HasId ||
                    !senderKeyMessage.HasIteration ||
                    !senderKeyMessage.HasCiphertext)
                {
                    throw new InvalidMessageException("Incomplete message.");
                }

                this.serialized = serialized;
                messageVersion  = (uint)ByteUtil.highBitsToInt(version);
                keyId           = senderKeyMessage.Id;
                iteration       = senderKeyMessage.Iteration;
                ciphertext      = senderKeyMessage.Ciphertext.ToByteArray();
            }
            catch (/*InvalidProtocolBufferException | Parse*/ Exception e)
            {
                throw new InvalidMessageException(e);
            }
        }