Skip to content

Commit

Permalink
perf: reduce copies in jodeToDer
Browse files Browse the repository at this point in the history
  • Loading branch information
omsmith committed Jun 17, 2016
1 parent 7af10be commit a844f29
Showing 1 changed file with 23 additions and 24 deletions.
47 changes: 23 additions & 24 deletions src/ecdsa-sig-formatter.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ function derToJose(signature, alg) {
return signature;
}

function reduceBuffer(buf) {
function countPadding(buf) {
var padding = 0;
for (var n = buf.length; padding < n && buf[padding] === 0;) {
++padding;
Expand All @@ -116,23 +116,9 @@ function reduceBuffer(buf) {
var needsSign = buf[padding] >= MAX_OCTET;
if (needsSign) {
--padding;

if (padding < 0) {
var old = buf;
buf = new Buffer(1 + buf.length);
buf[0] = 0;
old.copy(buf, 1);

return buf;
}
}

if (padding === 0) {
return buf;
}

buf = buf.slice(padding);
return buf;
return padding;
}

function joseToDer(signature, alg) {
Expand All @@ -144,10 +130,14 @@ function joseToDer(signature, alg) {
throw new TypeError('"' + alg + '" signatures must be "' + paramBytes * 2 + '" bytes, saw "' + signatureBytes + '"');
}

var r = reduceBuffer(signature.slice(0, paramBytes));
var s = reduceBuffer(signature.slice(paramBytes));
var r = signature.slice(0, paramBytes);
var s = signature.slice(paramBytes);
var rPadding = countPadding(r);
var sPadding = countPadding(s);
var rLength = r.length - rPadding;
var sLength = s.length - sPadding;

var rsBytes = 1 + 1 + r.length + 1 + 1 + s.length;
var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength;

var shortLength = rsBytes < MAX_OCTET;

Expand All @@ -167,12 +157,21 @@ function joseToDer(signature, alg) {
signature[offset++] = rsBytes & 0xff;
}
signature[offset++] = ENCODED_TAG_INT;
signature[offset++] = r.length;
r.copy(signature, offset);
offset += r.length;
signature[offset++] = rLength;
if (rPadding < 0) {
signature[offset++] = 0;
offset += r.copy(signature, offset);
} else {
offset += r.copy(signature, offset, rPadding);
}
signature[offset++] = ENCODED_TAG_INT;
signature[offset++] = s.length;
s.copy(signature, offset);
signature[offset++] = sLength;
if (sPadding < 0) {
signature[offset++] = 0;
s.copy(signature, offset);
} else {
s.copy(signature, offset, sPadding);
}

return signature;
}
Expand Down

0 comments on commit a844f29

Please sign in to comment.