/*
 * Copyright (c) 2015, Google Inc.
 *
 * (C) Copyright 2008 Semihalf
 *
 * (C) Copyright 2000-2006
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#ifndef _RSA_IMX_H
#define _RSA_IMX_H

#include <errno.h>
#include <image.h>

/* This is the minimum/maximum key size we support, in bits */
#define RSA_MIN_KEY_BITS	2048
#define RSA_MAX_KEY_BITS	2048

/**
 * struct rsa_public_key - holder for a public key
 *
 * An RSA public key consists of a modulus (typically called N), the inverse
 * and R^2, where R is 2^(# key bits).
 */
struct rsa_public_key {
	uint len;							/* Length of modulus[] in number of uint32_t */
	uint32_t n0inv;							/* -1 / modulus[0] mod 2^32 */
	uint32_t modulus[RSA_MAX_KEY_BITS / (sizeof(uint32_t) * 8)];	/* modulus as little endian array */
	uint32_t rr[RSA_MAX_KEY_BITS / (sizeof(uint32_t) * 8)];		/* R^2 as little endian array */
};

/**
 * rsa_imx_get_key() - Get an RSA public key from an FDT
 *
 * @fdt_blob:	FDT pointer
 * @node:	Node index into FDT
 * @key:	Pointer to public key structure
 * @return 0 if verified, -ve on error
 */
int rsa_imx_get_key(const void *fdt_blob, int node, struct rsa_public_key *key);

/**
 * rsa_imx_verify_key() - Decrypt sig using an RSA public key and verify the padding and hash match
 *
 * @fdt_blob:	FDT pointer
 * @node:	Node index into FDT
 * @key:	Pointer to public key structure
 * @return 0 if verified, -ve on error
 */
int rsa_imx_verify_key(const struct rsa_public_key *key, const uint8_t *sig,
                       const uint32_t sig_len, const uint8_t *hash);

#if IMAGE_ENABLE_SIGN

/**
 * sign() - calculate and return signature for given input data
 *
 * @info:	Specifies key and FIT information
 * @data:	Pointer to the input data
 * @data_len:	Data length
 * @sigp:	Set to an allocated buffer holding the signature
 * @sig_len:	Set to length of the calculated hash
 *
 * This computes input data signature according to selected algorithm.
 * Resulting signature value is placed in an allocated buffer, the
 * pointer is returned as *sigp. The length of the calculated
 * signature is returned via the sig_len pointer argument. The caller
 * should free *sigp.
 *
 * @return: 0, on success, -ve on error
 */
int rsa_imx_sign(struct image_sign_info *info,
                 const struct image_region region[],
                 int region_count, uint8_t **sigp, uint *sig_len);

/**
 * add_verify_data() - Add verification information to FDT
 *
 * Add public key information to the FDT node, suitable for
 * verification at run-time. The information added depends on the
 * algorithm being used.
 *
 * @info:	Specifies key and FIT information
 * @keydest:	Destination FDT blob for public key data
 * @return: 0, on success, -ve on error
*/
int rsa_imx_add_verify_data(struct image_sign_info *info, void *keydest);
#else
static inline int rsa_imx_sign(struct image_sign_info *info,
                               const struct image_region region[], int region_count,
                               uint8_t **sigp, uint *sig_len)
{
	return -ENXIO;
}

static inline int rsa_imx_add_verify_data(struct image_sign_info *info,
                                          void *keydest)
{
	return -ENXIO;
}
#endif

#if IMAGE_ENABLE_VERIFY
/**
 * rsa_verify() - Verify a signature against some data
 *
 * Verify a RSA PKCS1.5 signature against an expected hash.
 *
 * @info:	Specifies key and FIT information
 * @data:	Pointer to the input data
 * @data_len:	Data length
 * @sig:	Signature
 * @sig_len:	Number of bytes in signature
 * @return 0 if verified, -ve on error
 */
int rsa_imx_verify(struct image_sign_info *info,
                   const struct image_region region[], int region_count,
                   uint8_t *sig, uint sig_len);
#else
static inline int rsa_imx_verify(struct image_sign_info *info,
                                 const struct image_region region[], int region_count,
                                 uint8_t *sig, uint sig_len)
{
	return -ENXIO;
}
#endif

#endif
