Use correct type sizes to avoid overwriting unrelated data
sig_size is declared as
uint32_t, but later typecast to
which is significantly wider on 64-bit architectures.
To avoid potential issues in other places, promote sizes and lengths
ssize_t where this makes sense.
Check the hash algorithm before (possibly failing to) malloc.
malloc only accepts unsigned sizes, so failing to catch a negative size as an errorcode will result in a malloc call with an enormous value, leading to an allocation failure and a nonsensical error message.