From 4f60466a0134640283079a1ea716d8ca5eb52d1e Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Mon, 23 Aug 2010 10:10:36 +0200 Subject: [PATCH] Fall back to shifting with 32-bit words if 64-bit byte order conversion function missing --- src/libstrongswan/plugins/gcm/gcm_aead.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/libstrongswan/plugins/gcm/gcm_aead.c b/src/libstrongswan/plugins/gcm/gcm_aead.c index 644852a08..0d7d91dbf 100644 --- a/src/libstrongswan/plugins/gcm/gcm_aead.c +++ b/src/libstrongswan/plugins/gcm/gcm_aead.c @@ -56,14 +56,16 @@ struct private_gcm_aead_t { }; /** - * architecture specific macros to convert a "long" to network order + * Find a suiteable word size and network order conversion functions */ -#if ULONG_MAX == 4294967295UL -#define htobelong htobe32 -#define belongtoh htobe32 -#elif ULONG_MAX == 18446744073709551615UL -#define htobelong htobe64 -#define belongtoh htobe64 +#if ULONG_MAX == 18446744073709551615UL && defined(htobe64) +# define htobeword htobe64 +# define bewordtoh be64toh +# define SHIFT_WORD_TYPE u_int64_t +#else +# define htobeword htonl +# define bewordtoh ntohl +# define SHIFT_WORD_TYPE u_int32_t #endif /** @@ -71,12 +73,12 @@ struct private_gcm_aead_t { */ static void sr_block(char *block) { - u_long *word = (u_long*)block; int i; + SHIFT_WORD_TYPE *word = (SHIFT_WORD_TYPE*)block; for (i = 0; i < BLOCK_SIZE / sizeof(*word); i++) { - word[i] = htobelong(word[i]); + word[i] = bewordtoh(word[i]); } for (i = BLOCK_SIZE / sizeof(*word) - 1; i >= 0; i--) { @@ -88,7 +90,7 @@ static void sr_block(char *block) } for (i = 0; i < BLOCK_SIZE / sizeof(*word); i++) { - word[i] = belongtoh(word[i]); + word[i] = htobeword(word[i]); } }