1*23ba6841SJoseph Chen /* 2*23ba6841SJoseph Chen --------------------------------------------------------------------------- 3*23ba6841SJoseph Chen Copyright (c) 2002, Dr Brian Gladman <brg@gladman.me.uk>, Worcester, UK. 4*23ba6841SJoseph Chen All rights reserved. 5*23ba6841SJoseph Chen 6*23ba6841SJoseph Chen LICENSE TERMS 7*23ba6841SJoseph Chen 8*23ba6841SJoseph Chen The free distribution and use of this software in both source and binary 9*23ba6841SJoseph Chen form is allowed (with or without changes) provided that: 10*23ba6841SJoseph Chen 11*23ba6841SJoseph Chen 1. distributions of this source code include the above copyright 12*23ba6841SJoseph Chen notice, this list of conditions and the following disclaimer; 13*23ba6841SJoseph Chen 14*23ba6841SJoseph Chen 2. distributions in binary form include the above copyright 15*23ba6841SJoseph Chen notice, this list of conditions and the following disclaimer 16*23ba6841SJoseph Chen in the documentation and/or other associated materials; 17*23ba6841SJoseph Chen 18*23ba6841SJoseph Chen 3. the copyright holder's name is not used to endorse products 19*23ba6841SJoseph Chen built using this software without specific written permission. 20*23ba6841SJoseph Chen 21*23ba6841SJoseph Chen ALTERNATIVELY, provided that this notice is retained in full, this product 22*23ba6841SJoseph Chen may be distributed under the terms of the GNU General Public License (GPL), 23*23ba6841SJoseph Chen in which case the provisions of the GPL apply INSTEAD OF those given above. 24*23ba6841SJoseph Chen 25*23ba6841SJoseph Chen DISCLAIMER 26*23ba6841SJoseph Chen 27*23ba6841SJoseph Chen This software is provided 'as is' with no explicit or implied warranties 28*23ba6841SJoseph Chen in respect of its properties, including, but not limited to, correctness 29*23ba6841SJoseph Chen and/or fitness for purpose. 30*23ba6841SJoseph Chen --------------------------------------------------------------------------- 31*23ba6841SJoseph Chen Issue Date: 30/11/2002 32*23ba6841SJoseph Chen */ 33*23ba6841SJoseph Chen 34*23ba6841SJoseph Chen #ifndef _SHA2_H 35*23ba6841SJoseph Chen #define _SHA2_H 36*23ba6841SJoseph Chen 37*23ba6841SJoseph Chen #ifdef USE_HOSTCC 38*23ba6841SJoseph Chen #include <limits.h> 39*23ba6841SJoseph Chen #endif 40*23ba6841SJoseph Chen 41*23ba6841SJoseph Chen /* Defines for suffixes to 32 and 64 bit unsigned numeric values */ 42*23ba6841SJoseph Chen 43*23ba6841SJoseph Chen #define sfx_lo(x,y) x##y 44*23ba6841SJoseph Chen #define sfx_hi(x,y) sfx_lo(x,y) 45*23ba6841SJoseph Chen #define n_u32(p) sfx_hi(0x##p,s_u32) 46*23ba6841SJoseph Chen #define n_u64(p) sfx_hi(0x##p,s_u64) 47*23ba6841SJoseph Chen 48*23ba6841SJoseph Chen #ifdef USE_HOSTCC 49*23ba6841SJoseph Chen /* define an unsigned 32-bit type */ 50*23ba6841SJoseph Chen 51*23ba6841SJoseph Chen #if UINT_MAX == 0xffffffff 52*23ba6841SJoseph Chen typedef unsigned int sha2_32t; 53*23ba6841SJoseph Chen #define s_u32 u 54*23ba6841SJoseph Chen #elif ULONG_MAX == 0xffffffff 55*23ba6841SJoseph Chen typedef unsigned long sha2_32t; 56*23ba6841SJoseph Chen #define s_u32 ul 57*23ba6841SJoseph Chen #else 58*23ba6841SJoseph Chen #error Please define sha2_32t as an unsigned 32 bit type in sha2.h 59*23ba6841SJoseph Chen #endif 60*23ba6841SJoseph Chen 61*23ba6841SJoseph Chen /* define an unsigned 64-bit type */ 62*23ba6841SJoseph Chen 63*23ba6841SJoseph Chen #if defined( _MSC_VER ) 64*23ba6841SJoseph Chen typedef unsigned __int64 sha2_64t; 65*23ba6841SJoseph Chen #define s_u64 ui64 66*23ba6841SJoseph Chen #elif ULONG_MAX == 0xffffffffffffffff 67*23ba6841SJoseph Chen typedef unsigned long sha2_64t; 68*23ba6841SJoseph Chen #define s_u64 ul 69*23ba6841SJoseph Chen #elif ULONG_MAX == 0xffffffff 70*23ba6841SJoseph Chen typedef unsigned long long sha2_64t; /* a somewhat dangerous guess */ 71*23ba6841SJoseph Chen #define s_u64 ull 72*23ba6841SJoseph Chen #else 73*23ba6841SJoseph Chen #error Please define sha2_64t as an unsigned 64 bit type in sha2.h 74*23ba6841SJoseph Chen #endif 75*23ba6841SJoseph Chen 76*23ba6841SJoseph Chen #else 77*23ba6841SJoseph Chen #include <common.h> 78*23ba6841SJoseph Chen 79*23ba6841SJoseph Chen typedef uint32_t sha2_32t; 80*23ba6841SJoseph Chen #define s_u32 u 81*23ba6841SJoseph Chen 82*23ba6841SJoseph Chen typedef uint64_t sha2_64t; /* a somewhat dangerous guess */ 83*23ba6841SJoseph Chen #define s_u64 ull 84*23ba6841SJoseph Chen #endif /* USE_HOSTCC */ 85*23ba6841SJoseph Chen 86*23ba6841SJoseph Chen #if defined(__cplusplus) 87*23ba6841SJoseph Chen extern "C" 88*23ba6841SJoseph Chen { 89*23ba6841SJoseph Chen #endif 90*23ba6841SJoseph Chen 91*23ba6841SJoseph Chen #define SHA256_DIGEST_SIZE 32 92*23ba6841SJoseph Chen #define SHA384_DIGEST_SIZE 48 93*23ba6841SJoseph Chen #define SHA512_DIGEST_SIZE 64 94*23ba6841SJoseph Chen 95*23ba6841SJoseph Chen #define SHA256_BLOCK_SIZE 64 96*23ba6841SJoseph Chen #define SHA384_BLOCK_SIZE 128 97*23ba6841SJoseph Chen #define SHA512_BLOCK_SIZE 128 98*23ba6841SJoseph Chen 99*23ba6841SJoseph Chen #define SHA2_DIGEST_SIZE SHA256_DIGEST_SIZE 100*23ba6841SJoseph Chen #define SHA2_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE 101*23ba6841SJoseph Chen 102*23ba6841SJoseph Chen #define SHA2_GOOD 0 103*23ba6841SJoseph Chen #define SHA2_BAD 1 104*23ba6841SJoseph Chen 105*23ba6841SJoseph Chen /* type to hold the SHA256 context */ 106*23ba6841SJoseph Chen 107*23ba6841SJoseph Chen typedef struct { 108*23ba6841SJoseph Chen sha2_32t count[2]; 109*23ba6841SJoseph Chen sha2_32t hash[8]; 110*23ba6841SJoseph Chen sha2_32t wbuf[16]; 111*23ba6841SJoseph Chen } sha256_ctx; 112*23ba6841SJoseph Chen 113*23ba6841SJoseph Chen /* type to hold the SHA384/512 context */ 114*23ba6841SJoseph Chen 115*23ba6841SJoseph Chen typedef struct { 116*23ba6841SJoseph Chen sha2_64t count[2]; 117*23ba6841SJoseph Chen sha2_64t hash[8]; 118*23ba6841SJoseph Chen sha2_64t wbuf[16]; 119*23ba6841SJoseph Chen } sha512_ctx; 120*23ba6841SJoseph Chen 121*23ba6841SJoseph Chen typedef sha512_ctx sha384_ctx; 122*23ba6841SJoseph Chen 123*23ba6841SJoseph Chen /* type to hold a SHA2 context (256/384/512) */ 124*23ba6841SJoseph Chen 125*23ba6841SJoseph Chen typedef struct { 126*23ba6841SJoseph Chen union { 127*23ba6841SJoseph Chen sha256_ctx ctx256[1]; 128*23ba6841SJoseph Chen sha512_ctx ctx512[1]; 129*23ba6841SJoseph Chen } uu[1]; 130*23ba6841SJoseph Chen sha2_32t sha2_len; 131*23ba6841SJoseph Chen } sha2_ctx; 132*23ba6841SJoseph Chen 133*23ba6841SJoseph Chen void sha256_compile(sha256_ctx ctx[1]); 134*23ba6841SJoseph Chen void sha512_compile(sha512_ctx ctx[1]); 135*23ba6841SJoseph Chen 136*23ba6841SJoseph Chen void sha256_begin(sha256_ctx ctx[1]); 137*23ba6841SJoseph Chen void sha256_hash(sha256_ctx ctx[1], const unsigned char data[], unsigned long len); 138*23ba6841SJoseph Chen void sha256_end(sha256_ctx ctx[1], unsigned char hval[]); 139*23ba6841SJoseph Chen void sha256(unsigned char hval[], const unsigned char data[], unsigned long len); 140*23ba6841SJoseph Chen 141*23ba6841SJoseph Chen void sha384_begin(sha384_ctx ctx[1]); 142*23ba6841SJoseph Chen #define sha384_hash sha512_hash 143*23ba6841SJoseph Chen void sha384_end(sha384_ctx ctx[1], unsigned char hval[]); 144*23ba6841SJoseph Chen void sha384(unsigned char hval[], const unsigned char data[], unsigned long len); 145*23ba6841SJoseph Chen 146*23ba6841SJoseph Chen void sha512_begin(sha512_ctx ctx[1]); 147*23ba6841SJoseph Chen void sha512_hash(sha512_ctx ctx[1], const unsigned char data[], unsigned long len); 148*23ba6841SJoseph Chen void sha512_end(sha512_ctx ctx[1], unsigned char hval[]); 149*23ba6841SJoseph Chen void sha512(unsigned char hval[], const unsigned char data[], unsigned long len); 150*23ba6841SJoseph Chen 151*23ba6841SJoseph Chen int sha2_begin(sha2_ctx ctx[1], unsigned long size); 152*23ba6841SJoseph Chen void sha2_hash(sha2_ctx ctx[1], const unsigned char data[], unsigned long len); 153*23ba6841SJoseph Chen void sha2_end(sha2_ctx ctx[1], unsigned char hval[]); 154*23ba6841SJoseph Chen int sha2(unsigned char hval[], unsigned long size, const unsigned char data[], unsigned long len); 155*23ba6841SJoseph Chen 156*23ba6841SJoseph Chen #if defined(__cplusplus) 157*23ba6841SJoseph Chen } 158*23ba6841SJoseph Chen #endif 159*23ba6841SJoseph Chen 160*23ba6841SJoseph Chen 161*23ba6841SJoseph Chen #endif 162