diff options
author | Brad Smith <brad@comstyle.com> | 2013-03-15 19:56:07 -0400 |
---|---|---|
committer | Linus Walleij <triad@df.lth.se> | 2013-03-16 21:28:14 +0100 |
commit | faf197f37f40b31bc1005a2a510ae2541e78c74c (patch) | |
tree | 8bde1bc2a10ca4169d399f88ce781b1dd15e2fc5 | |
parent | bbc4313422cd7479d00f157c155a8dba7e9abdfd (diff) | |
download | libmtp-faf197f37f40b31bc1005a2a510ae2541e78c74c.tar.gz |
Fix building libmtp with older GCC versions / non GCC compilers
Here is an updated diff also build tested with gcc 4.6.
Signed-off-by: Brad Smith <brad@comstyle.com>
-rw-r--r-- | src/mtpz.c | 27 |
1 files changed, 19 insertions, 8 deletions
@@ -238,7 +238,7 @@ unsigned int mtpz_aes_gb9[]; #define MTPZ_ENCRYPTIONBYTE2(val) (((val) >> 8) & 0xFF) #define MTPZ_ENCRYPTIONBYTE3(val) (((val) >> 0) & 0xFF) -#define MTPZ_SWAP(x) __builtin_bswap32(x) +#define MTPZ_SWAP(x) mtpz_bswap32(x) void mtpz_encryption_cipher(unsigned char *data, unsigned int len, char encrypt); void mtpz_encryption_cipher_advanced(unsigned char *key, unsigned int key_len, unsigned char *data, unsigned int data_len, char encrypt); @@ -250,6 +250,17 @@ void mtpz_encryption_encrypt_custom(unsigned char *data, unsigned char *seed, un void mtpz_encryption_encrypt_mac(unsigned char *hash, unsigned int hash_length, unsigned char *seed, unsigned int seed_len, unsigned char *out); +static inline uint32_t mtpz_bswap32(uint32_t x) +{ +#if defined __GNUC__ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) || defined(__clang__) + return __builtin_bswap32(x); +#else + return (x >> 24) | + ((x >> 8) & 0x0000ff00) | + ((x << 8) & 0x00ff0000) | + (x << 24); +#endif +} /* MTPZ RSA implementation */ @@ -1576,11 +1587,11 @@ ptp_mtpz_validatehandshakeresponse (PTPParams* params, unsigned char *random, un mtpz_encryption_cipher_advanced((unsigned char *)hash_key, 16, act_msg, 832, 0); act_reader++; - unsigned int certs_length = __builtin_bswap32(*(unsigned int *)(act_reader)); + unsigned int certs_length = MTPZ_SWAP(*(unsigned int *)(act_reader)); act_reader += 4; act_reader += certs_length; - unsigned int rand_length = __builtin_bswap32(*(unsigned short *)(act_reader) << 16); + unsigned int rand_length = MTPZ_SWAP(*(unsigned short *)(act_reader) << 16); act_reader += 2; unsigned char *rand_data = (unsigned char *)malloc(rand_length); memcpy(rand_data, act_reader, rand_length); @@ -1592,19 +1603,19 @@ ptp_mtpz_validatehandshakeresponse (PTPParams* params, unsigned char *random, un free(rand_data); act_reader += rand_length; - unsigned int dev_rand_length = __builtin_bswap32(*(unsigned short *)(act_reader) << 16); + unsigned int dev_rand_length = MTPZ_SWAP(*(unsigned short *)(act_reader) << 16); act_reader += 2; act_reader += dev_rand_length; act_reader++; - unsigned int sig_length = __builtin_bswap32(*(unsigned short *)(act_reader) << 16); + unsigned int sig_length = MTPZ_SWAP(*(unsigned short *)(act_reader) << 16); act_reader += 2; act_reader += sig_length; act_reader++; - unsigned int machash_length = __builtin_bswap32(*(unsigned short *)(act_reader) << 16); + unsigned int machash_length = MTPZ_SWAP(*(unsigned short *)(act_reader) << 16); act_reader += 2; unsigned char *machash_data = (unsigned char *)malloc(machash_length); memcpy(machash_data, act_reader, machash_length); @@ -1638,8 +1649,8 @@ ptp_mtpz_opensecuresyncsession (PTPParams* params, unsigned char *hash) mtpz_encryption_encrypt_mac(hash, 16, (unsigned char *)(&macCount), 4, mch); ret = ptp_mtpz_wmdrmpd_enabletrustedfilesoperations(params, - __builtin_bswap32(hashparams[0]), __builtin_bswap32(hashparams[1]), - __builtin_bswap32(hashparams[2]), __builtin_bswap32(hashparams[3])); + MTPZ_SWAP(hashparams[0]), MTPZ_SWAP(hashparams[1]), + MTPZ_SWAP(hashparams[2]), MTPZ_SWAP(hashparams[3])); return ret; }; |