/// <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)); } }
/// <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); }
/// <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; } }