diff --git a/ChangeLog b/ChangeLog index bcea834..ce3bebf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2017-06-22 Peter van Dijk , Kees Monshouwer + + * Fix leading zero(s) padding in ECDSA sig conversion + 2017-01-06 David Blacka * Released version 0.13 diff --git a/src/com/verisignlabs/dnssec/security/SignUtils.java b/src/com/verisignlabs/dnssec/security/SignUtils.java index 9fbb1e5..35be19d 100644 --- a/src/com/verisignlabs/dnssec/security/SignUtils.java +++ b/src/com/verisignlabs/dnssec/security/SignUtils.java @@ -526,10 +526,19 @@ public class SignUtils s_src_pos = (byte) (r_src_pos + r_src_len); s_pad = 0; len = (byte) (6 + r_src_len + s_src_len); - if (signature[r_src_pos] < 0) { - r_pad = 1; len++; + // leading zeroes are forbidden + while (signature[r_src_pos] == 0 && r_src_len > 0) { + r_src_pos++; r_src_len--; len--; } - if (signature[s_src_pos] < 0) { + while (signature[s_src_pos] == 0 && s_src_len > 0) { + s_src_pos++; s_src_len--; len--; + } + + // except when they are mandatory + if (r_src_len > 0 && signature[r_src_pos] < 0) { + r_pad = 1; len++; + } + if (s_src_len > 0 && signature[s_src_pos] < 0) { s_pad = 1; len++; } byte[] sig = new byte[len];