Annotation of truecrypt/volume/encryptionmodelrw.cpp, revision 1.1

1.1     ! root        1: /*
        !             2:  Copyright (c) 2008 TrueCrypt Foundation. All rights reserved.
        !             3: 
        !             4:  Governed by the TrueCrypt License 2.4 the full text of which is contained
        !             5:  in the file License.txt included in TrueCrypt binary and source code
        !             6:  distribution packages.
        !             7: */
        !             8: 
        !             9: #include "EncryptionModeLRW.h"
        !            10: #include "Common/GfMul.h"
        !            11: 
        !            12: namespace TrueCrypt
        !            13: {
        !            14:        void EncryptionModeLRW::Decrypt (byte *data, uint64 length) const
        !            15:        {
        !            16:                if_debug (ValidateState ());
        !            17:                DecryptBuffer (data, length, 1);
        !            18:        }
        !            19: 
        !            20:        void EncryptionModeLRW::DecryptBuffer (byte *data, uint64 length, uint64 blockIndex) const
        !            21:        {
        !            22:                size_t blockSize = Ciphers.front()->GetBlockSize();
        !            23:                if (blockSize != 8 && blockSize != 16)
        !            24:                        throw ParameterIncorrect (SRC_POS);
        !            25: 
        !            26:                byte i[8];
        !            27:                *(uint64 *)i = Endian::Big (blockIndex);
        !            28: 
        !            29:                byte t[Cipher::MaxBlockSize];
        !            30: 
        !            31:                for (unsigned int b = 0; b < length / blockSize; b++)
        !            32:                {
        !            33:                        if (blockSize == 8)
        !            34:                        {
        !            35:                                Gf64MulTab (i, t, (GfCtx *) (GfContext.Ptr()));
        !            36:                                Xor64 ((uint64 *)data, (uint64 *)t);
        !            37:                        }
        !            38:                        else
        !            39:                        {
        !            40:                                Gf128MulBy64Tab (i, t, (GfCtx *) (GfContext.Ptr()));
        !            41:                                Xor128 ((uint64 *)data, (uint64 *)t);
        !            42:                        }
        !            43: 
        !            44:                        for (CipherList::const_reverse_iterator iCipherList = Ciphers.rbegin();
        !            45:                                iCipherList != Ciphers.rend();
        !            46:                                ++iCipherList)
        !            47:                        {
        !            48:                                const Cipher &c = **iCipherList;
        !            49: 
        !            50:                                if (c.GetBlockSize () != blockSize)
        !            51:                                        throw ParameterIncorrect (SRC_POS);
        !            52: 
        !            53:                                c.DecryptBlock (data);
        !            54:                        }
        !            55: 
        !            56:                        if (blockSize == 8)
        !            57:                                Xor64 ((uint64 *)data, (uint64 *)t);
        !            58:                        else
        !            59:                                Xor128 ((uint64 *)data, (uint64 *)t);
        !            60: 
        !            61:                        data += blockSize;
        !            62:                        IncrementBlockIndex (i);
        !            63:                }
        !            64: 
        !            65:                Memory::Erase (t, sizeof (t));
        !            66:        }
        !            67: 
        !            68:        void EncryptionModeLRW::DecryptSectors (byte *data, uint64 sectorIndex, uint64 sectorCount, size_t sectorSize) const
        !            69:        {
        !            70:                if_debug (ValidateState ());
        !            71:                if_debug (ValidateParameters (data, sectorCount, sectorSize));
        !            72: 
        !            73:                DecryptBuffer (data,
        !            74:                        sectorCount * sectorSize,
        !            75:                        SectorToBlockIndex (sectorIndex));
        !            76:        }
        !            77: 
        !            78:        void EncryptionModeLRW::Encrypt (byte *data, uint64 length) const
        !            79:        {
        !            80:                ValidateState ();
        !            81:                EncryptBuffer (data, length, 1);
        !            82:        }
        !            83: 
        !            84:        void EncryptionModeLRW::EncryptBuffer (byte *data, uint64 length, uint64 blockIndex) const
        !            85:        {
        !            86:                size_t blockSize = Ciphers.front()->GetBlockSize();
        !            87:                if (blockSize != 8 && blockSize != 16)
        !            88:                        throw ParameterIncorrect (SRC_POS);
        !            89: 
        !            90:                byte i[8];
        !            91:                *(uint64 *)i = Endian::Big (blockIndex);
        !            92: 
        !            93:                byte t[Cipher::MaxBlockSize];
        !            94: 
        !            95:                for (unsigned int b = 0; b < length / blockSize; b++)
        !            96:                {
        !            97:                        if (blockSize == 8)
        !            98:                        {
        !            99:                                Gf64MulTab (i, t, (GfCtx *) (GfContext.Ptr()));
        !           100:                                Xor64 ((uint64 *)data, (uint64 *)t);
        !           101:                        }
        !           102:                        else
        !           103:                        {
        !           104:                                Gf128MulBy64Tab (i, t, (GfCtx *) (GfContext.Ptr()));
        !           105:                                Xor128 ((uint64 *)data, (uint64 *)t);
        !           106:                        }
        !           107: 
        !           108:                        for (CipherList::const_iterator iCipherList = Ciphers.begin();
        !           109:                                iCipherList != Ciphers.end();
        !           110:                                ++iCipherList)
        !           111:                        {
        !           112:                                const Cipher &c = **iCipherList;
        !           113: 
        !           114:                                if (c.GetBlockSize () != blockSize)
        !           115:                                        throw ParameterIncorrect (SRC_POS);
        !           116: 
        !           117:                                c.EncryptBlock (data);
        !           118:                        }
        !           119: 
        !           120:                        if (blockSize == 8)
        !           121:                                Xor64 ((uint64 *)data, (uint64 *)t);
        !           122:                        else
        !           123:                                Xor128 ((uint64 *)data, (uint64 *)t);
        !           124: 
        !           125:                        data += blockSize;
        !           126:                        IncrementBlockIndex (i);
        !           127:                }
        !           128: 
        !           129:                Memory::Erase (t, sizeof (t));
        !           130:        }
        !           131: 
        !           132:        void EncryptionModeLRW::EncryptSectors (byte *data, uint64 sectorIndex, uint64 sectorCount, size_t sectorSize) const
        !           133:        {
        !           134:                if_debug (ValidateState ());
        !           135:                if_debug (ValidateParameters (data, sectorCount, sectorSize));
        !           136: 
        !           137:                EncryptBuffer (data,
        !           138:                        sectorCount * sectorSize,
        !           139:                        SectorToBlockIndex (sectorIndex));
        !           140:        }
        !           141: 
        !           142:        void EncryptionModeLRW::IncrementBlockIndex (byte *index) const
        !           143:        {
        !           144:                if (index[7] != 0xff)
        !           145:                        index[7]++;
        !           146:                else
        !           147:                        *(uint64 *)index = Endian::Big ( Endian::Big (*(uint64 *)index) + 1 );
        !           148:        }
        !           149: 
        !           150:        uint64 EncryptionModeLRW::SectorToBlockIndex (uint64 sectorIndex) const
        !           151:        {
        !           152:                sectorIndex -= SectorOffset;
        !           153: 
        !           154:                switch (Ciphers.front()->GetBlockSize())
        !           155:                {
        !           156:                case 8:
        !           157:                        return (sectorIndex << 6) | 1;
        !           158: 
        !           159:                case 16:
        !           160:                        return (sectorIndex << 5) | 1;
        !           161:                
        !           162:                default:
        !           163:                        throw ParameterIncorrect (SRC_POS);
        !           164:                }
        !           165:        }
        !           166: 
        !           167:        void EncryptionModeLRW::SetKey (const ConstBufferPtr &key)
        !           168:        {
        !           169:                if (key.Size() != 16)
        !           170:                        throw ParameterIncorrect (SRC_POS);
        !           171: 
        !           172:                if (!KeySet)
        !           173:                        GfContext.Allocate (sizeof (GfCtx));
        !           174: 
        !           175:                if (!Gf64TabInit ((unsigned char *) key.Get(), (GfCtx *) (GfContext.Ptr())))
        !           176:                        throw bad_alloc();
        !           177: 
        !           178:                if (!Gf128Tab64Init ((unsigned char *) key.Get(), (GfCtx *) (GfContext.Ptr())))
        !           179:                        throw bad_alloc();
        !           180: 
        !           181:                KeySet = true;
        !           182:        }
        !           183: 
        !           184:        void EncryptionModeLRW::Xor64 (uint64 *a, const uint64 *b) const
        !           185:        {
        !           186:                *a ^= *b;
        !           187:        }
        !           188: 
        !           189:        void EncryptionModeLRW::Xor128 (uint64 *a, const uint64 *b) const
        !           190:        {
        !           191:                *a++ ^= *b++;
        !           192:                *a ^= *b;
        !           193:        }
        !           194: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.