124 lines
3.1 KiB
JavaScript
124 lines
3.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var ASN1 = require('../');
|
||
|
var Enc = require('@root/encoding');
|
||
|
var PEM = require('@root/pem');
|
||
|
|
||
|
// 1.2.840.10045.3.1.7
|
||
|
// prime256v1 (ANSI X9.62 named elliptic curve)
|
||
|
var OBJ_ID_EC_256 = '06 08 2A8648CE3D030107';
|
||
|
|
||
|
var jwk = {
|
||
|
crv: 'P-256',
|
||
|
d: 'LImWxqqTHbP3LHQfqscDSUzf_uNePGqf9U6ETEcO5Ho',
|
||
|
kty: 'EC',
|
||
|
x: 'vdjQ3T6VBX82LIKDzepYgRsz3HgRwp83yPuonu6vqos',
|
||
|
y: 'IUkEXtAMnppnV1A19sE2bJhUo4WPbq6EYgWxma4oGyg',
|
||
|
kid: 'MnfJYyS9W5gUjrJLdn8ePMzik8ZJz2qc-VZmKOs_oCw'
|
||
|
};
|
||
|
var d = Enc.base64ToHex(jwk.d);
|
||
|
var x = Enc.base64ToHex(jwk.x);
|
||
|
var y = Enc.base64ToHex(jwk.y);
|
||
|
|
||
|
var der = Enc.hexToBuf(
|
||
|
ASN1.Any(
|
||
|
'30', // Sequence
|
||
|
ASN1.UInt('01'), // Integer (Version 1)
|
||
|
ASN1.Any('04', d), // Octet String
|
||
|
ASN1.Any('A0', OBJ_ID_EC_256), // [0] Object ID
|
||
|
ASN1.Any(
|
||
|
'A1', // [1] Embedded EC/ASN1 public key
|
||
|
ASN1.BitStr('04' + x + y)
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
|
||
|
var pem1 = PEM.packBlock({
|
||
|
type: 'EC PRIVATE KEY',
|
||
|
bytes: der
|
||
|
});
|
||
|
|
||
|
var expected = [
|
||
|
'-----BEGIN EC PRIVATE KEY-----',
|
||
|
'MHcCAQEEICyJlsaqkx2z9yx0H6rHA0lM3/7jXjxqn/VOhExHDuR6oAoGCCqGSM49',
|
||
|
'AwEHoUQDQgAEvdjQ3T6VBX82LIKDzepYgRsz3HgRwp83yPuonu6vqoshSQRe0Aye',
|
||
|
'mmdXUDX2wTZsmFSjhY9uroRiBbGZrigbKA==',
|
||
|
'-----END EC PRIVATE KEY-----'
|
||
|
].join('\n');
|
||
|
|
||
|
if (pem1 !== expected) {
|
||
|
throw new Error('Did not correctly Cascade pack EC P-256 JWK to DER');
|
||
|
} else {
|
||
|
console.info('PASS: packed cascaded ASN1');
|
||
|
}
|
||
|
|
||
|
// Mix and match hex ints, hex strings, and byte arrays
|
||
|
var asn1Arr = [
|
||
|
'30', // Sequence
|
||
|
[
|
||
|
[0x02, '01'], // Integer (Version 1)
|
||
|
[0x04, Buffer.from(d, 'hex')], // Octet String
|
||
|
['a0', OBJ_ID_EC_256], // [0] Object ID
|
||
|
[
|
||
|
0xa1, // [1] Embedded EC/ASN1 public key
|
||
|
ASN1.BitStr('04' + x + y)
|
||
|
]
|
||
|
]
|
||
|
];
|
||
|
|
||
|
var der2 = ASN1.pack(asn1Arr);
|
||
|
var pem2 = PEM.packBlock({
|
||
|
type: 'EC PRIVATE KEY',
|
||
|
bytes: der2
|
||
|
});
|
||
|
|
||
|
if (pem2 !== expected) {
|
||
|
console.log(pem2);
|
||
|
console.log(expected);
|
||
|
throw new Error('Did not correctly Array pack EC P-256 JWK to DER');
|
||
|
} else {
|
||
|
console.info('PASS: packed array-style ASN1');
|
||
|
}
|
||
|
|
||
|
var block = PEM.parseBlock(expected);
|
||
|
var arr1 = ASN1.parse({ der: block.bytes });
|
||
|
//console.log(JSON.stringify(arr1));
|
||
|
var arr2 = ASN1.parse({ der: block.bytes, verbose: false, json: false });
|
||
|
var obj3 = ASN1.parse({ der: block.bytes, verbose: true, json: true });
|
||
|
//console.log(obj3);
|
||
|
|
||
|
function eq(b1, b2) {
|
||
|
if (b1.byteLength !== b2.byteLength) {
|
||
|
return false;
|
||
|
}
|
||
|
return b1.every(function(b, i) {
|
||
|
return b === b2[i];
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (!eq(block.bytes, ASN1.pack(arr1))) {
|
||
|
throw new Error('packing hex array resulted in different bytes');
|
||
|
} else {
|
||
|
console.log('PASS: packs parsed (hex) array');
|
||
|
}
|
||
|
|
||
|
if (!eq(block.bytes, ASN1.pack(arr2))) {
|
||
|
throw new Error('packing array with bytes resulted in different bytes');
|
||
|
} else {
|
||
|
console.log('PASS: packs parsed array (with bytes)');
|
||
|
}
|
||
|
|
||
|
if (!eq(block.bytes, ASN1.pack(obj3))) {
|
||
|
console.log(block.bytes.toString('hex'));
|
||
|
console.log(ASN1.pack(obj3));
|
||
|
throw new Error('packing verbose object resulted in different bytes');
|
||
|
} else {
|
||
|
console.log('PASS: packs parsed verbose object');
|
||
|
}
|
||
|
|
||
|
if (block.bytes.toString('hex') !== ASN1.pack(obj3, { json: true })) {
|
||
|
throw new Error('packing to hex resulted in different bytes');
|
||
|
} else {
|
||
|
console.log('PASS: packs as hex when json: true');
|
||
|
}
|