Beispiel #1
0
        /// <inheritdoc />
        public override bool TryDecrypt(ReadOnlySpan <byte> key, ReadOnlySpan <byte> ciphertext, ReadOnlySpan <byte> nonce, Span <byte> plaintext, out int bytesWritten)
        {
            int keyLength = _encryptionAlgorithm.RequiredKeySizeInBits >> 4;

            if (key.Length < keyLength)
            {
                ThrowHelper.ThrowArgumentOutOfRangeException_EncryptionKeyTooSmall(_encryptionAlgorithm, _encryptionAlgorithm.RequiredKeySizeInBits, _encryptionAlgorithm.RequiredKeySizeInBits >> 4);
            }

            if (ciphertext.Length == 0)
            {
                bytesWritten = 0;
                return(true);
            }

            try
            {
                using var aes       = Aes.Create();
                aes.Key             = key.ToArray();
                aes.IV              = nonce.ToArray();
                aes.Mode            = CipherMode.CBC;
                aes.Padding         = PaddingMode.PKCS7;
                using var decryptor = aes.CreateDecryptor();
                bytesWritten        = AesCbcHelper.Transform(decryptor, ciphertext, 0, ciphertext.Length, plaintext);
                return(true);
            }
            catch (CryptographicException)
            {
                plaintext.Clear();
                return(ThrowHelper.TryWriteError(out bytesWritten));
            }
        }
Beispiel #2
0
        /// <inheritdoc />
        public override bool TryDecrypt(ReadOnlySpan <byte> key, ReadOnlySpan <byte> ciphertext, ReadOnlySpan <byte> nonce, Span <byte> plaintext, out int bytesWritten)
        {
            if (key.IsEmpty)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
            }

            if (ciphertext.IsEmpty)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.ciphertext);
            }

            if (nonce.IsEmpty)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.nonce);
            }

            int keyLength = _encryptionAlgorithm.RequiredKeySizeInBits >> 4;

            if (key.Length < keyLength)
            {
                ThrowHelper.ThrowArgumentOutOfRangeException_EncryptionKeyTooSmall(_encryptionAlgorithm, _encryptionAlgorithm.RequiredKeySizeInBits, _encryptionAlgorithm.RequiredKeySizeInBits >> 4);
            }

            using var aes       = Aes.Create();
            aes.Key             = key.ToArray();
            aes.IV              = nonce.ToArray();
            aes.Mode            = CipherMode.CBC;
            aes.Padding         = PaddingMode.PKCS7;
            using var decryptor = aes.CreateDecryptor();
            bytesWritten        = AesCbcHelper.Transform(decryptor, ciphertext, 0, ciphertext.Length, plaintext);
            return(true);
        }
Beispiel #3
0
        /// <inheritdoc />
        public override void Encrypt(
            ReadOnlySpan <byte> key,
            ReadOnlySpan <byte> plaintext,
            ReadOnlySpan <byte> nonce,
            Span <byte> ciphertext)
        {
            int keyLength = _encryptionAlgorithm.RequiredKeySizeInBytes >> 1;

            if (key.Length < keyLength)
            {
                ThrowHelper.ThrowArgumentOutOfRangeException_EncryptionKeyTooSmall(_encryptionAlgorithm, _encryptionAlgorithm.RequiredKeySizeInBytes >> 1, key.Length << 3);
            }

            var aesKey = key.ToArray();

            using Aes aes = CreateAes(aesKey);
            try
            {
                aes.IV = nonce.ToArray();
                using ICryptoTransform encryptor = aes.CreateEncryptor();
                AesCbcHelper.Transform(encryptor, plaintext, 0, plaintext.Length, ciphertext);
            }
            catch
            {
                CryptographicOperations.ZeroMemory(ciphertext);
                throw;
            }
        }