mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	DM: crypto/fsl - Add Freescale rsa DM driver
Driver added for RSA Modular Exponentiation using Freescale Hardware Accelerator CAAM. The driver uses UCLASS_MOD_EXP Signed-off-by: Ruchika Gupta <ruchika.gupta@freescale.com> CC: Simon Glass <sjg@chromium.org> Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
				
					committed by
					
						 Simon Glass
						Simon Glass
					
				
			
			
				
	
			
			
			
						parent
						
							c937ff6dc2
						
					
				
				
					commit
					34276478f7
				
			| @@ -0,0 +1 @@ | |||||||
|  | source drivers/crypto/fsl/Kconfig | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								drivers/crypto/fsl/Kconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								drivers/crypto/fsl/Kconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | config FSL_CAAM | ||||||
|  | 	bool "Freescale Crypto Driver Support" | ||||||
|  | 	help | ||||||
|  | 	  Enables the Freescale's Cryptographic Accelerator and Assurance | ||||||
|  | 	  Module (CAAM), also known as the SEC version 4 (SEC4). The driver uses | ||||||
|  | 	  Job Ring as interface to communicate with CAAM. | ||||||
| @@ -9,3 +9,4 @@ | |||||||
| obj-y += sec.o | obj-y += sec.o | ||||||
| obj-$(CONFIG_FSL_CAAM) += jr.o fsl_hash.o jobdesc.o error.o | obj-$(CONFIG_FSL_CAAM) += jr.o fsl_hash.o jobdesc.o error.o | ||||||
| obj-$(CONFIG_CMD_BLOB) += fsl_blob.o | obj-$(CONFIG_CMD_BLOB) += fsl_blob.o | ||||||
|  | obj-$(CONFIG_RSA_FREESCALE_EXP) += fsl_rsa.o | ||||||
|   | |||||||
							
								
								
									
										60
									
								
								drivers/crypto/fsl/fsl_rsa.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								drivers/crypto/fsl/fsl_rsa.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | /* | ||||||
|  |  * (C) Copyright 2014 Freescale Semiconductor, Inc. | ||||||
|  |  * Author: Ruchika Gupta <ruchika.gupta@freescale.com> | ||||||
|  |  * | ||||||
|  |  * SPDX-License-Identifier:	GPL-2.0+ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <config.h> | ||||||
|  | #include <common.h> | ||||||
|  | #include <dm.h> | ||||||
|  | #include <asm/types.h> | ||||||
|  | #include <malloc.h> | ||||||
|  | #include "jobdesc.h" | ||||||
|  | #include "desc.h" | ||||||
|  | #include "jr.h" | ||||||
|  | #include "rsa_caam.h" | ||||||
|  | #include <u-boot/rsa-mod-exp.h> | ||||||
|  |  | ||||||
|  | int fsl_mod_exp(struct udevice *dev, const uint8_t *sig, uint32_t sig_len, | ||||||
|  | 		struct key_prop *prop, uint8_t *out) | ||||||
|  | { | ||||||
|  | 	uint32_t keylen; | ||||||
|  | 	struct pk_in_params pkin; | ||||||
|  | 	uint32_t desc[MAX_CAAM_DESCSIZE]; | ||||||
|  | 	int ret; | ||||||
|  |  | ||||||
|  | 	/* Length in bytes */ | ||||||
|  | 	keylen = prop->num_bits / 8; | ||||||
|  |  | ||||||
|  | 	pkin.a = sig; | ||||||
|  | 	pkin.a_siz = sig_len; | ||||||
|  | 	pkin.n = prop->modulus; | ||||||
|  | 	pkin.n_siz = keylen; | ||||||
|  | 	pkin.e = prop->public_exponent; | ||||||
|  | 	pkin.e_siz = prop->exp_len; | ||||||
|  |  | ||||||
|  | 	inline_cnstr_jobdesc_pkha_rsaexp(desc, &pkin, out, sig_len); | ||||||
|  |  | ||||||
|  | 	ret = run_descriptor_jr(desc); | ||||||
|  | 	if (ret) { | ||||||
|  | 		debug("%s: RSA failed to verify: %d\n", __func__, ret); | ||||||
|  | 		return -EFAULT; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static const struct mod_exp_ops fsl_mod_exp_ops = { | ||||||
|  | 	.mod_exp	= fsl_mod_exp, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | U_BOOT_DRIVER(fsl_rsa_mod_exp) = { | ||||||
|  | 	.name	= "fsl_rsa_mod_exp", | ||||||
|  | 	.id	= UCLASS_MOD_EXP, | ||||||
|  | 	.ops	= &fsl_mod_exp_ops, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | U_BOOT_DEVICE(fsl_rsa) = { | ||||||
|  | 	.name = "fsl_rsa_mod_exp", | ||||||
|  | }; | ||||||
| @@ -11,6 +11,7 @@ | |||||||
| #include <common.h> | #include <common.h> | ||||||
| #include "desc_constr.h" | #include "desc_constr.h" | ||||||
| #include "jobdesc.h" | #include "jobdesc.h" | ||||||
|  | #include "rsa_caam.h" | ||||||
|  |  | ||||||
| #define KEY_BLOB_SIZE			32 | #define KEY_BLOB_SIZE			32 | ||||||
| #define MAC_SIZE			16 | #define MAC_SIZE			16 | ||||||
| @@ -123,3 +124,30 @@ void inline_cnstr_jobdesc_rng_instantiation(uint32_t *desc) | |||||||
| 	append_operation(desc, OP_TYPE_CLASS1_ALG | OP_ALG_ALGSEL_RNG | | 	append_operation(desc, OP_TYPE_CLASS1_ALG | OP_ALG_ALGSEL_RNG | | ||||||
| 			 OP_ALG_RNG4_SK); | 			 OP_ALG_RNG4_SK); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* Change key size to bytes form bits in calling function*/ | ||||||
|  | void inline_cnstr_jobdesc_pkha_rsaexp(uint32_t *desc, | ||||||
|  | 				      struct pk_in_params *pkin, uint8_t *out, | ||||||
|  | 				      uint32_t out_siz) | ||||||
|  | { | ||||||
|  | 	dma_addr_t dma_addr_e, dma_addr_a, dma_addr_n, dma_addr_out; | ||||||
|  |  | ||||||
|  | 	dma_addr_e = virt_to_phys((void *)pkin->e); | ||||||
|  | 	dma_addr_a = virt_to_phys((void *)pkin->a); | ||||||
|  | 	dma_addr_n = virt_to_phys((void *)pkin->n); | ||||||
|  | 	dma_addr_out = virt_to_phys((void *)out); | ||||||
|  |  | ||||||
|  | 	init_job_desc(desc, 0); | ||||||
|  | 	append_key(desc, dma_addr_e, pkin->e_siz, KEY_DEST_PKHA_E | CLASS_1); | ||||||
|  |  | ||||||
|  | 	append_fifo_load(desc, dma_addr_a, | ||||||
|  | 			 pkin->a_siz, LDST_CLASS_1_CCB | FIFOLD_TYPE_PK_A); | ||||||
|  |  | ||||||
|  | 	append_fifo_load(desc, dma_addr_n, | ||||||
|  | 			 pkin->n_siz, LDST_CLASS_1_CCB | FIFOLD_TYPE_PK_N); | ||||||
|  |  | ||||||
|  | 	append_operation(desc, OP_TYPE_PK | OP_ALG_PK | OP_ALG_PKMODE_MOD_EXPO); | ||||||
|  |  | ||||||
|  | 	append_fifo_store(desc, dma_addr_out, out_siz, | ||||||
|  | 			  LDST_CLASS_1_CCB | FIFOST_TYPE_PKHA_B); | ||||||
|  | } | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ | |||||||
|  |  | ||||||
| #include <common.h> | #include <common.h> | ||||||
| #include <asm/io.h> | #include <asm/io.h> | ||||||
|  | #include "rsa_caam.h" | ||||||
|  |  | ||||||
| #define KEY_IDNFR_SZ_BYTES		16 | #define KEY_IDNFR_SZ_BYTES		16 | ||||||
|  |  | ||||||
| @@ -26,4 +27,8 @@ void inline_cnstr_jobdesc_blob_decap(uint32_t *desc, uint8_t *key_idnfr, | |||||||
| 				     uint32_t out_sz); | 				     uint32_t out_sz); | ||||||
|  |  | ||||||
| void inline_cnstr_jobdesc_rng_instantiation(uint32_t *desc); | void inline_cnstr_jobdesc_rng_instantiation(uint32_t *desc); | ||||||
|  |  | ||||||
|  | void inline_cnstr_jobdesc_pkha_rsaexp(uint32_t *desc, | ||||||
|  | 				      struct pk_in_params *pkin, uint8_t *out, | ||||||
|  | 				      uint32_t out_siz); | ||||||
| #endif | #endif | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								drivers/crypto/fsl/rsa_caam.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								drivers/crypto/fsl/rsa_caam.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright 2014 Freescale Semiconductor, Inc. | ||||||
|  |  * | ||||||
|  |  * SPDX-License-Identifier:	GPL-2.0+ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef __RSA_CAAM_H | ||||||
|  | #define __RSA_CAAM_H | ||||||
|  |  | ||||||
|  | #include <common.h> | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * struct pk_in_params - holder for input to PKHA block in CAAM | ||||||
|  |  * These parameters are required to perform Modular Exponentiation | ||||||
|  |  * using PKHA Block in CAAM | ||||||
|  |  */ | ||||||
|  | struct pk_in_params { | ||||||
|  | 	const uint8_t *e;	/* public exponent as byte array */ | ||||||
|  | 	uint32_t e_siz;		/* size of e[] in number of bytes */ | ||||||
|  | 	const uint8_t *n;	/* modulus as byte array */ | ||||||
|  | 	uint32_t n_siz;		/* size of n[] in number of bytes */ | ||||||
|  | 	const uint8_t *a;		/* Signature as byte array */ | ||||||
|  | 	uint32_t a_siz;		/* size of a[] in number of bytes */ | ||||||
|  | 	uint8_t *b;		/* Result exp. modulus in number of bytes */ | ||||||
|  | 	uint32_t b_siz;		/* size of b[] in number of bytes */ | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif | ||||||
		Reference in New Issue
	
	Block a user