Annotation of truecrypt/volume/keyfile.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 "Platform/Serializer.h"
        !            10: #include "Crc32.h"
        !            11: #include "Keyfile.h"
        !            12: 
        !            13: namespace TrueCrypt
        !            14: {
        !            15:        void Keyfile::Apply (const BufferPtr &pool) const
        !            16:        {
        !            17:                if (Path.IsDirectory())
        !            18:                        throw ParameterIncorrect (SRC_POS);
        !            19: 
        !            20:                File file;
        !            21:                file.Open (Path, File::OpenRead, File::ShareRead, File::PreserveTimestamps);
        !            22: 
        !            23:                Crc32 crc32;
        !            24:                size_t poolPos = 0;
        !            25:                uint64 totalLength = 0;
        !            26:                uint64 readLength;
        !            27: 
        !            28:                SecureBuffer keyfileBuf (File::GetOptimalReadSize());
        !            29: 
        !            30:                while ((readLength = file.Read (keyfileBuf)) > 0)
        !            31:                {
        !            32:                        for (size_t i = 0; i < readLength; i++)
        !            33:                        {
        !            34:                                uint32 crc = crc32.Process (keyfileBuf[i]);
        !            35: 
        !            36:                                pool[poolPos++] += (byte) (crc >> 24);
        !            37:                                pool[poolPos++] += (byte) (crc >> 16);
        !            38:                                pool[poolPos++] += (byte) (crc >> 8);
        !            39:                                pool[poolPos++] += (byte) crc;
        !            40: 
        !            41:                                if (poolPos >= pool.Size())
        !            42:                                        poolPos = 0;
        !            43: 
        !            44:                                if (++totalLength >= MaxProcessedLength)
        !            45:                                        goto done;
        !            46:                        }
        !            47:                }
        !            48: done:
        !            49:                if (totalLength < MinProcessedLength)
        !            50:                        throw InsufficientData (SRC_POS, Path);
        !            51:        }
        !            52: 
        !            53:        shared_ptr <VolumePassword> Keyfile::ApplyListToPassword (shared_ptr <KeyfileList> keyfiles, shared_ptr <VolumePassword> password)
        !            54:        {
        !            55:                if (!password)
        !            56:                        password.reset (new VolumePassword);
        !            57: 
        !            58:                if (!keyfiles || keyfiles->size() < 1)
        !            59:                        return password;
        !            60: 
        !            61:                KeyfileList keyfilesExp;
        !            62: 
        !            63:                // Enumerate directories
        !            64:                foreach (shared_ptr <Keyfile> keyfile, *keyfiles)
        !            65:                {
        !            66:                        if (FilesystemPath (*keyfile).GetType() == FilesystemPathType::Directory)
        !            67:                        {
        !            68:                                foreach_ref (const FilePath &path, Directory::GetFilePaths (*keyfile))
        !            69:                                {
        !            70:                                        keyfilesExp.push_back (make_shared <Keyfile> (path));
        !            71:                                }
        !            72:                        }
        !            73:                        else
        !            74:                        {
        !            75:                                keyfilesExp.push_back (keyfile);
        !            76:                        }
        !            77:                }
        !            78: 
        !            79:                make_shared_auto (VolumePassword, newPassword);
        !            80: 
        !            81:                if (keyfilesExp.size() < 1)
        !            82:                {
        !            83:                        newPassword->Set (*password);
        !            84:                }
        !            85:                else
        !            86:                {
        !            87:                        SecureBuffer keyfilePool (VolumePassword::MaxSize);
        !            88: 
        !            89:                        // Pad password with zeros if shorter than max length
        !            90:                        keyfilePool.Zero();
        !            91:                        keyfilePool.CopyFrom (ConstBufferPtr (password->DataPtr(), password->Size()));
        !            92: 
        !            93:                        // Apply all keyfiles
        !            94:                        foreach_ref (const Keyfile &k, keyfilesExp)
        !            95:                        {
        !            96:                                k.Apply (keyfilePool);
        !            97:                        }
        !            98: 
        !            99:                        newPassword->Set (keyfilePool);
        !           100:                }
        !           101: 
        !           102:                return newPassword;
        !           103:        }
        !           104: 
        !           105:        shared_ptr <KeyfileList> Keyfile::DeserializeList (shared_ptr <Stream> stream, const string &name)
        !           106:        {
        !           107:                shared_ptr <KeyfileList> keyfiles;
        !           108:                Serializer sr (stream);
        !           109:                
        !           110:                if (!sr.DeserializeBool (name + "Null"))
        !           111:                {
        !           112:                        keyfiles.reset (new KeyfileList);
        !           113:                        foreach (const wstring &k, sr.DeserializeWStringList (name))
        !           114:                                keyfiles->push_back (make_shared <Keyfile> (k));
        !           115:                }
        !           116:                return keyfiles;
        !           117:        }
        !           118: 
        !           119:        void Keyfile::SerializeList (shared_ptr <Stream> stream, const string &name, shared_ptr <KeyfileList> keyfiles)
        !           120:        {
        !           121:                Serializer sr (stream);
        !           122:                sr.Serialize (name + "Null", keyfiles == nullptr);
        !           123:                if (keyfiles)
        !           124:                {
        !           125:                        list <wstring> sl;
        !           126: 
        !           127:                        foreach_ref (const Keyfile &k, *keyfiles)
        !           128:                                sl.push_back (FilesystemPath (k));
        !           129: 
        !           130:                        sr.Serialize (name, sl);
        !           131:                }
        !           132:        }
        !           133: }

unix.superglobalmegacorp.com

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