Ejemplo n.º 1
0
        public static bool TryParseProtected(IAead aead, ICipher cipher, MemoryCursor cursor, out InitialPacket result)
        {
            result = new InitialPacket();

            var startOffset = cursor.AsOffset();
            var firstByte   = PacketFirstByte.Parse(cursor.Peek(1).Span[0]);

            if (!firstByte.IsInitialType())
            {
                return(false);
            }

            cursor.Move(1);

            var version = PacketVersion.Parse(cursor);
            var destinationConnectionId = PacketConnectionId.Parse(cursor);
            var sourceConnectionId      = PacketConnectionId.Parse(cursor);
            var token   = PacketToken.Parse(cursor);
            var payload = PacketPayload.SliceLongProtectedPacketBytes(cursor, aead, cipher, startOffset, firstByte, null, out var packetNumber);

            result = new InitialPacket(version,
                                       destinationConnectionId,
                                       sourceConnectionId,
                                       token,
                                       packetNumber,
                                       payload);

            return(true);
        }
Ejemplo n.º 2
0
        public static bool TryParseEncrypted(MemoryCursor cursor, IAead aead, ulong sequenceNumber, out Record result)
        {
            var startOffsetOfMessage = cursor.AsOffset();

            result = new Record();

            if (!RecordType.TrySlice(cursor, RecordType.ApplicationData))
            {
                return(false);
            }

            var legacyVersion = ProtocolVersion.Parse(cursor);

            if (legacyVersion != ProtocolVersion.Tls12)
            {
                throw new EncodingException();
            }

            var body = RecordLength.DecryptBytes(cursor, startOffsetOfMessage, aead, sequenceNumber);

            using var bodyContext = body.SetCursor(cursor);

            var startOffsetOfBody = cursor.AsOffset();

            cursor.MoveEnd();

            var actualType = RecordType.ParseReverse(cursor);

            result = new Record(actualType, legacyVersion, new MemoryBuffer(startOffsetOfBody, cursor - startOffsetOfBody));

            return(true);
        }
Ejemplo n.º 3
0
        public static bool TryParseProtectedByConnectionId(IAead aead,
                                                           ICipher cipher,
                                                           MemoryCursor cursor,
                                                           PacketConnectionId connectionId,
                                                           PacketNumber largestAcknowledgedPacketNumber,
                                                           out ShortPacket result)
        {
            result = new ShortPacket();

            var startOffset = cursor.AsOffset();
            var firstByte   = PacketFirstByte.Parse(cursor.Peek(1).Span[0]);

            if (!firstByte.IsShortHeader())
            {
                return(false);
            }

            cursor.Move(1);

            if (!connectionId.TrySliceValue(cursor))
            {
                return(false);
            }

            var payload = PacketPayload.SliceShortProtectedPacketBytes(cursor, aead, cipher, startOffset, firstByte, largestAcknowledgedPacketNumber, out var packetNumber);

            result = new ShortPacket(connectionId, packetNumber, payload);

            return(true);
        }
Ejemplo n.º 4
0
 public static LongProtectedWritingContext StartLongProtectedPacketWriting(
     MemoryCursor cursor,
     IAead aead,
     ICipher cipher,
     int startPacketOffset,
     PacketFirstByte firstByte,
     PacketNumber packetNumber,
     PacketNumber?largestAcknowledgedPacketNumber)
 {
     return(new LongProtectedWritingContext(aead, cipher, cursor, startPacketOffset, cursor.AsOffset(), packetNumber, largestAcknowledgedPacketNumber, firstByte));
 }
Ejemplo n.º 5
0
        public static EncryptedWritingContext StartEncryptedWriting(
            MemoryCursor cursor,
            int startLengthOfMessage,
            RecordType type,
            IAead aead,
            ulong sequenceNumber)
        {
            var lengthBytes       = cursor.Move(2);
            var startLengthOfBody = cursor.AsOffset();

            return(new EncryptedWritingContext(cursor, lengthBytes.Span, startLengthOfBody, startLengthOfMessage, type, aead, sequenceNumber));
        }
Ejemplo n.º 6
0
 public EncryptedWritingContext(
     MemoryCursor cursor,
     Span <byte> lengthBytes,
     int startLengthOfBody,
     int startLengthOfMessage,
     RecordType type,
     IAead aead,
     ulong sequenceNumber)
 {
     this.cursor               = cursor;
     this.lengthBytes          = lengthBytes;
     this.startLengthOfBody    = startLengthOfBody;
     this.startLengthOfMessage = startLengthOfMessage;
     this.type           = type;
     this.aead           = aead;
     this.sequenceNumber = sequenceNumber;
 }
