1fc2f4246SRuchika Gupta /* 2057c2200SRuchika Gupta * Copyright 2014 Freescale Semiconductor, Inc. 3fc2f4246SRuchika Gupta * 4fc2f4246SRuchika Gupta * SPDX-License-Identifier: GPL-2.0+ 5fc2f4246SRuchika Gupta */ 6fc2f4246SRuchika Gupta 7fc2f4246SRuchika Gupta #ifndef _RSA_MOD_EXP_H 8fc2f4246SRuchika Gupta #define _RSA_MOD_EXP_H 9fc2f4246SRuchika Gupta 10fc2f4246SRuchika Gupta #include <errno.h> 11fc2f4246SRuchika Gupta #include <image.h> 12fc2f4246SRuchika Gupta 13fc2f4246SRuchika Gupta /** 14fc2f4246SRuchika Gupta * struct key_prop - holder for a public key properties 15fc2f4246SRuchika Gupta * 16fc2f4246SRuchika Gupta * The struct has pointers to modulus (Typically called N), 17fc2f4246SRuchika Gupta * The inverse, R^2, exponent. These can be typecasted and 18fc2f4246SRuchika Gupta * used as byte arrays or converted to the required format 19fc2f4246SRuchika Gupta * as per requirement of RSA implementation. 20fc2f4246SRuchika Gupta */ 21fc2f4246SRuchika Gupta struct key_prop { 22fc2f4246SRuchika Gupta const void *rr; /* R^2 can be treated as byte array */ 23fc2f4246SRuchika Gupta const void *modulus; /* modulus as byte array */ 24fc2f4246SRuchika Gupta const void *public_exponent; /* public exponent as byte array */ 25*008ec9b4SJoseph Chen const void *public_exponent_BN; /* public exponent as byte array */ 26*008ec9b4SJoseph Chen #ifdef CONFIG_ROCKCHIP_CRYPTO_V1 27*008ec9b4SJoseph Chen const void *factor_c; /* rockchip crypto v1 accelerate factor */ 28*008ec9b4SJoseph Chen #else 29*008ec9b4SJoseph Chen const void *factor_np; /* rockchip crypto v2 accelerate factor */ 30*008ec9b4SJoseph Chen #endif 31fc2f4246SRuchika Gupta uint32_t n0inv; /* -1 / modulus[0] mod 2^32 */ 32fc2f4246SRuchika Gupta int num_bits; /* Key length in bits */ 33fc2f4246SRuchika Gupta uint32_t exp_len; /* Exponent length in number of uint8_t */ 34fc2f4246SRuchika Gupta }; 35fc2f4246SRuchika Gupta 36fc2f4246SRuchika Gupta /** 37fc2f4246SRuchika Gupta * rsa_mod_exp_sw() - Perform RSA Modular Exponentiation in sw 38fc2f4246SRuchika Gupta * 39fc2f4246SRuchika Gupta * Operation: out[] = sig ^ exponent % modulus 40fc2f4246SRuchika Gupta * 41fc2f4246SRuchika Gupta * @sig: RSA PKCS1.5 signature 42fc2f4246SRuchika Gupta * @sig_len: Length of signature in number of bytes 43fc2f4246SRuchika Gupta * @node: Node with RSA key elements like modulus, exponent, R^2, n0inv 4431d2b4fdSRuchika Gupta * @out: Result in form of byte array of len equal to sig_len 45fc2f4246SRuchika Gupta */ 46fc2f4246SRuchika Gupta int rsa_mod_exp_sw(const uint8_t *sig, uint32_t sig_len, 47fc2f4246SRuchika Gupta struct key_prop *node, uint8_t *out); 48fc2f4246SRuchika Gupta 4931d2b4fdSRuchika Gupta int rsa_mod_exp(struct udevice *dev, const uint8_t *sig, uint32_t sig_len, 5031d2b4fdSRuchika Gupta struct key_prop *node, uint8_t *out); 5131d2b4fdSRuchika Gupta 5231d2b4fdSRuchika Gupta /** 5331d2b4fdSRuchika Gupta * struct struct mod_exp_ops - Driver model for RSA Modular Exponentiation 5431d2b4fdSRuchika Gupta * operations 5531d2b4fdSRuchika Gupta * 5631d2b4fdSRuchika Gupta * The uclass interface is implemented by all crypto devices which use 5731d2b4fdSRuchika Gupta * driver model. 5831d2b4fdSRuchika Gupta */ 5931d2b4fdSRuchika Gupta struct mod_exp_ops { 6031d2b4fdSRuchika Gupta /** 6131d2b4fdSRuchika Gupta * Perform Modular Exponentiation 6231d2b4fdSRuchika Gupta * 6331d2b4fdSRuchika Gupta * Operation: out[] = sig ^ exponent % modulus 6431d2b4fdSRuchika Gupta * 6531d2b4fdSRuchika Gupta * @dev: RSA Device 6631d2b4fdSRuchika Gupta * @sig: RSA PKCS1.5 signature 6731d2b4fdSRuchika Gupta * @sig_len: Length of signature in number of bytes 6831d2b4fdSRuchika Gupta * @node: Node with RSA key elements like modulus, exponent, 6931d2b4fdSRuchika Gupta * R^2, n0inv 7031d2b4fdSRuchika Gupta * @out: Result in form of byte array of len equal to sig_len 7131d2b4fdSRuchika Gupta * 7231d2b4fdSRuchika Gupta * This function computes exponentiation over the signature. 7331d2b4fdSRuchika Gupta * Returns: 0 if exponentiation is successful, or a negative value 7431d2b4fdSRuchika Gupta * if it wasn't. 7531d2b4fdSRuchika Gupta */ 7631d2b4fdSRuchika Gupta int (*mod_exp)(struct udevice *dev, const uint8_t *sig, 7731d2b4fdSRuchika Gupta uint32_t sig_len, struct key_prop *node, 7831d2b4fdSRuchika Gupta uint8_t *outp); 7931d2b4fdSRuchika Gupta }; 8031d2b4fdSRuchika Gupta 81fc2f4246SRuchika Gupta #endif 82