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); } }