public EncryptedPacket EncryptData(byte[] original, RSAWithRSAParameterKey rsaParams,
                                           DigitalSignature digitalSignature)
        {
            var sessionKey = _aes.GenerateRandomNumber(32);

            var encryptedPacket = new EncryptedPacket {
                Iv = _aes.GenerateRandomNumber(12)
            };

            (byte[] ciphereText, byte[] tag)encrypted = _aes.Encrypt(original, sessionKey, encryptedPacket.Iv, null);

            encryptedPacket.EncryptedData       = encrypted.ciphereText;
            encryptedPacket.Tag                 = encrypted.tag;
            encryptedPacket.EncryptedSessionKey = rsaParams.EncryptData(sessionKey);

            using (var hmac = new HMACSHA256(sessionKey))
            {
                var temp = hmac.ComputeHash(Combine(encryptedPacket.EncryptedData, encryptedPacket.Iv));
                encryptedPacket.Hmac = hmac.ComputeHash(Combine(temp, encryptedPacket.Tag));
            }

            encryptedPacket.Signature = digitalSignature.SignData(encryptedPacket.Hmac);

            return(encryptedPacket);
        }
        public EncryptedPacket EncryptData(byte[] original, RSAWithRSAParameterKey rsaParams,
                                           DigitalSignature digitalSignature)
        {
            var sessionKey = _aes.GenerateRandomNumber(32);

            var encryptedPacket = new EncryptedPacket {
                Iv = _aes.GenerateRandomNumber(16)
            };

            encryptedPacket.EncryptedData = _aes.Encrypt(original, sessionKey, encryptedPacket.Iv);

            encryptedPacket.EncryptedSessionKey = rsaParams.EncryptData(sessionKey);

            using (var hmac = new HMACSHA256(sessionKey))
            {
                encryptedPacket.Hmac = hmac.ComputeHash(Combine(encryptedPacket.EncryptedData, encryptedPacket.Iv));
            }

            encryptedPacket.Signature = digitalSignature.SignData(encryptedPacket.Hmac);

            return(encryptedPacket);
        }