Try it Live
Run Signature examples in the interactive playground
Validation
Signature validation and canonicalization functions.isCanonical
Check if ECDSA signature has canonical s-value.Signature
Parameters
signature- BrandedSignature to check
Returns
true- If signature is canonical (s ≤ n/2) or Ed25519false- If signature is non-canonical (s > n/2)
Example
Canonicality Rules
ECDSA (secp256k1, P-256)
A signature is canonical ifs ≤ n/2, where n is the curve order.
secp256k1:
Why Canonicality Matters
ECDSA signatures have inherent malleability: both(r, s) and (r, -s mod n) are valid for the same message and public key.
Security Issues:
- Transaction malleability attacks
- Signature duplication
- Replay attacks
- Bitcoin BIP-62: Require canonical form
- Ethereum: Enforce low s-value
- Most modern protocols: Mandate canonicality
Example: Non-Canonical Signature
normalize
Normalize ECDSA signature to canonical form.Signature
Parameters
signature- BrandedSignature to normalize
Returns
BrandedSignature with canonical s-value (s ≤ n/2) If already canonical: Returns input unchanged If Ed25519: Returns input unchanged (always canonical) If non-canonical: Returns new signature withs = n - s and flipped v
Example
Normalization Process
For non-canonical signature (s > n/2):- Calculate
s_normalized = n - s - Flip recovery ID:
v_new = (v === 27) ? 28 : 27 - Return new signature with
(r, s_normalized, v_new)
Algorithm Details
Recovery ID Flip
When normalizing, the recovery ID must flip:Use Cases
Ethereum Transaction Signing
Bitcoin Transaction Validation
Signature Verification
API Validation
Validation Patterns
Pre-Normalization Check
Enforce Canonical
Reject Non-Canonical
Security Considerations
Transaction Malleability
Signature Uniqueness
Replay Attack Prevention
Performance
Canonicality Check
Normalization
Optimization
Testing
See Also
- Utilities - Helper functions
- Constructors - Creating signatures
- Usage Patterns - Common patterns
- BIP-62: Dealing with Malleability

