blob: 1c20e4c228d7c7f2e18abdb933e1d8c68a5c579c [file] [log] [blame]
Antonio de Angelis8bb98512024-01-16 14:13:36 +00001/**
2 * \file sha512.h
3 * \brief This file contains SHA-384 and SHA-512 definitions and functions.
4 *
5 * The Secure Hash Algorithms 384 and 512 (SHA-384 and SHA-512) cryptographic
6 * hash functions are defined in <em>FIPS 180-4: Secure Hash Standard (SHS)</em>.
7 */
8/*
9 * Copyright The Mbed TLS Contributors
10 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
11 */
12#ifndef MBEDTLS_SHA512_H
13#define MBEDTLS_SHA512_H
14#include "mbedtls/private_access.h"
15
16#include "mbedtls/build_info.h"
17
18#include <stddef.h>
19#include <stdint.h>
20
21/** SHA-512 input data was malformed. */
22#define MBEDTLS_ERR_SHA512_BAD_INPUT_DATA -0x0075
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27
28#if !defined(MBEDTLS_SHA512_ALT)
29// Regular implementation
30//
31
32/**
33 * \brief The SHA-512 context structure.
34 *
35 * The structure is used both for SHA-384 and for SHA-512
36 * checksum calculations. The choice between these two is
37 * made in the call to mbedtls_sha512_starts().
38 */
39typedef struct mbedtls_sha512_context {
40 uint64_t MBEDTLS_PRIVATE(total)[2]; /*!< The number of Bytes processed. */
41 uint64_t MBEDTLS_PRIVATE(state)[8]; /*!< The intermediate digest state. */
42 unsigned char MBEDTLS_PRIVATE(buffer)[128]; /*!< The data block being processed. */
43#if defined(MBEDTLS_SHA384_C)
44 int MBEDTLS_PRIVATE(is384); /*!< Determines which function to use:
45 0: Use SHA-512, or 1: Use SHA-384. */
46#endif
47}
48mbedtls_sha512_context;
49
50#else /* MBEDTLS_SHA512_ALT */
51#include "sha512_alt.h"
52#endif /* MBEDTLS_SHA512_ALT */
53
54/**
55 * \brief This function initializes a SHA-512 context.
56 *
57 * \param ctx The SHA-512 context to initialize. This must
58 * not be \c NULL.
59 */
60void mbedtls_sha512_init(mbedtls_sha512_context *ctx);
61
62/**
63 * \brief This function clears a SHA-512 context.
64 *
65 * \param ctx The SHA-512 context to clear. This may be \c NULL,
66 * in which case this function does nothing. If it
67 * is not \c NULL, it must point to an initialized
68 * SHA-512 context.
69 */
70void mbedtls_sha512_free(mbedtls_sha512_context *ctx);
71
72/**
73 * \brief This function clones the state of a SHA-512 context.
74 *
75 * \param dst The destination context. This must be initialized.
76 * \param src The context to clone. This must be initialized.
77 */
78void mbedtls_sha512_clone(mbedtls_sha512_context *dst,
79 const mbedtls_sha512_context *src);
80
81/**
82 * \brief This function starts a SHA-384 or SHA-512 checksum
83 * calculation.
84 *
85 * \param ctx The SHA-512 context to use. This must be initialized.
86 * \param is384 Determines which function to use. This must be
87 * either \c 0 for SHA-512, or \c 1 for SHA-384.
88 *
89 * \note is384 must be defined accordingly to the enabled
90 * MBEDTLS_SHA384_C/MBEDTLS_SHA512_C symbols otherwise the
91 * function will return #MBEDTLS_ERR_SHA512_BAD_INPUT_DATA.
92 *
93 * \return \c 0 on success.
94 * \return A negative error code on failure.
95 */
96int mbedtls_sha512_starts(mbedtls_sha512_context *ctx, int is384);
97
98/**
99 * \brief This function feeds an input buffer into an ongoing
100 * SHA-512 checksum calculation.
101 *
102 * \param ctx The SHA-512 context. This must be initialized
103 * and have a hash operation started.
104 * \param input The buffer holding the input data. This must
105 * be a readable buffer of length \p ilen Bytes.
106 * \param ilen The length of the input data in Bytes.
107 *
108 * \return \c 0 on success.
109 * \return A negative error code on failure.
110 */
111int mbedtls_sha512_update(mbedtls_sha512_context *ctx,
112 const unsigned char *input,
113 size_t ilen);
114
115/**
116 * \brief This function finishes the SHA-512 operation, and writes
117 * the result to the output buffer.
118 *
119 * \param ctx The SHA-512 context. This must be initialized
120 * and have a hash operation started.
121 * \param output The SHA-384 or SHA-512 checksum result.
122 * This must be a writable buffer of length \c 64 bytes
123 * for SHA-512, \c 48 bytes for SHA-384.
124 *
125 * \return \c 0 on success.
126 * \return A negative error code on failure.
127 */
128int mbedtls_sha512_finish(mbedtls_sha512_context *ctx,
129 unsigned char *output);
130
131/**
132 * \brief This function processes a single data block within
133 * the ongoing SHA-512 computation.
134 * This function is for internal use only.
135 *
136 * \param ctx The SHA-512 context. This must be initialized.
137 * \param data The buffer holding one block of data. This
138 * must be a readable buffer of length \c 128 Bytes.
139 *
140 * \return \c 0 on success.
141 * \return A negative error code on failure.
142 */
143int mbedtls_internal_sha512_process(mbedtls_sha512_context *ctx,
144 const unsigned char data[128]);
145
146/**
147 * \brief This function calculates the SHA-512 or SHA-384
148 * checksum of a buffer.
149 *
150 * The function allocates the context, performs the
151 * calculation, and frees the context.
152 *
153 * The SHA-512 result is calculated as
154 * output = SHA-512(input buffer).
155 *
156 * \param input The buffer holding the input data. This must be
157 * a readable buffer of length \p ilen Bytes.
158 * \param ilen The length of the input data in Bytes.
159 * \param output The SHA-384 or SHA-512 checksum result.
160 * This must be a writable buffer of length \c 64 bytes
161 * for SHA-512, \c 48 bytes for SHA-384.
162 * \param is384 Determines which function to use. This must be either
163 * \c 0 for SHA-512, or \c 1 for SHA-384.
164 *
165 * \note is384 must be defined accordingly with the supported
166 * symbols in the config file. If:
167 * - is384 is 0, but \c MBEDTLS_SHA384_C is not defined, or
168 * - is384 is 1, but \c MBEDTLS_SHA512_C is not defined
169 * then the function will return
170 * #MBEDTLS_ERR_SHA512_BAD_INPUT_DATA.
171 *
172 * \return \c 0 on success.
173 * \return A negative error code on failure.
174 */
175int mbedtls_sha512(const unsigned char *input,
176 size_t ilen,
177 unsigned char *output,
178 int is384);
179
180#if defined(MBEDTLS_SELF_TEST)
181
182#if defined(MBEDTLS_SHA384_C)
183/**
184 * \brief The SHA-384 checkup routine.
185 *
186 * \return \c 0 on success.
187 * \return \c 1 on failure.
188 */
189int mbedtls_sha384_self_test(int verbose);
190#endif /* MBEDTLS_SHA384_C */
191
192#if defined(MBEDTLS_SHA512_C)
193/**
194 * \brief The SHA-512 checkup routine.
195 *
196 * \return \c 0 on success.
197 * \return \c 1 on failure.
198 */
199int mbedtls_sha512_self_test(int verbose);
200#endif /* MBEDTLS_SHA512_C */
201
202#endif /* MBEDTLS_SELF_TEST */
203
204#ifdef __cplusplus
205}
206#endif
207
208#endif /* mbedtls_sha512.h */