
Hi Clemens, York, Fabio,
-----Original Message----- From: U-Boot [mailto:u-boot-bounces@lists.denx.de] On Behalf Of Fabio Estevam Sent: Friday, January 05, 2018 3:27 AM To: York Sun york.sun@nxp.com Cc: Breno Matheus Lima breno.lima@nxp.com; u-boot@lists.denx.de; clemens.gruber@pqgruber.com; Fabio Estevam fabio.estevam@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