1238104Sdes/* 2238104Sdes * FILE: sha2.h 3238104Sdes * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/ 4238104Sdes * 5238104Sdes * Copyright (c) 2000-2001, Aaron D. Gifford 6238104Sdes * All rights reserved. 7238104Sdes * 8238104Sdes * Modified by Jelte Jansen to fit in ldns, and not clash with any 9238104Sdes * system-defined SHA code. 10238104Sdes * Changes: 11238104Sdes * - Renamed (external) functions and constants to fit ldns style 12238104Sdes * - Removed uintXX vs. u_intXX smartness, since ldns needs uintXX 13238104Sdes * anyway 14238104Sdes * - BYTE ORDER check replaced by simple ifdef as defined or not by 15238104Sdes * configure.ac 16238104Sdes * - Removed _End and _Data functions 17238104Sdes * - Added ldns_shaX(data, len, digest) functions 18238104Sdes * 19238104Sdes * Redistribution and use in source and binary forms, with or without 20238104Sdes * modification, are permitted provided that the following conditions 21238104Sdes * are met: 22238104Sdes * 1. Redistributions of source code must retain the above copyright 23238104Sdes * notice, this list of conditions and the following disclaimer. 24238104Sdes * 2. Redistributions in binary form must reproduce the above copyright 25238104Sdes * notice, this list of conditions and the following disclaimer in the 26238104Sdes * documentation and/or other materials provided with the distribution. 27238104Sdes * 3. Neither the name of the copyright holder nor the names of contributors 28238104Sdes * may be used to endorse or promote products derived from this software 29238104Sdes * without specific prior written permission. 30238104Sdes * 31238104Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND 32238104Sdes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 33238104Sdes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 34238104Sdes * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE 35238104Sdes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36238104Sdes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37238104Sdes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38238104Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 39238104Sdes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 40238104Sdes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 41238104Sdes * SUCH DAMAGE. 42238104Sdes * 43238104Sdes * $Id: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $ 44238104Sdes */ 45238104Sdes 46238104Sdes#ifndef __LDNS_SHA2_H__ 47238104Sdes#define __LDNS_SHA2_H__ 48238104Sdes 49238104Sdes#ifdef __cplusplus 50238104Sdesextern "C" { 51238104Sdes#endif 52238104Sdes 53238104Sdes 54238104Sdes/* 55238104Sdes * Import u_intXX_t size_t type definitions from system headers. You 56238104Sdes * may need to change this, or define these things yourself in this 57238104Sdes * file. 58238104Sdes */ 59238104Sdes#include <sys/types.h> 60238104Sdes 61238104Sdes#if LDNS_BUILD_CONFIG_HAVE_INTTYPES_H 62238104Sdes 63238104Sdes#include <inttypes.h> 64238104Sdes 65238104Sdes#endif /* LDNS_BUILD_CONFIG_HAVE_INTTYPES_H */ 66238104Sdes 67238104Sdes 68238104Sdes/*** SHA-256/384/512 Various Length Definitions ***********************/ 69238104Sdes#define LDNS_SHA256_BLOCK_LENGTH 64 70238104Sdes#define LDNS_SHA256_DIGEST_LENGTH 32 71238104Sdes#define LDNS_SHA256_DIGEST_STRING_LENGTH (LDNS_SHA256_DIGEST_LENGTH * 2 + 1) 72238104Sdes#define LDNS_SHA384_BLOCK_LENGTH 128 73238104Sdes#define LDNS_SHA384_DIGEST_LENGTH 48 74238104Sdes#define LDNS_SHA384_DIGEST_STRING_LENGTH (LDNS_SHA384_DIGEST_LENGTH * 2 + 1) 75238104Sdes#define LDNS_SHA512_BLOCK_LENGTH 128 76238104Sdes#define LDNS_SHA512_DIGEST_LENGTH 64 77238104Sdes#define LDNS_SHA512_DIGEST_STRING_LENGTH (LDNS_SHA512_DIGEST_LENGTH * 2 + 1) 78238104Sdes 79238104Sdes 80238104Sdes/*** SHA-256/384/512 Context Structures *******************************/ 81238104Sdes 82238104Sdestypedef struct _ldns_sha256_CTX { 83238104Sdes uint32_t state[8]; 84238104Sdes uint64_t bitcount; 85238104Sdes uint8_t buffer[LDNS_SHA256_BLOCK_LENGTH]; 86238104Sdes} ldns_sha256_CTX; 87238104Sdestypedef struct _ldns_sha512_CTX { 88238104Sdes uint64_t state[8]; 89238104Sdes uint64_t bitcount[2]; 90238104Sdes uint8_t buffer[LDNS_SHA512_BLOCK_LENGTH]; 91238104Sdes} ldns_sha512_CTX; 92238104Sdes 93238104Sdestypedef ldns_sha512_CTX ldns_sha384_CTX; 94238104Sdes 95238104Sdes 96238104Sdes/*** SHA-256/384/512 Function Prototypes ******************************/ 97238104Sdesvoid ldns_sha256_init(ldns_sha256_CTX *); 98238104Sdesvoid ldns_sha256_update(ldns_sha256_CTX*, const uint8_t*, size_t); 99238104Sdesvoid ldns_sha256_final(uint8_t[LDNS_SHA256_DIGEST_LENGTH], ldns_sha256_CTX*); 100238104Sdes 101238104Sdesvoid ldns_sha384_init(ldns_sha384_CTX*); 102238104Sdesvoid ldns_sha384_update(ldns_sha384_CTX*, const uint8_t*, size_t); 103238104Sdesvoid ldns_sha384_final(uint8_t[LDNS_SHA384_DIGEST_LENGTH], ldns_sha384_CTX*); 104238104Sdes 105238104Sdesvoid ldns_sha512_init(ldns_sha512_CTX*); 106238104Sdesvoid ldns_sha512_update(ldns_sha512_CTX*, const uint8_t*, size_t); 107238104Sdesvoid ldns_sha512_final(uint8_t[LDNS_SHA512_DIGEST_LENGTH], ldns_sha512_CTX*); 108238104Sdes 109238104Sdes/** 110238104Sdes * Convenience function to digest a fixed block of data at once. 111238104Sdes * 112238104Sdes * \param[in] data the data to digest 113238104Sdes * \param[in] data_len the length of data in bytes 114238104Sdes * \param[out] digest the length of data in bytes 115238104Sdes * This pointer MUST have LDNS_SHA256_DIGEST_LENGTH bytes 116238104Sdes * available 117238104Sdes * \return the SHA1 digest of the given data 118238104Sdes */ 119238104Sdesunsigned char *ldns_sha256(unsigned char *data, unsigned int data_len, unsigned char *digest); 120238104Sdes 121238104Sdes/** 122238104Sdes * Convenience function to digest a fixed block of data at once. 123238104Sdes * 124238104Sdes * \param[in] data the data to digest 125238104Sdes * \param[in] data_len the length of data in bytes 126238104Sdes * \param[out] digest the length of data in bytes 127238104Sdes * This pointer MUST have LDNS_SHA384_DIGEST_LENGTH bytes 128238104Sdes * available 129238104Sdes * \return the SHA1 digest of the given data 130238104Sdes */ 131238104Sdesunsigned char *ldns_sha384(unsigned char *data, unsigned int data_len, unsigned char *digest); 132238104Sdes 133238104Sdes/** 134238104Sdes * Convenience function to digest a fixed block of data at once. 135238104Sdes * 136238104Sdes * \param[in] data the data to digest 137238104Sdes * \param[in] data_len the length of data in bytes 138238104Sdes * \param[out] digest the length of data in bytes 139238104Sdes * This pointer MUST have LDNS_SHA512_DIGEST_LENGTH bytes 140238104Sdes * available 141238104Sdes * \return the SHA1 digest of the given data 142238104Sdes */ 143238104Sdesunsigned char *ldns_sha512(unsigned char *data, unsigned int data_len, unsigned char *digest); 144238104Sdes 145238104Sdes#ifdef __cplusplus 146238104Sdes} 147238104Sdes#endif /* __cplusplus */ 148238104Sdes 149238104Sdes#endif /* __LDNS_SHA2_H__ */ 150