From 8a9df3041d7d75b29a92a3ad9ccc50b908e55f43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sat, 29 Jul 2023 15:41:04 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8DMSVC=E5=92=8C=E5=85=B6?= =?UTF-8?q?=E5=AE=83=E9=9D=9EGNUC=E7=BC=96=E8=AF=91=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- binary.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ md5.c | 6 ++++-- tea.c | 17 +++++++++-------- 3 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 binary.h diff --git a/binary.h b/binary.h new file mode 100644 index 0000000..35c5978 --- /dev/null +++ b/binary.h @@ -0,0 +1,49 @@ +#ifndef _SCRYPTO_BINARY_H +#define _SCRYPTO_BINARY_H + +// https://github.com/TheSnowfield + +#include + +inline uint32_t _swap_16(uint16_t value) { + #ifdef _MSC_VER + return _byteswap_ushort(value); + #elif __GNUC__ + return __builtin_bswap16(value); + #else + return ((value & 0xff00) >> 8) | + ((value & 0x00ff) << 8); + #endif +} + +inline uint32_t _swap_32(uint32_t value) { + #ifdef _MSC_VER + return _byteswap_ulong(value); + #elif __GNUC__ + return __builtin_bswap32(value); + #else + return ((value & 0xff000000) >> 24) | + ((value & 0x00ff0000) >> 8) | + ((value & 0x0000ff00) << 8) | + ((value & 0x000000ff) << 24); + #endif +} + +inline uint64_t _swap_64(uint64_t value) { + #ifdef _MSC_VER + return _byteswap_uint64(value); + #elif __GNUC__ + return __builtin_bswap64(value); + #else + return ((value & 0xff00000000000000) >> 56) | + ((value & 0x00ff000000000000) >> 40) | + ((value & 0x0000ff0000000000) >> 24) | + ((value & 0x000000ff00000000) >> 8) | + ((value & 0x00000000ff000000) << 8) | + ((value & 0x0000000000ff0000) << 24) | + ((value & 0x000000000000ff00) << 40) | + ((value & 0x00000000000000ff) << 56); + #endif +} + +#endif /* _SCRYPTO_BINARY_H */ diff --git a/md5.c b/md5.c index 6c5b6f0..9cd8010 100644 --- a/md5.c +++ b/md5.c @@ -4,6 +4,8 @@ #include #include +#include "binary.h" + // Constants are the integer part of the sines of integers (in radians) * 2^32. const static uint32_t k[64] = { 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee , @@ -34,7 +36,7 @@ const static uint32_t r[] = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, static void to_bytes(uint32_t val, uint8_t *bytes) { #ifdef WORDS_BIGENDIAN - *(uint32_t*)bytes = __builtin_bswap32(val); + *(uint32_t*)bytes = _swap_32(val); #else *(uint32_t*)bytes = val; #endif @@ -42,7 +44,7 @@ static void to_bytes(uint32_t val, uint8_t *bytes) { static uint32_t to_uint32(const uint8_t *bytes) { #ifdef WORDS_BIGENDIAN - return __builtin_bswap32(*(uint32_t*)bytes); + return _swap_32(*(uint32_t*)bytes); #else return *(uint32_t*)bytes; #endif diff --git a/tea.c b/tea.c index e8b1ebd..3a3e12e 100644 --- a/tea.c +++ b/tea.c @@ -8,6 +8,7 @@ #include #endif #include "simplecrypto.h" +#include "binary.h" const static uint32_t qqsumtable[0x10] = { 0x9e3779b9, @@ -43,7 +44,7 @@ int64_t tea_encrypt_qq(const TEA t, const uint8_t* src, int64_t srclen, uint8_t* #ifdef WORDS_BIGENDIAN uint64_t block = ((uint64_t*)dst)[i]; #else - uint64_t block = __builtin_bswap64(((uint64_t*)dst)[i]); + uint64_t block = _swap_64(((uint64_t*)dst)[i]); #endif holder = block ^ iv1; iv1 = holder; @@ -60,7 +61,7 @@ int64_t tea_encrypt_qq(const TEA t, const uint8_t* src, int64_t srclen, uint8_t* #ifdef WORDS_BIGENDIAN ((uint64_t*)dst)[i] = iv1; #else - ((uint64_t*)dst)[i] = __builtin_bswap64(iv1); + ((uint64_t*)dst)[i] = _swap_64(iv1); #endif } return dstlen; @@ -81,7 +82,7 @@ int64_t tea_encrypt(const TEA t, const uint32_t sumtable[0x10], const uint8_t* s #ifdef WORDS_BIGENDIAN uint64_t block = ((uint64_t*)dst)[i]; #else - uint64_t block = __builtin_bswap64(((uint64_t*)dst)[i]); + uint64_t block = _swap_64(((uint64_t*)dst)[i]); #endif holder = block ^ iv1; iv1 = holder; @@ -98,7 +99,7 @@ int64_t tea_encrypt(const TEA t, const uint32_t sumtable[0x10], const uint8_t* s #ifdef WORDS_BIGENDIAN ((uint64_t*)dst)[i] = iv1; #else - ((uint64_t*)dst)[i] = __builtin_bswap64(iv1); + ((uint64_t*)dst)[i] = _swap_64(iv1); #endif } return dstlen; @@ -171,7 +172,7 @@ uint8_t* tea_decrypt_qq(const TEA t, const uint8_t* src, int64_t srclen, uint8_t #ifdef WORDS_BIGENDIAN iv1 = ((uint64_t*)(src))[i]; #else - iv1 = __builtin_bswap64(((uint64_t*)(src))[i]); + iv1 = _swap_64(((uint64_t*)(src))[i]); #endif iv2 ^= iv1; uint32_t v1 = iv2; @@ -185,7 +186,7 @@ uint8_t* tea_decrypt_qq(const TEA t, const uint8_t* src, int64_t srclen, uint8_t #ifdef WORDS_BIGENDIAN ((uint64_t*)dst)[i] = iv2^holder; #else - ((uint64_t*)dst)[i] = __builtin_bswap64(iv2^holder); + ((uint64_t*)dst)[i] = _swap_64(iv2^holder); #endif holder = iv1; } @@ -202,7 +203,7 @@ uint8_t* tea_decrypt(const TEA t, const uint32_t sumtable[0x10], const uint8_t* #ifdef WORDS_BIGENDIAN iv1 = ((uint64_t*)(src))[i]; #else - iv1 = __builtin_bswap64(((uint64_t*)(src))[i]); + iv1 = _swap_64(((uint64_t*)(src))[i]); #endif iv2 ^= iv1; uint32_t v1 = iv2; @@ -216,7 +217,7 @@ uint8_t* tea_decrypt(const TEA t, const uint32_t sumtable[0x10], const uint8_t* #ifdef WORDS_BIGENDIAN ((uint64_t*)dst)[i] = iv2^holder; #else - ((uint64_t*)dst)[i] = __builtin_bswap64(iv2^holder); + ((uint64_t*)dst)[i] = _swap_64(iv2^holder); #endif holder = iv1; }