xref: /rk3399_rockchip-uboot/drivers/crypto/fsl/fsl_rsa.c (revision 9c7a0a600bfc8741e2941ce9bb965f2e77d6bbea)
134276478SRuchika Gupta /*
234276478SRuchika Gupta  * (C) Copyright 2014 Freescale Semiconductor, Inc.
334276478SRuchika Gupta  * Author: Ruchika Gupta <ruchika.gupta@freescale.com>
434276478SRuchika Gupta  *
534276478SRuchika Gupta  * SPDX-License-Identifier:	GPL-2.0+
634276478SRuchika Gupta  */
734276478SRuchika Gupta 
834276478SRuchika Gupta #include <config.h>
934276478SRuchika Gupta #include <common.h>
1034276478SRuchika Gupta #include <dm.h>
1134276478SRuchika Gupta #include <asm/types.h>
1234276478SRuchika Gupta #include <malloc.h>
1334276478SRuchika Gupta #include "jobdesc.h"
1434276478SRuchika Gupta #include "desc.h"
1534276478SRuchika Gupta #include "jr.h"
1634276478SRuchika Gupta #include "rsa_caam.h"
1734276478SRuchika Gupta #include <u-boot/rsa-mod-exp.h>
1834276478SRuchika Gupta 
fsl_mod_exp(struct udevice * dev,const uint8_t * sig,uint32_t sig_len,struct key_prop * prop,uint8_t * out)1934276478SRuchika Gupta int fsl_mod_exp(struct udevice *dev, const uint8_t *sig, uint32_t sig_len,
2034276478SRuchika Gupta 		struct key_prop *prop, uint8_t *out)
2134276478SRuchika Gupta {
2234276478SRuchika Gupta 	uint32_t keylen;
2334276478SRuchika Gupta 	struct pk_in_params pkin;
2434276478SRuchika Gupta 	uint32_t desc[MAX_CAAM_DESCSIZE];
2534276478SRuchika Gupta 	int ret;
2634276478SRuchika Gupta 
2734276478SRuchika Gupta 	/* Length in bytes */
2834276478SRuchika Gupta 	keylen = prop->num_bits / 8;
2934276478SRuchika Gupta 
3034276478SRuchika Gupta 	pkin.a = sig;
3134276478SRuchika Gupta 	pkin.a_siz = sig_len;
3234276478SRuchika Gupta 	pkin.n = prop->modulus;
3334276478SRuchika Gupta 	pkin.n_siz = keylen;
3434276478SRuchika Gupta 	pkin.e = prop->public_exponent;
3534276478SRuchika Gupta 	pkin.e_siz = prop->exp_len;
3634276478SRuchika Gupta 
3734276478SRuchika Gupta 	inline_cnstr_jobdesc_pkha_rsaexp(desc, &pkin, out, sig_len);
3834276478SRuchika Gupta 
3934276478SRuchika Gupta 	ret = run_descriptor_jr(desc);
4034276478SRuchika Gupta 	if (ret) {
4134276478SRuchika Gupta 		debug("%s: RSA failed to verify: %d\n", __func__, ret);
4234276478SRuchika Gupta 		return -EFAULT;
4334276478SRuchika Gupta 	}
4434276478SRuchika Gupta 
4534276478SRuchika Gupta 	return 0;
4634276478SRuchika Gupta }
4734276478SRuchika Gupta 
4834276478SRuchika Gupta static const struct mod_exp_ops fsl_mod_exp_ops = {
4934276478SRuchika Gupta 	.mod_exp	= fsl_mod_exp,
5034276478SRuchika Gupta };
5134276478SRuchika Gupta 
5234276478SRuchika Gupta U_BOOT_DRIVER(fsl_rsa_mod_exp) = {
5334276478SRuchika Gupta 	.name	= "fsl_rsa_mod_exp",
5434276478SRuchika Gupta 	.id	= UCLASS_MOD_EXP,
5534276478SRuchika Gupta 	.ops	= &fsl_mod_exp_ops,
56*7f0a0e4cSSumit Garg 	.flags  = DM_FLAG_PRE_RELOC,
5734276478SRuchika Gupta };
5834276478SRuchika Gupta 
5934276478SRuchika Gupta U_BOOT_DEVICE(fsl_rsa) = {
6034276478SRuchika Gupta 	.name = "fsl_rsa_mod_exp",
6134276478SRuchika Gupta };
62