Merge branch '2.5.x'
[catacomb] / symm / sha512.h
CommitLineData
eee16120 1/* -*-c-*-
2 *
eee16120 3 * Implementation of the SHA-512 hash function
4 *
5 * (c) 2000 Straylight/Edgeware
6 */
7
45c0fd36 8/*----- Licensing notice --------------------------------------------------*
eee16120 9 *
10 * This file is part of Catacomb.
11 *
12 * Catacomb is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Library General Public License as
14 * published by the Free Software Foundation; either version 2 of the
15 * License, or (at your option) any later version.
45c0fd36 16 *
eee16120 17 * Catacomb is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Library General Public License for more details.
45c0fd36 21 *
eee16120 22 * You should have received a copy of the GNU Library General Public
23 * License along with Catacomb; if not, write to the Free
24 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25 * MA 02111-1307, USA.
26 */
27
5d5a3322 28/*----- Notes on the SHA-512 hash function --------------------------------*
eee16120 29 *
30 * SHA-1 (Secure Hash Algorithm) was designed by the NSA, for use with the
31 * Digital Signature Algorithm. This is an evolution with a larger output
32 * size, intended to provide security commensurate with 256-bit AES. At the
33 * time of writing, SHA-512 is very new, and can't be trusted too far. There
34 * is also a truncated version, SHA-384, which provides security commensurate
35 * with 192-bit AES.
36 */
37
38#ifndef CATACOMB_SHA512_H
39#define CATACOMB_SHA512_H
40#define CATACOMB_SHA384_H
41
42#ifdef __cplusplus
43 extern "C" {
44#endif
45
46/*----- Header files ------------------------------------------------------*/
47
48#include <mLib/bits.h>
49
50#ifndef CATACOMB_GHASH_H
51# include "ghash.h"
52#endif
53
54/*----- Magic numbers -----------------------------------------------------*/
55
56#define SHA512_BUFSZ 128
57#define SHA512_HASHSZ 64
c850c0da 58#define SHA512_STATESZ 64
eee16120 59
60#define SHA384_BUFSZ 128
61#define SHA384_HASHSZ 48
c850c0da 62#define SHA384_STATESZ 64
eee16120 63
12a5df42
MW
64#define SHA512_256_BUFSZ 128
65#define SHA512_256_HASHSZ 32
66#define SHA512_256_STATESZ 64
67
68#define SHA512_224_BUFSZ 128
69#define SHA512_224_HASHSZ 28
70#define SHA512_224_STATESZ 64
71
eee16120 72/*----- Data structures ---------------------------------------------------*/
73
74typedef struct sha512_ctx {
75 kludge64 a, b, c, d, e, f, g, h; /* Chaining variables */
76 uint32 nh, nl; /* Byte count so far */
77 unsigned off; /* Offset into buffer */
78 octet buf[SHA512_BUFSZ]; /* Accumulation buffer */
12a5df42 79} sha512_ctx, sha384_ctx, sha512_256_ctx, sha512_224_ctx;
eee16120 80
81/*----- Functions provided ------------------------------------------------*/
82
12a5df42 83/* --- @sha512_compress@, etc. --- *
eee16120 84 *
85 * Arguments: @sha512_ctx *ctx@ = pointer to context block
86 * @const void *sbuf@ = pointer to buffer of appropriate size
87 *
88 * Returns: ---
89 *
90 * Use: SHA-512 compression function.
91 */
92
93extern void sha512_compress(sha512_ctx */*ctx*/, const void */*sbuf*/);
94#define sha384_compress sha512_compress
12a5df42
MW
95#define sha512_256_compress sha512_compress
96#define sha512_224_compress sha512_compress
eee16120 97
12a5df42 98/* --- @sha512_init@, etc. --- *
eee16120 99 *
100 * Arguments: @sha512_ctx *ctx@ = pointer to context block to initialize
101 *
102 * Returns: ---
103 *
104 * Use: Initializes a context block ready for hashing.
105 */
106
107extern void sha512_init(sha512_ctx */*ctx*/);
108extern void sha384_init(sha512_ctx */*ctx*/);
12a5df42
MW
109extern void sha512_256_init(sha512_ctx */*ctx*/);
110extern void sha512_224_init(sha512_ctx */*ctx*/);
eee16120 111
12a5df42 112/* --- @sha512_set@, etc. --- *
eee16120 113 *
114 * Arguments: @sha512_ctx *ctx@ = pointer to context block
115 * @const void *buf@ = pointer to state buffer
116 * @unsigned long count@ = current count of bytes processed
117 *
118 * Returns: ---
119 *
120 * Use: Initializes a context block from a given state. This is
121 * useful in cases where the initial hash state is meant to be
122 * secret, e.g., for NMAC and HMAC support.
123 */
124
125extern void sha512_set(sha512_ctx */*ctx*/, const void */*buf*/,
126 unsigned long /*count*/);
127#define sha384_set sha512_set
12a5df42
MW
128#define sha512_256_set sha512_set
129#define sha512_224_set sha512_set
eee16120 130
12a5df42 131/* --- @sha512_hash@, etc. --- *
eee16120 132 *
133 * Arguments: @sha512_ctx *ctx@ = pointer to context block
134 * @const void *buf@ = buffer of data to hash
135 * @size_t sz@ = size of buffer to hash
136 *
137 * Returns: ---
138 *
139 * Use: Hashes a buffer of data. The buffer may be of any size and
140 * alignment.
141 */
142
143extern void sha512_hash(sha512_ctx */*ctx*/,
144 const void */*buf*/, size_t /*sz*/);
145#define sha384_hash sha512_hash
12a5df42
MW
146#define sha512_256_hash sha512_hash
147#define sha512_224_hash sha512_hash
eee16120 148
12a5df42 149/* --- @sha512_done@, etc. --- *
eee16120 150 *
151 * Arguments: @sha512_ctx *ctx@ = pointer to context block
152 * @void *hash@ = pointer to output buffer
153 *
154 * Returns: ---
155 *
156 * Use: Returns the hash of the data read so far.
157 */
158
159extern void sha512_done(sha512_ctx */*ctx*/, void */*hash*/);
160extern void sha384_done(sha512_ctx */*ctx*/, void */*hash*/);
12a5df42
MW
161extern void sha512_256_done(sha512_ctx */*ctx*/, void */*hash*/);
162extern void sha512_224_done(sha512_ctx */*ctx*/, void */*hash*/);
eee16120 163
164/* --- @sha512_state@, @sha384_state@ --- *
165 *
166 * Arguments: @sha512_ctx *ctx@ = pointer to context
167 * @void *state@ = pointer to buffer for current state
168 *
169 * Returns: Number of bytes written to the hash function so far.
170 *
171 * Use: Returns the current state of the hash function such that
172 * it can be passed to @sha512_set@.
173 */
174
175extern unsigned long sha512_state(sha512_ctx */*ctx*/, void */*state*/);
176#define sha384_state sha512_state
12a5df42
MW
177#define sha512_256_state sha512_state
178#define sha512_224_state sha512_state
eee16120 179
180/*----- Generic hash interface --------------------------------------------*/
181
182extern const gchash sha512;
183extern const gchash sha384;
12a5df42
MW
184extern const gchash sha512_256;
185extern const gchash sha512_224;
eee16120 186
187/*----- That's all, folks -------------------------------------------------*/
188
189#ifdef __cplusplus
190 }
191#endif
192
193#endif