コード例 #1
0
 public void TestStaticReadBoundry()
 {
     using (PacketBuffer buffer = PacketBuffer.CreateStatic(new byte[16]))
     {
         TestReadBoundry(buffer);
     }
 }
コード例 #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="FileMeta"/> class with <see cref="ContentAlgorithm.Aes256CbcHmacSha256"/>.
        /// </summary>
        /// <param name="binaryData"></param>
        /// <param name="hmacKey"></param>
        /// <param name="aesKey"></param>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="ArgumentOutOfRangeException"/>
        /// <exception cref="CryptographicException"/>
        public FileMeta(byte[] binaryData, byte[] hmacKey, byte[] aesKey)
        {
            if (binaryData == null)
            {
                throw new ArgumentNullException(nameof(binaryData));
            }
            if (binaryData.Length < 78)
            {
                throw new ArgumentOutOfRangeException(nameof(binaryData), binaryData.Length, "A valid v1.2 FileHeader packet must contain at least 78 bytes.");
            }
            if (hmacKey == null)
            {
                throw new ArgumentNullException(nameof(hmacKey));
            }
            if (hmacKey.Length != 32)
            {
                throw new ArgumentOutOfRangeException(nameof(hmacKey), hmacKey.Length, "An HMAC key must be 32 bytes in length.");
            }
            if (aesKey == null)
            {
                throw new ArgumentNullException(nameof(aesKey));
            }
            if (aesKey.Length != 32)
            {
                throw new ArgumentOutOfRangeException(nameof(aesKey), aesKey.Length, "An AES key must be 32 bytes in length.");
            }

            Read_v1_2(PacketBuffer.CreateStatic(binaryData), hmacKey, aesKey);
        }
コード例 #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="FileMeta"/> class from binary data.
        /// </summary>
        /// <param name="binaryData"></param>
        /// <param name="connectionVersion"></param>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="ArgumentOutOfRangeException"/>
        /// <exception cref="NotSupportedException"/>
        public FileMeta(byte[] binaryData, ushort connectionVersion)
        {
            if (binaryData == null)
            {
                throw new ArgumentNullException(nameof(binaryData));
            }
            if (connectionVersion < Constants.CompatibilityVersion || connectionVersion > Constants.ProtocolVersion)
            {
                throw new NotSupportedException($"VSL {Constants.AssemblyVersion} only support connection versions from {Constants.CompatibilityVersion} to {Constants.ProtocolVersion} but not {connectionVersion}");
            }

            if (connectionVersion == 1)
            {
                if (binaryData.Length < 44)
                {
                    throw new ArgumentOutOfRangeException(nameof(binaryData), binaryData.Length, "A valid v1.1 FileHeader packet must contain at least 44 bytes.");
                }
                Read_v1_1(PacketBuffer.CreateStatic(binaryData));
            }
            else if (connectionVersion >= 2)
            {
                if (binaryData.Length < 78)
                {
                    throw new ArgumentOutOfRangeException(nameof(binaryData), binaryData.Length, "A valid v1.2 FileHeader packet must contain at least 78 bytes.");
                }
                Read_v1_2(PacketBuffer.CreateStatic(binaryData));
            }
        }
コード例 #4
0
 public void TestStaticWriteBoundry()
 {
     using (PacketBuffer buffer = PacketBuffer.CreateStatic(16))
     {
         buffer.WriteLong(0x0475f9172a17abc9);
         buffer.WriteSingle(0.1f);
         buffer.WriteUShort(ushort.MaxValue);
         Assert.ThrowsException <ArgumentOutOfRangeException>(() => buffer.WriteInt(-1));
         Assert.ThrowsException <ArgumentOutOfRangeException>(() => buffer.WriteString("Hello world!"));
         Assert.ThrowsException <ArgumentOutOfRangeException>(() => buffer.WriteByteArray(new byte[3], false));
     }
 }
コード例 #5
0
        /// <summary>
        /// Handles an internal VSL packet. Ensure using the correct <see cref="CryptoAlgorithm"/>.
        /// </summary>
        internal Task <bool> HandleInternalPacketAsync(PacketRule rule, byte[] content)
        {
            IPacket packet = rule.Packet.New();

            try
            {
                using (PacketBuffer buf = PacketBuffer.CreateStatic(content))
                    packet.ReadPacket(buf);
            }
            catch (ArgumentException ex)
            {
                parent.ExceptionHandler.CloseConnection(ex);
                return(Task.FromResult(false));
            }
            return(packet.HandlePacketAsync(this));
        }
コード例 #6
0
 private void Read_v1_2(PacketBuffer buf, byte[] hmacKey, byte[] aesKey)
 {
     Read_v1_2_Header(buf);
     if (Algorithm == ContentAlgorithm.None)
     {
         Read_v1_2_Core(buf);
     }
     else if (Algorithm == ContentAlgorithm.Aes256CbcHmacSha256)
     {
         byte[] plain = AesStatic.DecryptWithHmac(buf, -1, hmacKey, aesKey);
         HmacKey = hmacKey; // Assign public properties after successful decryption
         AesKey  = aesKey;
         using (PacketBuffer innerBuf = PacketBuffer.CreateStatic(plain))
             Read_v1_2_Core(innerBuf);
         Available = true;
     }
     else
     {
         encryptedContent = buf.ReadByteArray(buf.Pending);
     }
 }
コード例 #7
0
        /// <summary>
        /// Decrypts an encrypted <see cref="FileMeta"/> with <see cref="ContentAlgorithm.Aes256CbcHmacSha256"/>.
        /// </summary>
        /// <param name="hmacKey"></param>
        /// <param name="aesKey"></param>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="ArgumentOutOfRangeException"/>
        public void Decrypt(byte[] hmacKey, byte[] aesKey)
        {
            if (hmacKey == null)
            {
                throw new ArgumentNullException(nameof(hmacKey));
            }
            if (hmacKey.Length != 32)
            {
                throw new ArgumentOutOfRangeException(nameof(hmacKey), hmacKey.Length, "An HMAC key must be 32 bytes in length.");
            }
            if (aesKey == null)
            {
                throw new ArgumentNullException(nameof(aesKey));
            }
            if (aesKey.Length != 32)
            {
                throw new ArgumentOutOfRangeException(nameof(aesKey), aesKey.Length, "An AES key must be 32 bytes in length.");
            }

            using (PacketBuffer buf = PacketBuffer.CreateStatic(GetBinaryData(Constants.ProtocolVersion)))
                Read_v1_2(buf, hmacKey, aesKey);
        }