152 lines
4.4 KiB
C
152 lines
4.4 KiB
C
|
/*
|
||
|
---------------------------------------------------------------------------
|
||
|
Copyright (c) 2002, Dr Brian Gladman, Worcester, UK. All rights reserved.
|
||
|
|
||
|
LICENSE TERMS
|
||
|
|
||
|
The free distribution and use of this software in both source and binary
|
||
|
form is allowed (with or without changes) provided that:
|
||
|
|
||
|
1. distributions of this source code include the above copyright
|
||
|
notice, this list of conditions and the following disclaimer;
|
||
|
|
||
|
2. distributions in binary form include the above copyright
|
||
|
notice, this list of conditions and the following disclaimer
|
||
|
in the documentation and/or other associated materials;
|
||
|
|
||
|
3. the copyright holder's name is not used to endorse products
|
||
|
built using this software without specific written permission.
|
||
|
|
||
|
ALTERNATIVELY, provided that this notice is retained in full, this product
|
||
|
may be distributed under the terms of the GNU General Public License (GPL),
|
||
|
in which case the provisions of the GPL apply INSTEAD OF those given above.
|
||
|
|
||
|
DISCLAIMER
|
||
|
|
||
|
This software is provided 'as is' with no explicit or implied warranties
|
||
|
in respect of its properties, including, but not limited to, correctness
|
||
|
and/or fitness for purpose.
|
||
|
---------------------------------------------------------------------------
|
||
|
Issue Date: 01/08/2005
|
||
|
*/
|
||
|
|
||
|
#ifndef _SHA2_H
|
||
|
#define _SHA2_H
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#define SHA_64BIT
|
||
|
|
||
|
/* define the hash functions that you need */
|
||
|
#define SHA_2 /* for dynamic hash length */
|
||
|
#define SHA_224
|
||
|
#define SHA_256
|
||
|
#ifdef SHA_64BIT
|
||
|
# define SHA_384
|
||
|
# define SHA_512
|
||
|
# define NEED_UINT_64T
|
||
|
#endif
|
||
|
|
||
|
#include "brg_types.h"
|
||
|
|
||
|
#if defined(__cplusplus)
|
||
|
extern "C"
|
||
|
{
|
||
|
#endif
|
||
|
|
||
|
/* Note that the following function prototypes are the same */
|
||
|
/* for both the bit and byte oriented implementations. But */
|
||
|
/* the length fields are in bytes or bits as is appropriate */
|
||
|
/* for the version used. Bit sequences are arrays of bytes */
|
||
|
/* in which bit sequence indexes increase from the most to */
|
||
|
/* the least significant end of each byte */
|
||
|
|
||
|
#define SHA224_DIGEST_SIZE 28
|
||
|
#define SHA224_BLOCK_SIZE 64
|
||
|
#define SHA256_DIGEST_SIZE 32
|
||
|
#define SHA256_BLOCK_SIZE 64
|
||
|
|
||
|
/* type to hold the SHA256 (and SHA224) context */
|
||
|
|
||
|
typedef struct
|
||
|
{ uint_32t count[2];
|
||
|
uint_32t hash[8];
|
||
|
uint_32t wbuf[16];
|
||
|
} sha256_ctx;
|
||
|
|
||
|
typedef sha256_ctx sha224_ctx;
|
||
|
|
||
|
VOID_RETURN sha256_compile(sha256_ctx ctx[1]);
|
||
|
|
||
|
VOID_RETURN sha224_begin(sha224_ctx ctx[1]);
|
||
|
#define sha224_hash sha256_hash
|
||
|
VOID_RETURN sha224_end(unsigned char hval[], sha224_ctx ctx[1]);
|
||
|
VOID_RETURN sha224(unsigned char hval[], const unsigned char data[], unsigned long len);
|
||
|
|
||
|
VOID_RETURN sha256_begin(sha256_ctx ctx[1]);
|
||
|
VOID_RETURN sha256_hash(const unsigned char data[], unsigned long len, sha256_ctx ctx[1]);
|
||
|
VOID_RETURN sha256_end(unsigned char hval[], sha256_ctx ctx[1]);
|
||
|
VOID_RETURN sha256(unsigned char hval[], const unsigned char data[], unsigned long len);
|
||
|
|
||
|
#ifndef SHA_64BIT
|
||
|
|
||
|
typedef struct
|
||
|
{ union
|
||
|
{ sha256_ctx ctx256[1];
|
||
|
} uu[1];
|
||
|
uint_32t sha2_len;
|
||
|
} sha2_ctx;
|
||
|
|
||
|
#define SHA2_MAX_DIGEST_SIZE SHA256_DIGEST_SIZE
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define SHA384_DIGEST_SIZE 48
|
||
|
#define SHA384_BLOCK_SIZE 128
|
||
|
#define SHA512_DIGEST_SIZE 64
|
||
|
#define SHA512_BLOCK_SIZE 128
|
||
|
#define SHA2_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE
|
||
|
|
||
|
/* type to hold the SHA384 (and SHA512) context */
|
||
|
|
||
|
typedef struct
|
||
|
{ uint_64t count[2];
|
||
|
uint_64t hash[8];
|
||
|
uint_64t wbuf[16];
|
||
|
} sha512_ctx;
|
||
|
|
||
|
typedef sha512_ctx sha384_ctx;
|
||
|
|
||
|
typedef struct
|
||
|
{ union
|
||
|
{ sha256_ctx ctx256[1];
|
||
|
sha512_ctx ctx512[1];
|
||
|
} uu[1];
|
||
|
uint_32t sha2_len;
|
||
|
} sha2_ctx;
|
||
|
|
||
|
VOID_RETURN sha512_compile(sha512_ctx ctx[1]);
|
||
|
|
||
|
VOID_RETURN sha384_begin(sha384_ctx ctx[1]);
|
||
|
#define sha384_hash sha512_hash
|
||
|
VOID_RETURN sha384_end(unsigned char hval[], sha384_ctx ctx[1]);
|
||
|
VOID_RETURN sha384(unsigned char hval[], const unsigned char data[], unsigned long len);
|
||
|
|
||
|
VOID_RETURN sha512_begin(sha512_ctx ctx[1]);
|
||
|
VOID_RETURN sha512_hash(const unsigned char data[], unsigned long len, sha512_ctx ctx[1]);
|
||
|
VOID_RETURN sha512_end(unsigned char hval[], sha512_ctx ctx[1]);
|
||
|
VOID_RETURN sha512(unsigned char hval[], const unsigned char data[], unsigned long len);
|
||
|
|
||
|
INT_RETURN sha2_begin(unsigned long size, sha2_ctx ctx[1]);
|
||
|
VOID_RETURN sha2_hash(const unsigned char data[], unsigned long len, sha2_ctx ctx[1]);
|
||
|
VOID_RETURN sha2_end(unsigned char hval[], sha2_ctx ctx[1]);
|
||
|
INT_RETURN sha2(unsigned char hval[], unsigned long size, const unsigned char data[], unsigned long len);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#if defined(__cplusplus)
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif
|