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