1/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2 * All rights reserved.
3 *
4 * This package is an SSL implementation written
5 * by Eric Young (eay@cryptsoft.com).
6 * The implementation was written so as to conform with Netscapes SSL.
7 *
8 * This library is free for commercial and non-commercial use as long as
9 * the following conditions are aheared to.  The following conditions
10 * apply to all code found in this distribution, be it the RC4, RSA,
11 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12 * included with this distribution is covered by the same copyright terms
13 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14 *
15 * Copyright remains Eric Young's, and as such any Copyright notices in
16 * the code are not to be removed.
17 * If this package is used in a product, Eric Young should be given attribution
18 * as the author of the parts of the library used.
19 * This can be in the form of a textual message at program startup or
20 * in documentation (online or textual) provided with the package.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the copyright
26 *    notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 *    notice, this list of conditions and the following disclaimer in the
29 *    documentation and/or other materials provided with the distribution.
30 * 3. All advertising materials mentioning features or use of this software
31 *    must display the following acknowledgement:
32 *    "This product includes cryptographic software written by
33 *     Eric Young (eay@cryptsoft.com)"
34 *    The word 'cryptographic' can be left out if the rouines from the library
35 *    being used are not cryptographic related :-).
36 * 4. If you include any Windows specific code (or a derivative thereof) from
37 *    the apps directory (application code) you must include an acknowledgement:
38 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39 *
40 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 * SUCH DAMAGE.
51 *
52 * The licence and distribution terms for any publically available version or
53 * derivative of this code cannot be changed.  i.e. this code cannot simply be
54 * copied and put under another distribution licence
55 * [including the GNU Public Licence.] */
56
57#ifndef OPENSSL_HEADER_SHA_H
58#define OPENSSL_HEADER_SHA_H
59
60#include <openssl/base.h>
61
62#if defined(__cplusplus)
63extern "C" {
64#endif
65
66
67/* The SHA family of hash functions (SHA-1 and SHA-2). */
68
69
70/* SHA_CBLOCK is the block size of SHA-1. */
71#define SHA_CBLOCK 64
72
73/* SHA_DIGEST_LENGTH is the length of a SHA-1 digest. */
74#define SHA_DIGEST_LENGTH 20
75
76/* SHA1_Init initialises |sha| and returns one. */
77OPENSSL_EXPORT int SHA1_Init(SHA_CTX *sha);
78
79/* SHA1_Update adds |len| bytes from |data| to |sha| and returns one. */
80OPENSSL_EXPORT int SHA1_Update(SHA_CTX *sha, const void *data, size_t len);
81
82/* SHA1_Final adds the final padding to |sha| and writes the resulting digest
83 * to |md|, which must have at least |SHA_DIGEST_LENGTH| bytes of space. It
84 * returns one. */
85OPENSSL_EXPORT int SHA1_Final(uint8_t *md, SHA_CTX *sha);
86
87/* SHA1 writes the digest of |len| bytes from |data| to |out| and returns
88 * |out|. There must be at least |SHA_DIGEST_LENGTH| bytes of space in
89 * |out|. */
90OPENSSL_EXPORT uint8_t *SHA1(const uint8_t *data, size_t len, uint8_t *out);
91
92/* SHA1_Transform is a low-level function that performs a single, SHA-1 block
93 * transformation using the state from |sha| and |SHA_CBLOCK| bytes from
94 * |block|. */
95OPENSSL_EXPORT void SHA1_Transform(SHA_CTX *sha, const uint8_t *block);
96
97struct sha_state_st {
98#if defined(OPENSSL_WINDOWS)
99  uint32_t h[5];
100#else
101  /* wpa_supplicant accesses |h0|..|h4| so we must support those names
102   * for compatibility with it until it can be updated. */
103  union {
104    uint32_t h[5];
105    struct {
106      uint32_t h0;
107      uint32_t h1;
108      uint32_t h2;
109      uint32_t h3;
110      uint32_t h4;
111    };
112  };
113#endif
114  uint32_t Nl, Nh;
115  uint8_t data[SHA_CBLOCK];
116  unsigned num;
117};
118
119
120/* SHA-224. */
121
122/* SHA224_CBLOCK is the block size of SHA-224. */
123#define SHA224_CBLOCK 64
124
125/* SHA224_DIGEST_LENGTH is the length of a SHA-224 digest. */
126#define SHA224_DIGEST_LENGTH 28
127
128/* SHA224_Init initialises |sha| and returns 1. */
129OPENSSL_EXPORT int SHA224_Init(SHA256_CTX *sha);
130
131/* SHA224_Update adds |len| bytes from |data| to |sha| and returns 1. */
132OPENSSL_EXPORT int SHA224_Update(SHA256_CTX *sha, const void *data, size_t len);
133
134/* SHA224_Final adds the final padding to |sha| and writes the resulting digest
135 * to |md|, which must have at least |SHA224_DIGEST_LENGTH| bytes of space. It
136 * returns one on success and zero on programmer error. */
137OPENSSL_EXPORT int SHA224_Final(uint8_t *md, SHA256_CTX *sha);
138
139/* SHA224 writes the digest of |len| bytes from |data| to |out| and returns
140 * |out|. There must be at least |SHA224_DIGEST_LENGTH| bytes of space in
141 * |out|. */
142OPENSSL_EXPORT uint8_t *SHA224(const uint8_t *data, size_t len, uint8_t *out);
143
144
145/* SHA-256. */
146
147/* SHA256_CBLOCK is the block size of SHA-256. */
148#define SHA256_CBLOCK 64
149
150/* SHA256_DIGEST_LENGTH is the length of a SHA-256 digest. */
151#define SHA256_DIGEST_LENGTH 32
152
153/* SHA256_Init initialises |sha| and returns 1. */
154OPENSSL_EXPORT int SHA256_Init(SHA256_CTX *sha);
155
156/* SHA256_Update adds |len| bytes from |data| to |sha| and returns 1. */
157OPENSSL_EXPORT int SHA256_Update(SHA256_CTX *sha, const void *data, size_t len);
158
159/* SHA256_Final adds the final padding to |sha| and writes the resulting digest
160 * to |md|, which must have at least |SHA256_DIGEST_LENGTH| bytes of space. It
161 * returns one on success and zero on programmer error. */
162OPENSSL_EXPORT int SHA256_Final(uint8_t *md, SHA256_CTX *sha);
163
164/* SHA256 writes the digest of |len| bytes from |data| to |out| and returns
165 * |out|. There must be at least |SHA256_DIGEST_LENGTH| bytes of space in
166 * |out|. */
167OPENSSL_EXPORT uint8_t *SHA256(const uint8_t *data, size_t len, uint8_t *out);
168
169/* SHA256_Transform is a low-level function that performs a single, SHA-256
170 * block transformation using the state from |sha| and |SHA256_CBLOCK| bytes
171 * from |block|. */
172OPENSSL_EXPORT void SHA256_Transform(SHA256_CTX *sha, const uint8_t *block);
173
174struct sha256_state_st {
175  uint32_t h[8];
176  uint32_t Nl, Nh;
177  uint8_t data[SHA256_CBLOCK];
178  unsigned num, md_len;
179};
180
181
182/* SHA-384. */
183
184/* SHA384_CBLOCK is the block size of SHA-384. */
185#define SHA384_CBLOCK 128
186
187/* SHA384_DIGEST_LENGTH is the length of a SHA-384 digest. */
188#define SHA384_DIGEST_LENGTH 48
189
190/* SHA384_Init initialises |sha| and returns 1. */
191OPENSSL_EXPORT int SHA384_Init(SHA512_CTX *sha);
192
193/* SHA384_Update adds |len| bytes from |data| to |sha| and returns 1. */
194OPENSSL_EXPORT int SHA384_Update(SHA512_CTX *sha, const void *data, size_t len);
195
196/* SHA384_Final adds the final padding to |sha| and writes the resulting digest
197 * to |md|, which must have at least |SHA384_DIGEST_LENGTH| bytes of space. It
198 * returns one on success and zero on programmer error. */
199OPENSSL_EXPORT int SHA384_Final(uint8_t *md, SHA512_CTX *sha);
200
201/* SHA384 writes the digest of |len| bytes from |data| to |out| and returns
202 * |out|. There must be at least |SHA384_DIGEST_LENGTH| bytes of space in
203 * |out|. */
204OPENSSL_EXPORT uint8_t *SHA384(const uint8_t *data, size_t len, uint8_t *out);
205
206/* SHA384_Transform is a low-level function that performs a single, SHA-384
207 * block transformation using the state from |sha| and |SHA384_CBLOCK| bytes
208 * from |block|. */
209OPENSSL_EXPORT void SHA384_Transform(SHA512_CTX *sha, const uint8_t *block);
210
211
212/* SHA-512. */
213
214/* SHA512_CBLOCK is the block size of SHA-512. */
215#define SHA512_CBLOCK 128
216
217/* SHA512_DIGEST_LENGTH is the length of a SHA-512 digest. */
218#define SHA512_DIGEST_LENGTH 64
219
220/* SHA512_Init initialises |sha| and returns 1. */
221OPENSSL_EXPORT int SHA512_Init(SHA512_CTX *sha);
222
223/* SHA512_Update adds |len| bytes from |data| to |sha| and returns 1. */
224OPENSSL_EXPORT int SHA512_Update(SHA512_CTX *sha, const void *data, size_t len);
225
226/* SHA512_Final adds the final padding to |sha| and writes the resulting digest
227 * to |md|, which must have at least |SHA512_DIGEST_LENGTH| bytes of space. It
228 * returns one on success and zero on programmer error. */
229OPENSSL_EXPORT int SHA512_Final(uint8_t *md, SHA512_CTX *sha);
230
231/* SHA512 writes the digest of |len| bytes from |data| to |out| and returns
232 * |out|. There must be at least |SHA512_DIGEST_LENGTH| bytes of space in
233 * |out|. */
234OPENSSL_EXPORT uint8_t *SHA512(const uint8_t *data, size_t len, uint8_t *out);
235
236/* SHA512_Transform is a low-level function that performs a single, SHA-512
237 * block transformation using the state from |sha| and |SHA512_CBLOCK| bytes
238 * from |block|. */
239OPENSSL_EXPORT void SHA512_Transform(SHA512_CTX *sha, const uint8_t *block);
240
241struct sha512_state_st {
242  uint64_t h[8];
243  uint64_t Nl, Nh;
244  union {
245    uint64_t d[16];
246    uint8_t p[128];
247  } u;
248  unsigned num, md_len;
249};
250
251
252#if defined(__cplusplus)
253}  /* extern C */
254#endif
255
256#endif  /* OPENSSL_HEADER_SHA_H */
257