Update README.md
[nemesis.git] / Platform / Memory.h
1 /*
2  Copyright (c) 2008-2009 TrueCrypt Developers Association. All rights reserved.
3
4  Governed by the TrueCrypt License 3.0 the full text of which is contained in
5  the file License.txt included in TrueCrypt binary and source code distribution
6  packages.
7 */
8
9 #ifndef TC_HEADER_Platform_Memory
10 #define TC_HEADER_Platform_Memory
11
12 #include <new>
13 #include <memory.h>
14 #include "PlatformBase.h"
15
16 #ifdef TC_WINDOWS
17
18 #       ifndef LITTLE_ENDIAN
19 #               define LITTLE_ENDIAN 1234
20 #       endif
21 #       ifndef BYTE_ORDER
22 #               define BYTE_ORDER LITTLE_ENDIAN
23 #       endif
24
25 #elif !defined(BYTE_ORDER)
26
27 #       ifdef TC_MACOSX
28 #               include <machine/endian.h>
29 #       elif defined (TC_BSD)
30 #               include <sys/endian.h>
31 #       elif defined (TC_SOLARIS)
32 #               include <sys/types.h>
33 #               define LITTLE_ENDIAN 1234
34 #               define BIG_ENDIAN 4321
35 #               ifdef _BIG_ENDIAN
36 #                       define BYTE_ORDER BIG_ENDIAN
37 #               else
38 #                       define BYTE_ORDER LITTLE_ENDIAN
39 #               endif
40 #       else
41 #               include <endian.h>
42 #       endif
43
44 #       ifndef BYTE_ORDER
45 #               ifndef __BYTE_ORDER
46 #                       error Byte ordering cannot be determined (BYTE_ORDER undefined).
47 #               endif
48
49 #               define BYTE_ORDER __BYTE_ORDER
50 #       endif
51
52 #       ifndef LITTLE_ENDIAN
53 #               define LITTLE_ENDIAN __LITTLE_ENDIAN
54 #       endif
55
56 #       ifndef BIG_ENDIAN
57 #               define BIG_ENDIAN __BIG_ENDIAN
58 #       endif
59
60 #endif // !BYTE_ORDER
61
62 #if BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN
63 #       error Unsupported byte ordering detected.
64 #endif
65
66 namespace TrueCrypt
67 {
68         class Memory
69         {
70         public:
71                 static void *Allocate (size_t size);
72                 static int Compare (const void *memory1, size_t size1, const void *memory2, size_t size2);
73                 static void Copy (void *memoryDestination, const void *memorySource, size_t size);
74                 static void Erase (void *memory, size_t size);
75                 static void Free (void *memory);
76                 static void Zero (void *memory, size_t size);
77         };
78
79         class Endian
80         {
81         public:
82                 static byte Big (const byte &x)
83                 {
84                         return x;
85                 }
86
87                 static uint16 Big (const uint16 &x)
88                 {
89 #if BYTE_ORDER == BIG_ENDIAN
90                         return x;
91 #else
92                         return MirrorBytes (x);
93 #endif
94                 }
95
96                 static uint32 Big (const uint32 &x)
97                 {
98 #if BYTE_ORDER == BIG_ENDIAN
99                         return x;
100 #else
101                         return MirrorBytes (x);
102 #endif
103                 }
104
105                 static uint64 Big (const uint64 &x)
106                 {
107 #if BYTE_ORDER == BIG_ENDIAN
108                         return x;
109 #else
110                         return MirrorBytes (x);
111 #endif
112                 }
113
114                 static byte Little (const byte &x)
115                 {
116                         return x;
117                 }
118
119                 static uint16 Little (const uint16 &x)
120                 {
121 #if BYTE_ORDER == LITTLE_ENDIAN
122                         return x;
123 #else
124                         return MirrorBytes (x);
125 #endif
126                 }
127
128                 static uint32 Little (const uint32 &x)
129                 {
130 #if BYTE_ORDER == LITTLE_ENDIAN
131                         return x;
132 #else
133                         return MirrorBytes (x);
134 #endif
135                 }
136
137                 static uint64 Little (const uint64 &x)
138                 {
139 #if BYTE_ORDER == LITTLE_ENDIAN
140                         return x;
141 #else
142                         return MirrorBytes (x);
143 #endif
144                 }
145
146         protected:
147                 static uint16 MirrorBytes (const uint16 &x)
148                 {
149                         return (x << 8) | (x >> 8);
150                 }
151
152                 static uint32 MirrorBytes (const uint32 &x)
153                 {
154                         uint32 n = (byte) x;
155                         n <<= 8; n |= (byte) (x >> 8);
156                         n <<= 8; n |= (byte) (x >> 16);
157                         return (n << 8) | (byte) (x >> 24);
158                 }
159
160                 static uint64 MirrorBytes (const uint64 &x)
161                 {
162                         uint64 n = (byte) x;
163                         n <<= 8; n |= (byte) (x >> 8);
164                         n <<= 8; n |= (byte) (x >> 16);
165                         n <<= 8; n |= (byte) (x >> 24);
166                         n <<= 8; n |= (byte) (x >> 32);
167                         n <<= 8; n |= (byte) (x >> 40);
168                         n <<= 8; n |= (byte) (x >> 48);
169                         return (n << 8) | (byte) (x >> 56);
170                 }
171         };
172 }
173
174 #endif // TC_HEADER_Platform_Memory
This page took 0.024754 seconds and 3 git commands to generate. Download a nemesis OSX (sierra+high sierra, tested/working) binary, with fuse-ext3 via e2fsprogs, at this link. application and installer are signed by screwjack, llc. must install fuse with macFUSE layer first.