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

#ifndef VBOOT_REFERENCE_VB2_CONVERT_STRUCTS_H_
#define VBOOT_REFERENCE_VB2_CONVERT_STRUCTS_H_

#include "2struct.h"

/**
 * Round up a size to a multiple of 32 bits (4 bytes).
 */
static __inline const uint32_t roundup32(uint32_t v)
{
	return (v + 3) & ~3;
}

/**
 * Convert a packed key from vboot data format to vboot2 data format.
 *
 * Intended for use by unit tests.  Does NOT validate the original struct
 * contents, just copies them.
 *
 * @param key		Packed key in vboot1 format
 * @param desc		Description of packed key
 * @param out_size	Destination for size of the newly allocated buffer
 * @return a newly allocated buffer with the converted key.  Caller is
 * responsible for freeing this buffer.
 */
struct vb2_packed_key2 *vb2_convert_packed_key2(
				const struct vb2_packed_key *key,
				const char *desc, uint32_t *out_size);

/**
 * Convert a signature from vboot data format to vboot2 data format.
 *
 * Intended for use by unit tests.  Does NOT validate the original struct
 * contents, just copies them.
 *
 * @param sig		Signature in vboot1 format
 * @param desc		Description of signature
 * @param key		Key to take algorithms and GUID from.  If NULL, those
 *			fields are left uninitialized.
 * @param out_size	Destination for size of the newly allocated buffer
 * @return a newly allocated buffer with the converted signature.  Caller is
 * responsible for freeing this buffer.
 */
struct vb2_signature2 *vb2_convert_signature2(
			      const struct vb2_signature *sig,
			      const char *desc,
			      const struct vb2_packed_key2 *key,
			      uint32_t *out_size);

/**
 * Create an unsigned hash signature of the data.
 *
 * @param data		Data to sign
 * @param size		Size of data in bytes
 * @return a newly-allocated signature, which the caller must free, or NULL if
 *	   error.
 */
struct vb2_signature2 *vb2_create_hash_sig(const uint8_t *data,
					   uint32_t size,
					   enum vb2_hash_algorithm hash_alg);

#endif  /* VBOOT_REFERENCE_VB2_CONVERT_STRUCTS_H_ */
