public void TestStaticReadBoundry() { using (PacketBuffer buffer = PacketBuffer.CreateStatic(new byte[16])) { TestReadBoundry(buffer); } }
/// <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); }
/// <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)); } }
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)); } }
/// <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)); }
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); } }
/// <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); }