iPXE
gcm.h
Go to the documentation of this file.
1#ifndef _IPXE_GCM_H
2#define _IPXE_GCM_H
3
4/** @file
5 *
6 * Galois/Counter Mode (GCM)
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_SECBOOT ( PERMITTED );
12
13#include <stdint.h>
14#include <ipxe/crypto.h>
15
16/** A GCM counter */
18 /** Initialisation vector */
20 /** Counter value */
22} __attribute__ (( packed ));
23
24/** A GCM length pair */
26 /** Additional data length */
28 /** Data length */
30} __attribute__ (( packed ));
31
32/** A GCM block */
33union gcm_block {
34 /** Raw bytes */
35 uint8_t byte[16];
36 /** Raw words */
38 /** Raw dwords */
40 /** Counter */
42 /** Lengths */
44} __attribute__ (( packed ));
45
46/** GCM context */
48 /** Accumulated hash (X) */
50 /** Accumulated lengths */
52 /** Counter (Y) */
54 /** Hash key (H) */
56 /** Underlying block cipher */
58 /** Underlying block cipher context */
60};
61
62extern void gcm_tag ( struct gcm_context *context, union gcm_block *tag );
63extern int gcm_setkey ( struct gcm_context *context, const void *key,
64 size_t keylen, struct cipher_algorithm *raw_cipher );
65extern void gcm_setiv ( struct gcm_context *context, const void *iv,
66 size_t ivlen );
67extern void gcm_encrypt ( struct gcm_context *context, const void *src,
68 void *dst, size_t len );
69extern void gcm_decrypt ( struct gcm_context *context, const void *src,
70 void *dst, size_t len );
71
72/**
73 * Create a GCM mode of behaviour of an existing cipher
74 *
75 * @v _cbc_name Name for the new CBC cipher
76 * @v _cbc_cipher New cipher algorithm
77 * @v _raw_cipher Underlying cipher algorithm
78 * @v _raw_context Context structure for the underlying cipher
79 * @v _blocksize Cipher block size
80 */
81#define GCM_CIPHER( _gcm_name, _gcm_cipher, _raw_cipher, _raw_context, \
82 _blocksize ) \
83struct _gcm_name ## _context { \
84 /** GCM context */ \
85 struct gcm_context gcm; \
86 /** Underlying block cipher context */ \
87 _raw_context raw; \
88}; \
89static int _gcm_name ## _setkey ( void *ctx, const void *key, \
90 size_t keylen ) { \
91 struct _gcm_name ## _context *context = ctx; \
92 build_assert ( _blocksize == sizeof ( context->gcm.key ) ); \
93 build_assert ( offsetof ( typeof ( *context ), gcm ) == 0 ); \
94 build_assert ( offsetof ( typeof ( *context ), raw ) == \
95 offsetof ( typeof ( *context ), gcm.raw_ctx ) ); \
96 return gcm_setkey ( &context->gcm, key, keylen, &_raw_cipher ); \
97} \
98static void _gcm_name ## _setiv ( void *ctx, const void *iv, \
99 size_t ivlen ) { \
100 struct _gcm_name ## _context *context = ctx; \
101 gcm_setiv ( &context->gcm, iv, ivlen ); \
102} \
103static void _gcm_name ## _encrypt ( void *ctx, const void *src, \
104 void *dst, size_t len ) { \
105 struct _gcm_name ## _context *context = ctx; \
106 gcm_encrypt ( &context->gcm, src, dst, len ); \
107} \
108static void _gcm_name ## _decrypt ( void *ctx, const void *src, \
109 void *dst, size_t len ) { \
110 struct _gcm_name ## _context *context = ctx; \
111 gcm_decrypt ( &context->gcm, src, dst, len ); \
112} \
113static void _gcm_name ## _auth ( void *ctx, void *auth ) { \
114 struct _gcm_name ## _context *context = ctx; \
115 union gcm_block *tag = auth; \
116 gcm_tag ( &context->gcm, tag ); \
117} \
118struct cipher_algorithm _gcm_cipher = { \
119 .name = #_gcm_name, \
120 .ctxsize = sizeof ( struct _gcm_name ## _context ), \
121 .blocksize = 1, \
122 .alignsize = sizeof ( union gcm_block ), \
123 .authsize = sizeof ( union gcm_block ), \
124 .setkey = _gcm_name ## _setkey, \
125 .setiv = _gcm_name ## _setiv, \
126 .encrypt = _gcm_name ## _encrypt, \
127 .decrypt = _gcm_name ## _decrypt, \
128 .auth = _gcm_name ## _auth, \
129};
130
131#endif /* _IPXE_GCM_H */
union @162305117151260234136356364136041353210355154177 key
Sense key.
Definition scsi.h:3
unsigned short uint16_t
Definition stdint.h:11
unsigned int uint32_t
Definition stdint.h:12
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
uint64_t tag
Identity tag.
Definition edd.h:1
void gcm_tag(struct gcm_context *context, union gcm_block *tag)
Construct tag.
Definition gcm.c:409
void gcm_setiv(struct gcm_context *context, const void *iv, size_t ivlen)
Set initialisation vector.
Definition gcm.c:475
void gcm_encrypt(struct gcm_context *context, const void *src, void *dst, size_t len)
Encrypt data.
Definition gcm.c:522
void gcm_decrypt(struct gcm_context *context, const void *src, void *dst, size_t len)
Decrypt data.
Definition gcm.c:537
int gcm_setkey(struct gcm_context *context, const void *key, size_t keylen, struct cipher_algorithm *raw_cipher)
Set key.
Definition gcm.c:440
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
#define __attribute__(x)
Definition compiler.h:10
Cryptographic API.
A cipher algorithm.
Definition crypto.h:51
GCM context.
Definition gcm.h:47
union gcm_block key
Hash key (H)
Definition gcm.h:55
struct cipher_algorithm * raw_cipher
Underlying block cipher.
Definition gcm.h:57
uint8_t raw_ctx[0]
Underlying block cipher context.
Definition gcm.h:59
union gcm_block ctr
Counter (Y)
Definition gcm.h:53
union gcm_block hash
Accumulated hash (X)
Definition gcm.h:49
union gcm_block len
Accumulated lengths.
Definition gcm.h:51
A GCM counter.
Definition gcm.h:17
uint8_t iv[12]
Initialisation vector.
Definition gcm.h:19
uint32_t value
Counter value.
Definition gcm.h:21
A GCM length pair.
Definition gcm.h:25
uint64_t data
Data length.
Definition gcm.h:29
uint64_t add
Additional data length.
Definition gcm.h:27
A GCM block.
Definition gcm.h:33
struct gcm_counter ctr
Counter.
Definition gcm.h:41
uint32_t dword[4]
Raw dwords.
Definition gcm.h:39
struct gcm_lengths len
Lengths.
Definition gcm.h:43
uint16_t word[8]
Raw words.
Definition gcm.h:37
u8 iv[16]
Initialization vector.
Definition wpa.h:33