Ejemplo n.º 1
0
        public void Read_Protected_ResultBytesAreExpected()
        {
            //Arrange
            var messageBytes        = Utils.ParseHexString(GetProtectedMessageHex());
            var destConnectionId    = PacketConnectionId.Empty;
            var packetNumbers       = GetPacketNumbersHex();
            var currentPacketNumber = PacketNumber.Parse(Utils.ParseHexString(packetNumbers.Current));
            var largestPacketNumber = PacketNumber.Parse(Utils.ParseHexString(packetNumbers.Largest));
            var secrets             = GetSecrets();
            var aead   = Cipher.TLS_CHACHA20_POLY1305_SHA256.CreateAead(Utils.ParseHexString(secrets.Iv), Utils.ParseHexString(secrets.Key));
            var cipher = Cipher.TLS_CHACHA20_POLY1305_SHA256.CreateCipher(Utils.ParseHexString(secrets.Hp));

            //Act
            var cursor = new MemoryCursor(messageBytes);

            var result = ShortPacket.TryParseProtectedByConnectionId(aead, cipher, cursor, destConnectionId, largestPacketNumber, out var packet);

            using (packet.Payload.SetCursor(cursor))
            {
                result &= PingFrame.TryParse(cursor);

                result &= cursor.IsEnd();
            }

            result &= cursor.IsEnd();

            //Assert
            Assert.True(result);
            Assert.Equal(destConnectionId, packet.DestinationConnectionId);
            Assert.Equal(currentPacketNumber, packet.Number);
        }
        public void Write_Encrypted_ResultBytesAreExpected()
        {
            //Arrange
            var expectedBytes      = GetProtectedMessageHex();
            var buffer             = new byte[PacketBuffer.MaxPacketSize];
            var version            = PacketVersion.CreateByDraft(32);
            var connectionIds      = GetConnectionIdsHex();
            var sourceConnectionId = PacketConnectionId.Parse(Utils.ParseHexString(connectionIds.SourceConnectionIdHex));
            var destConnectionId   = PacketConnectionId.Parse(Utils.ParseHexString(connectionIds.DestConnectionIdHex));
            var packetNumber       = PacketNumber.Parse(Utils.ParseHexString(GetPacketNumberHex()));
            var token            = PacketToken.Empty;
            var clientHelloBytes = Utils.ParseHexString(GetTlsClientHelloHex());
            var secrets          = GetSecrets();
            var aead             = Cipher.TLS_AES_128_GCM_SHA256.CreateAead(Utils.ParseHexString(secrets.Iv), Utils.ParseHexString(secrets.Key));
            var cipher           = Cipher.TLS_AES_128_GCM_SHA256.CreateCipher(Utils.ParseHexString(secrets.Hp));

            //Act
            var cursor = new MemoryCursor(buffer);

            using (InitialPacket.StartProtectedWriting(aead, cipher, cursor, version, destConnectionId, sourceConnectionId, packetNumber, token))
            {
                using (PaddingFrame.EnsureLength(cursor, 1162))
                {
                    using (CryptoFrame.StartWriting(cursor, 0))
                    {
                        clientHelloBytes.CopyTo(cursor);
                    }
                }
            }

            //Assert
            Assert.Equal(expectedBytes, Utils.ToHexString(cursor.PeekStart().ToArray()), true);
        }
Ejemplo n.º 3
0
        public static WritingContext StartWriting(MemoryCursor cursor,
                                                  AckDelay delay,
                                                  PacketNumber largestAcknowledged,
                                                  int beforLargestAcknowledgedLength,
                                                  AckEcnCounts?ecnFeedback = null)
        {
            if (beforLargestAcknowledgedLength < 0)
            {
                throw new EncodingException();
            }

            FrameType
            .CreateAck(ecnFeedback.HasValue)
            .Write(cursor);

            largestAcknowledged.WriteVariable(cursor);
            delay.Write(cursor);

            var startPayloadOffset = cursor.AsOffset();

            cursor.EncodeVariable32(beforLargestAcknowledgedLength);

            var startRangesOffset = cursor.AsOffset();

            return(new WritingContext(cursor, ecnFeedback, startPayloadOffset, startRangesOffset));
        }
