iPXE
Data Structures | Macros | Functions | Variables
gcm.h File Reference

Galois/Counter Mode (GCM) More...

#include <stdint.h>
#include <ipxe/crypto.h>

Go to the source code of this file.

Data Structures

struct  gcm_counter
 A GCM counter. More...
 
struct  gcm_lengths
 A GCM length pair. More...
 
union  gcm_block
 A GCM block. More...
 
struct  gcm_context
 GCM context. More...
 

Macros

#define GCM_CIPHER(_gcm_name, _gcm_cipher, _raw_cipher, _raw_context, _blocksize)
 Create a GCM mode of behaviour of an existing cipher. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
struct gcm_counter __attribute__ ((packed))
 
void gcm_tag (struct gcm_context *context, union gcm_block *tag)
 Construct tag. More...
 
int gcm_setkey (struct gcm_context *context, const void *key, size_t keylen, struct cipher_algorithm *raw_cipher)
 Set key. More...
 
void gcm_setiv (struct gcm_context *context, const void *iv, size_t ivlen)
 Set initialisation vector. More...
 
void gcm_encrypt (struct gcm_context *context, const void *src, void *dst, size_t len)
 Encrypt data. More...
 
void gcm_decrypt (struct gcm_context *context, const void *src, void *dst, size_t len)
 Decrypt data. More...
 

Variables

uint8_t iv [12]
 Initialisation vector. More...
 
uint32_t value
 Counter value. More...
 
uint64_t add
 Additional data length. More...
 
uint64_t data
 Data length. More...
 
uint8_t byte [16]
 Raw bytes. More...
 
uint16_t word [8]
 Raw words. More...
 
uint32_t dword [4]
 Raw dwords. More...
 
struct gcm_counter ctr
 Counter. More...
 
struct gcm_lengths len
 Lengths. More...
 
struct gcm_context __attribute__
 

Detailed Description

Galois/Counter Mode (GCM)

Definition in file gcm.h.

Macro Definition Documentation

◆ GCM_CIPHER

#define GCM_CIPHER (   _gcm_name,
  _gcm_cipher,
  _raw_cipher,
  _raw_context,
  _blocksize 
)

Create a GCM mode of behaviour of an existing cipher.

Parameters
_cbc_nameName for the new CBC cipher
_cbc_cipherNew cipher algorithm
_raw_cipherUnderlying cipher algorithm
_raw_contextContext structure for the underlying cipher
_blocksizeCipher block size

Definition at line 80 of file gcm.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ __attribute__()

struct gcm_counter __attribute__ ( (packed)  )

◆ gcm_tag()

void gcm_tag ( struct gcm_context context,
union gcm_block tag 
)

Construct tag.

Parameters
contextContext
tagTag

Definition at line 405 of file gcm.c.

405  {
406  union gcm_block tmp;
408 
409  /* Construct hash */
410  gcm_hash ( context, tag );
411 
412  /* Construct encrypted initial counter value */
413  memcpy ( &tmp, &context->ctr, sizeof ( tmp ) );
414  offset = ( ( -context->len.len.data ) / ( 8 * sizeof ( tmp ) ) );
415  gcm_count ( &tmp, offset );
416  cipher_encrypt ( context->raw_cipher, &context->raw_ctx, &tmp,
417  &tmp, sizeof ( tmp ) );
418  DBGC2 ( context, "GCM %p E(K,Y[0]):\n", context );
419  DBGC2_HDA ( context, 0, &tmp, sizeof ( tmp ) );
420 
421  /* Construct tag */
422  gcm_xor_block ( &tmp, tag );
423  DBGC2 ( context, "GCM %p T:\n", context );
424  DBGC2_HDA ( context, 0, tag, sizeof ( *tag ) );
425 }
A GCM block.
Definition: gcm.h:32
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
static void gcm_hash(struct gcm_context *context, union gcm_block *hash)
Construct hash.
Definition: gcm.c:384
static void gcm_xor_block(const union gcm_block *src, union gcm_block *dst)
XOR whole data block in situ.
Definition: gcm.c:170
struct cipher_algorithm * raw_cipher
Underlying block cipher.
Definition: gcm.h:56
unsigned long tmp
Definition: linux_pci.h:53
#define cipher_encrypt(cipher, ctx, src, dst, len)
Definition: crypto.h:228
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
uint64_t data
Data length.
Definition: gcm.h:28
#define DBGC2_HDA(...)
Definition: compiler.h:523
unsigned int uint32_t
Definition: stdint.h:12
union gcm_block ctr
Counter (Y)
Definition: gcm.h:52
#define DBGC2(...)
Definition: compiler.h:522
uint64_t tag
Identity tag.
Definition: edd.h:30

