aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/sha512_256.h
blob: 43359dc7dd45b7dd167a46614bedf19b6168ee2b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
     This file is part of GNU libmicrohttpd
     Copyright (C) 2022 Karlson2k (Evgeny Grin)

     GNU libmicrohttpd is free software; you can redistribute it and/or
     modify it under the terms of the GNU Lesser General Public
     License as published by the Free Software Foundation; either
     version 2.1 of the License, or (at your option) any later version.

     This library is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     Lesser General Public License for more details.

     You should have received a copy of the GNU Lesser General Public
     License along with this library.
     If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * @file microhttpd/sha512_256.h
 * @brief  Calculation of SHA-512/256 digest
 * @author Karlson2k (Evgeny Grin)
 */

#ifndef MHD_SHA512_256_H
#define MHD_SHA512_256_H 1

#include "mhd_options.h"
#include <stdint.h>
#ifdef HAVE_STDDEF_H
#include <stddef.h>  /* for size_t */
#endif /* HAVE_STDDEF_H */


/**
 * Number of bits in single SHA-512/256 word.
 */
#define SHA512_256_WORD_SIZE_BITS 64

/**
 * Number of bytes in single SHA-512/256 word.
 */
#define SHA512_256_BYTES_IN_WORD (SHA512_256_WORD_SIZE_BITS / 8)

/**
 * Hash is kept internally as 8 64-bit words.
 * This is intermediate hash size, used during computing the final digest.
 */
#define SHA512_256_HASH_SIZE_WORDS 8

/**
 * Size of SHA-512/256 resulting digest in bytes.
 * This is the final digest size, not intermediate hash.
 */
#define SHA512_256_DIGEST_SIZE_WORDS (SHA512_256_HASH_SIZE_WORDS  / 2)

/**
 * Size of SHA-512/256 resulting digest in bytes
 * This is the final digest size, not intermediate hash.
 */
#define SHA512_256_DIGEST_SIZE \
  (SHA512_256_DIGEST_SIZE_WORDS * SHA512_256_BYTES_IN_WORD)

/**
 * Size of SHA-512/256 digest string in chars including termination NUL.
 */
#define SHA512_256_DIGEST_STRING_SIZE ((SHA512_256_DIGEST_SIZE) * 2 + 1)

/**
 * Size of single processing block in bits.
 * This is the final digest size, not intermediate hash.
 */
#define SHA512_256_BLOCK_SIZE_BITS 1024

/**
 * Size of single processing block in bytes.
 */
#define SHA512_256_BLOCK_SIZE (SHA512_256_BLOCK_SIZE_BITS / 8)

/**
 * Size of single processing block in words.
 */
#define SHA512_256_BLOCK_SIZE_WORDS \
 (SHA512_256_BLOCK_SIZE_BITS / SHA512_256_WORD_SIZE_BITS)


/**
 * SHA-512/256 calculation context
 */
struct Sha512_256Ctx
{
  uint64_t H[SHA512_256_HASH_SIZE_WORDS];       /**< Intermediate hash value  */
  uint64_t buffer[SHA512_256_BLOCK_SIZE_WORDS]; /**< SHA512_256 input data buffer */
  /**
   * The number of bytes, lower part
   */
  uint64_t count;
  /**
   * The number of bits, high part.
   * Unlike lower part, this counts the number of bits, not bytes.
   */
  uint64_t count_bits_hi;
};

/**
 * Initialise structure for SHA-512/256 calculation.
 *
 * @param ctx the calculation context
 */
void
MHD_SHA512_256_init (struct Sha512_256Ctx *ctx);


/**
 * Process portion of bytes.
 *
 * @param ctx the calculation context
 * @param data bytes to add to hash
 * @param length number of bytes in @a data
 */
void
MHD_SHA512_256_update (struct Sha512_256Ctx *ctx,
                       const uint8_t *data,
                       size_t length);


/**
 * Finalise SHA-512/256 calculation, return digest.
 *
 * @param ctx the calculation context
 * @param[out] digest set to the hash, must be #SHA512_256_DIGEST_SIZE bytes
 */
void
MHD_SHA512_256_finish (struct Sha512_256Ctx *ctx,
                       uint8_t digest[SHA512_256_DIGEST_SIZE]);

#endif /* MHD_SHA512_256_H */