private static void DispatchEncryptEcb(ReadOnlySpan <byte> plaintext, Span <byte> ciphertext, AesKey key, PaddingMode paddingMode) { switch (key) { case Aes128Key aes128Key: EncryptEcb(plaintext, ciphertext, aes128Key, paddingMode); return; case Aes192Key aes192Key: EncryptEcb(plaintext, ciphertext, aes192Key, paddingMode); return; case Aes256Key aes256Key: EncryptEcb(plaintext, ciphertext, aes256Key, paddingMode); return; } }
private static void DispatchDecryptEcb( ReadOnlySpan <byte> ciphertext, Span <byte> plaintext, AesKey key, PaddingMode paddingMode) { switch (key) { case Aes128Key aes128Key: DecryptEcb(ciphertext, plaintext, aes128Key); break; case Aes192Key aes192Key: DecryptEcb(ciphertext, plaintext, aes192Key); break; case Aes256Key aes256Key: DecryptEcb(ciphertext, plaintext, aes256Key); break; } }
// TODO: harmonize default parameter values (e.g. paddingMode) public static void Encrypt(ReadOnlySpan <byte> plaintext, Span <byte> ciphertext, ReadOnlySpan <byte> iv, AesKey key, CipherMode cipherMode = CipherMode.CBC, PaddingMode paddingMode = PaddingMode.PKCS7) { if (cipherMode != CipherMode.ECB && cipherMode != CipherMode.CBC) { ThrowHelper.ThrowNotImplementedException(); } if (paddingMode == PaddingMode.None && plaintext.Length % BlockSize != 0) { ThrowHelper.ThrowInputNotMultipleOfBlockSizeException(nameof(plaintext)); } if (cipherMode == CipherMode.CBC && iv == null) { ThrowHelper.ThrowArgumentNullException(nameof(iv)); } // TODO: correctly validate ciphertext length if (ciphertext.Length < plaintext.Length) { ThrowHelper.ThrowDestinationBufferTooSmallException(nameof(ciphertext)); } // TODO: moar validation switch (cipherMode) { case CipherMode.ECB: DispatchEncryptEcb(plaintext, ciphertext, key, paddingMode); return; case CipherMode.CBC: DispatchEncryptCbc(plaintext, ciphertext, iv, key, paddingMode); return; } ThrowHelper.ThrowNotImplementedException(); }