xref: /rk3399_rockchip-uboot/include/u-boot/rsa-mod-exp.h (revision fc2f4246b4b3b750e8c5aa08440ec5e1c952088e)
1*fc2f4246SRuchika Gupta /*
2*fc2f4246SRuchika Gupta  * Copyright (c) 2014, Ruchika Gupta.
3*fc2f4246SRuchika Gupta  *
4*fc2f4246SRuchika Gupta  * SPDX-License-Identifier:    GPL-2.0+
5*fc2f4246SRuchika Gupta */
6*fc2f4246SRuchika Gupta 
7*fc2f4246SRuchika Gupta #ifndef _RSA_MOD_EXP_H
8*fc2f4246SRuchika Gupta #define _RSA_MOD_EXP_H
9*fc2f4246SRuchika Gupta 
10*fc2f4246SRuchika Gupta #include <errno.h>
11*fc2f4246SRuchika Gupta #include <image.h>
12*fc2f4246SRuchika Gupta 
13*fc2f4246SRuchika Gupta /**
14*fc2f4246SRuchika Gupta  * struct key_prop - holder for a public key properties
15*fc2f4246SRuchika Gupta  *
16*fc2f4246SRuchika Gupta  * The struct has pointers to modulus (Typically called N),
17*fc2f4246SRuchika Gupta  * The inverse, R^2, exponent. These can be typecasted and
18*fc2f4246SRuchika Gupta  * used as byte arrays or converted to the required format
19*fc2f4246SRuchika Gupta  * as per requirement of RSA implementation.
20*fc2f4246SRuchika Gupta  */
21*fc2f4246SRuchika Gupta struct key_prop {
22*fc2f4246SRuchika Gupta 	const void *rr;		/* R^2 can be treated as byte array */
23*fc2f4246SRuchika Gupta 	const void *modulus;	/* modulus as byte array */
24*fc2f4246SRuchika Gupta 	const void *public_exponent; /* public exponent as byte array */
25*fc2f4246SRuchika Gupta 	uint32_t n0inv;		/* -1 / modulus[0] mod 2^32 */
26*fc2f4246SRuchika Gupta 	int num_bits;		/* Key length in bits */
27*fc2f4246SRuchika Gupta 	uint32_t exp_len;	/* Exponent length in number of uint8_t */
28*fc2f4246SRuchika Gupta };
29*fc2f4246SRuchika Gupta 
30*fc2f4246SRuchika Gupta /**
31*fc2f4246SRuchika Gupta  * rsa_mod_exp_sw() - Perform RSA Modular Exponentiation in sw
32*fc2f4246SRuchika Gupta  *
33*fc2f4246SRuchika Gupta  * Operation: out[] = sig ^ exponent % modulus
34*fc2f4246SRuchika Gupta  *
35*fc2f4246SRuchika Gupta  * @sig:	RSA PKCS1.5 signature
36*fc2f4246SRuchika Gupta  * @sig_len:	Length of signature in number of bytes
37*fc2f4246SRuchika Gupta  * @node:	Node with RSA key elements like modulus, exponent, R^2, n0inv
38*fc2f4246SRuchika Gupta  * @out:	Result in form of byte array
39*fc2f4246SRuchika Gupta  */
40*fc2f4246SRuchika Gupta int rsa_mod_exp_sw(const uint8_t *sig, uint32_t sig_len,
41*fc2f4246SRuchika Gupta 		struct key_prop *node, uint8_t *out);
42*fc2f4246SRuchika Gupta 
43*fc2f4246SRuchika Gupta #endif
44