Ejemplo n.º 4
0
 /// <summary>
 /// Appends header specific attributes to <paramref name="attributes"/> dictionary.
 /// </summary>
 /// <param name="attributes">Dictionary to append header specific attributes to.</param>
 internal void AppendHeaderAttributes(Dictionary <string, string> attributes)
 {
     attributes.Add("Frame Type", (ushort)TypeID + ": " + TypeID);
     attributes.Add("Using Phasor File Format", UsePhasorDataFileFormat.ToString());
     attributes.Add("Frame Length", FrameLength.ToString());
     attributes.Add("Packet Number", PacketNumber.ToString());
     attributes.Add("Word Count", WordCount.ToString());
 }
Ejemplo n.º 5
0
 private AckFrame(AckDelay delay,
                  PacketNumber largestAcknowledged,
                  AckRanges ranges,
                  AckEcnCounts?ecnFeedback)
 {
     Delay = delay;
     LargestAcknowledged = largestAcknowledged;
     Ranges      = ranges;
     EcnFeedback = ecnFeedback;
 }
Ejemplo n.º 6
0
        public void Encode_ByLargestAcknowledged_ResultIsExpected(string initial, string largest, string expected)
        {
            //Arrange
            var initialNumber  = PacketNumber.Parse(Utils.ParseHexString(initial));
            var largestNumber  = PacketNumber.Parse(Utils.ParseHexString(largest));
            var expectedNumber = PacketNumber.Parse(Utils.ParseHexString(expected));

            //Act
            var resultNumber = initialNumber.EncodeByLargestAcknowledged(largestNumber);

            //Assert
            Assert.Equal(expectedNumber, resultNumber);
        }
