Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81159 views
1
// Copyright 2011 Mark Cavage <[email protected]> All rights reserved.
2
3
var test = require('tap').test;
4
var sys = require('sys');
5
6
///--- Globals
7
8
var BerWriter;
9
10
var BerReader;
11
12
13
///--- Tests
14
15
test('load library', function(t) {
16
BerWriter = require('../../lib/index').BerWriter;
17
t.ok(BerWriter);
18
t.ok(new BerWriter());
19
t.end();
20
});
21
22
23
test('write byte', function(t) {
24
var writer = new BerWriter();
25
26
writer.writeByte(0xC2);
27
var ber = writer.buffer;
28
29
t.ok(ber);
30
t.equal(ber.length, 1, 'Wrong length');
31
t.equal(ber[0], 0xC2, 'value wrong');
32
33
t.end();
34
});
35
36
37
test('write 1 byte int', function(t) {
38
var writer = new BerWriter();
39
40
writer.writeInt(0x7f);
41
var ber = writer.buffer;
42
43
t.ok(ber);
44
t.equal(ber.length, 3, 'Wrong length for an int: ' + ber.length);
45
t.equal(ber[0], 0x02, 'ASN.1 tag wrong (2) -> ' + ber[0]);
46
t.equal(ber[1], 0x01, 'length wrong(1) -> ' + ber[1]);
47
t.equal(ber[2], 0x7f, 'value wrong(3) -> ' + ber[2]);
48
49
t.end();
50
});
51
52
53
test('write 2 byte int', function(t) {
54
var writer = new BerWriter();
55
56
writer.writeInt(0x7ffe);
57
var ber = writer.buffer;
58
59
t.ok(ber);
60
t.equal(ber.length, 4, 'Wrong length for an int');
61
t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
62
t.equal(ber[1], 0x02, 'length wrong');
63
t.equal(ber[2], 0x7f, 'value wrong (byte 1)');
64
t.equal(ber[3], 0xfe, 'value wrong (byte 2)');
65
66
t.end();
67
});
68
69
70
test('write 3 byte int', function(t) {
71
var writer = new BerWriter();
72
73
writer.writeInt(0x7ffffe);
74
var ber = writer.buffer;
75
76
t.ok(ber);
77
t.equal(ber.length, 5, 'Wrong length for an int');
78
t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
79
t.equal(ber[1], 0x03, 'length wrong');
80
t.equal(ber[2], 0x7f, 'value wrong (byte 1)');
81
t.equal(ber[3], 0xff, 'value wrong (byte 2)');
82
t.equal(ber[4], 0xfe, 'value wrong (byte 3)');
83
84
t.end();
85
});
86
87
88
test('write 4 byte int', function(t) {
89
var writer = new BerWriter();
90
91
writer.writeInt(0x7ffffffe);
92
var ber = writer.buffer;
93
94
t.ok(ber);
95
96
t.equal(ber.length, 6, 'Wrong length for an int');
97
t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
98
t.equal(ber[1], 0x04, 'length wrong');
99
t.equal(ber[2], 0x7f, 'value wrong (byte 1)');
100
t.equal(ber[3], 0xff, 'value wrong (byte 2)');
101
t.equal(ber[4], 0xff, 'value wrong (byte 3)');
102
t.equal(ber[5], 0xfe, 'value wrong (byte 4)');
103
104
t.end();
105
});
106
107
108
test('write boolean', function(t) {
109
var writer = new BerWriter();
110
111
writer.writeBoolean(true);
112
writer.writeBoolean(false);
113
var ber = writer.buffer;
114
115
t.ok(ber);
116
t.equal(ber.length, 6, 'Wrong length');
117
t.equal(ber[0], 0x01, 'tag wrong');
118
t.equal(ber[1], 0x01, 'length wrong');
119
t.equal(ber[2], 0xff, 'value wrong');
120
t.equal(ber[3], 0x01, 'tag wrong');
121
t.equal(ber[4], 0x01, 'length wrong');
122
t.equal(ber[5], 0x00, 'value wrong');
123
124
t.end();
125
});
126
127
128
test('write string', function(t) {
129
var writer = new BerWriter();
130
writer.writeString('hello world');
131
var ber = writer.buffer;
132
133
t.ok(ber);
134
t.equal(ber.length, 13, 'wrong length');
135
t.equal(ber[0], 0x04, 'wrong tag');
136
t.equal(ber[1], 11, 'wrong length');
137
t.equal(ber.slice(2).toString('utf8'), 'hello world', 'wrong value');
138
139
t.end();
140
});
141
142
test('write buffer', function(t) {
143
var writer = new BerWriter();
144
// write some stuff to start with
145
writer.writeString('hello world');
146
var ber = writer.buffer;
147
var buf = new Buffer([0x04, 0x0b, 0x30, 0x09, 0x02, 0x01, 0x0f, 0x01, 0x01,
148
0xff, 0x01, 0x01, 0xff]);
149
writer.writeBuffer(buf.slice(2, buf.length), 0x04);
150
ber = writer.buffer;
151
152
t.ok(ber);
153
t.equal(ber.length, 26, 'wrong length');
154
t.equal(ber[0], 0x04, 'wrong tag');
155
t.equal(ber[1], 11, 'wrong length');
156
t.equal(ber.slice(2, 13).toString('utf8'), 'hello world', 'wrong value');
157
t.equal(ber[13], buf[0], 'wrong tag');
158
t.equal(ber[14], buf[1], 'wrong length');
159
for (var i = 13, j = 0; i < ber.length && j < buf.length; i++, j++) {
160
t.equal(ber[i], buf[j], 'buffer contents not identical');
161
}
162
t.end();
163
});
164
165
test('write string array', function(t) {
166
var writer = new BerWriter();
167
writer.writeStringArray(['hello world', 'fubar!']);
168
var ber = writer.buffer;
169
170
t.ok(ber);
171
172
t.equal(ber.length, 21, 'wrong length');
173
t.equal(ber[0], 0x04, 'wrong tag');
174
t.equal(ber[1], 11, 'wrong length');
175
t.equal(ber.slice(2, 13).toString('utf8'), 'hello world', 'wrong value');
176
177
t.equal(ber[13], 0x04, 'wrong tag');
178
t.equal(ber[14], 6, 'wrong length');
179
t.equal(ber.slice(15).toString('utf8'), 'fubar!', 'wrong value');
180
181
t.end();
182
});
183
184
185
test('resize internal buffer', function(t) {
186
var writer = new BerWriter({size: 2});
187
writer.writeString('hello world');
188
var ber = writer.buffer;
189
190
t.ok(ber);
191
t.equal(ber.length, 13, 'wrong length');
192
t.equal(ber[0], 0x04, 'wrong tag');
193
t.equal(ber[1], 11, 'wrong length');
194
t.equal(ber.slice(2).toString('utf8'), 'hello world', 'wrong value');
195
196
t.end();
197
});
198
199
200
test('sequence', function(t) {
201
var writer = new BerWriter({size: 25});
202
writer.startSequence();
203
writer.writeString('hello world');
204
writer.endSequence();
205
var ber = writer.buffer;
206
207
t.ok(ber);
208
console.log(ber);
209
t.equal(ber.length, 15, 'wrong length');
210
t.equal(ber[0], 0x30, 'wrong tag');
211
t.equal(ber[1], 13, 'wrong length');
212
t.equal(ber[2], 0x04, 'wrong tag');
213
t.equal(ber[3], 11, 'wrong length');
214
t.equal(ber.slice(4).toString('utf8'), 'hello world', 'wrong value');
215
216
t.end();
217
});
218
219
220
test('nested sequence', function(t) {
221
var writer = new BerWriter({size: 25});
222
writer.startSequence();
223
writer.writeString('hello world');
224
writer.startSequence();
225
writer.writeString('hello world');
226
writer.endSequence();
227
writer.endSequence();
228
var ber = writer.buffer;
229
230
t.ok(ber);
231
t.equal(ber.length, 30, 'wrong length');
232
t.equal(ber[0], 0x30, 'wrong tag');
233
t.equal(ber[1], 28, 'wrong length');
234
t.equal(ber[2], 0x04, 'wrong tag');
235
t.equal(ber[3], 11, 'wrong length');
236
t.equal(ber.slice(4, 15).toString('utf8'), 'hello world', 'wrong value');
237
t.equal(ber[15], 0x30, 'wrong tag');
238
t.equal(ber[16], 13, 'wrong length');
239
t.equal(ber[17], 0x04, 'wrong tag');
240
t.equal(ber[18], 11, 'wrong length');
241
t.equal(ber.slice(19, 30).toString('utf8'), 'hello world', 'wrong value');
242
243
t.end();
244
});
245
246
247
test('LDAP bind message', function(t) {
248
var dn = 'cn=foo,ou=unit,o=test';
249
var writer = new BerWriter();
250
writer.startSequence();
251
writer.writeInt(3); // msgid = 3
252
writer.startSequence(0x60); // ldap bind
253
writer.writeInt(3); // ldap v3
254
writer.writeString(dn);
255
writer.writeByte(0x80);
256
writer.writeByte(0x00);
257
writer.endSequence();
258
writer.endSequence();
259
var ber = writer.buffer;
260
261
t.ok(ber);
262
t.equal(ber.length, 35, 'wrong length (buffer)');
263
t.equal(ber[0], 0x30, 'wrong tag');
264
t.equal(ber[1], 33, 'wrong length');
265
t.equal(ber[2], 0x02, 'wrong tag');
266
t.equal(ber[3], 1, 'wrong length');
267
t.equal(ber[4], 0x03, 'wrong value');
268
t.equal(ber[5], 0x60, 'wrong tag');
269
t.equal(ber[6], 28, 'wrong length');
270
t.equal(ber[7], 0x02, 'wrong tag');
271
t.equal(ber[8], 1, 'wrong length');
272
t.equal(ber[9], 0x03, 'wrong value');
273
t.equal(ber[10], 0x04, 'wrong tag');
274
t.equal(ber[11], dn.length, 'wrong length');
275
t.equal(ber.slice(12, 33).toString('utf8'), dn, 'wrong value');
276
t.equal(ber[33], 0x80, 'wrong tag');
277
t.equal(ber[34], 0x00, 'wrong len');
278
279
t.end();
280
});
281
282
283
test('Write OID', function(t) {
284
var oid = '1.2.840.113549.1.1.1';
285
var writer = new BerWriter();
286
writer.writeOID(oid);
287
288
var ber = writer.buffer;
289
t.ok(ber);
290
console.log(require('util').inspect(ber));
291
console.log(require('util').inspect(new Buffer([0x06, 0x09, 0x2a, 0x86,
292
0x48, 0x86, 0xf7, 0x0d,
293
0x01, 0x01, 0x01])));
294
295
t.end();
296
});
297
298