diff options
Diffstat (limited to 'include/crypto/modes.h')
| -rw-r--r-- | include/crypto/modes.h | 137 |
1 files changed, 66 insertions, 71 deletions
diff --git a/include/crypto/modes.h b/include/crypto/modes.h index 19f9d85959c5..e96a216499bd 100644 --- a/include/crypto/modes.h +++ b/include/crypto/modes.h @@ -13,15 +13,15 @@ #if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) typedef __int64 i64; typedef unsigned __int64 u64; -# define U64(C) C##UI64 +#define U64(C) C##UI64 #elif defined(__arch64__) typedef long i64; typedef unsigned long u64; -# define U64(C) C##UL +#define U64(C) C##UL #else typedef long long i64; typedef unsigned long long u64; -# define U64(C) C##ULL +#define U64(C) C##ULL #endif typedef unsigned int u32; @@ -29,79 +29,74 @@ typedef unsigned char u8; #define STRICT_ALIGNMENT 1 #ifndef PEDANTIC -# if defined(__i386) || defined(__i386__) || \ - defined(__x86_64) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || \ - defined(__aarch64__) || \ - defined(__s390__) || defined(__s390x__) -# undef STRICT_ALIGNMENT -# endif +#if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || defined(__aarch64__) || defined(__s390__) || defined(__s390x__) +#undef STRICT_ALIGNMENT +#endif #endif #if !defined(PEDANTIC) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) -# if defined(__GNUC__) && __GNUC__>=2 -# if defined(__x86_64) || defined(__x86_64__) -# define BSWAP8(x) ({ u64 ret_=(x); \ +#if defined(__GNUC__) && __GNUC__ >= 2 +#if defined(__x86_64) || defined(__x86_64__) +#define BSWAP8(x) ({ u64 ret_=(x); \ asm ("bswapq %0" \ - : "+r"(ret_)); ret_; }) -# define BSWAP4(x) ({ u32 ret_=(x); \ + : "+r"(ret_)); ret_; }) +#define BSWAP4(x) ({ u32 ret_=(x); \ asm ("bswapl %0" \ - : "+r"(ret_)); ret_; }) -# elif (defined(__i386) || defined(__i386__)) && !defined(I386_ONLY) -# define BSWAP8(x) ({ u32 lo_=(u64)(x)>>32,hi_=(x); \ + : "+r"(ret_)); ret_; }) +#elif (defined(__i386) || defined(__i386__)) && !defined(I386_ONLY) +#define BSWAP8(x) ({ u32 lo_=(u64)(x)>>32,hi_=(x); \ asm ("bswapl %0; bswapl %1" \ : "+r"(hi_),"+r"(lo_)); \ - (u64)hi_<<32|lo_; }) -# define BSWAP4(x) ({ u32 ret_=(x); \ + (u64)hi_<<32|lo_; }) +#define BSWAP4(x) ({ u32 ret_=(x); \ asm ("bswapl %0" \ - : "+r"(ret_)); ret_; }) -# elif defined(__aarch64__) -# if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ -# define BSWAP8(x) ({ u64 ret_; \ + : "+r"(ret_)); ret_; }) +#elif defined(__aarch64__) +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define BSWAP8(x) ({ u64 ret_; \ asm ("rev %0,%1" \ - : "=r"(ret_) : "r"(x)); ret_; }) -# define BSWAP4(x) ({ u32 ret_; \ + : "=r"(ret_) : "r"(x)); ret_; }) +#define BSWAP4(x) ({ u32 ret_; \ asm ("rev %w0,%w1" \ - : "=r"(ret_) : "r"(x)); ret_; }) -# endif -# elif (defined(__arm__) || defined(__arm)) && !defined(STRICT_ALIGNMENT) -# define BSWAP8(x) ({ u32 lo_=(u64)(x)>>32,hi_=(x); \ + : "=r"(ret_) : "r"(x)); ret_; }) +#endif +#elif (defined(__arm__) || defined(__arm)) && !defined(STRICT_ALIGNMENT) +#define BSWAP8(x) ({ u32 lo_=(u64)(x)>>32,hi_=(x); \ asm ("rev %0,%0; rev %1,%1" \ : "+r"(hi_),"+r"(lo_)); \ - (u64)hi_<<32|lo_; }) -# define BSWAP4(x) ({ u32 ret_; \ + (u64)hi_<<32|lo_; }) +#define BSWAP4(x) ({ u32 ret_; \ asm ("rev %0,%1" \ : "=r"(ret_) : "r"((u32)(x))); \ - ret_; }) -# endif -# elif defined(_MSC_VER) -# if _MSC_VER>=1300 -# include <stdlib.h> -# pragma intrinsic(_byteswap_uint64,_byteswap_ulong) -# define BSWAP8(x) _byteswap_uint64((u64)(x)) -# define BSWAP4(x) _byteswap_ulong((u32)(x)) -# elif defined(_M_IX86) -__inline u32 _bswap4(u32 val) -{ -_asm mov eax, val _asm bswap eax} -# define BSWAP4(x) _bswap4(x) -# endif -# endif + ret_; }) +#endif +#elif defined(_MSC_VER) +#if _MSC_VER >= 1300 +#include <stdlib.h> +#pragma intrinsic(_byteswap_uint64, _byteswap_ulong) +#define BSWAP8(x) _byteswap_uint64((u64)(x)) +#define BSWAP4(x) _byteswap_ulong((u32)(x)) +#elif defined(_M_IX86) +__inline u32 _bswap4(u32 val) { + _asm mov eax, val _asm bswap eax +} +#define BSWAP4(x) _bswap4(x) +#endif +#endif #endif #if defined(BSWAP4) && !defined(STRICT_ALIGNMENT) -# define GETU32(p) BSWAP4(*(const u32 *)(p)) -# define PUTU32(p,v) *(u32 *)(p) = BSWAP4(v) +#define GETU32(p) BSWAP4(*(const u32 *)(p)) +#define PUTU32(p, v) *(u32 *)(p) = BSWAP4(v) #else -# define GETU32(p) ((u32)(p)[0]<<24|(u32)(p)[1]<<16|(u32)(p)[2]<<8|(u32)(p)[3]) -# define PUTU32(p,v) ((p)[0]=(u8)((v)>>24),(p)[1]=(u8)((v)>>16),(p)[2]=(u8)((v)>>8),(p)[3]=(u8)(v)) +#define GETU32(p) ((u32)(p)[0] << 24 | (u32)(p)[1] << 16 | (u32)(p)[2] << 8 | (u32)(p)[3]) +#define PUTU32(p, v) ((p)[0] = (u8)((v) >> 24), (p)[1] = (u8)((v) >> 16), (p)[2] = (u8)((v) >> 8), (p)[3] = (u8)(v)) #endif /*- GCM definitions */ typedef struct { u64 hi, lo; } u128; -#ifdef TABLE_BITS -# undef TABLE_BITS +#ifdef TABLE_BITS +#undef TABLE_BITS #endif /* * Even though permitted values for TABLE_BITS are 8, 4 and 1, it should @@ -121,13 +116,13 @@ struct gcm128_context { * Relative position of Xi, H and pre-computed Htable is used in some * assembler modules, i.e. don't change the order! */ -#if TABLE_BITS==8 +#if TABLE_BITS == 8 u128 Htable[256]; #else u128 Htable[16]; - void (*gmult) (u64 Xi[2], const u128 Htable[16]); - void (*ghash) (u64 Xi[2], const u128 Htable[16], const u8 *inp, - size_t len); + void (*gmult)(u64 Xi[2], const u128 Htable[16]); + void (*ghash)(u64 Xi[2], const u128 Htable[16], const u8 *inp, + size_t len); #endif unsigned int mres, ares; block128_f block; @@ -141,7 +136,7 @@ struct gcm128_context { * The maximum permitted number of cipher blocks per data unit in XTS mode. * Reference IEEE Std 1619-2018. */ -#define XTS_MAX_BLOCKS_PER_DATA_UNIT (1<<20) +#define XTS_MAX_BLOCKS_PER_DATA_UNIT (1 << 20) struct xts128_context { void *key1, *key2; @@ -164,15 +159,15 @@ typedef union { u64 a[2]; unsigned char c[16]; } OCB_BLOCK; -# define ocb_block16_xor(in1,in2,out) \ - ( (out)->a[0]=(in1)->a[0]^(in2)->a[0], \ - (out)->a[1]=(in1)->a[1]^(in2)->a[1] ) -# if STRICT_ALIGNMENT -# define ocb_block16_xor_misaligned(in1,in2,out) \ - ocb_block_xor((in1)->c,(in2)->c,16,(out)->c) -# else -# define ocb_block16_xor_misaligned ocb_block16_xor -# endif +#define ocb_block16_xor(in1, in2, out) \ + ((out)->a[0] = (in1)->a[0] ^ (in2)->a[0], \ + (out)->a[1] = (in1)->a[1] ^ (in2)->a[1]) +#if STRICT_ALIGNMENT +#define ocb_block16_xor_misaligned(in1, in2, out) \ + ocb_block_xor((in1)->c, (in2)->c, 16, (out)->c) +#else +#define ocb_block16_xor_misaligned ocb_block16_xor +#endif struct ocb128_context { /* Need both encrypt and decrypt key schedules for decryption */ @@ -180,7 +175,7 @@ struct ocb128_context { block128_f decrypt; void *keyenc; void *keydec; - ocb128_f stream; /* direction dependent */ + ocb128_f stream; /* direction dependent */ /* Key dependent variables. Can be reused if key remains the same */ size_t l_index; size_t max_l_index; @@ -197,14 +192,14 @@ struct ocb128_context { OCB_BLOCK checksum; } sess; }; -#endif /* OPENSSL_NO_OCB */ +#endif /* OPENSSL_NO_OCB */ #ifndef OPENSSL_NO_SIV #define SIV_LEN 16 typedef union siv_block_u { - uint64_t word[SIV_LEN/sizeof(uint64_t)]; + uint64_t word[SIV_LEN / sizeof(uint64_t)]; unsigned char byte[SIV_LEN]; } SIV_BLOCK; |
