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); }); });
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 19553 | swellard | Move and rename clients | ||
//guest/perforce_software/helix-web-services/main/source/clients/2016.1.0/javascript/node_modules/asn1.js/test/der-decode-test.js | |||||
#1 | 18810 | tjuricek |
First-pass at JavaScript client SDK. JavaScript requires Node with Gulp to "browserfy" the library. It's the easiest way I found to use the swagger-js project; bundle up a wrapping method. There is no JavaScript reference guide. The swagger-js doesn't really document what they do very well, actually. Overall I'm not particularly impressed by swagger-js, it was hard to even figure out what the right method syntax was. We may want to invest time in doing it better. This required setting CORS response headers, which are currently defaulted to a fairly insecure setting. |