21 DEBUG(
"End of CBFS reached\n");
27 size_t already_read,
void *
arg),
32 struct vb2_digest_context dc;
36 if (do_hash && (vbrv = vb2_digest_init(&dc, metadata_hash->algo))) {
37 ERROR(
"Metadata hash digest (%d) init error: %#x\n", metadata_hash->algo, vbrv);
52 DEBUG(
"Found CBFS header @%#zx (type %d, attr +%#x, data +%#x, length %#x)\n",
53 offset,
type, attr_offset, data_offset, data_length);
54 if (data_offset >
sizeof(mdata) || data_length > devsize ||
55 offset + data_offset + data_length > devsize) {
67 if (do_hash || attr_offset == 0)
68 todo = data_offset -
sizeof(mdata.
h);
70 todo = attr_offset -
sizeof(mdata.
h);
71 if (todo <= 0 || data_offset < attr_offset) {
77 assert(todo > 0 && todo <=
sizeof(mdata) -
sizeof(mdata.
h));
79 offset +
sizeof(mdata.
h), todo) != todo)
82 mdata.
raw[attr_offset ? attr_offset - 1 : data_offset - 1] =
'\0';
85 if (do_hash && !empty && vb2_digest_extend(&dc, mdata.
raw, data_offset))
89 ret_walker = walker(dev,
offset, &mdata,
sizeof(mdata.
h) + todo,
arg);
96 offset += data_offset + data_length;
103 uint8_t real_hash[VB2_MAX_DIGEST_SIZE];
104 size_t hash_size = vb2_digest_size(metadata_hash->algo);
105 if (vb2_digest_finalize(&dc, real_hash, hash_size))
108 memcpy(metadata_hash->raw, real_hash, hash_size);
109 else if (
memcmp(metadata_hash->raw, real_hash, hash_size) != 0)
120 memcpy(dst, src, already_read);
124 assert(todo <=
sizeof(*dst) - already_read);
139 size_t already_read,
void *
arg)
181 ERROR(
"Attribute %s[%x] invalid length: %u\n",
185 if (
tag == attr_tag) {
186 if (size_check &&
len != size_check) {
187 ERROR(
"Attribute %s[%x] size mismatch: %u != %zu\n",
208 const struct vb2_hash *hash = &attr->
hash;
209 const size_t hsize = vb2_digest_size(hash->algo);
211 ERROR(
"Hash algo %u for '%s' unsupported.\n", hash->algo, mdata->
h.
filename);
215 ERROR(
"Hash attribute size for '%s' (%zu) incorrect for algo %u.\n",
void * memcpy(void *dest, const void *src, size_t n)
#define assert(statement)
#define offsetof(TYPE, MEMBER)
cb_err
coreboot error codes
@ CB_ERR
Generic error code.
@ CB_ERR_ARG
Invalid argument.
@ CB_SUCCESS
Call completed successfully.
@ CB_CBFS_IO
Underlying I/O error.
@ CB_CBFS_NOT_FOUND
File not found in directory.
@ CB_CBFS_HASH_MISMATCH
Master hash validation failed.
static ssize_t cbfs_dev_read(cbfs_dev_t dev, void *buffer, size_t offset, size_t size)
static size_t cbfs_dev_size(cbfs_dev_t dev)
#define CBFS_ENABLE_HASHING
static enum cb_err read_next_header(cbfs_dev_t dev, size_t *offset, struct cbfs_file *buffer, const size_t devsize)
const struct vb2_hash * cbfs_file_hash(const union cbfs_mdata *mdata)
enum cb_err cbfs_walk(cbfs_dev_t dev, enum cb_err(*walker)(cbfs_dev_t dev, size_t offset, const union cbfs_mdata *mdata, size_t already_read, void *arg), void *arg, struct vb2_hash *metadata_hash, enum cbfs_walk_flags flags)
static enum cb_err lookup_walker(cbfs_dev_t dev, size_t offset, const union cbfs_mdata *mdata, size_t already_read, void *arg)
enum cb_err cbfs_lookup(cbfs_dev_t dev, const char *name, union cbfs_mdata *mdata_out, size_t *data_offset_out, struct vb2_hash *metadata_hash)
const void * cbfs_find_attr(const union cbfs_mdata *mdata, uint32_t attr_tag, size_t size_check)
enum cb_err cbfs_copy_fill_metadata(union cbfs_mdata *dst, const union cbfs_mdata *src, size_t already_read, cbfs_dev_t dev, size_t offset)
@ CBFS_WALK_INCLUDE_EMPTY
@ CBFS_WALK_WRITEBACK_HASH
#define CBFS_FILE_MAGIC
This is a component header - every entry in the CBFS will have this header.
@ CBFS_FILE_ATTR_TAG_HASH
static uint32_t be32toh(uint32_t big_endian_32bits)
u8 buffer[C2P_BUFFER_MAXSIZE]
int memcmp(const void *s1, const void *s2, size_t n)
size_t strlen(const char *src)
uint32_t attributes_offset
union cbfs_mdata * mdata_out
uint8_t raw[CBFS_METADATA_MAX_SIZE]