iPXE
mdhash.h
Go to the documentation of this file.
1#ifndef _IPXE_MDHASH_H
2#define _IPXE_MDHASH_H
3
4/** @file
5 *
6 * Merkle-Damgård hash algorithms
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_SECBOOT ( PERMITTED );
12
13#include <stdint.h>
14#include <stddef.h>
15#include <endian.h>
16#include <ipxe/crypto.h>
17
18/** Merkle-Damgård hash algorithm digest and data block */
19#define mdhash_dd_t( digestsize, blocksize ) \
20 struct { \
21 /** Digest of data already processed */ \
22 uint8_t digest[ (digestsize) ]; \
23 /** Accumulated data */ \
24 uint8_t data[ (blocksize) ]; \
25 } __attribute__ (( packed ))
26
27/** Merkle-Damgård hash algorithm context */
28#define mdhash_context_t( digestsize, blocksize ) \
29 struct { \
30 /** Amount of accumulated data */ \
31 size_t len; \
32 /** Digest and accumulated data */ \
33 mdhash_dd_t ( (digestsize), (blocksize) ) dd; \
34 }
35
36/** Merkle-Damgård trailing bit-length count */
38 /** Raw bytes */
39 uint8_t byte[16];
40 /** Host-endian qwords */
41 struct {
42 /** Bit length */
44 /** Padding */
46 } __attribute__ (( packed )) qword;
47};
48
49/** Merkle-Damgård hash algorithm */
51 /**
52 * Compression function
53 *
54 * @v dd Digest and accumulated data
55 * @v digest Copy of current digest value
56 *
57 * We provide a read-only copy of the current digest value
58 * since most compression functions would otherwise have to
59 * make this copy themselves.
60 */
61 void ( * compress ) ( void *dd, const void *digest );
62 /** Initial digest value (as host-endian words) */
63 const void *init;
64 /** Digest size (before any final truncation) */
66 /** Data toggle (for endianness swapping)
67 *
68 * This is the value to be XORed with a byte offset in the
69 * input data stream to obtain the byte offset within the
70 * internal word array.
71 *
72 * This same value is also XORed with a byte offset in the
73 * internal word array to obtain the byte offset within the
74 * digest output.
75 */
77 /** Length field length
78 *
79 * This is the length (in bytes) of the trailing bit-length
80 * field (used for Merkle-Damgård strengthening).
81 */
83 /** Length field toggle (for endianness swapping)
84 *
85 * This is the value to be XORed with the byte offset within a
86 * host-endian 64-bit integer to obtain the byte offset within
87 * the trailing bit-length field.
88 */
90};
91
92/** Merkle-Damgård hash algorithm digest and data block sample pointer */
93#define MDHASH_DD_PTR( _dd ) ( ( typeof (_dd) * ) NULL )
94
95/** Merkle-Damgård hash algorithm compression function sample pointer */
96#define MDHASH_COMPRESS_PTR( _dd ) \
97 ( ( void ( * ) \
98 ( _dd *, const typeof ( MDHASH_DD_PTR (_dd)->digest ) * ) ) \
99 NULL )
100
101/** Merkle-Damgård hash algorithm digest size */
102#define MDHASH_DIGEST_SIZE( _dd ) \
103 ( sizeof ( MDHASH_DD_PTR (_dd)->digest ) )
104
105/** Merkle-Damgård hash algorithm data toggle */
106#define MDHASH_TOGGLE( _dd, _byteorder ) \
107 ( ( (_byteorder) == __BYTE_ORDER ) ? 0 : \
108 ( sizeof ( MDHASH_DD_PTR (_dd)->digest.h[0] ) - 1 ) )
109
110/** Merkle-Damgård hash algorithm length field length */
111#define MDHASH_LEN_LEN( _dd ) \
112 ( sizeof ( MDHASH_DD_PTR (_dd)->data.final.len ) )
113
114/** Merkle-Damgård hash algorithm length field toggle */
115#define MDHASH_LEN_TOGGLE( _dd, _byteorder ) \
116 ( ( ( (_byteorder) == __BYTE_ORDER ) ? 0 : \
117 ( sizeof ( uint64_t ) - 1 ) ) | \
118 ( sizeof ( MDHASH_DD_PTR (_dd)->data.final.len ) - \
119 sizeof ( uint64_t ) ) )
120
121/** Merkle-Damgård hash algorithm block size */
122#define MDHASH_BLOCK_SIZE( _dd ) \
123 ( sizeof ( MDHASH_DD_PTR (_dd)->data ) )
124
125/** Merkle-Damgård hash algorithm context size */
126#define MDHASH_CTX_SIZE( _dd ) \
127 ( sizeof ( mdhash_context_t ( MDHASH_DIGEST_SIZE (_dd), \
128 MDHASH_BLOCK_SIZE (_dd) ) ) )
129
130extern void mdhash_init ( struct digest_algorithm *digest, void *ctx );
131extern void mdhash_update ( struct digest_algorithm *digest, void *ctx,
132 const void *src, size_t len );
133extern void mdhash_final ( struct digest_algorithm *digest, void *ctx,
134 void *out );
135
136/** Define a Merkle-Damgård hash algorithm */
137#define MDHASH_ALGORITHM( _name, _digest, _compress, _byteorder, \
138 _dd, _init, _digestsize ) \
139 static_assert ( sizeof (_init) == MDHASH_DIGEST_SIZE (_dd) ); \
140 static_assert ( (_digestsize) <= MDHASH_DIGEST_SIZE (_dd) ); \
141 static_assert ( offsetof ( _dd, digest ) == 0 ); \
142 static_assert ( offsetof ( _dd, data ) == \
143 MDHASH_DIGEST_SIZE (_dd) ); \
144 static_assert ( sizeof ( * MDHASH_DD_PTR (_dd) ) == \
145 ( MDHASH_DIGEST_SIZE (_dd) + \
146 MDHASH_BLOCK_SIZE (_dd) ) ); \
147 struct mdhash_algorithm _name ## _mdhash = { \
148 .compress = ( ( MDHASH_COMPRESS_PTR (_dd) \
149 == (_compress) ) \
150 ? ( ( void * ) (_compress) ) \
151 : ( ( void * ) (_compress) ) ), \
152 .init = ( ( &( MDHASH_DD_PTR (_dd)->digest ) \
153 == &(_init) ) \
154 ? &(_init) : &(_init) ), \
155 .digestsize = MDHASH_DIGEST_SIZE (_dd), \
156 .toggle = MDHASH_TOGGLE (_dd, _byteorder), \
157 .len_len = MDHASH_LEN_LEN (_dd), \
158 .len_toggle = MDHASH_LEN_TOGGLE (_dd, _byteorder), \
159 }; \
160 struct digest_algorithm _digest = { \
161 .name = #_name, \
162 .ctxsize = MDHASH_CTX_SIZE (_dd), \
163 .blocksize = MDHASH_BLOCK_SIZE (_dd), \
164 .digestsize = (_digestsize), \
165 .init = mdhash_init, \
166 .update = mdhash_update, \
167 .final = mdhash_final, \
168 .priv = &_name ## _mdhash, \
169 }
170
171#endif /* _IPXE_MDHASH_H */
struct golan_eq_context ctx
Definition CIB_PRM.h:0
__be32 out[4]
Definition CIB_PRM.h:8
unsigned long long uint64_t
Definition stdint.h:13
unsigned char uint8_t
Definition stdint.h:10
static const void * src
Definition string.h:48
ring len
Length.
Definition dwmac.h:226
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:921
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:951
#define __attribute__(x)
Definition compiler.h:10
Cryptographic API.
void mdhash_final(struct digest_algorithm *digest, void *ctx, void *out)
Generate digest.
Definition mdhash.c:111
void mdhash_update(struct digest_algorithm *digest, void *ctx, const void *src, size_t len)
Accumulate data.
Definition mdhash.c:66
void mdhash_init(struct digest_algorithm *digest, void *ctx)
Initialise algorithm.
Definition mdhash.c:45
A message digest algorithm.
Definition crypto.h:19
Merkle-Damgård hash algorithm.
Definition mdhash.h:50
const void * init
Initial digest value (as host-endian words).
Definition mdhash.h:63
uint8_t len_len
Length field length.
Definition mdhash.h:82
uint8_t digestsize
Digest size (before any final truncation).
Definition mdhash.h:65
uint8_t toggle
Data toggle (for endianness swapping).
Definition mdhash.h:76
uint8_t len_toggle
Length field toggle (for endianness swapping).
Definition mdhash.h:89
void(* compress)(void *dd, const void *digest)
Compression function.
Definition mdhash.h:61
Merkle-Damgård trailing bit-length count.
Definition mdhash.h:37
uint64_t bits
Bit length.
Definition mdhash.h:43
struct mdhash_len::@266161004377161233122147045250130141255315072176 qword
Host-endian qwords.
uint64_t pad
Padding.
Definition mdhash.h:45