Exemplo n.º 1
0
        // Constructor.
        internal CryptoAPITransform(int algorithm, byte[] iv, byte[] key,
                                    int blockSize, int feedbackBlockSize,
                                    CipherMode mode, PaddingMode padding,
                                    bool encrypt)
        {
            // Initialize the common state.
            if (iv != null)
            {
                this.iv = (byte[])(iv.Clone());
            }
            else
            {
                this.iv = null;
            }
            this.blockSize         = blockSize / 8;
            this.feedbackBlockSize = feedbackBlockSize / 8;
            this.padding           = padding;
            this.mode = mode;

            // Determine which processing methods to use based on the
            // mode and the encrypt/decrypt flag.
            switch (mode)
            {
            case CipherMode.CBC:
            {
                // Cipher Block Chaining Mode.
                if (encrypt)
                {
                    state        = CryptoMethods.EncryptCreate(algorithm, key);
                    processBlock = new ProcessBlock
                                       (CBCEncrypt.TransformBlock);
                    processFinal = new ProcessFinal
                                       (CBCEncrypt.TransformFinalBlock);
                }
                else
                {
                    CBCDecrypt.Initialize(this);
                    state        = CryptoMethods.DecryptCreate(algorithm, key);
                    processBlock = new ProcessBlock
                                       (CBCDecrypt.TransformBlock);
                    processFinal = new ProcessFinal
                                       (CBCDecrypt.TransformFinalBlock);
                }
            }
            break;

            case CipherMode.ECB:
            {
                // Electronic Code Book Mode.
                if (encrypt)
                {
                    state        = CryptoMethods.EncryptCreate(algorithm, key);
                    processBlock = new ProcessBlock
                                       (ECBEncrypt.TransformBlock);
                    processFinal = new ProcessFinal
                                       (ECBEncrypt.TransformFinalBlock);
                }
                else
                {
                    ECBDecrypt.Initialize(this);
                    state        = CryptoMethods.DecryptCreate(algorithm, key);
                    processBlock = new ProcessBlock
                                       (ECBDecrypt.TransformBlock);
                    processFinal = new ProcessFinal
                                       (ECBDecrypt.TransformFinalBlock);
                }
            }
            break;

            case CipherMode.OFB:
            {
                // Output Feed Back Mode.
                OFBEncrypt.Initialize(this);
                state        = CryptoMethods.EncryptCreate(algorithm, key);
                processBlock = new ProcessBlock
                                   (OFBEncrypt.TransformBlock);
                processFinal = new ProcessFinal
                                   (OFBEncrypt.TransformFinalBlock);
            }
            break;

            case CipherMode.CFB:
            {
                // Cipher Feed Back Mode.
                if (encrypt)
                {
                    CFBEncrypt.Initialize(this);
                    state        = CryptoMethods.EncryptCreate(algorithm, key);
                    processBlock = new ProcessBlock
                                       (CFBEncrypt.TransformBlock);
                    processFinal = new ProcessFinal
                                       (CFBEncrypt.TransformFinalBlock);
                }
                else
                {
                    CFBDecrypt.Initialize(this);
                    state        = CryptoMethods.EncryptCreate(algorithm, key);
                    processBlock = new ProcessBlock
                                       (CFBDecrypt.TransformBlock);
                    processFinal = new ProcessFinal
                                       (CFBDecrypt.TransformFinalBlock);
                }
            }
            break;

            case CipherMode.CTS:
            {
                // Cipher Text Stealing Mode.
                if (encrypt)
                {
                    CTSEncrypt.Initialize(this);
                    state        = CryptoMethods.EncryptCreate(algorithm, key);
                    processBlock = new ProcessBlock
                                       (CTSEncrypt.TransformBlock);
                    processFinal = new ProcessFinal
                                       (CTSEncrypt.TransformFinalBlock);
                }
                else
                {
                    // We need an encryptor as well to handle
                    // streams with only a single block in them.
                    CTSDecrypt.Initialize(this);
                    state  = CryptoMethods.DecryptCreate(algorithm, key);
                    state2 = CryptoMethods.EncryptCreate
                                 (algorithm, key);
                    processBlock = new ProcessBlock
                                       (CTSDecrypt.TransformBlock);
                    processFinal = new ProcessFinal
                                       (CTSDecrypt.TransformFinalBlock);
                }
            }
            break;
            }
        }