mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
efi_loader: Re-factor code to build the signature store from efi signature list
The efi_sigstore_parse_sigdb function reads the uefi authenticated variable, stored in the signature database format and builds the signature store structure. Factor out the code for building the signature store. This can then be used by the capsule authentication routine to build the signature store even when the signature database is not stored as an uefi authenticated variable Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
This commit is contained in:
parent
201b8068f3
commit
b4f20a5d83
2 changed files with 63 additions and 42 deletions
|
@ -813,6 +813,8 @@ efi_status_t efi_image_region_add(struct efi_image_regions *regs,
|
||||||
int nocheck);
|
int nocheck);
|
||||||
|
|
||||||
void efi_sigstore_free(struct efi_signature_store *sigstore);
|
void efi_sigstore_free(struct efi_signature_store *sigstore);
|
||||||
|
struct efi_signature_store *efi_build_signature_store(void *sig_list,
|
||||||
|
efi_uintn_t size);
|
||||||
struct efi_signature_store *efi_sigstore_parse_sigdb(u16 *name);
|
struct efi_signature_store *efi_sigstore_parse_sigdb(u16 *name);
|
||||||
|
|
||||||
bool efi_secure_boot_enabled(void);
|
bool efi_secure_boot_enabled(void);
|
||||||
|
|
|
@ -736,6 +736,63 @@ err:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* efi_sigstore_parse_sigdb - parse the signature list and populate
|
||||||
|
* the signature store
|
||||||
|
*
|
||||||
|
* @sig_list: Pointer to the signature list
|
||||||
|
* @size: Size of the signature list
|
||||||
|
*
|
||||||
|
* Parse the efi signature list and instantiate a signature store
|
||||||
|
* structure.
|
||||||
|
*
|
||||||
|
* Return: Pointer to signature store on success, NULL on error
|
||||||
|
*/
|
||||||
|
struct efi_signature_store *efi_build_signature_store(void *sig_list,
|
||||||
|
efi_uintn_t size)
|
||||||
|
{
|
||||||
|
struct efi_signature_list *esl;
|
||||||
|
struct efi_signature_store *sigstore = NULL, *siglist;
|
||||||
|
|
||||||
|
esl = sig_list;
|
||||||
|
while (size > 0) {
|
||||||
|
/* List must exist if there is remaining data. */
|
||||||
|
if (size < sizeof(*esl)) {
|
||||||
|
EFI_PRINT("Signature list in wrong format\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size < esl->signature_list_size) {
|
||||||
|
EFI_PRINT("Signature list in wrong format\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse a single siglist. */
|
||||||
|
siglist = efi_sigstore_parse_siglist(esl);
|
||||||
|
if (!siglist) {
|
||||||
|
EFI_PRINT("Parsing of signature list of failed\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append siglist */
|
||||||
|
siglist->next = sigstore;
|
||||||
|
sigstore = siglist;
|
||||||
|
|
||||||
|
/* Next */
|
||||||
|
size -= esl->signature_list_size;
|
||||||
|
esl = (void *)esl + esl->signature_list_size;
|
||||||
|
}
|
||||||
|
free(sig_list);
|
||||||
|
|
||||||
|
return sigstore;
|
||||||
|
|
||||||
|
err:
|
||||||
|
efi_sigstore_free(sigstore);
|
||||||
|
free(sig_list);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* efi_sigstore_parse_sigdb - parse a signature database variable
|
* efi_sigstore_parse_sigdb - parse a signature database variable
|
||||||
* @name: Variable's name
|
* @name: Variable's name
|
||||||
|
@ -747,8 +804,7 @@ err:
|
||||||
*/
|
*/
|
||||||
struct efi_signature_store *efi_sigstore_parse_sigdb(u16 *name)
|
struct efi_signature_store *efi_sigstore_parse_sigdb(u16 *name)
|
||||||
{
|
{
|
||||||
struct efi_signature_store *sigstore = NULL, *siglist;
|
struct efi_signature_store *sigstore = NULL;
|
||||||
struct efi_signature_list *esl;
|
|
||||||
const efi_guid_t *vendor;
|
const efi_guid_t *vendor;
|
||||||
void *db;
|
void *db;
|
||||||
efi_uintn_t db_size;
|
efi_uintn_t db_size;
|
||||||
|
@ -784,47 +840,10 @@ struct efi_signature_store *efi_sigstore_parse_sigdb(u16 *name)
|
||||||
ret = EFI_CALL(efi_get_variable(name, vendor, NULL, &db_size, db));
|
ret = EFI_CALL(efi_get_variable(name, vendor, NULL, &db_size, db));
|
||||||
if (ret != EFI_SUCCESS) {
|
if (ret != EFI_SUCCESS) {
|
||||||
EFI_PRINT("Getting variable, %ls, failed\n", name);
|
EFI_PRINT("Getting variable, %ls, failed\n", name);
|
||||||
goto err;
|
free(db);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse siglist list */
|
return efi_build_signature_store(db, db_size);
|
||||||
esl = db;
|
|
||||||
while (db_size > 0) {
|
|
||||||
/* List must exist if there is remaining data. */
|
|
||||||
if (db_size < sizeof(*esl)) {
|
|
||||||
EFI_PRINT("variable, %ls, in wrong format\n", name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (db_size < esl->signature_list_size) {
|
|
||||||
EFI_PRINT("variable, %ls, in wrong format\n", name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Parse a single siglist. */
|
|
||||||
siglist = efi_sigstore_parse_siglist(esl);
|
|
||||||
if (!siglist) {
|
|
||||||
EFI_PRINT("Parsing signature list of %ls failed\n",
|
|
||||||
name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Append siglist */
|
|
||||||
siglist->next = sigstore;
|
|
||||||
sigstore = siglist;
|
|
||||||
|
|
||||||
/* Next */
|
|
||||||
db_size -= esl->signature_list_size;
|
|
||||||
esl = (void *)esl + esl->signature_list_size;
|
|
||||||
}
|
|
||||||
free(db);
|
|
||||||
|
|
||||||
return sigstore;
|
|
||||||
|
|
||||||
err:
|
|
||||||
efi_sigstore_free(sigstore);
|
|
||||||
free(db);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_EFI_SECURE_BOOT */
|
#endif /* CONFIG_EFI_SECURE_BOOT */
|
||||||
|
|
Loading…
Reference in a new issue