WIP uasn1
This commit is contained in:
parent
6161eff921
commit
17a06bef18
@ -6,6 +6,55 @@ var crypto = require('crypto');
|
|||||||
// prime256v1 (ANSI X9.62 named elliptic curve)
|
// prime256v1 (ANSI X9.62 named elliptic curve)
|
||||||
var OBJ_ID_EC = '06 08 2A8648CE3D030107'.replace(/\s+/g, '').toLowerCase();
|
var OBJ_ID_EC = '06 08 2A8648CE3D030107'.replace(/\s+/g, '').toLowerCase();
|
||||||
|
|
||||||
|
function ANY() {
|
||||||
|
var args = Array.prototype.slice.call(arguments);
|
||||||
|
var typ = args.shift();
|
||||||
|
var str = args.join('').replace(/\s+/g, '');
|
||||||
|
console.log('typ:', typ, 'str:', str);
|
||||||
|
var len = (str.length/2);
|
||||||
|
var len2 = len;
|
||||||
|
var lenlen = 1;
|
||||||
|
var hex = typ;
|
||||||
|
// high-order bit means multiple bytes
|
||||||
|
if (len2 !== Math.round(len2)) {
|
||||||
|
throw new Error("invalid hex");
|
||||||
|
}
|
||||||
|
console.log(len);
|
||||||
|
if (0x80 & len) {
|
||||||
|
while (len2 > 127) { lenlen += 1; len2 = len2 >> 8; }
|
||||||
|
hex += numToHex(0x80 + lenlen);
|
||||||
|
}
|
||||||
|
return hex + numToHex(len) + str;
|
||||||
|
}
|
||||||
|
|
||||||
|
function UINT() {
|
||||||
|
var str = Array.prototype.slice.call(arguments).join('');
|
||||||
|
var first = parseInt(str.slice(0, 2), 16);
|
||||||
|
// high-order bit means signed, negative
|
||||||
|
// we want positive, so we pad with a leading '00'
|
||||||
|
if (0x80 & first) { str = '00' + str; }
|
||||||
|
return ANY('02', str);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BITSTR() {
|
||||||
|
var str = Array.prototype.slice.call(arguments).join('');
|
||||||
|
var first = parseInt(str.slice(0, 2), 16);
|
||||||
|
// '00' is a mask of how many bits of the next byte to ignore
|
||||||
|
return ANY('03', '00' + str);
|
||||||
|
}
|
||||||
|
function SEQ() {
|
||||||
|
return ANY('30', Array.prototype.slice.call(arguments).join(''));
|
||||||
|
}
|
||||||
|
function SET() {
|
||||||
|
return ANY('31', Array.prototype.slice.call(arguments).join(''));
|
||||||
|
}
|
||||||
|
function OBJID() {
|
||||||
|
return ANY('06', Array.prototype.slice.call(arguments).join(''));
|
||||||
|
}
|
||||||
|
function NULL() {
|
||||||
|
return '0500';
|
||||||
|
}
|
||||||
|
|
||||||
function fromBase64(b64) {
|
function fromBase64(b64) {
|
||||||
var buf;
|
var buf;
|
||||||
var ab;
|
var ab;
|
||||||
@ -144,16 +193,22 @@ function toBase64(der) {
|
|||||||
// (those segments will be content, signature header, and signature)
|
// (those segments will be content, signature header, and signature)
|
||||||
var csrHead = '30 82 {0seq0len}'.replace(/\s+/g, '');
|
var csrHead = '30 82 {0seq0len}'.replace(/\s+/g, '');
|
||||||
// The tail specifies the ES256 signature header (and is followed by the signature
|
// The tail specifies the ES256 signature header (and is followed by the signature
|
||||||
var csrEcFoot =
|
|
||||||
( '30 0A'
|
function csrEcSig(r, s) {
|
||||||
|
return [
|
||||||
|
SEQ(
|
||||||
// 1.2.840.10045.4.3.2 ecdsaWithSHA256
|
// 1.2.840.10045.4.3.2 ecdsaWithSHA256
|
||||||
// (ANSI X9.62 ECDSA algorithm with SHA256)
|
// (ANSI X9.62 ECDSA algorithm with SHA256)
|
||||||
+ '06 08 2A 86 48 CE 3D 04 03 02'
|
OBJID('2A 86 48 CE 3D 04 03 02')
|
||||||
+ '03 {len} 00' // bit stream (why??)
|
)
|
||||||
+ '30 {rslen}' // sequence
|
, BITSTR(
|
||||||
+ '02 {rlen} {r}' // integer r
|
SEQ(
|
||||||
+ '02 {slen} {s}' // integer s
|
UINT(toHex(r))
|
||||||
).replace(/\s+/g, '');
|
, UINT(toHex(s))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
].join('');
|
||||||
|
}
|
||||||
var csrDomains = '82 {dlen} {domain.tld}'; // 2+n bytes (type 82?)
|
var csrDomains = '82 {dlen} {domain.tld}'; // 2+n bytes (type 82?)
|
||||||
|
|
||||||
function strToHex(str) {
|
function strToHex(str) {
|
||||||
@ -329,7 +384,8 @@ function createEcCsr(domains, keypem, ecpub) {
|
|||||||
if (0x80 & new Uint8Array(sig.r)[0]) { rc = '00'; rLen += 1; }
|
if (0x80 & new Uint8Array(sig.r)[0]) { rc = '00'; rLen += 1; }
|
||||||
if (0x80 & new Uint8Array(sig.s)[0]) { sc = '00'; sLen += 1; }
|
if (0x80 & new Uint8Array(sig.s)[0]) { sc = '00'; sLen += 1; }
|
||||||
|
|
||||||
var csrSig = csrEcFoot
|
var csrSig = csrEcSig(sig.r, sig.s);
|
||||||
|
/*
|
||||||
.replace(/{len}/, numToHex(1 + 2 + 2 + 2 + rLen + sLen))
|
.replace(/{len}/, numToHex(1 + 2 + 2 + 2 + rLen + sLen))
|
||||||
.replace(/{rslen}/, numToHex(2 + 2 + rLen + sLen))
|
.replace(/{rslen}/, numToHex(2 + 2 + rLen + sLen))
|
||||||
.replace(/{rlen}/, numToHex(rLen))
|
.replace(/{rlen}/, numToHex(rLen))
|
||||||
@ -337,6 +393,7 @@ function createEcCsr(domains, keypem, ecpub) {
|
|||||||
.replace(/{slen}/, numToHex(sLen))
|
.replace(/{slen}/, numToHex(sLen))
|
||||||
.replace(/{s}/, sc + toHex(sig.s))
|
.replace(/{s}/, sc + toHex(sig.s))
|
||||||
;
|
;
|
||||||
|
*/
|
||||||
|
|
||||||
// Note: If we supported P-521 a number of the lengths would change
|
// Note: If we supported P-521 a number of the lengths would change
|
||||||
// by one byte and that would be... annoying to update
|
// by one byte and that would be... annoying to update
|
||||||
|
Loading…
x
Reference in New Issue
Block a user