void avb_sha512_update(AvbSHA512Ctx* ctx, const uint8_t* data, uint32_t len) { unsigned int block_nb; unsigned int new_len, rem_len, tmp_len; const uint8_t* shifted_data; tmp_len = AVB_SHA512_BLOCK_SIZE - ctx->len; rem_len = len < tmp_len ? len : tmp_len; avb_memcpy(&ctx->block[ctx->len], data, rem_len); if (ctx->len + len < AVB_SHA512_BLOCK_SIZE) { ctx->len += len; return; } new_len = len - rem_len; block_nb = new_len / AVB_SHA512_BLOCK_SIZE; shifted_data = data + rem_len; SHA512_transform(ctx, ctx->block, 1); SHA512_transform(ctx, shifted_data, block_nb); rem_len = new_len % AVB_SHA512_BLOCK_SIZE; avb_memcpy(ctx->block, &shifted_data[block_nb << 7], rem_len); ctx->len = rem_len; ctx->tot_len += (block_nb + 1) << 7; }
static int cmdline_append_option(AvbSlotVerifyData* slot_data, const char* key, const char* value) { size_t offset, key_len, value_len; char* new_cmdline; key_len = avb_strlen(key); value_len = avb_strlen(value); offset = 0; if (slot_data->cmdline != NULL) { offset = avb_strlen(slot_data->cmdline); if (offset > 0) { offset += 1; } } new_cmdline = avb_calloc(offset + key_len + value_len + 2); if (new_cmdline == NULL) { return 0; } if (offset > 0) { avb_memcpy(new_cmdline, slot_data->cmdline, offset - 1); new_cmdline[offset - 1] = ' '; } avb_memcpy(new_cmdline + offset, key, key_len); new_cmdline[offset + key_len] = '='; avb_memcpy(new_cmdline + offset + key_len + 1, value, value_len); if (slot_data->cmdline != NULL) { avb_free(slot_data->cmdline); } slot_data->cmdline = new_cmdline; return 1; }
bool avb_property_descriptor_validate_and_byteswap( const AvbPropertyDescriptor* src, AvbPropertyDescriptor* dest) { uint64_t expected_size; avb_memcpy(dest, src, sizeof(AvbPropertyDescriptor)); if (!avb_descriptor_validate_and_byteswap((const AvbDescriptor*)src, (AvbDescriptor*)dest)) return false; if (dest->parent_descriptor.tag != AVB_DESCRIPTOR_TAG_PROPERTY) { avb_error("Invalid tag for property descriptor.\n"); return false; } dest->key_num_bytes = avb_be64toh(dest->key_num_bytes); dest->value_num_bytes = avb_be64toh(dest->value_num_bytes); /* Check that key and value are fully contained. */ expected_size = sizeof(AvbPropertyDescriptor) - sizeof(AvbDescriptor) + 2; if (!avb_safe_add_to(&expected_size, dest->key_num_bytes) || !avb_safe_add_to(&expected_size, dest->value_num_bytes)) { avb_error("Overflow while adding up sizes.\n"); return false; } if (expected_size > dest->parent_descriptor.num_bytes_following) { avb_error("Descriptor payload size overflow.\n"); return false; } return true; }
static int cmdline_append_version(AvbSlotVerifyData* slot_data, const char* key, uint64_t major_version, uint64_t minor_version) { char major_digits[AVB_MAX_DIGITS_UINT64]; char minor_digits[AVB_MAX_DIGITS_UINT64]; char combined[AVB_MAX_DIGITS_UINT64 * 2 + 1]; size_t num_major_digits, num_minor_digits; num_major_digits = uint64_to_base10(major_version, major_digits); num_minor_digits = uint64_to_base10(minor_version, minor_digits); avb_memcpy(combined, major_digits, num_major_digits); combined[num_major_digits] = '.'; avb_memcpy(combined + num_major_digits + 1, minor_digits, num_minor_digits); combined[num_major_digits + 1 + num_minor_digits] = '\0'; return cmdline_append_option(slot_data, key, combined); }