1 /* ---- HELPER MACROS ---- */
2 module tomcrypt.macros;
3 
4 version(ENDIAN_NEUTRAL)
5 {
6     void STORE32L(uint x, ref ubyte[4] y)
7     {
8         y[3] = cast(ubyte)((x>>24)&255); y[2] = cast(ubyte)((x>>16)&255);   
9         y[1] = cast(ubyte)((x>>8 )&255); y[0] = cast(ubyte)( x     &255);
10     }
11     
12     void LOAD32L(ref uint x, ref ubyte[4] y)
13     {
14         x = (cast(uint)(y[3] & 255)<<24) | 
15             (cast(uint)(y[2] & 255)<<16) | 
16             (cast(uint)(y[1] & 255)<<8)  | 
17             (cast(uint)(y[0] & 255));
18     }
19     
20     void STORE64L(ulong x, ref ubyte[8] y)
21     {
22         y[7] = cast(ubyte)((x>>56)&255); y[6] = cast(ubyte)((x>>48)&255);   
23         y[5] = cast(ubyte)((x>>40)&255); y[4] = cast(ubyte)((x>>32)&255);   
24         y[3] = cast(ubyte)((x>>24)&255); y[2] = cast(ubyte)((x>>16)&255);   
25         y[1] = cast(ubyte)((x>>8)&255);  y[0] = cast(ubyte)(x&255); 
26     }
27     
28     void LOAD64L(ref ulong x, ref ubyte[8] y)
29     {
30         x = ((cast(ulong)(y[7] & 255))<<56)|((cast(ulong)(y[6] & 255))<<48)| 
31             ((cast(ulong)(y[5] & 255))<<40)|((cast(ulong)(y[4] & 255))<<32)| 
32             ((cast(ulong)(y[3] & 255))<<24)|((cast(ulong)(y[2] & 255))<<16)| 
33             ((cast(ulong)(y[1] & 255))<<8 )|((cast(ulong)(y[0] & 255)));
34     }
35     
36     void STORE32H(uint x, ref ubyte[4] y)
37     {
38         y[0] = cast(ubyte)((x>>24)&255); y[1] = cast(ubyte)((x>>16)&255);   
39         y[2] = cast(ubyte)((x>>8 )&255); y[3] = cast(ubyte)( x     &255); 
40     }
41     
42     void LOAD32H(ref uint x, ref ubyte[4] y)
43     {
44         x = (cast(uint)(y[0] & 255)<<24) |
45             (cast(uint)(y[1] & 255)<<16) |
46             (cast(uint)(y[2] & 255)<<8)  |
47             (cast(uint)(y[3] & 255));
48     }
49     
50     void STORE64H(ulong x, ref ubyte[8] y)
51     {
52         y[0] = cast(ubyte)((x>>56)&255); y[1] = cast(ubyte)((x>>48)&255);
53         y[2] = cast(ubyte)((x>>40)&255); y[3] = cast(ubyte)((x>>32)&255);
54         y[4] = cast(ubyte)((x>>24)&255); y[5] = cast(ubyte)((x>>16)&255);
55         y[6] = cast(ubyte)((x>>8 )&255); y[7] = cast(ubyte)( x     &255);
56     }
57     
58     void LOAD64H(ref ulong x, ref ubyte[8] y)                                                      
59     {
60         x = ((cast(ulong)(y[0] & 255))<<56)|((cast(ulong)(y[1] & 255))<<48) | 
61             ((cast(ulong)(y[2] & 255))<<40)|((cast(ulong)(y[3] & 255))<<32) | 
62             ((cast(ulong)(y[4] & 255))<<24)|((cast(ulong)(y[5] & 255))<<16) | 
63             ((cast(ulong)(y[6] & 255))<<8 )|((cast(ulong)(y[7] & 255)));
64     } 
65 
66 } /* ENDIAN_NEUTRAL */
67 
68 version(ENDIAN_LITTLE)
69 {
70     version(LTC_NO_BSWAP) {}
71     else
72     {
73         void STORE32H(uint x, ref ubyte[4] y)
74         {
75             y[0] = cast(ubyte)((x>>24)&255); y[1] = cast(ubyte)((x>>16)&255);   
76             y[2] = cast(ubyte)((x>>8 )&255); y[3] = cast(ubyte)( x     &255); 
77         }
78         
79         void LOAD32H(ref uint x, ref ubyte[4] y)
80         {
81             x = (cast(uint)(y[0] & 255)<<24) |
82                 (cast(uint)(y[1] & 255)<<16) |
83                 (cast(uint)(y[2] & 255)<<8)  |
84                 (cast(uint)(y[3] & 255));
85         }
86     }
87 
88 
89     /* x86_64 processor */
90     version(LTC_NO_BSWAP) {}
91     else
92     {
93         void STORE64H(ulong x, ref ubyte[8] y)
94         {
95             y[0] = cast(ubyte)((x>>56)&255); y[1] = cast(ubyte)((x>>48)&255);
96             y[2] = cast(ubyte)((x>>40)&255); y[3] = cast(ubyte)((x>>32)&255);
97             y[4] = cast(ubyte)((x>>24)&255); y[5] = cast(ubyte)((x>>16)&255);
98             y[6] = cast(ubyte)((x>>8 )&255); y[7] = cast(ubyte)( x     &255);
99         }
100         
101         void LOAD64H(x, y)                                                      
102         {
103             x = ((cast(ulong)(y[0] & 255))<<56)|((cast(ulong)(y[1] & 255))<<48) | 
104                 ((cast(ulong)(y[2] & 255))<<40)|((cast(ulong)(y[3] & 255))<<32) | 
105                 ((cast(ulong)(y[4] & 255))<<24)|((cast(ulong)(y[5] & 255))<<16) | 
106                 ((cast(ulong)(y[6] & 255))<<8 )|((cast(ulong)(y[7] & 255)));
107         } 
108     }
109 
110     version(ENDIAN_32BITWORD)
111     {
112         void STORE32L(uint x, ref ubyte[4] y)
113         {
114             y[] = (cast(ubyte*)&x)[0 .. 4];
115         }
116         
117         void LOAD32L(ref uint x, ref ubyte[4] y)
118         {
119             (cast(ubyte*)&x)[0 .. 4] = y[]; 
120         }
121         
122         void STORE64L(ulong x, ref ubyte[8] y)
123         {
124             y[7] = cast(ubyte)((x>>56)&255); y[6] = cast(ubyte)((x>>48)&255);   
125             y[5] = cast(ubyte)((x>>40)&255); y[4] = cast(ubyte)((x>>32)&255);   
126             y[3] = cast(ubyte)((x>>24)&255); y[2] = cast(ubyte)((x>>16)&255);   
127             y[1] = cast(ubyte)((x>>8)&255);  y[0] = cast(ubyte)(x&255); 
128         }
129         
130         void LOAD64L(ref ulong x, ref ubyte[8] y)
131         {
132             x = ((cast(ulong)(y[7] & 255))<<56)|((cast(ulong)(y[6] & 255))<<48)| 
133                 ((cast(ulong)(y[5] & 255))<<40)|((cast(ulong)(y[4] & 255))<<32)| 
134                 ((cast(ulong)(y[3] & 255))<<24)|((cast(ulong)(y[2] & 255))<<16)| 
135                 ((cast(ulong)(y[1] & 255))<<8 )|((cast(ulong)(y[0] & 255)));
136         }
137     } 
138     else /* 64-bit words then  */
139     {
140         
141         void STORE32L(uint x, ref ubyte[4] y)
142         {
143             y[] = (cast(ubyte*)&x)[0 .. 4];
144         }
145         
146         void LOAD32L(ref uint x, ref ubyte[4] y)
147         {
148             (cast(ubyte*)&x)[0 .. 4] = y[]; 
149         }
150         
151         void STORE64L(ulong x, ref ubyte[8] y)
152         {
153             y[] = (cast(ubyte*)&x)[0 .. 8];
154         }
155         
156         void LOAD64L(ref ulong x, ref ubyte[8] y)
157         {
158             (cast(ubyte*)&x)[0 .. 8] = y[];
159         }
160     } /* ENDIAN_64BITWORD */
161 } /* ENDIAN_LITTLE */
162 
163 version(ENDIAN_BIG)
164 {
165     void STORE32L(uint x, ref ubyte[4] y)
166     {
167         y[3] = cast(ubyte)((x>>24)&255); y[2] = cast(ubyte)((x>>16)&255);   
168         y[1] = cast(ubyte)((x>>8 )&255); y[0] = cast(ubyte)(x&255); 
169     }
170     
171     void LOAD32L(ref uint x, ref ubyte[4] y)
172     {
173         x = (cast(uint)(y[3] & 255)<<24) | 
174             (cast(uint)(y[2] & 255)<<16) | 
175             (cast(uint)(y[1] & 255)<<8)  | 
176             (cast(uint)(y[0] & 255)); 
177     }
178     
179     void STORE64L(ulong x, ref ubyte[8] y)
180     {
181         y[7] = cast(ubyte)((x>>56)&255); y[6] = cast(ubyte)((x>>48)&255);     
182         y[5] = cast(ubyte)((x>>40)&255); y[4] = cast(ubyte)((x>>32)&255);
183         y[3] = cast(ubyte)((x>>24)&255); y[2] = cast(ubyte)((x>>16)&255);
184         y[1] = cast(ubyte)((x>>8 )&255); y[0] = cast(ubyte)( x     &255); 
185     }
186     
187     void LOAD64L(ref ulong x, ref ubyte[8] y)
188     {
189         x = ((cast(ulong)(y[7] & 255))<<56)|((cast(ulong)(y[6] & 255))<<48) |
190             ((cast(ulong)(y[5] & 255))<<40)|((cast(ulong)(y[4] & 255))<<32) |
191             ((cast(ulong)(y[3] & 255))<<24)|((cast(ulong)(y[2] & 255))<<16) |
192             ((cast(ulong)(y[1] & 255))<<8)|((cast(ulong)(y[0] & 255))); 
193     }
194     
195     version(ENDIAN_32BITWORD)
196     { 
197         void STORE32H(uint x, ref ubyte[4] y)
198         {
199             y[] = (cast(ubyte*)&x)[0 .. 4];
200         }
201         
202         void LOAD32H(ref uint x, ref ubyte[4] y)
203         {
204             (cast(ubyte*)&x)[0 .. 4] = y[];
205         }
206         
207         void STORE64H(ulong x, ref ubyte[8] y)
208         {
209             y[0] = cast(ubyte)((x>>56)&255); y[1] = cast(ubyte)((x>>48)&255);
210             y[2] = cast(ubyte)((x>>40)&255); y[3] = cast(ubyte)((x>>32)&255);
211             y[4] = cast(ubyte)((x>>24)&255); y[5] = cast(ubyte)((x>>16)&255);
212             y[6] = cast(ubyte)((x>>8) &255); y[7] = cast(ubyte)( x     &255);
213         }
214         
215         void LOAD64H(ref ulong x, ref ubyte[8] y)
216         {
217             x = ((cast(ulong)(y[0] & 255))<<56)|((cast(ulong)(y[1] & 255))<<48)|
218                 ((cast(ulong)(y[2] & 255))<<40)|((cast(ulong)(y[3] & 255))<<32)|
219                 ((cast(ulong)(y[4] & 255))<<24)|((cast(ulong)(y[5] & 255))<<16)|
220                 ((cast(ulong)(y[6] & 255))<<8) |((cast(ulong)(y[7] & 255)));
221         }
222     }
223     else /* 64-bit words then  */
224     {
225         void STORE32H(uint x, ref ubyte[4] y)
226         {
227             y[] = (cast(ubyte*)&x)[0 .. 4];
228         }
229         
230         void LOAD32H(ref uint x, ref ubyte[4] y)
231         {
232             (cast(ubyte*)&x)[0 .. 4] = y[];
233         }
234         
235         void STORE64H(ulong x, ref ubyte[8] y)
236         {
237             y[] = (cast(ubyte*)&x)[0 .. 8];
238         }
239         
240         void LOAD64H(ref ulong x, ref ubyte[8] y)
241         {
242             (cast(ubyte*)&x)[0 .. 8] = y[];
243         }
244     } /* ENDIAN_64BITWORD */
245 } /* ENDIAN_BIG */
246 
247 void BSWAP(ref uint x)
248 {
249     x = ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL)  |
250         ((x>>8 )&0x0000FF00UL) | ((x<<8 )&0x00FF0000UL);
251 }
252 
253 /* 32-bit Rotates */
254 /* rotates the hard way */
255 uint ROL(uint x, int y) { return ((cast(uint)x<<cast(uint)(y&31)) | ((cast(uint)x&0xFFFFFFFFUL)>>cast(uint)(32-(y&31)))) & 0xFFFFFFFFUL;}
256 uint ROR(uint x, int y) { return (((cast(uint)x&0xFFFFFFFFUL)>>cast(uint)(y&31)) | (cast(uint)x<<cast(uint)(32-(y&31)))) & 0xFFFFFFFFUL;}
257 uint ROLc(uint x, const int y) { return ((cast(uint)x<<cast(uint)(y&31)) | ((cast(uint)x&0xFFFFFFFFUL)>>cast(uint)(32-(y&31)))) & 0xFFFFFFFFUL;}
258 uint RORc(uint x, const int y) { return (((cast(uint)x&0xFFFFFFFFUL)>>cast(uint)(y&31)) | (cast(uint)x<<cast(uint)(32-(y&31)))) & 0xFFFFFFFFUL;}
259 
260 
261 /* 64-bit Rotates */
262 ulong ROL64(ulong x, int y)
263 {
264     return ((x<<(cast(ulong)y&63)) | 
265            ((x&0xFFFFFFFFFFFFFFFFUL)>>(cast(ulong)64-(y&63)))) & 0xFFFFFFFFFFFFFFFFUL;
266 }
267 
268 ulong ROR64(ulong x, int y)
269 {
270     return (((x&0xFFFFFFFFFFFFFFFFUL)>>(cast(ulong)y&63UL)) | 
271       (x<<(cast(ulong)(64-(y&63UL))))) & 0xFFFFFFFFFFFFFFFFUL;
272 }
273 
274 ulong ROL64c(ulong x, const int y)
275 {
276     return ((x<<(cast(ulong)y&63)) |
277            ((x&0xFFFFFFFFFFFFFFFFUL)>>(cast(ulong)64-(y&63)))) & 0xFFFFFFFFFFFFFFFFUL;
278 }
279 
280 ulong ROR64c(ulong x, const int y)
281 {
282     return (((x&0xFFFFFFFFFFFFFFFFUL)>>(cast(ulong)y&63UL)) |
283            (x<<(cast(ulong)(64-(y&63UL))))) & 0xFFFFFFFFFFFFFFFFUL;
284 }
285 
286 T MAX(T)(T x, T y) { return x > y ? x : y; }
287 T MIN(T)(T x, T y) { return x < y ? x : y; }
288 
289 
290 /* extract a byte portably */
291 ubyte _byte(T)(T x, uint n) { return (x >> (8 * n)) & 255; }
292 
293 
294 /* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_macros.h,v $ */
295 /* $Revision: 1.15 $ */
296 /* $Date: 2006/11/29 23:43:57 $ */