BLAKE2/libb2

why does blake2*_final need outlen?

capr opened this issue · 3 comments

capr commented

blake2*_final() asks for outlen only to check if it's the same as the internal one:

int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen )
{
  if(S->outlen != outlen) return -1;

why is that?

Mostly to prevent accidents. For example, you decide to use the full 512-bit BLAKE2b instead of the shorter 256-bit one, but forget to update buffer sizes somewhere.

On second thought, it would make more sense to treat this outlen parameter as a buffer size, and verify that S->outlen <= outlen.

capr commented

I would personally prefer to have this parameter optional i.e. if (!outlen) outlen = S->outlen because I don't have safety issues like that in Lua and forcing this on the API makes little sense in that context.

Otherwise I have to wrap S just to keep the outlen passed to init() so I can pass it to back to final(), or treat S as non-opaque and get it from there.

capr commented

Actually it doesn't matter, the state is not opaque anyway I can get outlen from there.

Sorry for the noise :)