iPXE
Functions
efi_siglist.h File Reference

PEM-encoded ASN.1 data. More...

#include <stdint.h>
#include <ipxe/asn1.h>
#include <ipxe/image.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
int efisig_asn1 (const void *data, size_t len, size_t offset, struct asn1_cursor **cursor)
 Extract ASN.1 object from EFI signature list. More...
 
struct image_type efisig_image_type __image_type (PROBE_NORMAL)
 

Detailed Description

PEM-encoded ASN.1 data.

Definition in file efi_siglist.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ efisig_asn1()

int efisig_asn1 ( const void *  data,
size_t  len,
size_t  offset,
struct asn1_cursor **  cursor 
)

Extract ASN.1 object from EFI signature list.

Parameters
dataEFI signature list
lenLength of EFI signature list
offsetOffset within image
cursorASN.1 cursor to fill in
Return values
nextOffset to next image, or negative error

The caller is responsible for eventually calling free() on the allocated ASN.1 cursor.

Definition at line 142 of file efi_siglist.c.

143  {
144  const EFI_SIGNATURE_LIST *lhdr;
145  const EFI_SIGNATURE_DATA *dhdr;
146  int ( * asn1 ) ( const void *data, size_t len, size_t offset,
147  struct asn1_cursor **cursor );
148  size_t skip = offsetof ( typeof ( *dhdr ), SignatureData );
149  int next;
150  int rc;
151 
152  /* Locate signature list entry */
153  if ( ( rc = efisig_find ( data, len, &offset, &lhdr, &dhdr ) ) != 0 )
154  goto err_entry;
155  len = ( offset + lhdr->SignatureSize );
156 
157  /* Parse as PEM or DER based on first character */
158  asn1 = ( ( dhdr->SignatureData[0] == ASN1_SEQUENCE ) ?
159  der_asn1 : pem_asn1 );
160  DBGC2 ( data, "EFISIG [%#zx,%#zx) extracting %s\n", offset, len,
161  ( ( asn1 == der_asn1 ) ? "DER" : "PEM" ) );
162  next = asn1 ( data, len, ( offset + skip ), cursor );
163  if ( next < 0 ) {
164  rc = next;
165  DBGC ( data, "EFISIG [%#zx,%#zx) could not extract ASN.1: "
166  "%s\n", offset, len, strerror ( rc ) );
167  goto err_asn1;
168  }
169 
170  /* Check that whole entry was consumed */
171  if ( ( ( unsigned int ) next ) != len ) {
172  DBGC ( data, "EFISIG [%#zx,%#zx) malformed data\n",
173  offset, len );
174  rc = -EINVAL;
175  goto err_whole;
176  }
177 
178  return len;
179 
180  err_whole:
181  free ( *cursor );
182  err_asn1:
183  err_entry:
184  return rc;
185 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int pem_asn1(const void *data, size_t len, size_t offset, struct asn1_cursor **cursor)
Extract ASN.1 object from PEM data.
Definition: pem.c:103
UINT32 SignatureSize
Size of each signature.
#define DBGC(...)
Definition: compiler.h:505
#define offsetof(type, field)
Get offset of a field within a structure.
Definition: stddef.h:24
UINT8 SignatureData[1]
The format of the signature is defined by the SignatureType.
ring len
Length.
Definition: dwmac.h:231
static int efisig_find(const void *data, size_t len, size_t *start, const EFI_SIGNATURE_LIST **lhdr, const EFI_SIGNATURE_DATA **dhdr)
Find EFI signature list entry.
Definition: efi_siglist.c:53
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:89
uint32_t next
Next descriptor address.
Definition: dwmac.h:22
The format of a signature database.
#define DBGC2(...)
Definition: compiler.h:522
uint8_t data[48]
Additional event data.
Definition: ena.h:22
int der_asn1(const void *data, size_t len, size_t offset, struct asn1_cursor **cursor)
Extract ASN.1 object from DER data.
Definition: der.c:52
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition: acpi.c:47
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
An ASN.1 object cursor.
Definition: asn1.h:20

References image_type::asn1, ASN1_SEQUENCE, data, DBGC, DBGC2, der_asn1(), efisig_find(), EINVAL, free, len, next, offset, offsetof, pem_asn1(), rc, EFI_SIGNATURE_DATA::SignatureData, EFI_SIGNATURE_LIST::SignatureSize, strerror(), and typeof().

Referenced by efi_cacert(), and efisig_image_asn1().

◆ __image_type()

struct image_type efisig_image_type __image_type ( PROBE_NORMAL  )