| /****************************************************************************** |
| * Filename: sw_ecrypt-portable.h |
| * Revised: 2016-10-05 12:42:03 +0200 (Wed, 05 Oct 2016) |
| * Revision: 47308 |
| ******************************************************************************/ |
| /* ecrypt-portable.h */ |
| |
| /* |
| * WARNING: the conversions defined below are implemented as macros, |
| * and should be used carefully. They should NOT be used with |
| * parameters which perform some action. E.g., the following two lines |
| * are not equivalent: |
| * |
| * 1) ++x; y = ROTL32(x, n); |
| * 2) y = ROTL32(++x, n); |
| */ |
| |
| /* |
| * *** Please do not edit this file. *** |
| * |
| * The default macros can be overridden for specific architectures by |
| * editing 'ecrypt-machine.h'. |
| */ |
| |
| #ifndef ECRYPT_PORTABLE |
| #define ECRYPT_PORTABLE |
| |
| #include "sw_ecrypt-config.h" |
| |
| /* ------------------------------------------------------------------------- */ |
| |
| /* |
| * The following types are defined (if available): |
| * |
| * u8: unsigned integer type, at least 8 bits |
| * u16: unsigned integer type, at least 16 bits |
| * u32: unsigned integer type, at least 32 bits |
| * u64: unsigned integer type, at least 64 bits |
| * |
| * s8, s16, s32, s64 -> signed counterparts of u8, u16, u32, u64 |
| * |
| * The selection of minimum-width integer types is taken care of by |
| * 'ecrypt-config.h'. Note: to enable 64-bit types on 32-bit |
| * compilers, it might be necessary to switch from ISO C90 mode to ISO |
| * C99 mode (e.g., gcc -std=c99). |
| */ |
| |
| #ifdef I8T |
| typedef signed I8T s8; |
| typedef unsigned I8T u8; |
| #endif |
| |
| #ifdef I16T |
| typedef signed I16T s16; |
| typedef unsigned I16T u16; |
| #endif |
| |
| #ifdef I32T |
| typedef signed I32T s32; |
| typedef unsigned I32T u32; |
| #endif |
| |
| #ifdef I64T |
| typedef signed I64T s64; |
| typedef unsigned I64T u64; |
| #endif |
| |
| /* |
| * The following macros are used to obtain exact-width results. |
| */ |
| |
| #define U8V(v) ((u8)(v) & U8C(0xFF)) |
| #define U16V(v) ((u16)(v) & U16C(0xFFFF)) |
| #define U32V(v) ((u32)(v) & U32C(0xFFFFFFFF)) |
| #define U64V(v) ((u64)(v) & U64C(0xFFFFFFFFFFFFFFFF)) |
| |
| /* ------------------------------------------------------------------------- */ |
| |
| /* |
| * The following macros return words with their bits rotated over n |
| * positions to the left/right. |
| */ |
| |
| #define ECRYPT_DEFAULT_ROT |
| |
| #define ROTL8(v, n) \ |
| (U8V((v) << (n)) | ((v) >> (8 - (n)))) |
| |
| #define ROTL16(v, n) \ |
| (U16V((v) << (n)) | ((v) >> (16 - (n)))) |
| |
| #define ROTL32(v, n) \ |
| (U32V((v) << (n)) | ((v) >> (32 - (n)))) |
| |
| #define ROTL64(v, n) \ |
| (U64V((v) << (n)) | ((v) >> (64 - (n)))) |
| |
| #define ROTR8(v, n) ROTL8(v, 8 - (n)) |
| #define ROTR16(v, n) ROTL16(v, 16 - (n)) |
| #define ROTR32(v, n) ROTL32(v, 32 - (n)) |
| #define ROTR64(v, n) ROTL64(v, 64 - (n)) |
| |
| #include "sw_ecrypt-machine.h" |
| |
| /* ------------------------------------------------------------------------- */ |
| |
| /* |
| * The following macros return a word with bytes in reverse order. |
| */ |
| |
| #define ECRYPT_DEFAULT_SWAP |
| |
| #define SWAP16(v) \ |
| ROTL16(v, 8) |
| |
| #define SWAP32(v) \ |
| ((ROTL32(v, 8) & U32C(0x00FF00FF)) | \ |
| (ROTL32(v, 24) & U32C(0xFF00FF00))) |
| |
| #ifdef ECRYPT_NATIVE64 |
| #define SWAP64(v) \ |
| ((ROTL64(v, 8) & U64C(0x000000FF000000FF)) | \ |
| (ROTL64(v, 24) & U64C(0x0000FF000000FF00)) | \ |
| (ROTL64(v, 40) & U64C(0x00FF000000FF0000)) | \ |
| (ROTL64(v, 56) & U64C(0xFF000000FF000000))) |
| #else |
| #define SWAP64(v) \ |
| (((u64)SWAP32(U32V(v)) << 32) | (u64)SWAP32(U32V(v >> 32))) |
| #endif |
| |
| #include "sw_ecrypt-machine.h" |
| |
| #define ECRYPT_DEFAULT_WTOW |
| |
| #ifdef ECRYPT_LITTLE_ENDIAN |
| #define U16TO16_LITTLE(v) (v) |
| #define U32TO32_LITTLE(v) (v) |
| #define U64TO64_LITTLE(v) (v) |
| |
| #define U16TO16_BIG(v) SWAP16(v) |
| #define U32TO32_BIG(v) SWAP32(v) |
| #define U64TO64_BIG(v) SWAP64(v) |
| #endif |
| |
| #ifdef ECRYPT_BIG_ENDIAN |
| #define U16TO16_LITTLE(v) SWAP16(v) |
| #define U32TO32_LITTLE(v) SWAP32(v) |
| #define U64TO64_LITTLE(v) SWAP64(v) |
| |
| #define U16TO16_BIG(v) (v) |
| #define U32TO32_BIG(v) (v) |
| #define U64TO64_BIG(v) (v) |
| #endif |
| |
| #include "sw_ecrypt-machine.h" |
| |
| /* |
| * The following macros load words from an array of bytes with |
| * different types of endianness, and vice versa. |
| */ |
| |
| #define ECRYPT_DEFAULT_BTOW |
| |
| #if (!defined(ECRYPT_UNKNOWN) && defined(ECRYPT_I8T_IS_BYTE)) |
| |
| #define U8TO16_LITTLE(p) U16TO16_LITTLE(((u16*)(p))[0]) |
| #define U8TO32_LITTLE(p) U32TO32_LITTLE(((u32*)(p))[0]) |
| #define U8TO64_LITTLE(p) U64TO64_LITTLE(((u64*)(p))[0]) |
| |
| #define U8TO16_BIG(p) U16TO16_BIG(((u16*)(p))[0]) |
| #define U8TO32_BIG(p) U32TO32_BIG(((u32*)(p))[0]) |
| #define U8TO64_BIG(p) U64TO64_BIG(((u64*)(p))[0]) |
| |
| #define U16TO8_LITTLE(p, v) (((u16*)(p))[0] = U16TO16_LITTLE(v)) |
| #define U32TO8_LITTLE(p, v) (((u32*)(p))[0] = U32TO32_LITTLE(v)) |
| #define U64TO8_LITTLE(p, v) (((u64*)(p))[0] = U64TO64_LITTLE(v)) |
| |
| #define U16TO8_BIG(p, v) (((u16*)(p))[0] = U16TO16_BIG(v)) |
| #define U32TO8_BIG(p, v) (((u32*)(p))[0] = U32TO32_BIG(v)) |
| #define U64TO8_BIG(p, v) (((u64*)(p))[0] = U64TO64_BIG(v)) |
| |
| #else |
| |
| #define U8TO16_LITTLE(p) \ |
| (((u16)((p)[0]) ) | \ |
| ((u16)((p)[1]) << 8)) |
| |
| #define U8TO32_LITTLE(p) \ |
| (((u32)((p)[0]) ) | \ |
| ((u32)((p)[1]) << 8) | \ |
| ((u32)((p)[2]) << 16) | \ |
| ((u32)((p)[3]) << 24)) |
| |
| #ifdef ECRYPT_NATIVE64 |
| #define U8TO64_LITTLE(p) \ |
| (((u64)((p)[0]) ) | \ |
| ((u64)((p)[1]) << 8) | \ |
| ((u64)((p)[2]) << 16) | \ |
| ((u64)((p)[3]) << 24) | \ |
| ((u64)((p)[4]) << 32) | \ |
| ((u64)((p)[5]) << 40) | \ |
| ((u64)((p)[6]) << 48) | \ |
| ((u64)((p)[7]) << 56)) |
| #else |
| #define U8TO64_LITTLE(p) \ |
| ((u64)U8TO32_LITTLE(p) | ((u64)U8TO32_LITTLE((p) + 4) << 32)) |
| #endif |
| |
| #define U8TO16_BIG(p) \ |
| (((u16)((p)[0]) << 8) | \ |
| ((u16)((p)[1]) )) |
| |
| #define U8TO32_BIG(p) \ |
| (((u32)((p)[0]) << 24) | \ |
| ((u32)((p)[1]) << 16) | \ |
| ((u32)((p)[2]) << 8) | \ |
| ((u32)((p)[3]) )) |
| |
| #ifdef ECRYPT_NATIVE64 |
| #define U8TO64_BIG(p) \ |
| (((u64)((p)[0]) << 56) | \ |
| ((u64)((p)[1]) << 48) | \ |
| ((u64)((p)[2]) << 40) | \ |
| ((u64)((p)[3]) << 32) | \ |
| ((u64)((p)[4]) << 24) | \ |
| ((u64)((p)[5]) << 16) | \ |
| ((u64)((p)[6]) << 8) | \ |
| ((u64)((p)[7]) )) |
| #else |
| #define U8TO64_BIG(p) \ |
| (((u64)U8TO32_BIG(p) << 32) | (u64)U8TO32_BIG((p) + 4)) |
| #endif |
| |
| #define U16TO8_LITTLE(p, v) \ |
| do { \ |
| (p)[0] = U8V((v) ); \ |
| (p)[1] = U8V((v) >> 8); \ |
| } while (0) |
| |
| #define U32TO8_LITTLE(p, v) \ |
| do { \ |
| (p)[0] = U8V((v) ); \ |
| (p)[1] = U8V((v) >> 8); \ |
| (p)[2] = U8V((v) >> 16); \ |
| (p)[3] = U8V((v) >> 24); \ |
| } while (0) |
| |
| #ifdef ECRYPT_NATIVE64 |
| #define U64TO8_LITTLE(p, v) \ |
| do { \ |
| (p)[0] = U8V((v) ); \ |
| (p)[1] = U8V((v) >> 8); \ |
| (p)[2] = U8V((v) >> 16); \ |
| (p)[3] = U8V((v) >> 24); \ |
| (p)[4] = U8V((v) >> 32); \ |
| (p)[5] = U8V((v) >> 40); \ |
| (p)[6] = U8V((v) >> 48); \ |
| (p)[7] = U8V((v) >> 56); \ |
| } while (0) |
| #else |
| #define U64TO8_LITTLE(p, v) \ |
| do { \ |
| U32TO8_LITTLE((p), U32V((v) )); \ |
| U32TO8_LITTLE((p) + 4, U32V((v) >> 32)); \ |
| } while (0) |
| #endif |
| |
| #define U16TO8_BIG(p, v) \ |
| do { \ |
| (p)[0] = U8V((v) ); \ |
| (p)[1] = U8V((v) >> 8); \ |
| } while (0) |
| |
| #define U32TO8_BIG(p, v) \ |
| do { \ |
| (p)[0] = U8V((v) >> 24); \ |
| (p)[1] = U8V((v) >> 16); \ |
| (p)[2] = U8V((v) >> 8); \ |
| (p)[3] = U8V((v) ); \ |
| } while (0) |
| |
| #ifdef ECRYPT_NATIVE64 |
| #define U64TO8_BIG(p, v) \ |
| do { \ |
| (p)[0] = U8V((v) >> 56); \ |
| (p)[1] = U8V((v) >> 48); \ |
| (p)[2] = U8V((v) >> 40); \ |
| (p)[3] = U8V((v) >> 32); \ |
| (p)[4] = U8V((v) >> 24); \ |
| (p)[5] = U8V((v) >> 16); \ |
| (p)[6] = U8V((v) >> 8); \ |
| (p)[7] = U8V((v) ); \ |
| } while (0) |
| #else |
| #define U64TO8_BIG(p, v) \ |
| do { \ |
| U32TO8_BIG((p), U32V((v) >> 32)); \ |
| U32TO8_BIG((p) + 4, U32V((v) )); \ |
| } while (0) |
| #endif |
| |
| #endif |
| |
| #include "sw_ecrypt-machine.h" |
| |
| /* ------------------------------------------------------------------------- */ |
| |
| #endif |