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