Skip to content

Reject zero digest_size in blake2b generichash bindings - #968

Open
00200200 wants to merge 1 commit into
pyca:mainfrom
00200200:fix-generichash-zero-digest-size
Open

00200200 wants to merge 1 commit into
pyca:mainfrom
00200200:fix-generichash-zero-digest-size

Conversation

@00200200

Copy link
Copy Markdown

Summary

generichash_blake2b_final() aborts the interpreter with SIGABRT when called on a Blake2State whose digest_size is 0. The same invalid size also causes a poor failure mode through generichash_blake2b_init() / generichash_blake2b_salt_personal() (RuntimeError or abort) because _checkparams() only enforced an upper bound.

libsodium's blake2b_final() calls sodium_misuse() when outlen is 0 (!outlen || outlen > BLAKE2B_OUTBYTES). This is the zero-length counterpart of #964 (oversized digest); #965 covers the upper bound.

Fixes #967.

Fix

  • Reject digest_size < 1 in _checkparams() so init/one-shot paths raise ValueError.
  • Reject state.digest_size < 1 in generichash_blake2b_final() so a directly constructed Blake2State(0) raises ValueError instead of aborting.

Sizes 1..BYTES_MAX (including values below BYTES_MIN) remain accepted, matching current libsodium C behavior.

Testing

  • Added regression tests in tests/test_generichash.py:
    • test_generichash_blake2b_final_rejects_zero_directly_constructed_state
    • test_generichash_blake2b_init_rejects_zero_digest_size
    • test_generichash_blake2b_salt_personal_rejects_zero_digest_size
  • On main, generichash_blake2b_final(Blake2State(0)) exits with SIGABRT; with this change it raises ValueError: Digest_size less than 1.
  • Ran: PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest tests/test_generichash.py::test_generichash_blake2b_final_rejects_zero_directly_constructed_state tests/test_generichash.py::test_generichash_blake2b_init_rejects_zero_digest_size tests/test_generichash.py::test_generichash_blake2b_salt_personal_rejects_zero_digest_size → passed.

Prevent SIGABRT from libsodium sodium_misuse when digest_size is 0 by
validating in _checkparams and generichash_blake2b_final.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

generichash_blake2b_final() aborts for digest size 0

1 participant