/*
 * 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 IMX_RSA_MIN_KEY_BITS	2048
#define IMX_RSA_MAX_KEY_BITS	2048

/**
 * struct imx_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 imx_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[IMX_RSA_MAX_KEY_BITS / (sizeof(uint32_t) * 8)];	/* modulus as little endian array */
	uint32_t rr[IMX_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 imx_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 imx_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
