| /* |
| * Copyright (C) 2020 The Android Open Source Project |
| * |
| * Permission is hereby granted, free of charge, to any person |
| * obtaining a copy of this software and associated documentation |
| * files (the "Software"), to deal in the Software without |
| * restriction, including without limitation the rights to use, copy, |
| * modify, merge, publish, distribute, sublicense, and/or sell copies |
| * of the Software, and to permit persons to whom the Software is |
| * furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be |
| * included in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
| * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
| * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| * SOFTWARE. |
| */ |
| |
| #ifdef AVB_INSIDE_LIBAVB_AFTL_H |
| #error "You can't include avb_aftl_util.h in the public header libavb_aftl.h." |
| #endif |
| |
| #ifndef AVB_COMPILATION |
| #error "Never include this file, it may only be used from internal avb code." |
| #endif |
| |
| #ifndef AVB_AFTL_UTIL_H_ |
| #define AVB_AFTL_UTIL_H_ |
| |
| #include "avb_aftl_types.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define AVB_AFTL_MAGIC 0x4c544641 |
| #define avb_aftl_member_size(type, member) sizeof(((type*)0)->member) |
| |
| /* Performs a SHA256 hash operation on data. */ |
| bool avb_aftl_sha256( |
| uint8_t* data, /* Data to be hashed. */ |
| uint64_t length, /* Size of data. */ |
| uint8_t hash[AVB_AFTL_HASH_SIZE]); /* Resulting SHA256 hash. */ |
| |
| /* Calculates a SHA256 hash of the TrillianLogRootDescriptor in icp_entry. */ |
| bool avb_aftl_hash_log_root_descriptor( |
| AftlIcpEntry* icp_entry, /* The icp_entry containing the descriptor. */ |
| uint8_t* hash); /* The resulting hash of the descriptor data. */ |
| |
| /* RFC 6962 Hashing function for leaves of a Merkle tree. */ |
| bool avb_aftl_rfc6962_hash_leaf( |
| uint8_t* leaf, /* The Merkle tree leaf data to be hashed. */ |
| uint64_t leaf_size, /* Size of the leaf data. */ |
| uint8_t* hash); /* Resulting RFC 6962 hash of the leaf data. */ |
| |
| /* Computes an inner hash as detailed by https://tools.ietf.org/html/rfc6962. */ |
| bool avb_aftl_rfc6962_hash_children( |
| uint8_t* left_child, /* The left child node data. */ |
| uint64_t left_child_size, /* Size of the left child node data. */ |
| uint8_t* right_child, /* The right child node data. */ |
| uint64_t right_child_size, /* Size of the right child node data. */ |
| uint8_t |
| hash[AVB_AFTL_HASH_SIZE]); /* Resulting RFC 6962 hash of the children.*/ |
| |
| /* Computes a subtree hash along the left-side tree border. */ |
| bool avb_aftl_chain_border_right( |
| uint8_t* seed, /* Data containing the starting hash. */ |
| uint64_t seed_size, /* Size of the starting hash data. */ |
| uint8_t* proof, /* The hashes in the inclusion proof. */ |
| uint32_t proof_entry_count, /* Number of inclusion proof entries. */ |
| uint8_t* hash); /* Resulting subtree hash. */ |
| |
| /* Computes a subtree hash on or below the tree's right border. */ |
| bool avb_aftl_chain_inner( |
| uint8_t* seed, /* Data containing the starting hash. */ |
| uint64_t seed_size, /* Size of the starting hash data. */ |
| uint8_t* proof, /* The hashes in the inclusion proof. */ |
| uint32_t proof_entry_count, /* Number of inclusion proof entries. */ |
| uint64_t leaf_index, /* The current Merkle tree leaf index. */ |
| uint8_t* hash); /* Resulting subtree hash. */ |
| |
| /* Counts leading zeros. Used in Merkle tree hash validation .*/ |
| unsigned int avb_aftl_count_leading_zeros( |
| uint64_t val); /* Value to count leading zeros of. */ |
| |
| /* Calculates the expected Merkle tree hash. */ |
| bool avb_aftl_root_from_icp( |
| uint64_t leaf_index, /* The leaf index in the Merkle tree.*/ |
| uint64_t tree_size, /* The size of the Merkle tree. */ |
| uint8_t proof[][AVB_AFTL_HASH_SIZE], /* Inclusion proof hash data. */ |
| uint32_t proof_entry_count, /* Number of inclusion proof hashes. */ |
| uint8_t* leaf_hash, /* The leaf hash to prove inclusion of. */ |
| uint64_t leaf_hash_size, /* Size of the leaf hash. */ |
| uint8_t* root_hash); /* The resulting tree root hash. */ |
| |
| /* Allocates and populates an AftlImage from a binary blob. */ |
| AftlImage* parse_aftl_image(uint8_t* aftl_blob, size_t aftl_blob_size); |
| |
| /* Allocates and populates an AftlIcpEntry and all sub-fields from |
| a binary blob. It is assumed that the blob points to an AftlIcpEntry. */ |
| AftlIcpEntry* parse_icp_entry(uint8_t** aftl_blob, size_t* remaining_size); |
| |
| /* Frees an AftlIcpEntry and all sub-fields that were previously |
| allocated by a call to parse_icp_entry. */ |
| void free_aftl_icp_entry(AftlIcpEntry* aftl_icp_entry); |
| |
| /* Frees an AftlImage and all sub-fields that were previously |
| allocated by a call to parse_aftl_image. */ |
| void free_aftl_image(AftlImage* image); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* AVB_AFTL_UTIL_H_ */ |