/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * Convert structs from vboot1 data format to new vboot2 structs */ #include "2sysincludes.h" #include "2common.h" #include "2rsa.h" #include "vb2_convert_structs.h" #include "vboot_struct.h" /* For old struct sizes */ #include "test_common.h" struct vb2_packed_key2 *vb2_convert_packed_key2( const struct vb2_packed_key *key, const char *desc, uint32_t *out_size) { struct vb2_packed_key2 k2 = { .c.magic = VB2_MAGIC_PACKED_KEY2, .c.struct_version_major = VB2_PACKED_KEY2_VERSION_MAJOR, .c.struct_version_minor = VB2_PACKED_KEY2_VERSION_MINOR, }; uint8_t *kbuf; /* Calculate description size */ k2.c.desc_offset = sizeof(k2); k2.c.desc_size = roundup32(strlen(desc) + 1); /* Copy/initialize fields */ k2.key_offset = k2.c.desc_offset + k2.c.desc_size; k2.key_size = key->key_size; k2.key_version = key->key_version; k2.sig_algorithm = vb2_crypto_to_signature(key->algorithm); k2.hash_algorithm = vb2_crypto_to_hash(key->algorithm); /* TODO: fill in a non-zero GUID */ /* Allocate the new buffer */ *out_size = k2.key_offset + k2.key_size; kbuf = malloc(*out_size); memset(kbuf, 0, *out_size); /* Copy data into the buffer */ memcpy(kbuf, &k2, sizeof(k2)); /* strcpy() is safe because we allocated above based on strlen() */ strcpy((char *)(kbuf + k2.c.desc_offset), desc); kbuf[k2.c.desc_offset + k2.c.desc_size - 1] = 0; memcpy(kbuf + k2.key_offset, (const uint8_t *)key + key->key_offset, key->key_size); /* Return the newly allocated buffer */ return (struct vb2_packed_key2 *)kbuf; }