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