Annotation of truecrypt/common/password.c, revision 1.1

1.1     ! root        1: /* Copyright (C) 2004 TrueCrypt Team, truecrypt.org
        !             2:    This product uses components written by Paul Le Roux <[email protected]> */
        !             3: 
        !             4: #include "TCdefs.h"
        !             5: 
        !             6: #include "crypto.h"
        !             7: #include "fat.h"
        !             8: #include "format.h"
        !             9: #include "volumes.h"
        !            10: #include "password.h"
        !            11: #include "apidrvr.h"
        !            12: #include "dlgcode.h"
        !            13: #include "pkcs5.h"
        !            14: #include "endian.h"
        !            15: 
        !            16: #include <io.h>
        !            17: 
        !            18: void
        !            19: VerifyPasswordAndUpdate (HWND hwndDlg, HWND hButton, HWND hPassword,
        !            20:                         HWND hVerify, char *szPassword,
        !            21:                         char *szVerify)
        !            22: {
        !            23:        char szTmp1[MAX_PASSWORD + 1];
        !            24:        char szTmp2[MAX_PASSWORD + 1];
        !            25:        int k = GetWindowTextLength (hPassword);
        !            26:        BOOL bEnable = FALSE;
        !            27: 
        !            28:        if (hwndDlg);           /* Remove warning */
        !            29: 
        !            30:        GetWindowText (hPassword, szTmp1, sizeof (szTmp1));
        !            31:        GetWindowText (hVerify, szTmp2, sizeof (szTmp2));
        !            32: 
        !            33:        if (strcmp (szTmp1, szTmp2) != 0)
        !            34:                bEnable = FALSE;
        !            35:        else
        !            36:        {
        !            37:                if (k >= MIN_PASSWORD)
        !            38:                        bEnable = TRUE;
        !            39:                else
        !            40:                        bEnable = FALSE;
        !            41:        }
        !            42: 
        !            43:        if (szPassword != NULL)
        !            44:                memcpy (szPassword, szTmp1, sizeof (szTmp1));
        !            45: 
        !            46:        if (szVerify != NULL)
        !            47:                memcpy (szVerify, szTmp2, sizeof (szTmp2));
        !            48: 
        !            49:        burn (szTmp1, sizeof (szTmp1));
        !            50:        burn (szTmp2, sizeof (szTmp2));
        !            51: 
        !            52:        EnableWindow (hButton, bEnable);
        !            53: }
        !            54: 
        !            55: int
        !            56: ChangePwd (char *lpszVolume, char *lpszOldPassword, char *lpszPassword)
        !            57: {
        !            58:        int nDosLinkCreated = 0, nStatus;
        !            59:        char szDiskFile[TC_MAX_PATH], szCFDevice[TC_MAX_PATH];
        !            60:        char szDosDevice[TC_MAX_PATH];
        !            61:        char buffer[SECTOR_SIZE], boot[SECTOR_SIZE];
        !            62:        PCRYPTO_INFO cryptoInfo = NULL, ci = NULL;
        !            63:        void *dev = INVALID_HANDLE_VALUE;
        !            64:        OPEN_TEST_STRUCT driver;
        !            65:        DISKIO_STRUCT win9x_r0;
        !            66:        diskio_f write, read;
        !            67:        DWORD dwError;
        !            68:        BOOL bDevice;
        !            69:        
        !            70:        if (Randinit ()) return 1;
        !            71: 
        !            72:        CreateFullVolumePath (szDiskFile, lpszVolume, &bDevice);
        !            73: 
        !            74:        if (nCurrentOS == WIN_NT || bDevice == FALSE)
        !            75:        {
        !            76:                write = (diskio_f) _lwrite;
        !            77:                read = (diskio_f) _lread;
        !            78: 
        !            79:                if (bDevice == FALSE)
        !            80:                {
        !            81:                        strcpy (szCFDevice, szDiskFile);
        !            82:                }
        !            83:                else
        !            84:                {
        !            85:                        nDosLinkCreated = FakeDosNameForDevice (szDiskFile, szDosDevice, szCFDevice, FALSE);
        !            86:                        if (nDosLinkCreated != 0)
        !            87:                        {
        !            88:                                return nDosLinkCreated;
        !            89:                        }
        !            90:                }
        !            91: 
        !            92:                dev = CreateFile (szCFDevice, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
        !            93:        }
        !            94:        else
        !            95:        {
        !            96:                write = (diskio_f) win9x_io;
        !            97:                read = (diskio_f) win9x_io;
        !            98: 
        !            99:                if (OpenDevice (lpszVolume, &driver) == FALSE)
        !           100:                {
        !           101:                        return ERR_OS_ERROR;
        !           102:                }
        !           103:                else if (driver.secstart == driver.seclast)
        !           104:                {
        !           105:                        return ERR_ACCESS_DENIED;
        !           106:                }
        !           107: 
        !           108:                win9x_r0.devicenum = driver.device;
        !           109:                win9x_r0.sectorstart = driver.secstart;
        !           110: 
        !           111:                dev = &win9x_r0;
        !           112:        }
        !           113: 
        !           114:        if (dev == INVALID_HANDLE_VALUE)
        !           115:        {
        !           116:                return ERR_OS_ERROR;
        !           117:        }
        !           118: 
        !           119: 
        !           120:        WaitCursor ();
        !           121: 
        !           122:        win9x_r0.mode = 0;
        !           123: 
        !           124:        /* Read in volume */
        !           125:        nStatus = (*read) ((HFILE) dev, buffer, sizeof (buffer));
        !           126:        if (nStatus != sizeof (buffer))
        !           127:        {
        !           128:                nStatus = ERR_VOL_SIZE_WRONG;
        !           129:                goto error;
        !           130:        }
        !           131: 
        !           132:        memcpy (boot, buffer, SECTOR_SIZE);
        !           133: 
        !           134:        /* Parse header */
        !           135:        nStatus = VolumeReadHeader (buffer, lpszOldPassword, &cryptoInfo);
        !           136:        if (nStatus != 0)
        !           137:        {
        !           138:                cryptoInfo = NULL;
        !           139:                goto error;
        !           140:        }
        !           141: 
        !           142:        /* Change password now */ 
        !           143: 
        !           144:        if (dev != &win9x_r0)
        !           145:        {
        !           146:                nStatus = _llseek ((HFILE) dev, 0, FILE_BEGIN);
        !           147: 
        !           148:                if (nStatus != 0)
        !           149:                {
        !           150:                        nStatus = ERR_VOL_SEEKING;
        !           151:                        goto error;
        !           152:                }
        !           153:        }
        !           154: 
        !           155:        win9x_r0.mode = 1;
        !           156:        win9x_r0.sectorstart -= 1;
        !           157: 
        !           158:        VolumeWriteHeader (boot,
        !           159:                cryptoInfo->cipher,
        !           160:                lpszPassword,
        !           161:                cryptoInfo->pkcs5,
        !           162:                cryptoInfo->master_decrypted_key,
        !           163:                cryptoInfo->volume_creation_time,
        !           164:                &ci);
        !           165: 
        !           166:        crypto_close (ci);
        !           167: 
        !           168:        /* Write out new encrypted key + key check */
        !           169:        nStatus = (*write) ((HFILE) dev, boot, SECTOR_SIZE);
        !           170: 
        !           171:        if (nStatus != SECTOR_SIZE)
        !           172:        {
        !           173:                nStatus = ERR_VOL_WRITING;
        !           174:                goto error;
        !           175:        }
        !           176: 
        !           177:        /* That's it done... */
        !           178:        nStatus = 0;
        !           179: 
        !           180:       error:
        !           181: 
        !           182:        burn (buffer, sizeof (buffer));
        !           183: 
        !           184:        if (cryptoInfo != NULL)
        !           185:                crypto_close (cryptoInfo);
        !           186: 
        !           187:        dwError = GetLastError ();
        !           188: 
        !           189:        if (dev != &win9x_r0)
        !           190:        {
        !           191:                CloseHandle ((HANDLE) dev);
        !           192: 
        !           193:                if (bDevice == TRUE && nDosLinkCreated != 0)
        !           194:                {
        !           195:                        int x = RemoveFakeDosName (szDiskFile, szDosDevice);
        !           196:                        if (x != 0)
        !           197:                        {
        !           198:                                dwError = GetLastError ();
        !           199:                                nStatus = x;
        !           200:                        }
        !           201:                }
        !           202:        }
        !           203: 
        !           204:        SetLastError (dwError);
        !           205: 
        !           206:        NormalCursor ();
        !           207: 
        !           208:        return nStatus;
        !           209: }

unix.superglobalmegacorp.com

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