Suppose I have two arrays :
A = a single byte, being zero. B = two bytes, both being zero.
B = A||0 (i.e. B starts with A, and differs only by appending a zero byte)
BLAKE2(A) != BLAKE2(B)
Yet, according to the scant documentation I can find, BLAKE2 pads with zero bytes.
Given that both an array with just one byte, and an array with two bytes, are well within the size of a single block, theoretically their full-block-length zero-padded equivalents are identical.
So, if it isn't padding the inputs with a length indicator, and if the finalization flag mentioned in the scant documentation is either all binary 1s or else all binary 0s as the scant documentation clearly states (thus providing no indication of which bytes in the final input block are padding), how is BLAKE2 able to make a different hash for these two inputs?
Note: It does make different hashes from these two inputs, and that's a very good thing, and I'm in the process of writing some software that relies on this property of BLAKE2, but I would feel more confident if I understood why/how this is happening. Thanks!
P.S. I tried tagging this BLAKE2 but the system wouldn't let me - apparently the tag doesn't exist yet.