On Thu, Jan 02, 2025 at 02:12:57PM -0500, Stefan Berger wrote: > > > On 12/19/24 3:12 AM, Gary Lin wrote: > > As the preparation to load the sealed key from the NV index handle, > > Extract the logic to handle the file buffer from ... to prepare to load the > sealed key from the NV index handle. > > > the logic to handle the file buffer is extracted as an independent > > function and the SRK recover function only reads the file and sends the > > New sentence with 'The SRK recover ...' > > > > file buffer to the new function. Besides, the file format is detected > > Beside this, > > > automatically before unmarshalling the data, so there is no need to use > > the command option to specify the file format anymore. In other words, > > '--tpm2key' and '--keyfile' are the same now. > > Will fix the commit message in v2.
> > Signed-off-by: Gary Lin <g...@suse.com> > > --- > > .../commands/tpm2_key_protector/module.c | 122 +++++++++++++----- > > 1 file changed, 89 insertions(+), 33 deletions(-) > > > > diff --git a/grub-core/commands/tpm2_key_protector/module.c > > b/grub-core/commands/tpm2_key_protector/module.c > > index 0a5d81e4c..e58da6f7a 100644 > > --- a/grub-core/commands/tpm2_key_protector/module.c > > +++ b/grub-core/commands/tpm2_key_protector/module.c > > @@ -218,10 +218,51 @@ tpm2_protector_srk_read_file (const char *filepath, > > void **buffer, grub_size_t * > > return err; > > } > > +/* Check if the data is in TPM 2.0 Key File format */ > > +static bool > > +tpm2_protector_is_tpm2key (grub_uint8_t *buffer, grub_size_t buffer_size) > > +{ > > + /* id-sealedkey OID (2.23.133.10.1.5) in DER */ > > + const grub_uint8_t sealed_key_oid[] = {0x06, 0x06, 0x67, 0x81, 0x05, > > 0x0a}; > > + grub_size_t skip = 0; > > + > > + /* Need at least the first two bytes to check the tag and the length */ > > + if (buffer_size < 2) > > + return 0; > > return false/true in this function. > Ah, right. Those should be false/true. > > + > > + /* The first byte is always 0x30 (SEQUENCE). */ > > + if (buffer[0] != 0x30) > > + return 0; > > + > > + /* > > + * Get the bytes of the length > > + * > > + * If the bit 8 of the second byte is 0, it is in the short form, so the > > second byte > > + * alone represents the length. Thus, the first two bytes are skipped. > > + * > > + * Otherwise, it is in the long form, and bits 1~7 indicate how many > > more bytes are in > > + * the length field, so we skip the first two bytes plus the bytes for > > the length. > > + */ > > + if ((buffer[1] & 0x80) == 0) > > + skip = 2; > > + else > > + skip = (buffer[1] & 0x7F) + 2; > > + > > + /* Make sure the buffer is large enough to contain id-sealedkey OID */ > > + if (buffer_size < skip + sizeof (sealed_key_oid)) > > + return 0; > > + > > + /* Check id-sealedkey OID */ > > + if (grub_memcmp (buffer + skip, sealed_key_oid, sizeof (sealed_key_oid)) > > != 0) > > + return 0; > > + > > + return 1; > > +} > > + > > static grub_err_t > > -tpm2_protector_srk_unmarshal_keyfile (void *sealed_key, > > - grub_size_t sealed_key_size, > > - tpm2_sealed_key_t *sk) > > +tpm2_protector_unmarshal_raw (void *sealed_key, > > + grub_size_t sealed_key_size, > > + tpm2_sealed_key_t *sk) > > { > > struct grub_tpm2_buffer buf; > > @@ -242,13 +283,13 @@ tpm2_protector_srk_unmarshal_keyfile (void > > *sealed_key, > > } > > static grub_err_t > > -tpm2_protector_srk_unmarshal_tpm2key (void *sealed_key, > > - grub_size_t sealed_key_size, > > - tpm2key_policy_t *policy_seq, > > - tpm2key_authpolicy_t *authpol_seq, > > - grub_uint8_t *rsaparent, > > - grub_uint32_t *parent, > > - tpm2_sealed_key_t *sk) > > +tpm2_protector_unmarshal_tpm2key (void *sealed_key, > > + grub_size_t sealed_key_size, > > + tpm2key_policy_t *policy_seq, > > + tpm2key_authpolicy_t *authpol_seq, > > + grub_uint8_t *rsaparent, > > + grub_uint32_t *parent, > > + tpm2_sealed_key_t *sk) > > { > > asn1_node tpm2key = NULL; > > grub_uint8_t rsaparent_tmp; > > @@ -942,12 +983,11 @@ tpm2_protector_dump_pcr (const TPM_ALG_ID_t bank) > > } > > static grub_err_t > > -tpm2_protector_srk_recover (const tpm2_protector_context_t *ctx, > > - grub_uint8_t **key, grub_size_t *key_size) > > +tpm2_protector_unseal_buffer (const tpm2_protector_context_t *ctx, > > + void *buffer, grub_size_t buf_size, > > + grub_uint8_t **key, grub_size_t *key_size) > > { > > tpm2_sealed_key_t sealed_key = {0}; > > - void *file_bytes = NULL; > > - grub_size_t file_size = 0; > > grub_uint8_t rsaparent = 0; > > TPM_HANDLE_t parent_handle = 0; > > TPM_HANDLE_t srk_handle = 0; > > @@ -960,22 +1000,17 @@ tpm2_protector_srk_recover (const > > tpm2_protector_context_t *ctx, > > /* > > * Retrieve sealed key, parent handle, policy sequence, and authpolicy > > - * sequence from the key file > > + * sequence from the buffer > > */ > > - if (ctx->tpm2key != NULL) > > + if (tpm2_protector_is_tpm2key (buffer, buf_size) == true) > > > if (tpm2_protector_is_tpm2key (buffer, buf_size)) > In the previous review for PCR dump, Daniel prefers "dump_pcr == true", so I'll keep '== true' here. > > { > > - err = tpm2_protector_srk_read_file (ctx->tpm2key, &file_bytes, > > - &file_size); > > - if (err != GRUB_ERR_NONE) > > - return err; > > - > > - err = tpm2_protector_srk_unmarshal_tpm2key (file_bytes, > > - file_size, > > - &policy_seq, > > - &authpol_seq, > > - &rsaparent, > > - &parent_handle, > > - &sealed_key); > > + err = tpm2_protector_unmarshal_tpm2key (buffer, > > + buf_size, > > + &policy_seq, > > + &authpol_seq, > > + &rsaparent, > > + &parent_handle, > > + &sealed_key); > > if (err != GRUB_ERR_NONE) > > goto exit1; > > @@ -991,12 +1026,8 @@ tpm2_protector_srk_recover (const > > tpm2_protector_context_t *ctx, > > } > > else > > { > > - err = tpm2_protector_srk_read_file (ctx->keyfile, &file_bytes, > > &file_size); > > - if (err != GRUB_ERR_NONE) > > - return err; > > - > > parent_handle = TPM_RH_OWNER; > > - err = tpm2_protector_srk_unmarshal_keyfile (file_bytes, file_size, > > &sealed_key); > > + err = tpm2_protector_unmarshal_raw (buffer, buf_size, &sealed_key); > > if (err != GRUB_ERR_NONE) > > goto exit1; > > } > > @@ -1072,6 +1103,31 @@ tpm2_protector_srk_recover (const > > tpm2_protector_context_t *ctx, > > exit1: > > grub_tpm2key_free_policy_seq (policy_seq); > > grub_tpm2key_free_authpolicy_seq (authpol_seq); > > + return err; > > +} > > + > > +static grub_err_t > > +tpm2_protector_srk_recover (const tpm2_protector_context_t *ctx, > > + grub_uint8_t **key, grub_size_t *key_size) > > +{ > > + const char *filepath; > > + void *file_bytes = NULL; > > + grub_size_t file_size = 0; > > + grub_err_t err; > > + > > + if (ctx->tpm2key != NULL) > > + filepath = ctx->tpm2key; > > + else if (ctx->keyfile != NULL) > > + filepath = ctx->keyfile; > > + else > > + return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("key file not > > specified")); > > + > > + err = tpm2_protector_srk_read_file (filepath, &file_bytes, &file_size); > > + if (err != GRUB_ERR_NONE) > > + return err; > > + > > + err = tpm2_protector_unseal_buffer (ctx, file_bytes, file_size, key, > > key_size); > > + > > grub_free (file_bytes); > > return err; > > } > > With nits fixed: > > Reviewed-by: Stefan Berger <stef...@linux.ibm.com> > Thanks! Gary Lin _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel