Skip to content

Accept ECDSA signatures shorter than 71 bytes#69

Open
johnzilla wants to merge 1 commit into
rust-bitcoin:masterfrom
johnzilla:fix-ecdsa-signature-length
Open

Accept ECDSA signatures shorter than 71 bytes#69
johnzilla wants to merge 1 commit into
rust-bitcoin:masterfrom
johnzilla:fix-ecdsa-signature-length

Conversation

@johnzilla

Copy link
Copy Markdown

verify_full_p2wpkh gated the encoded ECDSA signature length on 71 | 72 and rejected everything else with Error::SignatureLength. ECDSA signatures aren't fixed length — a low-S DER signature is shorter than 71 bytes when r or s serialize to fewer than 32 bytes (~1% of signatures) — so valid signatures that sign_simple itself produces were rejected by verify_simple.

This peels the trailing sighash flag off and lets from_der validate the remainder instead of gating on length, with an empty-input guard so the slice index can't panic. The taproot path is unchanged.

Adds a P2WPKH regression vector (a 70-byte signature); it fails on master and passes with this change. cargo fmt --check, cargo clippy --all --all-targets -- --deny warnings, and cargo test --all are green.

Fixes #68.

ECDSA signatures are not fixed length: a low-S DER signature is shorter
than the usual 71 or 72 bytes when r or s serialize to fewer than 32
bytes (roughly 1% of signatures). verify_full_p2wpkh matched the encoded
signature length against `71 | 72` and rejected everything else with
Error::SignatureLength, so a valid signature that sign_simple itself can
produce was rejected by verify_simple.

Split the trailing sighash flag off and let from_der validate the
remainder rather than gating on length. The empty case is guarded so the
slice index cannot panic.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

verify_simple rejects valid ECDSA signatures shorter than 71 bytes

1 participant