Пример #1
0
        public virtual int DoFinal(
            byte[]  outBytes,
            int outOff)
        {
            InitCipher();

            int extra = bufOff;

            byte[] tmp = new byte[bufBlock.Length];

            bufOff = 0;

            if (forEncryption)
            {
                cipher.ProcessBlock(bufBlock, 0, tmp, 0);
                cipher.ProcessBlock(bufBlock, blockSize, tmp, blockSize);

                Array.Copy(tmp, 0, outBytes, outOff, extra);

                mac.BlockUpdate(tmp, 0, extra);

                CalculateMac();

                Array.Copy(macBlock, 0, outBytes, outOff + extra, macSize);

                Reset(false);

                return(extra + macSize);
            }
            else
            {
                if (extra > macSize)
                {
                    mac.BlockUpdate(bufBlock, 0, extra - macSize);

                    cipher.ProcessBlock(bufBlock, 0, tmp, 0);
                    cipher.ProcessBlock(bufBlock, blockSize, tmp, blockSize);

                    Array.Copy(tmp, 0, outBytes, outOff, extra - macSize);
                }

                CalculateMac();

                if (!VerifyMac(bufBlock, extra - macSize))
                {
                    throw new InvalidCipherTextException("mac check in EAX failed");
                }

                Reset(false);

                return(extra - macSize);
            }
        }