19#define mdhash_dd_t( digestsize, blocksize ) \
22 uint8_t digest[ (digestsize) ]; \
24 uint8_t data[ (blocksize) ]; \
25 } __attribute__ (( packed ))
28#define mdhash_context_t( digestsize, blocksize ) \
33 mdhash_dd_t ( (digestsize), (blocksize) ) dd; \
61 void ( *
compress ) (
void *dd,
const void *digest );
93#define MDHASH_DD_PTR( _dd ) ( ( typeof (_dd) * ) NULL )
96#define MDHASH_COMPRESS_PTR( _dd ) \
98 ( _dd *, const typeof ( MDHASH_DD_PTR (_dd)->digest ) * ) ) \
102#define MDHASH_DIGEST_SIZE( _dd ) \
103 ( sizeof ( MDHASH_DD_PTR (_dd)->digest ) )
106#define MDHASH_TOGGLE( _dd, _byteorder ) \
107 ( ( (_byteorder) == __BYTE_ORDER ) ? 0 : \
108 ( sizeof ( MDHASH_DD_PTR (_dd)->digest.h[0] ) - 1 ) )
111#define MDHASH_LEN_LEN( _dd ) \
112 ( sizeof ( MDHASH_DD_PTR (_dd)->data.final.len ) )
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 ) ) )
122#define MDHASH_BLOCK_SIZE( _dd ) \
123 ( sizeof ( MDHASH_DD_PTR (_dd)->data ) )
126#define MDHASH_CTX_SIZE( _dd ) \
127 ( sizeof ( mdhash_context_t ( MDHASH_DIGEST_SIZE (_dd), \
128 MDHASH_BLOCK_SIZE (_dd) ) ) )
132 const void *
src,
size_t len );
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) \
150 ? ( ( void * ) (_compress) ) \
151 : ( ( void * ) (_compress) ) ), \
152 .init = ( ( &( MDHASH_DD_PTR (_dd)->digest ) \
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), \
160 struct digest_algorithm _digest = { \
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, \
struct golan_eq_context ctx
unsigned long long uint64_t
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
void mdhash_final(struct digest_algorithm *digest, void *ctx, void *out)
Generate digest.
void mdhash_update(struct digest_algorithm *digest, void *ctx, const void *src, size_t len)
Accumulate data.
void mdhash_init(struct digest_algorithm *digest, void *ctx)
Initialise algorithm.
A message digest algorithm.
Merkle-Damgård hash algorithm.
const void * init
Initial digest value (as host-endian words).
uint8_t len_len
Length field length.
uint8_t digestsize
Digest size (before any final truncation).
uint8_t toggle
Data toggle (for endianness swapping).
uint8_t len_toggle
Length field toggle (for endianness swapping).
void(* compress)(void *dd, const void *digest)
Compression function.
Merkle-Damgård trailing bit-length count.
struct mdhash_len::@266161004377161233122147045250130141255315072176 qword
Host-endian qwords.