1/* $OpenLDAP$ */ 2/* 3 * FILE: sha2.h 4 * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/ 5 * 6 * Copyright (c) 2000-2001, Aaron D. Gifford 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of the copyright holder nor the names of contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * $Id: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $ 34 */ 35 36#ifndef __SHA2_H__ 37#define __SHA2_H__ 38 39#ifdef __cplusplus 40extern "C" { 41#endif 42 43 44/* 45 * Import u_intXX_t size_t type definitions from system headers. You 46 * may need to change this, or define these things yourself in this 47 * file. 48 */ 49#include <sys/types.h> 50 51#ifdef SHA2_USE_INTTYPES_H 52 53#include <inttypes.h> 54 55#endif /* SHA2_USE_INTTYPES_H */ 56 57 58/*** SHA-256/384/512 Various Length Definitions ***********************/ 59#define SHA256_BLOCK_LENGTH 64 60#define SHA256_DIGEST_LENGTH 32 61#define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1) 62#define SHA384_BLOCK_LENGTH 128 63#define SHA384_DIGEST_LENGTH 48 64#define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1) 65#define SHA512_BLOCK_LENGTH 128 66#define SHA512_DIGEST_LENGTH 64 67#define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1) 68 69 70/*** SHA-256/384/512 Context Structures *******************************/ 71/* NOTE: If your architecture does not define either u_intXX_t types or 72 * uintXX_t (from inttypes.h), you may need to define things by hand 73 * for your system: 74 */ 75#if 0 76typedef unsigned char u_int8_t; /* 1-byte (8-bits) */ 77typedef unsigned int u_int32_t; /* 4-bytes (32-bits) */ 78typedef unsigned long long u_int64_t; /* 8-bytes (64-bits) */ 79#endif 80/* 81 * Most BSD systems already define u_intXX_t types, as does Linux. 82 * Some systems, however, like Compaq's Tru64 Unix instead can use 83 * uintXX_t types defined by very recent ANSI C standards and included 84 * in the file: 85 * 86 * #include <inttypes.h> 87 * 88 * If you choose to use <inttypes.h> then please define: 89 * 90 * #define SHA2_USE_INTTYPES_H 91 * 92 * Or on the command line during compile: 93 * 94 * cc -DSHA2_USE_INTTYPES_H ... 95 */ 96#ifdef SHA2_USE_INTTYPES_H 97 98typedef struct _SHA256_CTX { 99 uint32_t state[8]; 100 uint64_t bitcount; 101 uint8_t buffer[SHA256_BLOCK_LENGTH]; 102} SHA256_CTX; 103typedef struct _SHA512_CTX { 104 uint64_t state[8]; 105 uint64_t bitcount[2]; 106 uint8_t buffer[SHA512_BLOCK_LENGTH]; 107} SHA512_CTX; 108 109#else /* SHA2_USE_INTTYPES_H */ 110 111typedef struct _SHA256_CTX { 112 u_int32_t state[8]; 113 u_int64_t bitcount; 114 u_int8_t buffer[SHA256_BLOCK_LENGTH]; 115} SHA256_CTX; 116typedef struct _SHA512_CTX { 117 u_int64_t state[8]; 118 u_int64_t bitcount[2]; 119 u_int8_t buffer[SHA512_BLOCK_LENGTH]; 120} SHA512_CTX; 121 122#endif /* SHA2_USE_INTTYPES_H */ 123 124typedef SHA512_CTX SHA384_CTX; 125 126 127/*** SHA-256/384/512 Function Prototypes ******************************/ 128#ifndef NOPROTO 129#ifdef SHA2_USE_INTTYPES_H 130 131void SHA256_Init(SHA256_CTX *); 132void SHA256_Update(SHA256_CTX*, const uint8_t*, size_t); 133void SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); 134char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]); 135char* SHA256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]); 136 137void SHA384_Init(SHA384_CTX*); 138void SHA384_Update(SHA384_CTX*, const uint8_t*, size_t); 139void SHA384_Final(uint8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*); 140char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]); 141char* SHA384_Data(const uint8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]); 142 143void SHA512_Init(SHA512_CTX*); 144void SHA512_Update(SHA512_CTX*, const uint8_t*, size_t); 145void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*); 146char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]); 147char* SHA512_Data(const uint8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]); 148 149#else /* SHA2_USE_INTTYPES_H */ 150 151void SHA256_Init(SHA256_CTX *); 152void SHA256_Update(SHA256_CTX*, const u_int8_t*, size_t); 153void SHA256_Final(u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); 154char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]); 155char* SHA256_Data(const u_int8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]); 156 157void SHA384_Init(SHA384_CTX*); 158void SHA384_Update(SHA384_CTX*, const u_int8_t*, size_t); 159void SHA384_Final(u_int8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*); 160char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]); 161char* SHA384_Data(const u_int8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]); 162 163void SHA512_Init(SHA512_CTX*); 164void SHA512_Update(SHA512_CTX*, const u_int8_t*, size_t); 165void SHA512_Final(u_int8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*); 166char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]); 167char* SHA512_Data(const u_int8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]); 168 169#endif /* SHA2_USE_INTTYPES_H */ 170 171#else /* NOPROTO */ 172 173void SHA256_Init(); 174void SHA256_Update(); 175void SHA256_Final(); 176char* SHA256_End(); 177char* SHA256_Data(); 178 179void SHA384_Init(); 180void SHA384_Update(); 181void SHA384_Final(); 182char* SHA384_End(); 183char* SHA384_Data(); 184 185void SHA512_Init(); 186void SHA512_Update(); 187void SHA512_Final(); 188char* SHA512_End(); 189char* SHA512_Data(); 190 191#endif /* NOPROTO */ 192 193#ifdef __cplusplus 194} 195#endif /* __cplusplus */ 196 197#endif /* __SHA2_H__ */ 198 199