[EXT] [PATCH] crypto: fsl - Fix RNG generation for lengths greater than 16 bytes

Paweł Kochanowski pkochanowski at sii.pl
Fri Apr 11 17:11:18 CEST 2025


Hi Horia,

> From: Horia Geanta <horia.geanta at nxp.com>
> Sent: Wednesday, April 9, 2025 6:47 PM
> 
> On 4/9/2025 9:19 AM, Gaurav Jain wrote:
> > Hi Pawel
> >
> >> From: Paweł Kochanowski <pkochanowski at sii.pl>
> >>
> >> Hi Gaurav,
> >>
> >> What we see is that the jr_enqueue() called by run_descriptor_jr()
> >> swaps the endianness of the descriptor in place (by modifying the
> >> data pointed by
> >> desc_add):
> >>
> >>         /* The descriptor must be submitted to SEC block as per endianness
> >>          * of the SEC Block.
> >>          * So, if the endianness of Core and SEC block is different, each word
> >>          * of the descriptor will be byte-swapped.
> >>          */
> >>         for (i = 0; i < length; i++) {
> >>                 desc_word = desc_addr[i];
> >>                 sec_out32((uint32_t *)&desc_addr[i], desc_word);
> >>         }
> >>
> >> So the sequence looks like this:
> >> 1. caam_rng_probe sets correct descriptor in ` caam_rng_priv *priv` 2.
> >> caam_rng_read is called with 32B 3.
> >> caam_rng_read_one->run_descriptor_jr() is called to generate 16B with
> >> `priv->desc` containing valid descriptor 4. The descriptor is swapped
> >> in jr_enqueue() before passing it to job ring
> >
> > I see you are right. In Linux, caam endianness is handled at the time of
> creating the descriptor.
> > But In Uboot, caam endianness is not handled at the time of descriptor
> creation.
> >
> IMO the U-Boot approach is broken.
> The handling of endianness must be done at creation time, only then we know
> how to interpret the data and perform adequate byteswaps.
> U-Boot makes the assumption that everything should be 4-byte swapped, but
> there are cases when the swap has to be done 8-byte wide (for example
> address pointers or 8-byte immediate data).
> 

I think you are right, although it might not be strictly necessary in U-boot as there seems to be no case where the 8-byte long data are used.
As I see the append_ptr() is already prepared for that as the `struct ptr_addr_t` definition is different based on CAAM endianness (so words are swapped).
The other place that could potentially cause a problem is append_u64() but I can not find anyplace that it is used in and I would propose to remove it.
Do you see other places that I missed?

I also crosschecked with TF-A repository and it is done in very similar way there (per word swap on usage and not on creation).

BR,
Pawel.

> > 5. The loop in
> >> caam_rng_read is called second time, this time the `priv->desc`
> >> contain swapped data.
> >>
> >> Interesting thing is that the job still succeeds and that some data
> >> are present in the buffers, but maybe swapped descriptor can also be a
> valid one?
> > I agree that the descriptor should be reinitialized for each RNG job.
> I would advise against this, considering what I said above.
> Handling endianness should be done only once.
> 
> Regards,
> Horia



More information about the U-Boot mailing list