From 2a94a49cefbe394c4472810368e92f27677f198c Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Tue, 8 Oct 2019 10:16:51 +0200 Subject: [PATCH] add required LibTomCrypt load/store functions --- src/sha.h | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/sha.h diff --git a/src/sha.h b/src/sha.h new file mode 100644 index 0000000..3c4df08 --- /dev/null +++ b/src/sha.h @@ -0,0 +1,112 @@ +/* public api for steve reid's public domain SHA-1 implementation */ +/* this file is in the public domain */ + +/** @file + * SHA-1 hash API. + */ + +#ifndef __LIBSTROPHE_SHA_H__ +#define __LIBSTROPHE_SHA_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* make sure the stdint.h types are available */ +#include "ostypes.h" + +#if defined(__BIG_ENDIAN__) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + +#define STORE32H(x, y) \ + do { \ + uint32_t __t = (x); \ + memcpy(y, &__t, 4); \ + } while (0) + +#define LOAD32H(x, y) \ + do { \ + memcpy(&(x), y, 4); \ + x &= 0xFFFFFFFF; \ + } while (0) + +#define STORE64H(x, y) \ + do { \ + uint64_t __t = (x); \ + memcpy(y, &__t, 8); \ + } while (0) + +#define LOAD64H(x, y) \ + do { \ + memcpy(&(x), y, 8); \ + } while (0) + +#elif defined(__LITTLE_ENDIAN__) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) + +#define STORE32H(x, y) \ + do { \ + (y)[0] = (uint8_t)(((x) >> 24) & 255); \ + (y)[1] = (uint8_t)(((x) >> 16) & 255); \ + (y)[2] = (uint8_t)(((x) >> 8) & 255); \ + (y)[3] = (uint8_t)((x)&255); \ + } while (0) + +#define LOAD32H(x, y) \ + do { \ + x = ((uint32_t)((y)[0] & 255) << 24) | \ + ((uint32_t)((y)[1] & 255) << 16) | \ + ((uint32_t)((y)[2] & 255) << 8) | ((uint32_t)((y)[3] & 255)); \ + } while (0) + +#define STORE64H(x, y) \ + do { \ + (y)[0] = (uint8_t)(((x) >> 56) & 255); \ + (y)[1] = (uint8_t)(((x) >> 48) & 255); \ + (y)[2] = (uint8_t)(((x) >> 40) & 255); \ + (y)[3] = (uint8_t)(((x) >> 32) & 255); \ + (y)[4] = (uint8_t)(((x) >> 24) & 255); \ + (y)[5] = (uint8_t)(((x) >> 16) & 255); \ + (y)[6] = (uint8_t)(((x) >> 8) & 255); \ + (y)[7] = (uint8_t)((x)&255); \ + } while (0) + +#define LOAD64H(x, y) \ + do { \ + x = (((uint64_t)((y)[0] & 255)) << 56) | \ + (((uint64_t)((y)[1] & 255)) << 48) | \ + (((uint64_t)((y)[2] & 255)) << 40) | \ + (((uint64_t)((y)[3] & 255)) << 32) | \ + (((uint64_t)((y)[4] & 255)) << 24) | \ + (((uint64_t)((y)[5] & 255)) << 16) | \ + (((uint64_t)((y)[6] & 255)) << 8) | (((uint64_t)((y)[7] & 255))); \ + } while (0) + +#else +#error Unknown endianness not supported +#endif + +#ifdef _MSC_VER +#define CONST64(n) n##ui64 +#else +#define CONST64(n) n##ULL +#endif + +#define RORc(x, y) \ + (((((uint32_t)(x)&0xFFFFFFFFUL) >> (uint32_t)((y)&31)) | \ + ((uint32_t)(x) << (uint32_t)((32 - ((y)&31)) & 31))) & \ + 0xFFFFFFFFUL) +#define ROR64c(x, y) \ + (((((x)&CONST64(0xFFFFFFFFFFFFFFFF)) >> ((uint64_t)(y)&CONST64(63))) | \ + ((x) << (((uint64_t)64 - ((y)&63)) & 63))) & \ + CONST64(0xFFFFFFFFFFFFFFFF)) + +#ifdef __cplusplus +} +#endif + +#endif /* __LIBSTROPHE_SHA_H__ */