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 $ */