|
|
1.1 root 1: /*
2: Copyright (c) 2008 TrueCrypt Foundation. All rights reserved.
3:
1.1.1.3 ! root 4: Governed by the TrueCrypt License 2.6 the full text of which is contained
1.1 root 5: in the file License.txt included in TrueCrypt binary and source code
6: distribution packages.
7: */
8:
9: #include "Tcdefs.h"
10: #include "Wipe.h"
11:
12:
1.1.1.3 ! root 13: static BOOL Wipe1PseudoRandom (int pass, byte *buffer, size_t size)
! 14: {
! 15: return FALSE;
! 16: }
! 17:
! 18:
1.1 root 19: // Fill buffer with wipe patterns defined in "National Industrial Security Program Operating Manual", US DoD 5220.22-M.
20: // Return: FALSE = buffer must be filled with random data
21:
22: static BOOL Wipe3Dod5220 (int pass, byte *buffer, size_t size)
23: {
24: byte wipeChar;
25:
26: switch (pass)
27: {
28: case 1:
29: wipeChar = 0;
30: break;
31:
32: case 2:
33: wipeChar = 0xff;
34: break;
35:
36: default:
37: return FALSE;
38: }
39:
40: memset (buffer, wipeChar, size);
41: return TRUE;
42: }
43:
44:
45: static BOOL Wipe7Dod5220 (int pass, byte randChars[TC_WIPE_RAND_CHAR_COUNT], byte *buffer, size_t size)
46: {
47: byte wipeChar;
48:
49: switch (pass)
50: {
51: case 1:
52: wipeChar = randChars[0];
53: break;
54:
55: case 2:
56: wipeChar = ~randChars[0];
57: break;
58:
59: case 4:
60: wipeChar = randChars[1];
61: break;
62:
63: case 5:
64: wipeChar = randChars[2];
65: break;
66:
67: case 6:
68: wipeChar = ~randChars[2];
69: break;
70:
71: default:
72: return FALSE;
73: }
74:
75: memset (buffer, wipeChar, size);
76: return TRUE;
77: }
78:
79:
80: // Fill the buffer with wipe patterns defined in the paper "Secure Deletion of Data from Magnetic and Solid-State Memory" by Peter Gutmann.
81: // Return: FALSE = buffer must be filled with random data
82:
83: static BOOL Wipe35Gutmann (int pass, byte *buffer, size_t size)
84: {
85: byte wipePat3[] = { 0x92, 0x49, 0x24 };
86: int wipePat3Pos;
87: size_t i;
88:
89: switch (pass)
90: {
91: case 5:
92: memset (buffer, 0x55, size);
93: break;
94:
95: case 6:
96: memset (buffer, 0xaa, size);
97: break;
98:
99: case 7:
100: case 26:
101: case 29:
102: wipePat3Pos = 0;
103: goto wipe3;
104:
105: case 8:
106: case 27:
107: case 30:
108: wipePat3Pos = 1;
109: goto wipe3;
110:
111: case 9:
112: case 28:
113: case 31:
114: wipePat3Pos = 2;
115: goto wipe3;
116:
117: wipe3:
118: if (pass >= 29)
119: {
120: wipePat3[0] = ~wipePat3[0];
121: wipePat3[1] = ~wipePat3[1];
122: wipePat3[2] = ~wipePat3[2];
123: }
124:
125: for (i = 0; i < size; ++i)
126: {
127: buffer[i] = wipePat3[wipePat3Pos++ % 3];
128: }
129: break;
130:
131: default:
132: if (pass >= 10 && pass <= 25)
133: memset (buffer, (pass - 10) * 0x11, size);
134: else
135: return FALSE;
136: }
137:
138: return TRUE;
139: }
140:
141:
142: size_t GetWipePassCount (WipeAlgorithmId algorithm)
143: {
144: switch (algorithm)
145: {
1.1.1.3 ! root 146: case TC_WIPE_1_RAND:
! 147: return 1;
! 148:
1.1 root 149: case TC_WIPE_3_DOD_5220:
150: return 3;
151:
152: case TC_WIPE_7_DOD_5220:
153: return 7;
154:
155: case TC_WIPE_35_GUTMANN:
156: return 35;
157:
158: default:
159: TC_THROW_FATAL_EXCEPTION;
160: }
1.1.1.3 ! root 161:
! 162: return 0; // Prevent compiler warnings
1.1 root 163: }
164:
165:
166: BOOL WipeBuffer (WipeAlgorithmId algorithm, byte randChars[TC_WIPE_RAND_CHAR_COUNT], int pass, byte *buffer, size_t size)
167: {
168: switch (algorithm)
169: {
1.1.1.3 ! root 170: case TC_WIPE_1_RAND:
! 171: return Wipe1PseudoRandom (pass, buffer, size);
! 172:
1.1 root 173: case TC_WIPE_3_DOD_5220:
174: return Wipe3Dod5220 (pass, buffer, size);
175:
176: case TC_WIPE_7_DOD_5220:
177: return Wipe7Dod5220 (pass, randChars, buffer, size);
178:
179: case TC_WIPE_35_GUTMANN:
180: return Wipe35Gutmann (pass, buffer, size);
181:
182: default:
183: TC_THROW_FATAL_EXCEPTION;
184: }
1.1.1.3 ! root 185:
! 186: return FALSE; // Prevent compiler warnings
1.1 root 187: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.