References cipher_encrypt, gcm_context::ctr, gcm_lengths::data, DBGC2, DBGC2_HDA, gcm_hash(), gcm_xor_block(), gcm_context::len, gcm_block::len, memcpy(), offset, gcm_context::raw_cipher, gcm_context::raw_ctx, tag, and tmp.

◆ gcm_setkey()

int gcm_setkey ( struct gcm_context context,
const void *  key,
size_t  keylen,
struct cipher_algorithm raw_cipher 
)

Set key.

Parameters
contextContext
keyKey
keylenKey length
raw_cipherUnderlying cipher
Return values
rcReturn status code

Definition at line 436 of file gcm.c.

437  {
438  int rc;
439 
440  /* Initialise GCM context */
441  memset ( context, 0, sizeof ( *context ) );
442  context->raw_cipher = raw_cipher;
443 
444  /* Set underlying block cipher key */
445  if ( ( rc = cipher_setkey ( raw_cipher, context->raw_ctx, key,
446  keylen ) ) != 0 )
447  return rc;
448 
449  /* Construct GCM hash key */
450  cipher_encrypt ( raw_cipher, context->raw_ctx, &context->ctr,
451  &context->key, sizeof ( context->key ) );
452  DBGC2 ( context, "GCM %p H:\n", context );
453  DBGC2_HDA ( context, 0, &context->key, sizeof ( context->key ) );
454 
455  /* Reset counter */
456  context->ctr.ctr.value = cpu_to_be32 ( 1 );
457 
458  /* Construct cached tables */
459  gcm_cache ( &context->key );
460 
461  return 0;
462 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint8_t raw_ctx[0]
Underlying block cipher context.
Definition: gcm.h:58
static void gcm_cache(const union gcm_block *key)
Construct cached tables.
Definition: gcm.c:210
uint32_t value
Counter value.
Definition: gcm.h:20
struct cipher_algorithm * raw_cipher
Underlying block cipher.
Definition: gcm.h:56
#define cipher_encrypt(cipher, ctx, src, dst, len)
Definition: crypto.h:228
union gcm_block key
Hash key (H)
Definition: gcm.h:54
struct gcm_counter ctr
Counter.
Definition: gcm.h:40
#define DBGC2_HDA(...)
Definition: compiler.h:523
#define cpu_to_be32(value)
Definition: byteswap.h:110
union gcm_block ctr
Counter (Y)
Definition: gcm.h:52
#define DBGC2(...)
Definition: compiler.h:522
union @382 key
Sense key.
Definition: scsi.h:18
static int cipher_setkey(struct cipher_algorithm *cipher, void *ctx, const void *key, size_t keylen)
Definition: crypto.h:213
void * memset(void *dest, int character, size_t len) __nonnull

References cipher_encrypt, cipher_setkey(), cpu_to_be32, gcm_context::ctr, gcm_block::ctr, DBGC2, DBGC2_HDA, gcm_cache(), gcm_context::key, key, memset(), gcm_context::raw_cipher, gcm_context::raw_ctx, rc, and gcm_counter::value.

◆ gcm_setiv()

void gcm_setiv ( struct gcm_context context,
const void *  iv,
size_t  ivlen 
)

Set initialisation vector.

Parameters
ctxContext
ivInitialisation vector
ivlenInitialisation vector length

Definition at line 471 of file gcm.c.

471  {
472  union gcm_block *check = ( ( void * ) context );
473 
474  /* Sanity checks */
475  linker_assert ( &context->hash == check, gcm_bad_layout );
476  linker_assert ( &context->len == check + 1, gcm_bad_layout );
477  linker_assert ( &context->ctr == check + 2, gcm_bad_layout );
478  linker_assert ( &context->key == check + 3, gcm_bad_layout );
479 
480  /* Reset non-key state */
481  memset ( context, 0, offsetof ( typeof ( *context ), key ) );
482 
483  /* Reset counter */
484  context->ctr.ctr.value = cpu_to_be32 ( 1 );
485 
486  /* Process initialisation vector */
487  if ( ivlen == sizeof ( context->ctr.ctr.iv ) ) {
488 
489  /* Initialisation vector is exactly 96 bits, use it as-is */
490  memcpy ( context->ctr.ctr.iv, iv, ivlen );
491 
492  } else {
493 
494  /* Calculate hash over initialisation vector */
495  gcm_process ( context, iv, NULL, ivlen, GCM_FL_IV );
496  gcm_hash ( context, &context->ctr );
497  assert ( context->len.len.add == 0 );
498 
499  /* Reset non-key, non-counter state */
500  memset ( context, 0, offsetof ( typeof ( *context ), ctr ) );
501  }
502 
503  DBGC2 ( context, "GCM %p Y[0]:\n", context );
504  DBGC2_HDA ( context, 0, &context->ctr, sizeof ( context->ctr ) );
505 }
A GCM block.
Definition: gcm.h:32
union gcm_block len
Accumulated lengths.
Definition: gcm.h:50
struct gcm_lengths len
Lengths.
Definition: gcm.h:42
uint8_t iv[12]
Initialisation vector.
Definition: gcm.h:18
static void gcm_hash(struct gcm_context *context, union gcm_block *hash)
Construct hash.
Definition: gcm.c:384
#define GCM_FL_IV
Calculate hash over an initialisation vector value.
Definition: gcm.c:57
#define offsetof(type, field)
Get offset of a field within a structure.
Definition: stddef.h:24
union gcm_block hash
Accumulated hash (X)
Definition: gcm.h:48
uint32_t value
Counter value.
Definition: gcm.h:20
void * memcpy(void *dest, const void *src, size_t len) __nonnull
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static void gcm_process(struct gcm_context *context, const void *src, void *dst, size_t len, unsigned int flags)
Encrypt/decrypt/authenticate data.
Definition: gcm.c:316
union gcm_block key
Hash key (H)
Definition: gcm.h:54
struct gcm_counter ctr
Counter.
Definition: gcm.h:40
#define DBGC2_HDA(...)
Definition: compiler.h:523
#define cpu_to_be32(value)
Definition: byteswap.h:110
union gcm_block ctr
Counter (Y)
Definition: gcm.h:52
#define DBGC2(...)
Definition: compiler.h:522
uint8_t iv[12]
Initialisation vector.
Definition: gcm.h:12
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition: acpi.c:45
struct gcm_counter ctr
Counter.
Definition: gcm.h:18
uint64_t add
Additional data length.
Definition: gcm.h:26
#define linker_assert(condition, error_symbol)
Assert a condition at link-time.
Definition: assert.h:68
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
union @382 key
Sense key.
Definition: scsi.h:18
void * memset(void *dest, int character, size_t len) __nonnull

References gcm_lengths::add, assert(), cpu_to_be32, ctr, gcm_context::ctr, gcm_block::ctr, DBGC2, DBGC2_HDA, GCM_FL_IV, gcm_hash(), gcm_process(), gcm_context::hash, iv, gcm_counter::iv, gcm_context::key, key, gcm_context::len, gcm_block::len, linker_assert, memcpy(), memset(), NULL, offsetof, typeof(), and gcm_counter::value.

◆ gcm_encrypt()

void gcm_encrypt ( struct gcm_context context,
const void *  src,
void *  dst,
size_t  len 
)

Encrypt data.

Parameters
contextContext
srcData to encrypt
dstBuffer for encrypted data, or NULL for additional data
lenLength of data

Definition at line 515 of file gcm.c.

516  {
517 
518  /* Process data */
519  gcm_process ( context, src, dst, len, GCM_FL_ENCRYPT );
520 }
#define GCM_FL_ENCRYPT
Perform encryption.
Definition: gcm.c:48
static void gcm_process(struct gcm_context *context, const void *src, void *dst, size_t len, unsigned int flags)
Encrypt/decrypt/authenticate data.
Definition: gcm.c:316
static __always_inline void off_t userptr_t src
Definition: efi_uaccess.h:66
uint32_t len
Length.
Definition: ena.h:14

References GCM_FL_ENCRYPT, gcm_process(), len, and src.

◆ gcm_decrypt()

void gcm_decrypt ( struct gcm_context context,
const void *  src,
void *  dst,
size_t  len 
)

Decrypt data.

Parameters
contextContext
srcData to decrypt
dstBuffer for decrypted data, or NULL for additional data
lenLength of data

Definition at line 530 of file gcm.c.

531  {
532 
533  /* Process data */
534  gcm_process ( context, src, dst, len, 0 );
535 }
static void gcm_process(struct gcm_context *context, const void *src, void *dst, size_t len, unsigned int flags)
Encrypt/decrypt/authenticate data.
Definition: gcm.c:316
static __always_inline void off_t userptr_t src
Definition: efi_uaccess.h:66
uint32_t len
Length.
Definition: ena.h:14

References gcm_process(), len, and src.

Variable Documentation

◆ iv

uint8_t iv[12]

◆ value

uint32_t value

Counter value.

Definition at line 14 of file gcm.h.

◆ add

uint64_t add

Additional data length.

Definition at line 12 of file gcm.h.

Referenced by hvm_ioremap().

◆ data

uint64_t data

Data length.

Definition at line 14 of file gcm.h.

◆ byte

Raw bytes.

Definition at line 12 of file gcm.h.

◆ word

Raw words.

Definition at line 14 of file gcm.h.

◆ dword

Raw dwords.

Definition at line 16 of file gcm.h.

◆ ctr

struct gcm_counter ctr

Counter.

Definition at line 18 of file gcm.h.

Referenced by ccmp_ctr_xor(), and gcm_setiv().

◆ len

struct gcm_lengths len

Lengths.

Definition at line 20 of file gcm.h.

◆ __attribute__