Initial commit
[yaffs-website] / node_modules / asn1 / tst / ber / writer.test.js
1 // Copyright 2011 Mark Cavage <mcavage@gmail.com> 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 1 byte negative int', function(t) {
109   var writer = new BerWriter();
110
111   writer.writeInt(-128);
112   var ber = writer.buffer;
113
114   t.ok(ber);
115
116   t.equal(ber.length, 3, 'Wrong length for an int');
117   t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
118   t.equal(ber[1], 0x01, 'length wrong');
119   t.equal(ber[2], 0x80, 'value wrong (byte 1)');
120
121   t.end();
122 });
123
124
125 test('write 2 byte negative int', function(t) {
126   var writer = new BerWriter();
127
128   writer.writeInt(-22400);
129   var ber = writer.buffer;
130
131   t.ok(ber);
132
133   t.equal(ber.length, 4, 'Wrong length for an int');
134   t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
135   t.equal(ber[1], 0x02, 'length wrong');
136   t.equal(ber[2], 0xa8, 'value wrong (byte 1)');
137   t.equal(ber[3], 0x80, 'value wrong (byte 2)');
138
139   t.end();
140 });
141
142
143 test('write 3 byte negative int', function(t) {
144   var writer = new BerWriter();
145
146   writer.writeInt(-481653);
147   var ber = writer.buffer;
148
149   t.ok(ber);
150
151   t.equal(ber.length, 5, 'Wrong length for an int');
152   t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
153   t.equal(ber[1], 0x03, 'length wrong');
154   t.equal(ber[2], 0xf8, 'value wrong (byte 1)');
155   t.equal(ber[3], 0xa6, 'value wrong (byte 2)');
156   t.equal(ber[4], 0x8b, 'value wrong (byte 3)');
157
158   t.end();
159 });
160
161
162 test('write 4 byte negative int', function(t) {
163   var writer = new BerWriter();
164
165   writer.writeInt(-1522904131);
166   var ber = writer.buffer;
167
168   t.ok(ber);
169
170   t.equal(ber.length, 6, 'Wrong length for an int');
171   t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
172   t.equal(ber[1], 0x04, 'length wrong');
173   t.equal(ber[2], 0xa5, 'value wrong (byte 1)');
174   t.equal(ber[3], 0x3a, 'value wrong (byte 2)');
175   t.equal(ber[4], 0x53, 'value wrong (byte 3)');
176   t.equal(ber[5], 0xbd, 'value wrong (byte 4)');
177
178   t.end();
179 });
180
181
182 test('write boolean', function(t) {
183   var writer = new BerWriter();
184
185   writer.writeBoolean(true);
186   writer.writeBoolean(false);
187   var ber = writer.buffer;
188
189   t.ok(ber);
190   t.equal(ber.length, 6, 'Wrong length');
191   t.equal(ber[0], 0x01, 'tag wrong');
192   t.equal(ber[1], 0x01, 'length wrong');
193   t.equal(ber[2], 0xff, 'value wrong');
194   t.equal(ber[3], 0x01, 'tag wrong');
195   t.equal(ber[4], 0x01, 'length wrong');
196   t.equal(ber[5], 0x00, 'value wrong');
197
198   t.end();
199 });
200
201
202 test('write string', function(t) {
203   var writer = new BerWriter();
204   writer.writeString('hello world');
205   var ber = writer.buffer;
206
207   t.ok(ber);
208   t.equal(ber.length, 13, 'wrong length');
209   t.equal(ber[0], 0x04, 'wrong tag');
210   t.equal(ber[1], 11, 'wrong length');
211   t.equal(ber.slice(2).toString('utf8'), 'hello world', 'wrong value');
212
213   t.end();
214 });
215
216 test('write buffer', function(t) {
217   var writer = new BerWriter();
218   // write some stuff to start with
219   writer.writeString('hello world');
220   var ber = writer.buffer;
221   var buf = new Buffer([0x04, 0x0b, 0x30, 0x09, 0x02, 0x01, 0x0f, 0x01, 0x01,
222      0xff, 0x01, 0x01, 0xff]);
223   writer.writeBuffer(buf.slice(2, buf.length), 0x04);
224   ber = writer.buffer;
225
226   t.ok(ber);
227   t.equal(ber.length, 26, 'wrong length');
228   t.equal(ber[0], 0x04, 'wrong tag');
229   t.equal(ber[1], 11, 'wrong length');
230   t.equal(ber.slice(2, 13).toString('utf8'), 'hello world', 'wrong value');
231   t.equal(ber[13], buf[0], 'wrong tag');
232   t.equal(ber[14], buf[1], 'wrong length');
233   for (var i = 13, j = 0; i < ber.length && j < buf.length; i++, j++) {
234     t.equal(ber[i], buf[j], 'buffer contents not identical');
235   }
236   t.end();
237 });
238
239 test('write string array', function(t) {
240   var writer = new BerWriter();
241   writer.writeStringArray(['hello world', 'fubar!']);
242   var ber = writer.buffer;
243
244   t.ok(ber);
245
246   t.equal(ber.length, 21, 'wrong length');
247   t.equal(ber[0], 0x04, 'wrong tag');
248   t.equal(ber[1], 11, 'wrong length');
249   t.equal(ber.slice(2, 13).toString('utf8'), 'hello world', 'wrong value');
250
251   t.equal(ber[13], 0x04, 'wrong tag');
252   t.equal(ber[14], 6, 'wrong length');
253   t.equal(ber.slice(15).toString('utf8'), 'fubar!', 'wrong value');
254
255   t.end();
256 });
257
258
259 test('resize internal buffer', function(t) {
260   var writer = new BerWriter({size: 2});
261   writer.writeString('hello world');
262   var ber = writer.buffer;
263
264   t.ok(ber);
265   t.equal(ber.length, 13, 'wrong length');
266   t.equal(ber[0], 0x04, 'wrong tag');
267   t.equal(ber[1], 11, 'wrong length');
268   t.equal(ber.slice(2).toString('utf8'), 'hello world', 'wrong value');
269
270   t.end();
271 });
272
273
274 test('sequence', function(t) {
275   var writer = new BerWriter({size: 25});
276   writer.startSequence();
277   writer.writeString('hello world');
278   writer.endSequence();
279   var ber = writer.buffer;
280
281   t.ok(ber);
282   console.log(ber);
283   t.equal(ber.length, 15, 'wrong length');
284   t.equal(ber[0], 0x30, 'wrong tag');
285   t.equal(ber[1], 13, 'wrong length');
286   t.equal(ber[2], 0x04, 'wrong tag');
287   t.equal(ber[3], 11, 'wrong length');
288   t.equal(ber.slice(4).toString('utf8'), 'hello world', 'wrong value');
289
290   t.end();
291 });
292
293
294 test('nested sequence', function(t) {
295   var writer = new BerWriter({size: 25});
296   writer.startSequence();
297   writer.writeString('hello world');
298   writer.startSequence();
299   writer.writeString('hello world');
300   writer.endSequence();
301   writer.endSequence();
302   var ber = writer.buffer;
303
304   t.ok(ber);
305   t.equal(ber.length, 30, 'wrong length');
306   t.equal(ber[0], 0x30, 'wrong tag');
307   t.equal(ber[1], 28, 'wrong length');
308   t.equal(ber[2], 0x04, 'wrong tag');
309   t.equal(ber[3], 11, 'wrong length');
310   t.equal(ber.slice(4, 15).toString('utf8'), 'hello world', 'wrong value');
311   t.equal(ber[15], 0x30, 'wrong tag');
312   t.equal(ber[16], 13, 'wrong length');
313   t.equal(ber[17], 0x04, 'wrong tag');
314   t.equal(ber[18], 11, 'wrong length');
315   t.equal(ber.slice(19, 30).toString('utf8'), 'hello world', 'wrong value');
316
317   t.end();
318 });
319
320
321 test('LDAP bind message', function(t) {
322   var dn = 'cn=foo,ou=unit,o=test';
323   var writer = new BerWriter();
324   writer.startSequence();
325   writer.writeInt(3);             // msgid = 3
326   writer.startSequence(0x60);     // ldap bind
327   writer.writeInt(3);             // ldap v3
328   writer.writeString(dn);
329   writer.writeByte(0x80);
330   writer.writeByte(0x00);
331   writer.endSequence();
332   writer.endSequence();
333   var ber = writer.buffer;
334
335   t.ok(ber);
336   t.equal(ber.length, 35, 'wrong length (buffer)');
337   t.equal(ber[0], 0x30, 'wrong tag');
338   t.equal(ber[1], 33, 'wrong length');
339   t.equal(ber[2], 0x02, 'wrong tag');
340   t.equal(ber[3], 1, 'wrong length');
341   t.equal(ber[4], 0x03, 'wrong value');
342   t.equal(ber[5], 0x60, 'wrong tag');
343   t.equal(ber[6], 28, 'wrong length');
344   t.equal(ber[7], 0x02, 'wrong tag');
345   t.equal(ber[8], 1, 'wrong length');
346   t.equal(ber[9], 0x03, 'wrong value');
347   t.equal(ber[10], 0x04, 'wrong tag');
348   t.equal(ber[11], dn.length, 'wrong length');
349   t.equal(ber.slice(12, 33).toString('utf8'), dn, 'wrong value');
350   t.equal(ber[33], 0x80, 'wrong tag');
351   t.equal(ber[34], 0x00, 'wrong len');
352
353   t.end();
354 });
355
356
357 test('Write OID', function(t) {
358   var oid = '1.2.840.113549.1.1.1';
359   var writer = new BerWriter();
360   writer.writeOID(oid);
361
362   var ber = writer.buffer;
363   t.ok(ber);
364   console.log(require('util').inspect(ber));
365   console.log(require('util').inspect(new Buffer([0x06, 0x09, 0x2a, 0x86,
366                                                   0x48, 0x86, 0xf7, 0x0d,
367                                                   0x01, 0x01, 0x01])));
368
369   t.end();
370 });