Пример #1
0
        public static MemoryBuffer SliceShortProtectedPacketBytes(
            MemoryCursor cursor,
            IAead aead,
            ICipher cipher,
            int startPacketOffset,
            PacketFirstByte firstByte,
            PacketNumber largestAcknowledgedPacketNumber,
            out PacketNumber packetNumber)
        {
            var startPacketNumberOffset = cursor.AsOffset();

            cursor.Move(SkipToSampleLength);

            var sample = cursor.Move(SampleLength);
            var mask   = cipher.CreateMask(sample.Span);

            cursor.Set(startPacketOffset);
            firstByte.Mask(mask).Write(cursor);
            cursor.Set(startPacketNumberOffset);

            var packetNumberBytes  = firstByte.Mask(mask).SlicePacketNumberBytes(cursor);
            var headerLength       = cursor - startPacketOffset;
            var headerBytes        = cursor.Peek(-headerLength);
            var startPayloadOffset = cursor.AsOffset();

            cursor.MoveEnd();

            var tagBytes            = cursor.Move(-aead.TagLength);
            var payloadLength       = cursor - startPayloadOffset;
            var payloadBytes        = cursor.Peek(-payloadLength);
            var payload             = cursor.Slice(-payloadLength);
            var encodedPacketNumber = PacketNumber.Parse(packetNumberBytes.Span, mask);

            encodedPacketNumber.Fill(packetNumberBytes.Span);

            packetNumber = encodedPacketNumber.DecodeByLargestAcknowledged(largestAcknowledgedPacketNumber);

            packetNumber.Decrypt(aead, payloadBytes.Span, tagBytes.Span, headerBytes.Span);
            cursor.MoveEnd();

            return(payload);
        }
Пример #2
0
            public void Dispose()
            {
                var payloadLength = cursor - startPayloadOffset;
                var payload       = cursor.Peek(-payloadLength);

                Span <byte> payloadBuffer = stackalloc byte[payloadLength];
                Span <byte> tagBuffer     = stackalloc byte[aead.TagLength];

                payload.Span.CopyTo(payloadBuffer);
                packetFirstByte.SlicePacketNumberBytes(cursor);

                var packetLength = cursor - startPacketOffset;

                cursor.Set(startPayloadOffset);
                cursor.EncodeVariable32(packetLength);

                var packetNumberBytes   = packetFirstByte.SlicePacketNumberBytes(cursor);
                var encodedPacketNumber = largestAcknowledgedPacketNumber.HasValue
                    ? packetNumber.EncodeByLargestAcknowledged(largestAcknowledgedPacketNumber.Value)
                    : packetNumber;

                encodedPacketNumber.Fill(packetNumberBytes.Span);

                var headerLength = cursor - startPacketOffset;
                var header       = cursor.Peek(-headerLength);

                packetNumber.Encrypt(aead, payloadBuffer, tagBuffer, header.Span);
                payloadBuffer.CopyTo(cursor);
                tagBuffer.CopyTo(cursor);

                var endPacketOffset = cursor.AsOffset();
                var encryptedLength = payloadBuffer.Length + tagBuffer.Length;
                var encryptedData   = cursor.Peek(-encryptedLength);
                var sample          = encryptedData.Slice(0, SampleLength);
                var mask            = cipher.CreateMask(sample.Span);

                encodedPacketNumber.Fill(packetNumberBytes.Span, mask);
                cursor.Set(startPacketOffset);
                packetFirstByte.Mask(mask).Write(cursor);
                cursor.Set(endPacketOffset);
            }