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