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