public void Setup() { cryptoChannelStore = new CryptoDtoChannelStore(); cryptoChannelStore.CreateChannel("Benchmark"); var dto = new BenchmarkDto() { Callsign = "Benchmark", SequenceCounter = 0, Audio = new byte[200], LastPacket = false }; Random rnd = new Random(); rnd.NextBytes(dto.Audio); MemoryStream ms = new MemoryStream(); MessagePackSerializer.Serialize(ms, dto); cryptoChannelStore.TryGetChannel("Benchmark", out var channel); var config = channel.GetRemoteEndpointChannelConfig(); remoteChannel = new CryptoDtoChannel(config); cryptoDtoPacket = serializer.Serialize(cryptoChannelStore, "Benchmark", CryptoDtoMode.ChaCha20Poly1305, dto); }
internal Deserializer(CryptoDtoChannelStore channelStore, ReadOnlySpan <byte> bytes, bool ignoreSequence) { sequenceValid = false; headerLength = Unsafe.ReadUnaligned <ushort>(ref MemoryMarshal.GetReference(bytes)); //.NET Standard 2.0 doesn't have BitConverter.ToUInt16(Span<T>) if (bytes.Length < (2 + headerLength)) { throw new CryptographicException("Not enough bytes to process packet."); } ReadOnlySpan <byte> headerDataBuffer = bytes.Slice(2, headerLength); header = MessagePackSerializer.Deserialize <CryptoDtoHeaderDto>(headerDataBuffer.ToArray()); ReadOnlySpan <byte> receiveKey = channelStore.GetReceiveKey(header.ChannelTag, header.Mode); //This will throw exception if channel tag isn't in the store switch (header.Mode) { case CryptoDtoMode.ChaCha20Poly1305: { int aeLength = bytes.Length - (2 + headerLength); ReadOnlySpan <byte> aePayloadBuffer = bytes.Slice(2 + headerLength, aeLength); ReadOnlySpan <byte> adBuffer = bytes.Slice(0, 2 + headerLength); Span <byte> nonceBuffer = stackalloc byte[Aead.NonceSize]; BinaryPrimitives.WriteUInt64LittleEndian(nonceBuffer.Slice(4), header.Sequence); var aead = new ChaCha20Poly1305(receiveKey.ToArray()); ReadOnlySpan <byte> decryptedPayload = aead.Decrypt(aePayloadBuffer.ToArray(), adBuffer.ToArray(), nonceBuffer); if (ignoreSequence) { sequenceValid = channelStore.IsReceivedSequenceAllowed(header.ChannelTag, header.Sequence); } else { channelStore.CheckReceivedSequence(header.ChannelTag, header.Sequence); //The packet has passed MAC, so now check if it's being duplicated or replayed sequenceValid = true; } dtoNameLength = Unsafe.ReadUnaligned <ushort>(ref MemoryMarshal.GetReference(decryptedPayload)); //.NET Standard 2.0 doesn't have BitConverter.ToUInt16(Span<T>) dtoNameBuffer = decryptedPayload.Slice(2, dtoNameLength); dataLength = Unsafe.ReadUnaligned <ushort>(ref MemoryMarshal.GetReference(decryptedPayload.Slice(2 + dtoNameLength, 2))); //.NET Standard 2.0 doesn't have BitConverter.ToUInt16(Span<T>) dataBuffer = decryptedPayload.Slice(2 + dtoNameLength + 2, dataLength); break; } default: throw new CryptographicException("Mode not recognised"); } }
public void Setup() { cryptoChannelStore = new CryptoDtoChannelStore(); cryptoChannelStore.CreateChannel("Benchmark"); dto = new BenchmarkDto() { Callsign = "Benchmark", SequenceCounter = 0, Audio = new byte[200], LastPacket = false }; Random rnd = new Random(); rnd.NextBytes(dto.Audio); }
public void Setup() { cryptoChannelStore = new CryptoDtoChannelStore(); cryptoChannelStore.CreateChannel("Benchmark"); var dto = new BenchmarkDto() { Callsign = "Benchmark", SequenceCounter = 0, Audio = new byte[200], LastPacket = false }; Random rnd = new Random(); rnd.NextBytes(dto.Audio); MemoryStream ms = new MemoryStream(); MessagePackSerializer.Serialize(ms, dto); dtoBytes = ms.ToArray(); typeNameBytes = Encoding.UTF8.GetBytes(nameof(BenchmarkDto)); }
public static byte[] Pack(CryptoDtoChannelStore channelStore, string channelTag, CryptoDtoMode mode, byte[] dtoNameBuffer, byte[] dtoBuffer) { var transmitKey = channelStore.GetTransmitKey(channelTag, mode, out ulong sequenceToSend); return(Pack(channelTag, mode, transmitKey, sequenceToSend, dtoNameBuffer, dtoBuffer)); }
public static byte[] Serialize <T>(CryptoDtoChannelStore channelStore, string channelTag, CryptoDtoMode mode, T obj) { var transmitKey = channelStore.GetTransmitKey(channelTag, mode, out ulong sequenceToSend); return(Serialise(channelTag, mode, transmitKey, sequenceToSend, obj)); }
// Hint for callers using ArrayBufferWriter<byte> - output.WrittenSpan contains the serialised data public void Serialize <T>(IBufferWriter <byte> output, CryptoDtoChannelStore channelStore, string channelTag, CryptoDtoMode mode, T obj) { var channel = channelStore.GetChannel(channelTag); Serialize(output, channel, mode, obj); }
public byte[] Serialize <T>(CryptoDtoChannelStore channelStore, string channelTag, CryptoDtoMode mode, T obj) { var channel = channelStore.GetChannel(channelTag); return(Serialize(channel, mode, obj)); }
public static Deserializer DeserializeIgnoreSequence(CryptoDtoChannelStore channelStore, ReadOnlySpan <byte> bytes) //This is used for UDP channels where duplication is possible { return(new Deserializer(channelStore, bytes, true)); }
public static Deserializer Deserialize(CryptoDtoChannelStore channelStore, ReadOnlySpan <byte> bytes) { return(new Deserializer(channelStore, bytes, false)); }