/*
 * 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_ */
