Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80620 views
1
var assert = require('assert');
2
var asn1 = require('..');
3
var bn = asn1.bignum;
4
var fixtures = require('./fixtures');
5
var jsonEqual = fixtures.jsonEqual;
6
7
var Buffer = require('buffer').Buffer;
8
9
describe('asn1.js models', function() {
10
describe('plain use', function() {
11
it('should encode submodel', function() {
12
var SubModel = asn1.define('SubModel', function() {
13
this.seq().obj(
14
this.key('b').octstr()
15
);
16
});
17
var Model = asn1.define('Model', function() {
18
this.seq().obj(
19
this.key('a').int(),
20
this.key('sub').use(SubModel)
21
);
22
});
23
24
var data = {a: new bn(1), sub: {b: new Buffer("XXX")}};
25
var wire = Model.encode(data, 'der');
26
assert.equal(wire.toString('hex'), '300a02010130050403585858');
27
var back = Model.decode(wire, 'der');
28
jsonEqual(back, data);
29
});
30
31
it('should honour implicit tag from parent', function() {
32
var SubModel = asn1.define('SubModel', function() {
33
this.seq().obj(
34
this.key('x').octstr()
35
)
36
});
37
var Model = asn1.define('Model', function() {
38
this.seq().obj(
39
this.key('a').int(),
40
this.key('sub').use(SubModel).implicit(0)
41
);
42
});
43
44
var data = {a: new bn(1), sub: {x: new Buffer("123")}};
45
var wire = Model.encode(data, 'der');
46
assert.equal(wire.toString('hex'), '300a020101a0050403313233');
47
var back = Model.decode(wire, 'der');
48
jsonEqual(back, data);
49
});
50
51
it('should honour explicit tag from parent', function() {
52
var SubModel = asn1.define('SubModel', function() {
53
this.seq().obj(
54
this.key('x').octstr()
55
)
56
});
57
var Model = asn1.define('Model', function() {
58
this.seq().obj(
59
this.key('a').int(),
60
this.key('sub').use(SubModel).explicit(0)
61
);
62
});
63
64
var data = {a: new bn(1), sub: {x: new Buffer("123")}};
65
var wire = Model.encode(data, 'der');
66
assert.equal(wire.toString('hex'), '300c020101a00730050403313233');
67
var back = Model.decode(wire, 'der');
68
jsonEqual(back, data);
69
70
});
71
72
it('should get model with function call', function() {
73
var SubModel = asn1.define('SubModel', function() {
74
this.seq().obj(
75
this.key('x').octstr()
76
)
77
});
78
var Model = asn1.define('Model', function() {
79
this.seq().obj(
80
this.key('a').int(),
81
this.key('sub').use(function(obj) {
82
assert.equal(obj.a, 1);
83
return SubModel;
84
})
85
);
86
});
87
88
var data = {a: new bn(1), sub: {x: new Buffer("123")}};
89
var wire = Model.encode(data, 'der');
90
assert.equal(wire.toString('hex'), '300a02010130050403313233');
91
var back = Model.decode(wire, 'der');
92
jsonEqual(back, data);
93
94
});
95
96
it('should support recursive submodels', function() {
97
var PlainSubModel = asn1.define('PlainSubModel', function() {
98
this.int();
99
});
100
var RecursiveModel = asn1.define('RecursiveModel', function() {
101
this.seq().obj(
102
this.key('plain').bool(),
103
this.key('content').use(function(obj) {
104
if(obj.plain) {
105
return PlainSubModel;
106
} else {
107
return RecursiveModel;
108
}
109
})
110
);
111
});
112
113
var data = {
114
'plain': false,
115
'content': {
116
'plain': true,
117
'content': new bn(1)
118
}
119
};
120
var wire = RecursiveModel.encode(data, 'der');
121
assert.equal(wire.toString('hex'), '300b01010030060101ff020101');
122
var back = RecursiveModel.decode(wire, 'der');
123
jsonEqual(back, data);
124
});
125
126
});
127
});
128
129
130