iPXE
hmac.h
Go to the documentation of this file.
1#ifndef _IPXE_HMAC_H
2#define _IPXE_HMAC_H
3
4/** @file
5 *
6 * Keyed-Hashing for Message Authentication
7 */
8
9FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
10FILE_SECBOOT ( PERMITTED );
11
12#include <ipxe/crypto.h>
13
14/** HMAC reduced key type */
15#define hmac_key_t( digest ) struct { \
16 /** HMAC input/output padding */ \
17 uint8_t pad[ digest->blocksize ]; \
18 } __attribute__ (( packed ))
19
20/** HMAC context type */
21#define hmac_context_t( digest ) struct { \
22 /** Digest context */ \
23 uint8_t ctx[ digest->ctxsize ]; \
24 /** HMAC input/output padding */ \
25 uint8_t pad[ digest->blocksize ]; \
26 } __attribute__ (( packed ))
27
28/**
29 * Calculate HMAC reduced key size
30 *
31 * @v digest Digest algorithm to use
32 * @ret len HMAC key pad size
33 */
34static inline __attribute__ (( always_inline )) size_t
35hmac_keysize ( struct digest_algorithm *digest ) {
36 hmac_key_t ( digest ) *hkey;
37
38 return sizeof ( hkey->pad );
39}
40
41/**
42 * Calculate HMAC context size
43 *
44 * @v digest Digest algorithm to use
45 * @ret len HMAC context size
46 */
47static inline __attribute__ (( always_inline )) size_t
48hmac_ctxsize ( struct digest_algorithm *digest ) {
49 hmac_context_t ( digest ) *hctx;
50
51 return sizeof ( *hctx );
52}
53
54/**
55 * Update HMAC
56 *
57 * @v digest Digest algorithm to use
58 * @v ctx HMAC context
59 * @v data Data
60 * @v len Length of data
61 */
62static inline void hmac_update ( struct digest_algorithm *digest, void *ctx,
63 const void *data, size_t len ) {
64 hmac_context_t ( digest ) *hctx = ctx;
65
66 digest_update ( digest, hctx->ctx, data, len );
67}
68
69extern void hmac_key ( struct digest_algorithm *digest, void *ctx,
70 const void *secret, size_t len, void *key );
71extern void hmac_init_key ( struct digest_algorithm *digest, void *ctx,
72 const void *key );
73extern void hmac_init ( struct digest_algorithm *digest, void *ctx,
74 const void *secret, size_t len );
75extern void hmac_final ( struct digest_algorithm *digest, void *ctx,
76 void *hmac );
77
78#endif /* _IPXE_HMAC_H */
struct golan_eq_context ctx
Definition CIB_PRM.h:0
union @162305117151260234136356364136041353210355154177 key
ring len
Length.
Definition dwmac.h:226
uint8_t data[48]
Additional event data.
Definition ena.h:11
#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
void hmac_init(struct digest_algorithm *digest, void *ctx, const void *secret, size_t len)
Initialise HMAC.
Definition hmac.c:106
static void hmac_update(struct digest_algorithm *digest, void *ctx, const void *data, size_t len)
Update HMAC.
Definition hmac.h:62
#define hmac_key_t(digest)
HMAC reduced key type.
Definition hmac.h:15
static size_t hmac_ctxsize(struct digest_algorithm *digest)
Calculate HMAC context size.
Definition hmac.h:48
static size_t hmac_keysize(struct digest_algorithm *digest)
Calculate HMAC reduced key size.
Definition hmac.h:35
void hmac_final(struct digest_algorithm *digest, void *ctx, void *hmac)
Finalise HMAC.
Definition hmac.c:124
void hmac_key(struct digest_algorithm *digest, void *ctx, const void *secret, size_t len, void *key)
Construct HMAC reduced key.
Definition hmac.c:59
void hmac_init_key(struct digest_algorithm *digest, void *ctx, const void *key)
Initialise HMAC from reduced key.
Definition hmac.c:82
#define hmac_context_t(digest)
HMAC context type.
Definition hmac.h:21
#define __attribute__(x)
Definition compiler.h:10
Cryptographic API.
static void digest_update(struct digest_algorithm *digest, void *ctx, const void *data, size_t len)
Definition crypto.h:299
A message digest algorithm.
Definition crypto.h:19