ecdsa-sig-formatter
Advanced tools
Comparing version 1.0.1 to 1.0.2
{ | ||
"name": "ecdsa-sig-formatter", | ||
"version": "1.0.1", | ||
"version": "1.0.2", | ||
"description": "Translate ECDSA signatures between ASN.1/DER and JOSE-style concatenation", | ||
@@ -34,2 +34,3 @@ "main": "src/ecdsa-sig-formatter.js", | ||
"devDependencies": { | ||
"bench": "^0.3.5", | ||
"chai": "^3.0.0", | ||
@@ -36,0 +37,0 @@ "coveralls": "^2.11.2", |
'use strict'; | ||
var asn1 = require('asn1.js'), | ||
BN = asn1.bignum, | ||
base64Url = require('base64-url').escape; | ||
@@ -14,2 +13,5 @@ | ||
var seq = 0x10, | ||
int = 0x02; | ||
function getParamSize (keySize) { | ||
@@ -35,7 +37,2 @@ var result = ((keySize / 8) | 0) + (keySize % 8 === 0 ? 0 : 1); | ||
function bufToBignum (buf) { | ||
var bn = new BN(buf, 10, 'be').iabs(); | ||
return bn; | ||
} | ||
function bignumToBuf (bn, numBytes) { | ||
@@ -72,2 +69,30 @@ var buf = new Buffer(bn.toString('hex', numBytes), 'hex'); | ||
function reduceBuffer (buf) { | ||
var padding = 0; | ||
for (var n = buf.length; padding < n && buf[padding] === 0;) { | ||
++padding; | ||
} | ||
var needsSign = buf[padding] >= 0x80; | ||
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; | ||
} | ||
function joseToDer(signature, alg) { | ||
@@ -82,12 +107,27 @@ signature = signatureAsBuffer(signature); | ||
var r = signature.slice(0, paramBytes); | ||
r = bufToBignum(r); | ||
var s = signature.slice(paramBytes); | ||
s = bufToBignum(s); | ||
var r = reduceBuffer(signature.slice(0, paramBytes)); | ||
var s = reduceBuffer(signature.slice(paramBytes)); | ||
signature = ECDSASigValue.encode({ | ||
r: r, | ||
s: s | ||
}, 'der'); | ||
var rsBytes = 1 + 1 + r.length + 1 + 1 + s.length; | ||
var oneByteLength = rsBytes < 0x80; | ||
signature = new Buffer((oneByteLength ? 2 : 3) + rsBytes); | ||
var offset = 0; | ||
signature[offset++] = (seq | 0x20) | 0 << 6; | ||
if (oneByteLength) { | ||
signature[offset++] = rsBytes; | ||
} else { | ||
signature[offset++] = 0x80 | 1; | ||
signature[offset++] = rsBytes & 0xff; | ||
} | ||
signature[offset++] = int | (0 << 6); | ||
signature[offset++] = r.length; | ||
r.copy(signature, offset); | ||
offset += r.length; | ||
signature[offset++] = int | (0 << 6); | ||
signature[offset++] = s.length; | ||
s.copy(signature, offset); | ||
return signature; | ||
@@ -94,0 +134,0 @@ } |
18808
6
139
5