Ejemplo n.º 7
0
        public void Decode_ByLargestAcknowledged_ResultIsExpected(string truncated, string largest, string expected)
        {
            //Arrange
            var truncatedNumber = PacketNumber.Parse(Utils.ParseHexString(truncated));
            var largestNumber   = PacketNumber.Parse(Utils.ParseHexString(largest));
            var expectedNumber  = PacketNumber.Parse(Utils.ParseHexString(expected));

            //Act
            var resultNumber = truncatedNumber.DecodeByLargestAcknowledged(largestNumber);

            //Assert
            Assert.Equal(expectedNumber, resultNumber);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Returns a <see cref="T:System.String"/> that represents the current <see cref="T:Microsoft.Xna.Framework.Input.GamePadState"/>.
        /// </summary>
        /// <returns>A <see cref="T:System.String"/> that represents the current <see cref="T:Microsoft.Xna.Framework.Input.GamePadState"/>.</returns>
        public override string ToString()
        {
            if (!IsConnected)
            {
                return("[GamePadState: IsConnected = 0]");
            }

            return("[GamePadState: IsConnected=" + (IsConnected ? "1" : "0") +
                   ", PacketNumber=" + PacketNumber.ToString("00000") +
                   ", Buttons=" + Buttons +
                   ", DPad=" + DPad +
                   ", ThumbSticks=" + ThumbSticks +
                   ", Triggers=" + Triggers +
                   "]");
        }
        public void Read_Protected_ResultsAreExpected()
        {
            //Arrange
            var messageBytes       = Utils.ParseHexString(GetProtectedMessageHex());
            var version            = PacketVersion.CreateByDraft(32);
            var connectionIds      = GetConnectionIdsHex();
            var sourceConnectionId = PacketConnectionId.Parse(Utils.ParseHexString(connectionIds.SourceConnectionIdHex));
            var destConnectionId   = PacketConnectionId.Parse(Utils.ParseHexString(connectionIds.DestConnectionIdHex));
            var packetNumber       = PacketNumber.Parse(Utils.ParseHexString(GetPacketNumberHex()));
            var token             = PacketToken.Empty;
            var clientHelloBytes  = GetTlsClientHelloHex();
            var cryptoFrame       = new CryptoFrame();
            var paddingFrameCount = 0;
            var secrets           = GetSecrets();
            var aead   = Cipher.TLS_AES_128_GCM_SHA256.CreateAead(Utils.ParseHexString(secrets.Iv), Utils.ParseHexString(secrets.Key));
            var cipher = Cipher.TLS_AES_128_GCM_SHA256.CreateCipher(Utils.ParseHexString(secrets.Hp));

            //Act
            var cursor = new MemoryCursor(messageBytes);
            var result = InitialPacket.TryParseProtected(aead, cipher, cursor, out var packet);

            using (packet.Payload.SetCursor(cursor))
            {
                result &= CryptoFrame.TryParse(cursor, out cryptoFrame);

                paddingFrameCount = PaddingFrame.SkipRange(cursor);

                result &= cursor.IsEnd();
            }

            result &= cursor.IsEnd();

            //Assert
            Assert.True(result);
            Assert.Equal(917, paddingFrameCount);
            Assert.Equal(version, packet.Version);
            Assert.Equal(sourceConnectionId, packet.SourceConnectionId);
            Assert.Equal(destConnectionId, packet.DestinationConnectionId);
            Assert.Equal(packetNumber, packet.Number);
            Assert.Equal(token, packet.Token);
            Assert.Equal(0, cryptoFrame.Offset);
            Assert.Equal(clientHelloBytes, Utils.ToHexString(cryptoFrame.Data.Read(cursor).ToArray()), true);
        }
Ejemplo n.º 10
0
        public static bool TryParse(MemoryCursor cursor, out AckFrame result)
        {
            result = new AckFrame();

            var type = FrameType.Peek(cursor);

            if (!type.IsAck)
            {
                return(false);
            }

            type.Slice(cursor);

            var largestAcknowledged = PacketNumber.ParseVariable(cursor);
            var delay       = AckDelay.Parse(cursor);
            var rangesCount = cursor.DecodeVariable32();
            var ranges      = SliceRanges(cursor, rangesCount + 1);
            var ecnFeedback = type.HasAckEcnFeedback ? AckEcnCounts.Parse(cursor) : new AckEcnCounts?();

            result = new AckFrame(delay, largestAcknowledged, ranges, ecnFeedback);

            return(true);
        }
Ejemplo n.º 11
0
        public void Write_Protected_ResultBytesAreExpected()
        {
            //Arrange
            var expectedBytes       = GetProtectedMessageHex();
            var buffer              = new byte[PacketBuffer.MaxPacketSize];
            var destConnectionId    = PacketConnectionId.Empty;
            var packetNumbers       = GetPacketNumbersHex();
            var currentPacketNumber = PacketNumber.Parse(Utils.ParseHexString(packetNumbers.Current));
            var largestPacketNumber = PacketNumber.Parse(Utils.ParseHexString(packetNumbers.Largest));
            var secrets             = GetSecrets();
            var aead   = Cipher.TLS_CHACHA20_POLY1305_SHA256.CreateAead(Utils.ParseHexString(secrets.Iv), Utils.ParseHexString(secrets.Key));
            var cipher = Cipher.TLS_CHACHA20_POLY1305_SHA256.CreateCipher(Utils.ParseHexString(secrets.Hp));

            //Act
            var cursor = new MemoryCursor(buffer);

            using (ShortPacket.StartProtectedWriting(aead, cipher, cursor, destConnectionId, currentPacketNumber, largestPacketNumber))
            {
                PingFrame.Write(cursor);
            }

            //Assert
            Assert.Equal(expectedBytes, Utils.ToHexString(cursor.PeekStart().ToArray()), true);
        }
Ejemplo n.º 12
0
        private bool Validate()
        {
            Valid = false;

            // La trama debe poseer exactamente 20 componentes una vez tokenizada; caso contrario esta mal formada.
            if (TokenizedDatagram.Length != 20)
            {
                return(false);
            }

            // La trama debe comenzar y terminar exactamente con marcas puntuales. ($B y $E, respectivamente).
            if (!TokenizedDatagram[0].Equals("$B"))
            {
                return(false);
            }

            if (!TokenizedDatagram[19].Equals("$E"))
            {
                return(false);
            }

            // Verifico los tipos de datos de la trama.
            if (!IMEI.All(char.IsDigit) || IMEI.Count() != 15)
            {
                return(false);
            }

            if (!PacketNumber.All(char.IsDigit) || PacketNumber.Count() != 4 || Convert.ToInt16(PacketNumber) < 1 || Convert.ToInt16(PacketNumber) > 1440)
            {
                return(false);
            }

            Valid = true;

            return(true);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Appends header specific attributes to <paramref name="attributes"/> dictionary.
        /// </summary>
        /// <param name="attributes">Dictionary to append header specific attributes to.</param>
        internal void AppendHeaderAttributes(Dictionary <string, string> attributes)
        {
            attributes.Add("Frame Type", (ushort)TypeID + ": " + TypeID);
            attributes.Add("Frame Length", FrameLength.ToString());
            attributes.Add("Header Length", Length.ToString());
            attributes.Add("Payload Length", DataLength.ToString());
            attributes.Add("Second of Century", SecondOfCentury.ToString());
            attributes.Add("Fraction of Second", FractionOfSecond.ToString());

            uint timeQualityFlags = (uint)TimeQualityFlags;

            attributes.Add("Time Quality Flags", timeQualityFlags.ToString());

            if (timeQualityFlags > 0)
            {
                attributes.Add("Leap Second State", TimeQualityFlags.ToString());
            }
            else
            {
                attributes.Add("Leap Second State", "No leap second is currently pending");
            }

            attributes.Add("Time Quality Indicator Code", (uint)TimeQualityIndicatorCode + ": " + TimeQualityIndicatorCode);
            attributes.Add("Time Base", Timebase + (Timebase != Common.Timebase ? " - NON STANDARD" : ""));

            if (m_frameType != IEC61850_90_5.FrameType.DataFrame)
            {
                attributes.Add("Version", Version.ToString());
            }
            else
            {
                attributes.Add("SPDU Length", m_spduLength.ToString());
                attributes.Add("ASDU Payload Length", m_payloadSize.ToString());
                attributes.Add("Packet Number", PacketNumber.ToString());
                attributes.Add("Key ID", m_keyID.ToString("X").PadLeft(8, '0'));
                attributes.Add("Security Algorithm", (byte)m_securityAlgorithm + ": " + m_securityAlgorithm);
                attributes.Add("Signature Algorithm", (byte)m_signatureAlgorithm + ": " + m_signatureAlgorithm);

                if ((object)m_sourceHash != null && m_sourceHash.Length > 0)
                {
                    attributes.Add("Parsed Signature Hash", ByteEncoding.Hexadecimal.GetString(m_sourceHash, ' '));
                }
                else
                {
                    attributes.Add("Parsed Signature Hash", "null");
                }

                if ((object)m_calculatedHash != null && m_calculatedHash.Length > 0)
                {
                    attributes.Add("Calculated Signature Hash", ByteEncoding.Hexadecimal.GetString(m_calculatedHash, ' '));
                }
                else
                {
                    attributes.Add("Calculated Signature Hash", "null");
                }

                attributes.Add("Ignoring Checksum Validation", IgnoreSignatureValidationFailures.ToString());
                attributes.Add("Number of ASDUs", m_asduCount.ToString());
                attributes.Add("ConfigurationRevision", m_configurationRevision.ToString());
                attributes.Add("Simulated Data", m_simulatedData.ToString());
                attributes.Add("Application ID", m_applicationID.ToString());
                attributes.Add("Using ETR Configuration", UseETRConfiguration.ToString());
                attributes.Add("Configuration Guessing Allowed", GuessConfiguration.ToString());
                attributes.Add("Parsing Redundant ASDUs", ParseRedundantASDUs.ToString());
                attributes.Add("Ignoring Signature Validation Errors", IgnoreSignatureValidationFailures.ToString());
                attributes.Add("Ignoring Sample Size Validation Errors", IgnoreSampleSizeValidationFailures.ToString());
                attributes.Add("Selected Angle Format", m_angleFormat.ToString());
            }
        }