[U-Boot] [PATCH v2] crypto/fsl: fix BLOB encapsulation and decapsulation

Sumit Garg sumit.garg at nxp.com
Fri Jan 5 06:47:36 UTC 2018


Hi Clemens, York, Fabio,

> -----Original Message-----
> From: U-Boot [mailto:u-boot-bounces at lists.denx.de] On Behalf Of Fabio
> Estevam
> Sent: Friday, January 05, 2018 3:27 AM
> To: York Sun <york.sun at nxp.com>
> Cc: Breno Matheus Lima <breno.lima at nxp.com>; u-boot at lists.denx.de;
> clemens.gruber at pqgruber.com; Fabio Estevam <fabio.estevam at nxp.com>
> Subject: [U-Boot] [PATCH v2] crypto/fsl: fix BLOB encapsulation and
> decapsulation
> 

<snip>

> 
>  int blob_decap(u8 *key_mod, u8 *src, u8 *dst, u32 len)  {
> -	int ret, i = 0;
> +	ALLOC_CACHE_ALIGN_BUFFER(u8, aligned_key_mod, 16);
> +	u8 *aligned_src, *aligned_dst;
> +	int ret, size, i = 0;
>  	u32 *desc;
> 
>  	printf("\nDecapsulating blob to get data\n");
> -	desc = malloc(sizeof(int) * MAX_CAAM_DESCSIZE);
> +	desc = malloc_cache_aligned(sizeof(int) * MAX_CAAM_DESCSIZE);
>  	if (!desc) {
>  		debug("Not enough memory for descriptor allocation\n");
> -		return -1;
> +		return -ENOMEM;
>  	}
> 
> -	inline_cnstr_jobdesc_blob_decap(desc, key_mod, src, dst, len);
> +	aligned_src = malloc_cache_aligned(BLOB_SIZE(len));
> +	aligned_dst = malloc_cache_aligned(len);
 
Please don't use malloc here as these blob_encap and blob_decap commands are used to blobify or deblobify images of maximum sizes upto 32 MB.

But u-boot malloc pool is of size:

/* Size of malloc() pool */
#define CONFIG_SYS_MALLOC_LEN           (CONFIG_ENV_SIZE + 2048 * 1024)

So please remove malloc from this patch for source and destination images as it will fail for larger images.

> +	if (!aligned_src || !aligned_dst) {
> +		debug("Not enough memory for blob allocations\n");
> +		return -ENOMEM;
> +	}
> +
> +	memcpy(aligned_key_mod, key_mod, 16);
> +	size = ALIGN(16, ARCH_DMA_MINALIGN);
> +	flush_dcache_range((unsigned long)aligned_key_mod,
> +			   (unsigned long)aligned_key_mod + size);
> +
> +	memcpy(aligned_src, src, BLOB_SIZE(len));
> +	size = ALIGN(BLOB_SIZE(len), ARCH_DMA_MINALIGN);
> +	flush_dcache_range((unsigned long)aligned_src,
> +			   (unsigned long)aligned_src + size);
> +
> +	inline_cnstr_jobdesc_blob_decap(desc, aligned_key_mod,
> aligned_src,
> +					aligned_dst, len);
> 
>  	debug("Descriptor dump:\n");
>  	for (i = 0; i < 14; i++)
>  		debug("Word[%d]: %08x\n", i, *(desc + i));
> +
> +	size = ALIGN(sizeof(int) * MAX_CAAM_DESCSIZE,
> ARCH_DMA_MINALIGN);
> +	flush_dcache_range((unsigned long)desc,
> +			   (unsigned long)desc + size);
> +
>  	ret = run_descriptor_jr(desc);
> 
> -	if (ret)
> -		printf("Error in Decapsulation %d\n", ret);
> -	else
> -		printf("Decapsulation Success\n");
> +	if (ret) {
> +		printf("Error in blob decapsulation: %d\n", ret);
> +	} else {
> +		size = ALIGN(len, ARCH_DMA_MINALIGN);
> +		invalidate_dcache_range((unsigned long)aligned_dst,
> +					(unsigned long)aligned_dst + size);
> +		memcpy(dst, aligned_dst, len);
> +
> +		puts("Blob decapsulation successful.\n");
> +	}
> 
> +	free(aligned_dst);
> +	free(aligned_src);
>  	free(desc);
>  	return ret;
>  }
> 
>  int blob_encap(u8 *key_mod, u8 *src, u8 *dst, u32 len)  {
> -	int ret, i = 0;
> +	ALLOC_CACHE_ALIGN_BUFFER(u8, aligned_key_mod, 16);
> +	u8 *aligned_src, *aligned_dst;
> +	int ret, size, i = 0;
>  	u32 *desc;
> 
>  	printf("\nEncapsulating data to form blob\n");
> -	desc = malloc(sizeof(int) * MAX_CAAM_DESCSIZE);
> +	desc = malloc_cache_aligned(sizeof(int) * MAX_CAAM_DESCSIZE);
>  	if (!desc) {
>  		debug("Not enough memory for descriptor allocation\n");
> -		return -1;
> +		return -ENOMEM;
>  	}
> 
> -	inline_cnstr_jobdesc_blob_encap(desc, key_mod, src, dst, len);
> +	aligned_src = malloc_cache_aligned(len);
> +	aligned_dst = malloc_cache_aligned(BLOB_SIZE(len));
 
Same here as above. Please remove malloc from this patch.

> +	if (!aligned_src || !aligned_dst) {
> +		debug("Not enough memory for blob allocations\n");
> +		return -ENOMEM;
> +	}
> +

-Sumit


More information about the U-Boot mailing list