imx6: Added DEK blob generator command
Subsystems (3)
PATCH v5 1/1 imx6: Added DEK blob generator command
From: Raul Cardenas <[email protected]>
Freescale's SEC block has built-in Data Encryption Key(DEK) Blob Protocol which provides a method for protecting a DEK for non-secure memory storage. SEC block protects data in a data structure called a Secret Key Blob, which provides both confidentiality and integrity protection.
Every time the blob encapsulation is executed, a AES-256 key is randomly generated to encrypt the DEK. This key is encrypted with the OTP Secret key from SoC. The resulting blob consists of the encrypted AES-256 key, the encrypted DEK, and a 16-bit MAC.
During decapsulation, the reverse process is performed to get back the original DEK. A caveat to the blob decapsulation process, is that the DEK is decrypted in secure-memory and can only be read by FSL SEC HW. The DEK is used to decrypt data during encrypted boot.
Commands added
--------------
dek_blob - encapsulating DEK as a cryptgraphic blob
Commands Syntax
---------------
dek_blob src dst len
Encapsulate and create blob of a len-bits DEK at address src and store the result at address dst.
---
Changes in v5:
-Add copyright as recommended by Stefano
-Remove CONFIG_ARM and use CONFIG_SYS_FSL_SEC_LE, and add !defined(CONFIG_IMX6), due to previous remove, as recommended by Ruchika
Changes in v4:
-Improve coding style as recommended by Simon
-Add const type qualifier to functions using the
plaintext as a parameter
-Fix and add documentation
Changes in v3:
-Improve cache management for relevant descriptors -Add cache management to RNG instantiate
Changes in v2:
-Remove weak symbol as recommended by Ruchika
arch/arm/imx-common/Makefile | 1 + arch/arm/imx-common/cmd_dek.c | 91 +++++++++++++++++++ arch/arm/imx-common/timer.c | 17 ++++ arch/arm/include/asm/arch-mx6/imx-regs.h | 4 + doc/README.mxc_hab | 48 ++++++++++ drivers/crypto/fsl/Makefile | 2 +- drivers/crypto/fsl/desc.h | 15 ++++ drivers/crypto/fsl/fsl_blob.c | 52 +++++++++++ drivers/crypto/fsl/jobdesc.c | 149 ++++++++++++++++++++++++++++++- drivers/crypto/fsl/jobdesc.h | 14 +++ drivers/crypto/fsl/jr.c | 31 ++++++- include/fsl_sec.h | 78 +++++++++++++++- 12 files changed, 492 insertions(+), 10 deletions(-) create mode 100644 arch/arm/imx-common/cmd_dek.c
arch/arm/imx-common/Makefile +1 -0
@@ -24,6 +24,7 @@ obj-$(CONFIG_IMX_VIDEO_SKIP) += video.o endif obj-$(CONFIG_CMD_BMODE) += cmd_bmode.o obj-$(CONFIG_CMD_HDMIDETECT) += cmd_hdmidet.o +obj-$(CONFIG_CMD_DEKBLOB) += cmd_dek.o quiet_cmd_cpp_cfg = CFGS $@ cmd_cpp_cfg = $(CPP) $(cpp_flags) -x c -o $@ $<
arch/arm/imx-common/cmd_dek.c new file +91 -0
91 lines not on this page · raw message
arch/arm/imx-common/timer.c +17 -0
@@ -176,3 +176,20 @@ ulong get_tbclk(void) {return gpt_get_clk (); } + +/* +* This function is intended for SHORT delays only. +* It will overflow at around 10 seconds @ 400MHz, +* or 20 seconds @ 200MHz. +*/ +unsigned long usec2ticks (unsigned long usec) +{ +ulong ticks; + +if (usec <1000 ) + ticks = ((usec * (get_tbclk ()/1000 )) +500 ) /1000 ; +else + ticks = ((usec /10 ) * (get_tbclk () /100000 )); + +return ticks; +}
arch/arm/include/asm/arch-mx6/imx-regs.h +4 -0
@@ -215,6 +215,10 @@#define AIPS2_OFF_BASE_ADDR (ATZ2_BASE_ADDR + 0x80000)#define CAAM_BASE_ADDR (ATZ2_BASE_ADDR)#define ARM_BASE_ADDR (ATZ2_BASE_ADDR + 0x40000) + +#define CONFIG_SYS_FSL_SEC_ADDR CAAM_BASE_ADDR +#define CONFIG_SYS_FSL_JR0_ADDR (CAAM_BASE_ADDR + 0x1000) +#define USB_PL301_BASE_ADDR (AIPS2_OFF_BASE_ADDR + 0x0000)#define USB_BASE_ADDR (AIPS2_OFF_BASE_ADDR + 0x4000)
doc/README.mxc_hab +48 -0
51 lines not on this page · raw message
drivers/crypto/fsl/Makefile +1 -1
@@ -8,5 +8,5 @@ obj-y += sec.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)$(CONFIG_CMD_DEKBLOB) += fsl_blob.o obj-$(CONFIG_RSA_FREESCALE_EXP) += fsl_rsa.o
drivers/crypto/fsl/desc.h +15 -0
@@ -12,11 +12,18 @@#ifndef DESC_H #define DESC_H +#define KEY_BLOB_SIZE 32 +#define MAC_SIZE 16 +/* Max size of any CAAM descriptor in 32-bit words, inclusive of header */ #define MAX_CAAM_DESCSIZE 64 +/* Size of DEK Blob descriptor, inclusive of header */ +#define DEK_BLOB_DESCSIZE 9 +/* Block size of any entity covered/uncovered with a KEK/TKEK */ #define KEK_BLOCKSIZE 16 +/* * Supported descriptor command types as they show up * inside a descriptor command word.
@@ -273,6 +280,13 @@#define LDLEN_SET_OFIFO_OFFSET_MASK (3 << LDLEN_SET_OFIFO_OFFSET_SHIFT)/* +* AAD Definitions +*/ +#define AES_KEY_SHIFT 8 +#define LD_CCM_MODE 0x66 +#define KEY_AES_SRC (0x55 << AES_KEY_SHIFT) + +/* * FIFO_LOAD/FIFO_STORE/SEQ_FIFO_LOAD/SEQ_FIFO_STORE * Command Constructs */
@@ -418,6 +432,7 @@#define OP_PCLID_MASK (0xff << 16)/* Assuming OP_TYPE = OP_TYPE_UNI_PROTOCOL */ +#define OP_PCLID_SECMEM 0x08#define OP_PCLID_BLOB (0x0d << OP_PCLID_SHIFT)#define OP_PCLID_SECRETKEY (0x11 << OP_PCLID_SHIFT)#define OP_PCLID_PUBLICKEYPAIR (0x14 << OP_PCLID_SHIFT)
drivers/crypto/fsl/fsl_blob.c +52 -0
61 lines not on this page · raw message
drivers/crypto/fsl/jobdesc.c +147 -2
159 lines not on this page · raw message
drivers/crypto/fsl/jobdesc.h +14 -0
@@ -14,6 +14,20 @@#define KEY_IDNFR_SZ_BYTES 16 +#ifdef CONFIG_CMD_DEKBLOB +/* inline_cnstr_jobdesc_blob_dek: +* Intializes and constructs the job descriptor for DEK encapsulation +* using the given parameters. +* @desc: reference to the job descriptor +* @plain_txt: reference to the DEK +* @enc_blob: reference where to store the blob +* @in_sz: size in bytes of the DEK +* @return: 0 on success, ECONSTRJDESC otherwise +*/ +int inline_cnstr_jobdesc_blob_dek (uint32_t *desc,const uint8_t *plain_txt, +uint8_t *enc_blob,uint32_t in_sz); +#endif +void inline_cnstr_jobdesc_hash (uint32_t *desc,const uint8_t *msg,uint32_t msgsz,uint8_t *digest,u32 alg_type,uint32_t alg_size,int sg_tbl);
drivers/crypto/fsl/jr.c +27 -4
@@ -90,11 +90,13 @@ static int jr_init(void) jr.liodn =DEFAULT_JR_LIODN ;#endif jr.size =JR_SIZE ; - jr.input_ring = (dma_addr_t *)malloc (JR_SIZE *sizeof (dma_addr_t)); + jr.input_ring = (dma_addr_t *)memalign (ARCH_DMA_MINALIGN , +JR_SIZE *sizeof (dma_addr_t));if (!jr.input_ring)return -1 ; jr.output_ring = - (struct op_ring *)malloc (JR_SIZE *sizeof (struct op_ring )); + (struct op_ring *)memalign (ARCH_DMA_MINALIGN , +JR_SIZE *sizeof (struct op_ring ));if (!jr.output_ring)return -1 ;
@@ -163,13 +165,23 @@ static int jr_enqueue(uint32_t *desc_addr, CIRC_SPACE(jr.head, jr.tail, jr.size) <= 0)return -1 ; - jr.input_ring[head] = desc_phys_addr; jr.info[head].desc_phys_addr = desc_phys_addr; jr.info[head].desc_addr = (uint32_t )desc_addr; jr.info[head].callback = (void *)callback; jr.info[head].arg = arg; jr.info[head].op_done =0 ; +unsigned long start = (unsigned long )&jr.info[head] & + ~(ARCH_DMA_MINALIGN -1 ); +unsigned long end =ALIGN (start +sizeof (struct jr_info ), +ARCH_DMA_MINALIGN ); +flush_dcache_range (start, end); + + jr.input_ring[head] = desc_phys_addr; + start = (unsigned long )&jr.input_ring[head] & ~(ARCH_DMA_MINALIGN -1 ); + end =ALIGN (start +sizeof (dma_addr_t),ARCH_DMA_MINALIGN ); +flush_dcache_range (start, end); + jr.head = (head +1 ) & (jr.size -1 );sec_out32 (®s->irja,1 );
@@ -187,6 +199,13 @@ static int jr_dequeue(void)void *arg =NULL ;while (sec_in32 (®s->orsf) &&CIRC_CNT (jr.head, jr.tail, jr.size)) { +unsigned long start = (unsigned long )jr.output_ring & + ~(ARCH_DMA_MINALIGN -1 ); +unsigned long end =ALIGN (start + +sizeof (struct op_ring )*JR_SIZE , +ARCH_DMA_MINALIGN ); +invalidate_dcache_range (start, end); + found =0 ;dma_addr_t op_desc = jr.output_ring[jr.tail].desc;
@@ -333,13 +352,17 @@ static int instantiate_rng(void)memset (&op,0 ,sizeof (struct result )); - desc =malloc (sizeof (int ) *6 ); + desc =memalign (ARCH_DMA_MINALIGN ,sizeof (uint32_t ) *6 );if (!desc) {printf ("cannot allocate RNG init descriptor memory\n" );return -1 ; }inline_cnstr_jobdesc_rng_instantiation (desc); +int size =roundup (sizeof (uint32_t ) *6 ,ARCH_DMA_MINALIGN ); +flush_dcache_range ((unsigned long )desc, + (unsigned long )desc + size); + ret =run_descriptor_jr (desc);if (ret)
include/fsl_sec.h +75 -3
103 lines not on this page · raw message
Signature · 1 line
2.1.2
Fabio Estevam
reviewerPATCH v5 1/1 imx6: Added DEK blob generator command
Hi Raul,
Quoted 31 lines · On Fri, Feb 27, 2015 at 2:22 PM, <[email protected]> wrote:
From: Raul Cardenas <[email protected]>
Freescale's SEC block has built-in Data Encryption Key(DEK) Blob Protocol which provides a method for protecting a DEK for non-secure memory storage. SEC block protects data in a data structure called a Secret Key Blob, which provides both confidentiality and integrity protection.
Every time the blob encapsulation is executed, a AES-256 key is randomly generated to encrypt the DEK. This key is encrypted with the OTP Secret key from SoC. The resulting blob consists of the encrypted AES-256 key, the encrypted DEK, and a 16-bit MAC.During decapsulation, the reverse process is performed to get back the original DEK. A caveat to the blob decapsulation process, is that the DEK is decrypted in secure-memory and can only be read by FSL SEC HW. The DEK is used to decrypt data during encrypted boot.
Commands added
--------------
dek_blob- encapsulating DEK as a cryptgraphic blobCommands Syntax
---------------
dek_blobsrc dst lenEncapsulate and create blob of a len-bits DEK at address src and store the result at address dst.
Quoted 6 lines
Signed-off-by Raul Cardenas <[email protected]>Signed-off-by Nitin Garg <[email protected]>Signed-off-by Ulises Cardenas <[email protected]>Signed-off-by Ulises Cardenas-B45798 <[email protected]>
It seems you have three Signed-off-by tags from yourself.
You could put only one from yourself and one from Nitin.
Regards,
Fabio Estevam
PATCH v5 1/1 imx6: Added DEK blob generator command
In reply to Ulises.Cardenas at freescale.comQuoted 31 lines · Ulises.Cardenas at freescale.com
From: Raul Cardenas <[email protected]>
Freescale's SEC block has built-in Data Encryption Key(DEK) Blob Protocol which provides a method for protecting a DEK for non-secure memory storage. SEC block protects data in a data structure called a Secret Key Blob, which provides both confidentiality and integrity protection.
Every time the blob encapsulation is executed, a AES-256 key is randomly generated to encrypt the DEK. This key is encrypted with the OTP Secret key from SoC. The resulting blob consists of the encrypted AES-256 key, the encrypted DEK, and a 16-bit MAC.During decapsulation, the reverse process is performed to get back the original DEK. A caveat to the blob decapsulation process, is that the DEK is decrypted in secure-memory and can only be read by FSL SEC HW. The DEK is used to decrypt data during encrypted boot.
Commands added
--------------
dek_blob- encapsulating DEK as a cryptgraphic blobCommands Syntax
---------------
dek_blobsrc dst lenEncapsulate and create blob of a len-bits DEK at address src and store the result at address dst.
Quoted 7 lines
Signed-off-by Raul Cardenas <[email protected]>Signed-off-by Nitin Garg <[email protected]>Signed-off-by Ulises Cardenas <[email protected]>Signed-off-by Ulises Cardenas-B45798 <[email protected]>---
Applied to u-boot-imx, thanks !
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================