whirlpool.h - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       whirlpool.h (3884B)
       ---
            1 
            2 #ifndef PORTABLE_C__
            3 #define PORTABLE_C__
            4 
            5 #include <limits.h>
            6 
            7 /* Definition of minimum-width integer types
            8  * 
            9  * u8   -> unsigned integer type, at least 8 bits, equivalent to unsigned char
           10  * u16  -> unsigned integer type, at least 16 bits
           11  * u32  -> unsigned integer type, at least 32 bits
           12  *
           13  * s8, s16, s32  -> signed counterparts of u8, u16, u32
           14  *
           15  * Always use macro's T8(), T16() or T32() to obtain exact-width results,
           16  * i.e., to specify the size of the result of each expression.
           17  */
           18 
           19 typedef signed char s8;
           20 typedef unsigned char u8;
           21 
           22 #if UINT_MAX >= 4294967295UL
           23 
           24 typedef signed short s16;
           25 typedef signed int s32;
           26 typedef unsigned short u16;
           27 typedef unsigned int u32;
           28 
           29 #define ONE32   0xffffffffU
           30 
           31 #else
           32 
           33 typedef signed int s16;
           34 typedef signed long s32;
           35 typedef unsigned int u16;
           36 typedef unsigned long u32;
           37 
           38 #define ONE32   0xffffffffUL
           39 
           40 #endif
           41 
           42 #define ONE8    0xffU
           43 #define ONE16   0xffffU
           44 
           45 #define T8(x)   ((x) & ONE8)
           46 #define T16(x)  ((x) & ONE16)
           47 #define T32(x)  ((x) & ONE32)
           48 
           49 #ifdef _MSC_VER
           50 typedef unsigned __int64 u64;
           51 typedef signed __int64 s64;
           52 #define LL(v)   (v##i64)
           53 #define ONE64   LL(0xffffffffffffffff)
           54 #else  /* !_MSC_VER */
           55 typedef unsigned long long u64;
           56 typedef signed long long s64;
           57 #define LL(v)   (v##ULL)
           58 #define ONE64   LL(0xffffffffffffffff)
           59 #endif /* ?_MSC_VER */
           60 #define T64(x)  ((x) & ONE64)
           61 #define ROTR64(v, n)   (((v) >> (n)) | T64((v) << (64 - (n))))
           62 /*
           63  * Note: the test is used to detect native 64-bit architectures;
           64  * if the unsigned long is strictly greater than 32-bit, it is
           65  * assumed to be at least 64-bit. This will not work correctly
           66  * on (old) 36-bit architectures (PDP-11 for instance).
           67  *
           68  * On non-64-bit architectures, "long long" is used.
           69  */
           70 
           71 /*
           72  * U8TO32_BIG(c) returns the 32-bit value stored in big-endian convention
           73  * in the unsigned char array pointed to by c.
           74  */
           75 #define U8TO32_BIG(c)  (((u32)T8(*(c)) << 24) | ((u32)T8(*((c) + 1)) << 16) | ((u32)T8(*((c) + 2)) << 8) | ((u32)T8(*((c) + 3))))
           76 
           77 /*
           78  * U8TO32_LITTLE(c) returns the 32-bit value stored in little-endian convention
           79  * in the unsigned char array pointed to by c.
           80  */
           81 #define U8TO32_LITTLE(c)  (((u32)T8(*(c))) | ((u32)T8(*((c) + 1)) << 8) | (u32)T8(*((c) + 2)) << 16) | ((u32)T8(*((c) + 3)) << 24))
           82 
           83 /*
           84  * U8TO32_BIG(c, v) stores the 32-bit-value v in big-endian convention
           85  * into the unsigned char array pointed to by c.
           86  */
           87 #define U32TO8_BIG(c, v)    do { u32 x = (v); u8 *d = (c); d[0] = T8(x >> 24); d[1] = T8(x >> 16); d[2] = T8(x >> 8); d[3] = T8(x); } while (0)
           88 
           89 /*
           90  * U8TO32_LITTLE(c, v) stores the 32-bit-value v in little-endian convention
           91  * into the unsigned char array pointed to by c.
           92  */
           93 #define U32TO8_LITTLE(c, v)    do { u32 x = (v); u8 *d = (c); d[0] = T8(x); d[1] = T8(x >> 8); d[2] = T8(x >> 16); d[3] = T8(x >> 24); } while (0)
           94 
           95 /*
           96  * ROTL32(v, n) returns the value of the 32-bit unsigned value v after
           97  * a rotation of n bits to the left. It might be replaced by the appropriate
           98  * architecture-specific macro.
           99  *
          100  * It evaluates v and n twice.
          101  *
          102  * The compiler might emit a warning if n is the constant 0. The result
          103  * is undefined if n is greater than 31.
          104  */
          105 #define ROTL32(v, n)   (T32((v) << (n)) | ((v) >> (32 - (n))))
          106 
          107 /*
          108  * Whirlpool-specific definitions.
          109  */
          110 
          111 #define DIGESTBYTES 64
          112 #define DIGESTBITS  (8*DIGESTBYTES) /* 512 */
          113 
          114 #define WBLOCKBYTES 64
          115 #define WBLOCKBITS  (8*WBLOCKBYTES) /* 512 */
          116 
          117 #define LENGTHBYTES 32
          118 #define LENGTHBITS  (8*LENGTHBYTES) /* 256 */
          119 
          120 typedef struct NESSIEstruct {
          121         u8  bitLength[LENGTHBYTES]; /* global number of hashed bits (256-bit counter) */
          122         u8  buffer[WBLOCKBYTES];        /* buffer of data to hash */
          123         int bufferBits;                        /* current number of bits on the buffer */
          124         int bufferPos;                        /* current (possibly incomplete) byte slot on the buffer */
          125         u64 hash[DIGESTBYTES/8];    /* the hashing state */
          126 } NESSIEstruct;
          127 
          128 #endif   /* PORTABLE_C__ */
          129