Annotation of truecrypt/volume/volumepassword.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 "VolumePassword.h"
        !            10: #include "Platform/SerializerFactory.h"
        !            11: #include "Platform/StringConverter.h"
        !            12: 
        !            13: namespace TrueCrypt
        !            14: {
        !            15:        VolumePassword::VolumePassword () : PasswordSize (0), Unportable (false)
        !            16:        {
        !            17:                AllocateBuffer ();
        !            18:        }
        !            19: 
        !            20:        VolumePassword::VolumePassword (const char *password, size_t size)
        !            21:        {
        !            22:                Set ((const byte *) password, size);
        !            23:        }
        !            24: 
        !            25:        VolumePassword::VolumePassword (const byte *password, size_t size)
        !            26:        {
        !            27:                Set (password, size);
        !            28:        }
        !            29: 
        !            30:        VolumePassword::VolumePassword (const wchar_t *password, size_t charCount)
        !            31:        {
        !            32:                Set (password, charCount);
        !            33:        }
        !            34: 
        !            35:        VolumePassword::VolumePassword (const wstring &password)
        !            36:        {
        !            37:                Set (password.c_str(), password.size());
        !            38:        }
        !            39: 
        !            40:        VolumePassword::~VolumePassword ()
        !            41:        {
        !            42:        }
        !            43: 
        !            44:        void VolumePassword::AllocateBuffer ()
        !            45:        {
        !            46:                if (!PasswordBuffer.IsAllocated ())
        !            47:                        PasswordBuffer.Allocate (MaxSize);
        !            48:        }
        !            49: 
        !            50:        void VolumePassword::CheckPortability () const
        !            51:        {
        !            52:                if (Unportable || !IsPortable())
        !            53:                        throw UnportablePassword (SRC_POS);
        !            54:        }
        !            55: 
        !            56:        void VolumePassword::Deserialize (shared_ptr <Stream> stream)
        !            57:        {
        !            58:                Serializer sr (stream);
        !            59:                uint64 passwordSize;
        !            60:                sr.Deserialize ("PasswordSize", passwordSize);
        !            61:                PasswordSize = static_cast <size_t> (passwordSize);
        !            62:                sr.Deserialize ("PasswordBuffer", BufferPtr (PasswordBuffer));
        !            63:                
        !            64:                Buffer wipeBuffer (128 * 1024);
        !            65:                sr.Deserialize ("WipeData", wipeBuffer);
        !            66:        }
        !            67: 
        !            68:        bool VolumePassword::IsPortable () const
        !            69:        {
        !            70:                for (size_t i = 0; i < PasswordSize; i++)
        !            71:                {
        !            72:                        if (PasswordBuffer[i] >= 0x7f || PasswordBuffer[i] < 0x20)
        !            73:                                return false;
        !            74:                }
        !            75:                return true;
        !            76:        }
        !            77: 
        !            78:        void VolumePassword::Serialize (shared_ptr <Stream> stream) const
        !            79:        {
        !            80:                Serializable::Serialize (stream);
        !            81:                Serializer sr (stream);
        !            82:                sr.Serialize ("PasswordSize", static_cast <uint64> (PasswordSize));
        !            83:                sr.Serialize ("PasswordBuffer", ConstBufferPtr (PasswordBuffer));
        !            84: 
        !            85:                // Wipe password from an eventual pipe buffer
        !            86:                Buffer wipeBuffer (128 * 1024);
        !            87:                wipeBuffer.Zero();
        !            88:                sr.Serialize ("WipeData", ConstBufferPtr (wipeBuffer));
        !            89:        }
        !            90: 
        !            91:        void VolumePassword::Set (const byte *password, size_t size)
        !            92:        {
        !            93:                AllocateBuffer ();
        !            94:                
        !            95:                if (size > MaxSize)
        !            96:                        throw PasswordTooLong (SRC_POS);
        !            97:                
        !            98:                PasswordBuffer.CopyFrom (ConstBufferPtr (password, size));
        !            99:                PasswordSize = size;
        !           100: 
        !           101:                Unportable = !IsPortable();
        !           102:        }
        !           103:        
        !           104:        void VolumePassword::Set (const wchar_t *password, size_t charCount)
        !           105:        {
        !           106:                if (charCount > MaxSize)
        !           107:                        throw PasswordTooLong (SRC_POS);
        !           108: 
        !           109:                union Conv
        !           110:                {
        !           111:                        byte b[sizeof (wchar_t)];
        !           112:                        wchar_t c;
        !           113:                };
        !           114: 
        !           115:                Conv conv;
        !           116:                conv.c = L'A';
        !           117:                
        !           118:                int lsbPos = -1;
        !           119:                for (size_t i = 0; i < sizeof (conv.b); ++i)
        !           120:                {
        !           121:                        if (conv.b[i] == L'A')
        !           122:                        {
        !           123:                                lsbPos = i;
        !           124:                                break;
        !           125:                        }
        !           126:                }
        !           127: 
        !           128:                if (lsbPos == -1)
        !           129:                        throw ParameterIncorrect (SRC_POS);
        !           130: 
        !           131:                bool unportable = false;
        !           132:                byte passwordBuf[MaxSize];
        !           133:                for (size_t i = 0; i < charCount; ++i)
        !           134:                {
        !           135:                        conv.c = password[i];
        !           136:                        passwordBuf[i] = conv.b[lsbPos];
        !           137:                        for (int j = 0; j < sizeof (wchar_t); ++j)
        !           138:                        {
        !           139:                                if (j != lsbPos && conv.b[j] != 0)
        !           140:                                        unportable = true;
        !           141:                        }
        !           142:                }
        !           143:                
        !           144:                Set (passwordBuf, charCount);
        !           145:                
        !           146:                if (unportable)
        !           147:                        Unportable = true;
        !           148:        }
        !           149: 
        !           150:        void VolumePassword::Set (const ConstBufferPtr &password)
        !           151:        {
        !           152:                Set (password, password.Size());
        !           153:        }
        !           154:        
        !           155:        void VolumePassword::Set (const VolumePassword &password)
        !           156:        {
        !           157:                Set (password.DataPtr(), password.Size());
        !           158:        }
        !           159: 
        !           160:        TC_SERIALIZER_FACTORY_ADD_CLASS (VolumePassword);
        !           161: 
        !           162: #define TC_EXCEPTION(TYPE) TC_SERIALIZER_FACTORY_ADD(TYPE)
        !           163: #undef TC_EXCEPTION_NODECL
        !           164: #define TC_EXCEPTION_NODECL(TYPE) TC_SERIALIZER_FACTORY_ADD(TYPE)
        !           165: 
        !           166:        TC_SERIALIZER_FACTORY_ADD_EXCEPTION_SET (PasswordException);
        !           167: }

unix.superglobalmegacorp.com

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