On Wed, 24 May 2023 11:08:31 GMT, Andrew Haley <a...@openjdk.org> wrote:

>> No, it doesn't break the invariants.
>> 
>> R is the randomly-chosen 128-bit key. It is generated from an initial 
>> 128-bit-log string of random bits, then
>> `r &= 0x0ffffffc0ffffffc0ffffffc0fffffff`
>> 
>> This 128-bit-long string is split into 26-bit limbs before the intrinsic is 
>> called. The zero bits remain zero.
>> When we repack R into two 64-bit registers those zero bits are still zero.
>
> See https://loup-vaillant.fr/tutorials/poly1305-design for more explanation

Thanks for the link! 

So `r` refers to the value passed via `r_start` and it wasn't clear from the 
immediate context that `r_start` is already split into 26-bit limbs. So the 
`pack26` takes the 5 26-bit limbs and repacks them so that `R_0` has the low 
64-bit of `r`, `R_1` the high bits. Makes sense. 

`R_2` is unused and could be reclaimed. Perhaps an override for `pack26` that 
only takes two registers and discards the last 2 bits? Might help clarify the 
setup.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/14085#discussion_r1204159348

Reply via email to