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 */ 24*78263d89SJason Zhu uint32_t burn_key; /* The flag to burn key's hash */ 25fc2f4246SRuchika Gupta const void *public_exponent; /* public exponent as byte array */ 26008ec9b4SJoseph Chen const void *public_exponent_BN; /* public exponent as byte array */ 27008ec9b4SJoseph Chen #ifdef CONFIG_ROCKCHIP_CRYPTO_V1 28008ec9b4SJoseph Chen const void *factor_c; /* rockchip crypto v1 accelerate factor */ 29008ec9b4SJoseph Chen #else 30008ec9b4SJoseph Chen const void *factor_np; /* rockchip crypto v2 accelerate factor */ 31008ec9b4SJoseph Chen #endif 32*78263d89SJason Zhu const void *hash; /* the key hash */ 33fc2f4246SRuchika Gupta uint32_t n0inv; /* -1 / modulus[0] mod 2^32 */ 34fc2f4246SRuchika Gupta int num_bits; /* Key length in bits */ 35fc2f4246SRuchika Gupta uint32_t exp_len; /* Exponent length in number of uint8_t */ 36fc2f4246SRuchika Gupta }; 37fc2f4246SRuchika Gupta 38fc2f4246SRuchika Gupta /** 39fc2f4246SRuchika Gupta * rsa_mod_exp_sw() - Perform RSA Modular Exponentiation in sw 40fc2f4246SRuchika Gupta * 41fc2f4246SRuchika Gupta * Operation: out[] = sig ^ exponent % modulus 42fc2f4246SRuchika Gupta * 43fc2f4246SRuchika Gupta * @sig: RSA PKCS1.5 signature 44fc2f4246SRuchika Gupta * @sig_len: Length of signature in number of bytes 45fc2f4246SRuchika Gupta * @node: Node with RSA key elements like modulus, exponent, R^2, n0inv 4631d2b4fdSRuchika Gupta * @out: Result in form of byte array of len equal to sig_len 47fc2f4246SRuchika Gupta */ 48fc2f4246SRuchika Gupta int rsa_mod_exp_sw(const uint8_t *sig, uint32_t sig_len, 49fc2f4246SRuchika Gupta struct key_prop *node, uint8_t *out); 50fc2f4246SRuchika Gupta 5131d2b4fdSRuchika Gupta int rsa_mod_exp(struct udevice *dev, const uint8_t *sig, uint32_t sig_len, 5231d2b4fdSRuchika Gupta struct key_prop *node, uint8_t *out); 5331d2b4fdSRuchika Gupta 5431d2b4fdSRuchika Gupta /** 5531d2b4fdSRuchika Gupta * struct struct mod_exp_ops - Driver model for RSA Modular Exponentiation 5631d2b4fdSRuchika Gupta * operations 5731d2b4fdSRuchika Gupta * 5831d2b4fdSRuchika Gupta * The uclass interface is implemented by all crypto devices which use 5931d2b4fdSRuchika Gupta * driver model. 6031d2b4fdSRuchika Gupta */ 6131d2b4fdSRuchika Gupta struct mod_exp_ops { 6231d2b4fdSRuchika Gupta /** 6331d2b4fdSRuchika Gupta * Perform Modular Exponentiation 6431d2b4fdSRuchika Gupta * 6531d2b4fdSRuchika Gupta * Operation: out[] = sig ^ exponent % modulus 6631d2b4fdSRuchika Gupta * 6731d2b4fdSRuchika Gupta * @dev: RSA Device 6831d2b4fdSRuchika Gupta * @sig: RSA PKCS1.5 signature 6931d2b4fdSRuchika Gupta * @sig_len: Length of signature in number of bytes 7031d2b4fdSRuchika Gupta * @node: Node with RSA key elements like modulus, exponent, 7131d2b4fdSRuchika Gupta * R^2, n0inv 7231d2b4fdSRuchika Gupta * @out: Result in form of byte array of len equal to sig_len 7331d2b4fdSRuchika Gupta * 7431d2b4fdSRuchika Gupta * This function computes exponentiation over the signature. 7531d2b4fdSRuchika Gupta * Returns: 0 if exponentiation is successful, or a negative value 7631d2b4fdSRuchika Gupta * if it wasn't. 7731d2b4fdSRuchika Gupta */ 7831d2b4fdSRuchika Gupta int (*mod_exp)(struct udevice *dev, const uint8_t *sig, 7931d2b4fdSRuchika Gupta uint32_t sig_len, struct key_prop *node, 8031d2b4fdSRuchika Gupta uint8_t *outp); 8131d2b4fdSRuchika Gupta }; 8231d2b4fdSRuchika Gupta 83fc2f4246SRuchika Gupta #endif 84