Skip to content

Instantly share code, notes, and snippets.

@Palmr
Created July 24, 2019 16:00
Show Gist options
  • Save Palmr/b1270682e3d7021e9f3ea5535aa36a66 to your computer and use it in GitHub Desktop.
Save Palmr/b1270682e3d7021e9f3ea5535aa36a66 to your computer and use it in GitHub Desktop.
function derEncodeECDSASignatureToUinit8Array(signatureUint8Array) {
let out_sigder = new ArrayBuffer(72);
let out_sigder_DV = new DataView(out_sigder);
let out_sigder_BA = new Uint8Array(out_sigder);
// Need to caress into dumb der format ..
let i;
let lead_s = 0; // leading zeros
let lead_r = 0;
for (i = 0; i < 32; i++)
if (signatureUint8Array[i] === 0) lead_r++;
else break;
for (i = 0; i < 32; i++)
if (signatureUint8Array[i + 32] === 0) lead_s++;
else break;
let pad_s = ((signatureUint8Array[32 + lead_s] & 0x80) === 0x80) ? 1 : 0;
let pad_r = ((signatureUint8Array[0 + lead_r] & 0x80) === 0x80) ? 1 : 0;
out_sigder_DV.setUint8(0, 0x30);
out_sigder_DV.setUint8(1, 0x44 + pad_s + pad_r - lead_s - lead_r);
// R ingredient
out_sigder_DV.setUint8(2, 0x02);
out_sigder_DV.setUint8(3 + pad_r, 0);
out_sigder_DV.setUint8(3, 0x20 + pad_r - lead_r);
let startR = lead_r;
let numberOfBytesToCopyR = 32 - lead_r;
let endR = startR + numberOfBytesToCopyR;
out_sigder_BA.set(signatureUint8Array.slice(startR, endR), 4 + pad_r);
// S ingredient
out_sigder_DV.setUint8(4 + 32 + pad_r - lead_r, 0x02);
out_sigder_DV.setUint8(5 + 32 + pad_r + pad_s - lead_r, 0);
out_sigder_DV.setUint8(5 + 32 + pad_r - lead_r, 0x20 + pad_s - lead_s);
let startS = 32 + lead_s;
let numberOfBytesToCopyS = 32 - lead_s;
let endS = startS + numberOfBytesToCopyS;
out_sigder_BA.set(signatureUint8Array.slice(startS, endS), 6 + 32 + pad_r + pad_s - lead_r);
return out_sigder_BA.slice(0, 0x46 + pad_s + pad_r - lead_r - lead_s);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment