On Fri, Aug 10, 2018 at 08:20:51AM +0200, Stephan Mueller wrote:
> > while (nbytes >= CHACHA20_BLOCK_SIZE) {
> > int adjust = (unsigned long)buf & (sizeof(tmp[0]) - 1);
> >
> > extract_crng(buf);
>
> Why this line?
>
> > buf += CHACHA20_BLOCK_SIZE;
Sorry, the above two lines should be removed, of course.
> > if (likely(adjust == 0)) {
> > extract_crng(buf);
> > buf += CHACHA20_BLOCK_SIZE;
> > nbytes -= CHACHA20_BLOCK_SIZE;
> > } else {
> > extract_crng(tmp);
> > memcpy(buf, tmp, CHACHA20_BLOCK_SIZE - adjust);
> > buf += CHACHA20_BLOCK_SIZE - adjust;
> > nbytes -= CHACHA20_BLOCK_SIZE - adjust;
>
> Sure, why not.
>
> > }
> >
> > }
> >
> > This may be a hyper optimization, though --- it's not clear how often,
> > say the kernel would be calling get_random_bytes with size >> 64 at
> > all, never mind with an unaligned buffer.
>
> I agree it is not likely that we have unaligned buffers. But in case we have,
> we have the potential to overwrite memory that does not belong to us with
> unknown consequences.
Sure, faire enough. The potential wouldn't be overwriting memory,
though. It would be a kernel panic when the CPU trapped a non-aligned
pointer dereference.
- Ted