Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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;
            }
        }
Beispiel #3
0
        // 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();
        }