1 /******************************************************************************
2  *  Filename:       sw_ecrypt-portable.h
3  ******************************************************************************/
4 /* ecrypt-portable.h */
5 
6 /*
7  * WARNING: the conversions defined below are implemented as macros,
8  * and should be used carefully. They should NOT be used with
9  * parameters which perform some action. E.g., the following two lines
10  * are not equivalent:
11  *
12  *  1) ++x; y = ROTL32(x, n);
13  *  2) y = ROTL32(++x, n);
14  */
15 
16 /*
17  * *** Please do not edit this file. ***
18  *
19  * The default macros can be overridden for specific architectures by
20  * editing 'ecrypt-machine.h'.
21  */
22 
23 #ifndef ECRYPT_PORTABLE
24 #define ECRYPT_PORTABLE
25 
26 #include "sw_ecrypt-config.h"
27 
28 /* ------------------------------------------------------------------------- */
29 
30 /*
31  * The following types are defined (if available):
32  *
33  * u8:  unsigned integer type, at least 8 bits
34  * u16: unsigned integer type, at least 16 bits
35  * u32: unsigned integer type, at least 32 bits
36  * u64: unsigned integer type, at least 64 bits
37  *
38  * s8, s16, s32, s64 -> signed counterparts of u8, u16, u32, u64
39  *
40  * The selection of minimum-width integer types is taken care of by
41  * 'ecrypt-config.h'. Note: to enable 64-bit types on 32-bit
42  * compilers, it might be necessary to switch from ISO C90 mode to ISO
43  * C99 mode (e.g., gcc -std=c99).
44  */
45 
46 #ifdef I8T
47 typedef signed I8T s8;
48 typedef unsigned I8T u8;
49 #endif
50 
51 #ifdef I16T
52 typedef signed I16T s16;
53 typedef unsigned I16T u16;
54 #endif
55 
56 #ifdef I32T
57 typedef signed I32T s32;
58 typedef unsigned I32T u32;
59 #endif
60 
61 #ifdef I64T
62 typedef signed I64T s64;
63 typedef unsigned I64T u64;
64 #endif
65 
66 /*
67  * The following macros are used to obtain exact-width results.
68  */
69 
70 #define U8V(v)  ((u8)(v)&U8C(0xFF))
71 #define U16V(v) ((u16)(v)&U16C(0xFFFF))
72 #define U32V(v) ((u32)(v)&U32C(0xFFFFFFFF))
73 #define U64V(v) ((u64)(v)&U64C(0xFFFFFFFFFFFFFFFF))
74 
75 /* ------------------------------------------------------------------------- */
76 
77 /*
78  * The following macros return words with their bits rotated over n
79  * positions to the left/right.
80  */
81 
82 #define ECRYPT_DEFAULT_ROT
83 
84 #define ROTL8(v, n) (U8V((v) << (n)) | ((v) >> (8 - (n))))
85 
86 #define ROTL16(v, n) (U16V((v) << (n)) | ((v) >> (16 - (n))))
87 
88 #define ROTL32(v, n) (U32V((v) << (n)) | ((v) >> (32 - (n))))
89 
90 #define ROTL64(v, n) (U64V((v) << (n)) | ((v) >> (64 - (n))))
91 
92 #define ROTR8(v, n)  ROTL8(v, 8 - (n))
93 #define ROTR16(v, n) ROTL16(v, 16 - (n))
94 #define ROTR32(v, n) ROTL32(v, 32 - (n))
95 #define ROTR64(v, n) ROTL64(v, 64 - (n))
96 
97 #include "sw_ecrypt-machine.h"
98 
99 /* ------------------------------------------------------------------------- */
100 
101 /*
102  * The following macros return a word with bytes in reverse order.
103  */
104 
105 #define ECRYPT_DEFAULT_SWAP
106 
107 #define SWAP16(v) ROTL16(v, 8)
108 
109 #define SWAP32(v) ((ROTL32(v, 8) & U32C(0x00FF00FF)) | (ROTL32(v, 24) & U32C(0xFF00FF00)))
110 
111 #ifdef ECRYPT_NATIVE64
112     #define SWAP64(v)                                                                             \
113         ((ROTL64(v, 8) & U64C(0x000000FF000000FF)) | (ROTL64(v, 24) & U64C(0x0000FF000000FF00)) | \
114          (ROTL64(v, 40) & U64C(0x00FF000000FF0000)) | (ROTL64(v, 56) & U64C(0xFF000000FF000000)))
115 #else
116     #define SWAP64(v) (((u64)SWAP32(U32V(v)) << 32) | (u64)SWAP32(U32V(v >> 32)))
117 #endif
118 
119 #include "sw_ecrypt-machine.h"
120 
121 #define ECRYPT_DEFAULT_WTOW
122 
123 #ifdef ECRYPT_LITTLE_ENDIAN
124     #define U16TO16_LITTLE(v) (v)
125     #define U32TO32_LITTLE(v) (v)
126     #define U64TO64_LITTLE(v) (v)
127 
128     #define U16TO16_BIG(v) SWAP16(v)
129     #define U32TO32_BIG(v) SWAP32(v)
130     #define U64TO64_BIG(v) SWAP64(v)
131 #endif
132 
133 #ifdef ECRYPT_BIG_ENDIAN
134     #define U16TO16_LITTLE(v) SWAP16(v)
135     #define U32TO32_LITTLE(v) SWAP32(v)
136     #define U64TO64_LITTLE(v) SWAP64(v)
137 
138     #define U16TO16_BIG(v) (v)
139     #define U32TO32_BIG(v) (v)
140     #define U64TO64_BIG(v) (v)
141 #endif
142 
143 #include "sw_ecrypt-machine.h"
144 
145 /*
146  * The following macros load words from an array of bytes with
147  * different types of endianness, and vice versa.
148  */
149 
150 #define ECRYPT_DEFAULT_BTOW
151 
152 #if (!defined(ECRYPT_UNKNOWN) && defined(ECRYPT_I8T_IS_BYTE))
153 
154     #define U8TO16_LITTLE(p) U16TO16_LITTLE(((u16 *)(p))[0])
155     #define U8TO32_LITTLE(p) U32TO32_LITTLE(((u32 *)(p))[0])
156     #define U8TO64_LITTLE(p) U64TO64_LITTLE(((u64 *)(p))[0])
157 
158     #define U8TO16_BIG(p) U16TO16_BIG(((u16 *)(p))[0])
159     #define U8TO32_BIG(p) U32TO32_BIG(((u32 *)(p))[0])
160     #define U8TO64_BIG(p) U64TO64_BIG(((u64 *)(p))[0])
161 
162     #define U16TO8_LITTLE(p, v) (((u16 *)(p))[0] = U16TO16_LITTLE(v))
163     #define U32TO8_LITTLE(p, v) (((u32 *)(p))[0] = U32TO32_LITTLE(v))
164     #define U64TO8_LITTLE(p, v) (((u64 *)(p))[0] = U64TO64_LITTLE(v))
165 
166     #define U16TO8_BIG(p, v) (((u16 *)(p))[0] = U16TO16_BIG(v))
167     #define U32TO8_BIG(p, v) (((u32 *)(p))[0] = U32TO32_BIG(v))
168     #define U64TO8_BIG(p, v) (((u64 *)(p))[0] = U64TO64_BIG(v))
169 
170 #else
171 
172     #define U8TO16_LITTLE(p) (((u16)((p)[0])) | ((u16)((p)[1]) << 8))
173 
174     #define U8TO32_LITTLE(p) (((u32)((p)[0])) | ((u32)((p)[1]) << 8) | ((u32)((p)[2]) << 16) | ((u32)((p)[3]) << 24))
175 
176     #ifdef ECRYPT_NATIVE64
177         #define U8TO64_LITTLE(p)                                                                      \
178             (((u64)((p)[0])) | ((u64)((p)[1]) << 8) | ((u64)((p)[2]) << 16) | ((u64)((p)[3]) << 24) | \
179              ((u64)((p)[4]) << 32) | ((u64)((p)[5]) << 40) | ((u64)((p)[6]) << 48) | ((u64)((p)[7]) << 56))
180     #else
181         #define U8TO64_LITTLE(p) ((u64)U8TO32_LITTLE(p) | ((u64)U8TO32_LITTLE((p) + 4) << 32))
182     #endif
183 
184     #define U8TO16_BIG(p) (((u16)((p)[0]) << 8) | ((u16)((p)[1])))
185 
186     #define U8TO32_BIG(p) (((u32)((p)[0]) << 24) | ((u32)((p)[1]) << 16) | ((u32)((p)[2]) << 8) | ((u32)((p)[3])))
187 
188     #ifdef ECRYPT_NATIVE64
189         #define U8TO64_BIG(p)                                                                                \
190             (((u64)((p)[0]) << 56) | ((u64)((p)[1]) << 48) | ((u64)((p)[2]) << 40) | ((u64)((p)[3]) << 32) | \
191              ((u64)((p)[4]) << 24) | ((u64)((p)[5]) << 16) | ((u64)((p)[6]) << 8) | ((u64)((p)[7])))
192     #else
193         #define U8TO64_BIG(p) (((u64)U8TO32_BIG(p) << 32) | (u64)U8TO32_BIG((p) + 4))
194     #endif
195 
196     #define U16TO8_LITTLE(p, v)     \
197         do                          \
198         {                           \
199             (p)[0] = U8V((v));      \
200             (p)[1] = U8V((v) >> 8); \
201         } while (0)
202 
203     #define U32TO8_LITTLE(p, v)      \
204         do                           \
205         {                            \
206             (p)[0] = U8V((v));       \
207             (p)[1] = U8V((v) >> 8);  \
208             (p)[2] = U8V((v) >> 16); \
209             (p)[3] = U8V((v) >> 24); \
210         } while (0)
211 
212     #ifdef ECRYPT_NATIVE64
213         #define U64TO8_LITTLE(p, v)      \
214             do                           \
215             {                            \
216                 (p)[0] = U8V((v));       \
217                 (p)[1] = U8V((v) >> 8);  \
218                 (p)[2] = U8V((v) >> 16); \
219                 (p)[3] = U8V((v) >> 24); \
220                 (p)[4] = U8V((v) >> 32); \
221                 (p)[5] = U8V((v) >> 40); \
222                 (p)[6] = U8V((v) >> 48); \
223                 (p)[7] = U8V((v) >> 56); \
224             } while (0)
225     #else
226         #define U64TO8_LITTLE(p, v)                      \
227             do                                           \
228             {                                            \
229                 U32TO8_LITTLE((p), U32V((v)));           \
230                 U32TO8_LITTLE((p) + 4, U32V((v) >> 32)); \
231             } while (0)
232     #endif
233 
234     #define U16TO8_BIG(p, v)        \
235         do                          \
236         {                           \
237             (p)[0] = U8V((v));      \
238             (p)[1] = U8V((v) >> 8); \
239         } while (0)
240 
241     #define U32TO8_BIG(p, v)         \
242         do                           \
243         {                            \
244             (p)[0] = U8V((v) >> 24); \
245             (p)[1] = U8V((v) >> 16); \
246             (p)[2] = U8V((v) >> 8);  \
247             (p)[3] = U8V((v));       \
248         } while (0)
249 
250     #ifdef ECRYPT_NATIVE64
251         #define U64TO8_BIG(p, v)         \
252             do                           \
253             {                            \
254                 (p)[0] = U8V((v) >> 56); \
255                 (p)[1] = U8V((v) >> 48); \
256                 (p)[2] = U8V((v) >> 40); \
257                 (p)[3] = U8V((v) >> 32); \
258                 (p)[4] = U8V((v) >> 24); \
259                 (p)[5] = U8V((v) >> 16); \
260                 (p)[6] = U8V((v) >> 8);  \
261                 (p)[7] = U8V((v));       \
262             } while (0)
263     #else
264         #define U64TO8_BIG(p, v)                  \
265             do                                    \
266             {                                     \
267                 U32TO8_BIG((p), U32V((v) >> 32)); \
268                 U32TO8_BIG((p) + 4, U32V((v)));   \
269             } while (0)
270     #endif
271 
272 #endif
273 
274 #include "sw_ecrypt-machine.h"
275 
276 /* ------------------------------------------------------------------------- */
277 
278 #endif
279