UNPKG

nodulator

Version:

Complete NodeJS Framework for Restfull APIs

161 lines (135 loc) 4.73 kB
var assert = require('assert'); var asn1 = require('..'); var Buffer = require('buffer').Buffer; describe('asn1.js DER decoder', function() { it('should propagate implicit tag', function() { var B = asn1.define('B', function() { this.seq().obj( this.key('b').octstr() ); }); var A = asn1.define('Bug', function() { this.seq().obj( this.key('a').implicit(0).use(B) ); }); var out = A.decode(new Buffer('300720050403313233', 'hex'), 'der'); assert.equal(out.a.b.toString(), '123'); }); it('should decode optional tag to undefined key', function() { var A = asn1.define('A', function() { this.seq().obj( this.key('key').bool(), this.optional().key('opt').bool() ); }); var out = A.decode(new Buffer('30030101ff', 'hex'), 'der'); assert.deepEqual(out, { 'key': true }); }); it('should decode optional tag to default value', function() { var A = asn1.define('A', function() { this.seq().obj( this.key('key').bool(), this.optional().key('opt').octstr().def('default') ); }); var out = A.decode(new Buffer('30030101ff', 'hex'), 'der'); assert.deepEqual(out, { 'key': true, 'opt': 'default' }); }); function test(name, model, inputHex, expected) { it(name, function() { var M = asn1.define('Model', model); var decoded = M.decode(new Buffer(inputHex,'hex'), 'der'); assert.deepEqual(decoded, expected); }); } test('should decode choice', function() { this.choice({ apple: this.bool(), }); }, '0101ff', { 'type': 'apple', 'value': true }); it('should decode optional and use', function() { var B = asn1.define('B', function() { this.int(); }); var A = asn1.define('A', function() { this.optional().use(B); }); var out = A.decode(new Buffer('020101', 'hex'), 'der'); assert.equal(out.toString(10), '1'); }); test('should decode indefinite length', function() { this.seq().obj( this.key('key').bool() ); }, '30800101ff0000', { 'key': true }); test('should decode bmpstr', function() { this.bmpstr(); }, '1e26004300650072007400690066006900630061' + '0074006500540065006d0070006c006100740065', 'CertificateTemplate'); test('should decode bmpstr with cyrillic chars', function() { this.bmpstr(); }, '1e0c041f04400438043204350442', 'Привет'); test('should properly decode objid with dots', function() { this.objid({ '1.2.398.3.10.1.1.1.2.2': 'yes' }); }, '060a2a830e030a0101010202', 'yes'); it('should decode encapsulated models', function() { var B = asn1.define('B', function() { this.seq().obj( this.key('nested').int() ); }); var A = asn1.define('A', function() { this.octstr().contains(B); }); var out = A.decode(new Buffer('04053003020105', 'hex'), 'der'); assert.equal(out.nested.toString(10), '5'); }); test('should decode IA5 string', function() { this.ia5str(); }, '160C646F6720616E6420626F6E65', 'dog and bone'); test('should decode printable string', function() { this.printstr(); }, '1310427261686D7320616E64204C69737A74', 'Brahms and Liszt'); test('should decode T61 string', function() { this.t61str(); }, '140C4F6C69766572205477697374', 'Oliver Twist'); test('should decode ISO646 string', function() { this.iso646str(); }, '1A0B7365707469632074616E6B', 'septic tank'); it('should decode optional seqof', function() { var B = asn1.define('B', function() { this.seq().obj( this.key('num').int() ); }); var A = asn1.define('A', function() { this.seq().obj( this.key('test1').seqof(B), this.key('test2').optional().seqof(B) ); }); var out = A.decode(new Buffer( '3018300A30030201013003020102300A30030201033003020104', 'hex'), 'der'); assert.equal(out.test1[0].num.toString(10), 1); assert.equal(out.test1[1].num.toString(10), 2); assert.equal(out.test2[0].num.toString(10), 3); assert.equal(out.test2[1].num.toString(10), 4); out = A.decode(new Buffer('300C300A30030201013003020102', 'hex'), 'der'); assert.equal(out.test1[0].num.toString(10), 1); assert.equal(out.test1[1].num.toString(10), 2); assert.equal(out.test2, undefined); }); it('should not require decoder param', function() { var M = asn1.define('Model', function() { this.choice({ apple: this.bool(), }); }); // Note no decoder specified, defaults to 'der' var decoded = M.decode(new Buffer('0101ff', 'hex')); assert.deepEqual(decoded, { 'type': 'apple', 'value': true }); }); });