Ejemplo n.º 7
0
 public LongProtectedWritingContext(
     IAead aead,
     ICipher cipher,
     MemoryCursor cursor,
     int startPacketOffset,
     int startPayloadOffset,
     PacketNumber packetNumber,
     PacketNumber?largestAcknowledgedPacketNumber,
     PacketFirstByte packetFirstByte)
 {
     this.aead               = aead;
     this.cipher             = cipher;
     this.cursor             = cursor;
     this.startPacketOffset  = startPacketOffset;
     this.startPayloadOffset = startPayloadOffset;
     this.packetNumber       = packetNumber;
     this.largestAcknowledgedPacketNumber = largestAcknowledgedPacketNumber;
     this.packetFirstByte = packetFirstByte;
 }
Ejemplo n.º 8
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);
        }
Ejemplo n.º 9
0
        public static RecordLength.EncryptedWritingContext StartEncryptedWriting(MemoryCursor cursor, RecordType type, IAead aead, ulong sequenceNumber)
        {
            var startLengthOfMessage = cursor.AsOffset();

            RecordType.ApplicationData.WriteBytes(cursor);
            ProtocolVersion.Tls12.WriteBytes(cursor);

            return(RecordLength.StartEncryptedWriting(cursor, startLengthOfMessage, type, aead, sequenceNumber));
        }
Ejemplo n.º 10
0
        public static PacketPayload.LongProtectedWritingContext StartProtectedWriting(IAead aead,
                                                                                      ICipher cipher,
                                                                                      MemoryCursor cursor,
                                                                                      PacketVersion version,
                                                                                      PacketConnectionId destinationConnectionId,
                                                                                      PacketConnectionId sourceConnectionId,
                                                                                      PacketNumber packetNumber,
                                                                                      PacketToken token)
        {
            var startPacketOffset = cursor.AsOffset();
            var firstByte         = new PacketFirstByte()
                                    .SetInitial()
                                    .SetMaxPacketNumberLength();

            firstByte.Write(cursor);
            version.WriteBytes(cursor);
            destinationConnectionId.WriteBytes(cursor);
            sourceConnectionId.WriteBytes(cursor);
            token.WriteBytes(cursor);

            return(PacketPayload.StartLongProtectedPacketWriting(cursor, aead, cipher, startPacketOffset, firstByte, packetNumber, null));
        }
Ejemplo n.º 11
0
        public static MemoryBuffer DecryptBytes(MemoryCursor cursor, int startOffsetOfMessage, IAead aead, ulong sequenceNumber)
        {
            var headerLength = cursor - startOffsetOfMessage + 2;
            var lengthBytes  = cursor.Move(2);
            var headerBytes  = cursor.Peek(-headerLength);
            var length       = (int)NetworkBitConverter.ParseUnaligned(lengthBytes.Span);

            if (length > MaxLength)
            {
                throw new EncodingException();
            }

            if (length < aead.TagLength)
            {
                throw new EncodingException();
            }

            var startOffsetOfBody = cursor.AsOffset();
            var encryptedLength   = length - aead.TagLength;
            var encryptedBytes    = cursor.Move(encryptedLength);
            var tag = cursor.Move(aead.TagLength);

            aead.Decrypt(encryptedBytes.Span, tag.Span, sequenceNumber, headerBytes.Span);

            return(new MemoryBuffer(startOffsetOfBody, encryptedLength));
        }
 public EncryptedUserDefaults(string name, NSUserDefaults defaults, IAead provider)
 {
     _name        = name;
     UserDefaults = defaults;
     _provider    = provider;
 }
Ejemplo n.º 13
0
        public static PacketPayload.ShortProtectedWritingContext StartProtectedWriting(IAead aead,
                                                                                       ICipher cipher,
                                                                                       MemoryCursor cursor,
                                                                                       PacketConnectionId destinationConnectionId,
                                                                                       PacketNumber packetNumber,
                                                                                       PacketNumber largestAcknowledgedPacketNumber)
        {
            var startOffset = cursor.AsOffset();
            var firstByte   = new PacketFirstByte().SetShort();

            firstByte.Write(cursor);
            destinationConnectionId.WriteValueBytes(cursor);

            return(PacketPayload.StartShortProtectedPacketWriting(cursor, aead, cipher, startOffset, firstByte, packetNumber, largestAcknowledgedPacketNumber));
        }