Пример #1
0
        /// <summary>
        /// Шифрование (зашифрование или расшифрование) заключительного
        /// массива байтов.
        /// </summary>
        ///
        /// <param name="inputBuffer">Входной массив байтов.</param>
        /// <param name="inputOffset">Смещение от начала входного
        /// массива.</param>
        /// <param name="inputCount">Число обрабатываемых байтов входного
        /// массива.</param>
        ///
        /// <returns>Зашифрованный или расшифрованный оконечный
        /// блок.</returns>
        ///
        /// <argnull name="inputBuffer" />
        /// <exception cref="ArgumentOutOfRangeException">
        /// <paramref name="inputOffset"/> меньше нуля.</exception>
        /// <exception cref="ArgumentException">
        /// <paramref name="inputCount"/> меньше нуля или
        /// входной блок выходит за границы массива.</exception>
        /// <exception cref="CryptographicException">При расшифровании
        /// в блочном режиме массива байтов с разером не кратным
        /// размеру блока.</exception>
        public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset,
                                          int inputCount)
        {
            if (inputBuffer == null)
            {
                throw new ArgumentNullException("inputBuffer");
            }
            if (inputOffset < 0)
            {
                throw new ArgumentOutOfRangeException("inputOffset",
                                                      SR.ArgumentOutOfRange_NeedNonNegNum);
            }
            if ((inputCount < 0) || (inputCount > inputBuffer.Length))
            {
                throw new ArgumentException(
                          SR.Argument_InvalidValue);
            }
            if ((inputBuffer.Length - inputCount) < inputOffset)
            {
                throw new ArgumentException(SR.Argument_InvalidValue);
            }

            if (_encrypting)
            {
                byte[] buffer1 = null;
                CapiHelper.EncryptDataCp(_safeProvHandle, safeKeyHandle_, inputBuffer, inputOffset,
                                         inputCount, ref buffer1, 0, _paddingValue, true, _isStream);
                Reset();
                return(buffer1);
            }
            // На поточных алгоритмах не проверяем соответствие длин.
            if (_isStream)
            {
                byte[] buffer2 = null;
                CapiHelper.DecryptDataCp(safeKeyHandle_, inputBuffer, inputOffset,
                                         inputCount, ref buffer2, 0, _paddingValue, true);
                Reset();
                return(buffer2);
            }
            if ((inputCount % InputBlockSize) != 0)
            {
                throw new CryptographicException(SR.Argument_InvalidValue);
            }
            if (depadBuffer_ == null)
            {
                byte[] buffer2 = null;
                CapiHelper.DecryptDataCp(safeKeyHandle_, inputBuffer, inputOffset,
                                         inputCount, ref buffer2, 0, _paddingValue, true);
                Reset();
                return(buffer2);
            }
            byte[] buffer3 = new byte[depadBuffer_.Length + inputCount];
            Array.Copy(depadBuffer_, 0, buffer3, 0, depadBuffer_.Length);
            Array.Copy(inputBuffer, inputOffset, buffer3, depadBuffer_.Length,
                       inputCount);
            byte[] buffer4 = null;
            CapiHelper.DecryptDataCp(safeKeyHandle_, buffer3, 0, buffer3.Length,
                                     ref buffer4, 0, _paddingValue, true);
            Reset();
            return(buffer4);
        }
Пример #2
0
        /// <summary>
        /// Шифрование (зашифрование или расшифрование)
        /// заданной области входного массива байтов и в заданную
        /// область выходного массива байтов.
        /// </summary>
        ///
        /// <param name="inputBuffer">Входной массив байтов.</param>
        /// <param name="inputOffset">Смещение от начала входного
        /// массива.</param>
        /// <param name="inputCount">Число обрабатываемых байтов входного
        /// массива.</param>
        /// <param name="outputBuffer">Выходной массив байтов.</param>
        /// <param name="outputOffset">Смещение от начала выходного
        /// массива.</param>
        ///
        /// <returns>Количество записанных байтов.</returns>
        ///
        /// <argnull name="inputBuffer" />
        /// <argnull name="outputBuffer" />
        ///
        /// <exception cref="ArgumentException">Длина входного массива меньше
        /// суммы смещения от его начала и числа обрабатываемых
        /// байтов.</exception>
        ///
        /// <exception cref="ArgumentOutOfRangeException">Если начальное
        /// смещение отрицательно.</exception>
        public int TransformBlock(byte[] inputBuffer, int inputOffset,
                                  int inputCount, byte[] outputBuffer, int outputOffset)
        {
            if (inputBuffer == null)
            {
                throw new ArgumentNullException("inputBuffer");
            }
            if (outputBuffer == null)
            {
                throw new ArgumentNullException("outputBuffer");
            }
            if (inputOffset < 0)
            {
                throw new ArgumentOutOfRangeException("inputOffset", SR.ArgumentOutOfRange_NeedNonNegNum);
            }
            if (((inputCount <= 0) || ((inputCount % InputBlockSize) != 0)) ||
                (inputCount > inputBuffer.Length))
            {
                throw new ArgumentException(SR.Argument_InvalidValue);
            }
            if ((inputBuffer.Length - inputCount) < inputOffset)
            {
                throw new ArgumentException(SR.Argument_InvalidValue);
            }
            if (_encrypting)
            {
                return(CapiHelper.EncryptDataCp(_safeProvHandle, safeKeyHandle_, inputBuffer,
                                                inputOffset, inputCount, ref outputBuffer, outputOffset,
                                                _paddingValue, false, _isStream));
            }
            if ((_paddingValue == PaddingMode.Zeros) ||
                (_paddingValue == PaddingMode.None))
            {
                return(CapiHelper.DecryptDataCp(safeKeyHandle_, inputBuffer,
                                                inputOffset, inputCount, ref outputBuffer, outputOffset,
                                                _paddingValue, false));
            }
            if (depadBuffer_ == null)
            {
                depadBuffer_ = new byte[InputBlockSize];
                int num1 = inputCount - InputBlockSize;
                Array.Copy(inputBuffer, inputOffset + num1,
                           depadBuffer_, 0, InputBlockSize);
                return(CapiHelper.DecryptDataCp(safeKeyHandle_, inputBuffer,
                                                inputOffset, num1, ref outputBuffer, outputOffset,
                                                _paddingValue, false));
            }
            int num2 = CapiHelper.DecryptDataCp(safeKeyHandle_, depadBuffer_,
                                                0, depadBuffer_.Length, ref outputBuffer, outputOffset,
                                                _paddingValue, false);

            outputOffset += OutputBlockSize;
            int num3 = inputCount - InputBlockSize;

            Array.Copy(inputBuffer, inputOffset + num3,
                       depadBuffer_, 0, InputBlockSize);
            num2 = CapiHelper.DecryptDataCp(safeKeyHandle_, inputBuffer,
                                            inputOffset, num3, ref outputBuffer, outputOffset,
                                            _paddingValue, false);
            return(OutputBlockSize + num2);
        }