iPXE
mdhash.c File Reference

Merkle-Damgård hash algorithms. More...

#include <stdint.h>
#include <string.h>
#include <assert.h>
#include <ipxe/crypto.h>
#include <ipxe/mdhash.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
void mdhash_init (struct digest_algorithm *digest, void *ctx)
 Initialise algorithm.
void mdhash_update (struct digest_algorithm *digest, void *ctx, const void *data, size_t len)
 Accumulate data.
void mdhash_final (struct digest_algorithm *digest, void *ctx, void *out)
 Generate digest.

Detailed Description

Merkle-Damgård hash algorithms.

Definition in file mdhash.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ mdhash_init()

void mdhash_init ( struct digest_algorithm * digest,
void * ctx )

Initialise algorithm.

Parameters
digestDigest algorithm
ctxMD hash context

Definition at line 45 of file mdhash.c.

45 {
46 const struct mdhash_algorithm *mdhash = digest->priv;
47 size_t blocksize = digest->blocksize;
48 size_t digestsize = mdhash->digestsize;
49 mdhash_context_t ( digestsize, blocksize ) *context = ctx;
50
51 /* Zero accumulated data length */
52 context->len = 0;
53
54 /* Copy initial digest values */
55 memcpy ( &context->dd.digest, mdhash->init, digestsize );
56}
struct golan_eq_context ctx
Definition CIB_PRM.h:0
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define mdhash_context_t(digestsize, blocksize)
Merkle-Damgård hash algorithm context.
Definition mdhash.h:28
uint32_t digestsize
Digest size (i.e.
Definition pccrr.h:1
size_t blocksize
Block size.
Definition crypto.h:25
void * priv
Algorithm private data.
Definition crypto.h:54
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 digestsize
Digest size (before any final truncation).
Definition mdhash.h:65

References digest_algorithm::blocksize, ctx, digestsize, mdhash_algorithm::digestsize, mdhash_algorithm::init, mdhash_context_t, memcpy(), and digest_algorithm::priv.

◆ mdhash_update()

void mdhash_update ( struct digest_algorithm * digest,
void * ctx,
const void * data,
size_t len )

Accumulate data.

Parameters
digestDigest algorithm
ctxMD hash context
dataData
lenLength of data

Definition at line 66 of file mdhash.c.

67 {
68 const struct mdhash_algorithm *mdhash = digest->priv;
69 size_t blocksize = digest->blocksize;
70 size_t digestsize = mdhash->digestsize;
71 mdhash_context_t ( digestsize, blocksize ) *context = ctx;
72 const uint8_t *byte = data;
73 uint8_t copy[digestsize];
74 unsigned int toggle;
75 unsigned int mask;
76 size_t offset;
77
78 /* Accumulate data a byte at a time, swapping endianness as we
79 * go and performing the digest whenever we fill the data
80 * buffer.
81 */
82 toggle = mdhash->toggle;
83 mask = ( blocksize - 1 );
84 while ( len-- ) {
85 offset = ( ( context->len++ ^ toggle ) & mask );
86 context->dd.data[offset] = *(byte++);
87 if ( ( context->len & mask ) == 0 ) {
88 DBGC2 ( digest, "MDHASH %s compressing:\n",
89 digest->name );
90 DBGC2_HDA ( digest, 0, &context->dd.digest,
91 sizeof ( context->dd.digest ) );
92 DBGC2_HDA ( digest, 0, &context->dd.data,
93 sizeof ( context->dd.data ) );
94 memcpy ( copy, &context->dd.digest, digestsize );
95 mdhash->compress ( &context->dd, copy );
96 DBGC2 ( digest, "MDHASH %s compressed:\n",
97 digest->name );
98 DBGC2_HDA ( digest, 0, &context->dd.digest,
99 sizeof ( context->dd.digest ) );
100 }
101 }
102}
unsigned char uint8_t
Definition stdint.h:10
uint16_t offset
Offset to command line.
Definition bzimage.h:3
ring len
Length.
Definition dwmac.h:226
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define DBGC2(...)
Definition compiler.h:547
#define DBGC2_HDA(...)
Definition compiler.h:548
const char * name
Algorithm name.
Definition crypto.h:21
uint8_t toggle
Data toggle (for endianness swapping).
Definition mdhash.h:76
void(* compress)(void *dd, const void *digest)
Compression function.
Definition mdhash.h:61

References digest_algorithm::blocksize, mdhash_algorithm::compress, ctx, data, DBGC2, DBGC2_HDA, digestsize, mdhash_algorithm::digestsize, len, mdhash_context_t, memcpy(), digest_algorithm::name, offset, digest_algorithm::priv, and mdhash_algorithm::toggle.

Referenced by mdhash_final().

◆ mdhash_final()

void mdhash_final ( struct digest_algorithm * digest,
void * ctx,
void * out )

Generate digest.

Parameters
digestDigest algorithm
ctxMD hash context
outOutput buffer

Definition at line 111 of file mdhash.c.

111 {
112 const struct mdhash_algorithm *mdhash = digest->priv;
113 size_t blocksize = digest->blocksize;
114 size_t digestsize = mdhash->digestsize;
115 mdhash_context_t ( digestsize, blocksize ) *context = ctx;
116 uint8_t *byte = out;
117 union mdhash_len len;
118 unsigned int toggle;
119 unsigned int mask;
120 unsigned int stop;
121 unsigned int i;
122 uint8_t pad;
123
124 /* Record length before pre-processing */
125 len.qword.bits = ( ( ( uint64_t ) context->len ) * 8 );
126 len.qword.pad = 0;
127
128 /* Pad with a single "1" bit followed by as many "0" bits as required */
129 mask = ( blocksize - 1 );
130 stop = ( blocksize - mdhash->len_len );
131 pad = 0x80;
132 do {
133 mdhash_update ( digest, ctx, &pad, sizeof ( pad ) );
134 pad = 0x00;
135 } while ( ( context->len & mask ) != stop );
136
137 /* Append length (in bits) */
138 toggle = mdhash->len_toggle;
139 for ( i = 0 ; i < mdhash->len_len ; i++ ) {
140 mdhash_update ( digest, ctx, &len.byte[ i ^ toggle ],
141 sizeof ( len.byte[ i ^ toggle ] ) );
142 }
143 assert ( ( context->len & mask ) == 0 );
144
145 /* Copy out final digest */
146 toggle = mdhash->toggle;
147 for ( i = 0 ; i < digest->digestsize ; i++ )
148 byte[i] = context->dd.digest[ i ^ toggle ];
149 DBGC ( digest, "MDHASH %s digested:\n", digest->name );
150 DBGC_HDA ( digest, 0, out, digest->digestsize );
151}
__be32 out[4]
Definition CIB_PRM.h:8
u32 pad[9]
Padding.
Definition ar9003_mac.h:23
unsigned long long uint64_t
Definition stdint.h:13
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
#define DBGC(...)
Definition compiler.h:530
#define DBGC_HDA(...)
Definition compiler.h:531
void mdhash_update(struct digest_algorithm *digest, void *ctx, const void *data, size_t len)
Accumulate data.
Definition mdhash.c:66
size_t digestsize
Digest size.
Definition crypto.h:27
uint8_t len_len
Length field length.
Definition mdhash.h:82
uint8_t len_toggle
Length field toggle (for endianness swapping).
Definition mdhash.h:89
Merkle-Damgård trailing bit-length count.
Definition mdhash.h:37

References assert, digest_algorithm::blocksize, ctx, DBGC, DBGC_HDA, digest_algorithm::digestsize, digestsize, mdhash_algorithm::digestsize, len, mdhash_algorithm::len_len, mdhash_algorithm::len_toggle, mdhash_context_t, mdhash_update(), digest_algorithm::name, out, pad, digest_algorithm::priv, and mdhash_algorithm::toggle.