diff --git a/lib/ber/reader.js b/lib/ber/reader.js old mode 100644 new mode 100755 index 0a00e98..bb711fb --- a/lib/ber/reader.js +++ b/lib/ber/reader.js @@ -1,6 +1,7 @@ // Copyright 2011 Mark Cavage All rights reserved. var assert = require('assert'); +var Buffer = require('safer-buffer').Buffer; var ASN1 = require('./types'); var errors = require('./errors'); @@ -10,8 +11,6 @@ var errors = require('./errors'); var newInvalidAsn1Error = errors.newInvalidAsn1Error; - - ///--- API function Reader(data) { @@ -20,7 +19,8 @@ function Reader(data) { this._buf = data; this._size = data.length; - + this._blocklevel = 0; + this._blockInfo = {}; // These hold the "current" state this._len = 0; this._offset = 0; @@ -54,7 +54,8 @@ Object.defineProperty(Reader.prototype, 'buffer', { */ Reader.prototype.readByte = function(peek) { if (this._size - this._offset < 1) - return null; + return null; + var b = this._buf[this._offset] & 0xff; @@ -65,6 +66,59 @@ Reader.prototype.readByte = function(peek) { }; +Reader.prototype.readBlock = function(offset) +{ + if (offset === undefined) { + offset = this._offset; + } + var currOffset = offset; + var b, lenB; + + if (this._blockInfo[offset] !== undefined) { + return this._blockInfo[offset]; + } + + while(this.remain > 0) { + b = this._buf[currOffset++]; + lenB = this._buf[currOffset++]; + + if ((b == 0) && (lenB == 0)) { + break; // end of block + } + var len = 0; + if ((lenB & 0x80) == 0x80) { + lenB &= 0x7f; + + if (lenB == 0) { + this._blocklevel++; + lenB = this.readBlock(currOffset); + this._blocklevel--; + } + else { + if (lenB > 4) + throw InvalidAsn1Error('encoding too long'); + + if (this._size - this.offset < lenB) { + return null; + } + + for (var i = 0; i < lenB; i++) { + len = (len << 8) + (this._buf[currOffset++] & 0xff); + } + lenB = len; + } + } + currOffset += lenB; + if (currOffset > this._size) { + throw new Error("invalid block at offset " + offset); + } + } + lenB = currOffset - offset; + this._blockInfo[offset] = lenB; + + return lenB; +} + Reader.prototype.peek = function() { return this.readByte(true); }; @@ -81,36 +135,38 @@ Reader.prototype.peek = function() { * @return {Number} the amount of offset to advance the buffer. * @throws {InvalidAsn1Error} on bad ASN.1 */ -Reader.prototype.readLength = function(offset) { +Reader.prototype.readLength = function (offset) { if (offset === undefined) offset = this._offset; if (offset >= this._size) - return null; + return null; var lenB = this._buf[offset++] & 0xff; if (lenB === null) - return null; + return null; + - if ((lenB & 0x80) == 0x80) { + if ((lenB & 0x80) === 0x80) { lenB &= 0x7f; - if (lenB == 0) - throw newInvalidAsn1Error('Indefinite length not supported'); - - if (lenB > 4) - throw newInvalidAsn1Error('encoding too long'); - - if (this._size - offset < lenB) - return null; + if (lenB === 0) { + this._len = this.readBlock(offset); + } + else { + if (lenB > 4) + throw newInvalidAsn1Error('encoding too long'); - this._len = 0; - for (var i = 0; i < lenB; i++) - this._len = (this._len << 8) + (this._buf[offset++] & 0xff); + if (this._size - offset < lenB) + return null; + this._len = 0; + for (var i = 0; i < lenB; i++) + this._len = (this._len << 8) + (this._buf[offset++] & 0xff); + } } else { - // Wasn't a variable length - this._len = lenB; + // Wasn't a variable length + this._len = lenB; } return offset; @@ -124,7 +180,7 @@ Reader.prototype.readLength = function(offset) { * * @return {Number} the sequence's tag. */ -Reader.prototype.readSequence = function(tag) { +Reader.prototype.readSequence = function (tag) { var seq = this.peek(); if (seq === null) return null; @@ -141,28 +197,29 @@ Reader.prototype.readSequence = function(tag) { }; -Reader.prototype.readInt = function() { +Reader.prototype.readInt = function () { return this._readTag(ASN1.Integer); }; -Reader.prototype.readBoolean = function() { +Reader.prototype.readBoolean = function () { return (this._readTag(ASN1.Boolean) === 0 ? false : true); }; -Reader.prototype.readEnumeration = function() { +Reader.prototype.readEnumeration = function () { return this._readTag(ASN1.Enumeration); }; -Reader.prototype.readString = function(tag, retbuf) { + +Reader.prototype.readString = function (tag, retbuf) { if (!tag) tag = ASN1.OctetString; var b = this.peek(); - if (b === null) - return null; + if (b === null) + return null; if (b !== tag) throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + @@ -176,18 +233,52 @@ Reader.prototype.readString = function(tag, retbuf) { if (this.length > this._size - o) return null; + + var length = this.length; + if (this._blockInfo[this._offset + 2] !== undefined) { + length = length - 2; + } + this._offset = o; + + if (length === 0) + return retbuf ? Buffer.alloc(0) : ''; - if (this.length === 0) - return retbuf ? new Buffer(0) : ''; + - var str = this._buf.slice(this._offset, this._offset + this.length); + var str = this._buf.slice(this._offset, this._offset + length); this._offset += this.length; return retbuf ? str : str.toString('utf8'); }; -Reader.prototype.readOID = function(tag) { +Reader.prototype.readRelativeOID = function(tag) { + if (!tag) + tag = ASN1.RelativeOID; + + var b = this.readString(tag, true); + if (b === null) + return null; + + var values = []; + var value = 0; + + for (var i = 0; i < b.length; i++) { + var byte = b[i] & 0xff; + + value += byte & 0x7F; + if ((byte & 0x80) == 0x80) { + value <<= 7; + continue; + } + values.push(value); + value = 0; + } + + return values.join('.'); +}; + +Reader.prototype.readOID = function (tag) { if (!tag) tag = ASN1.OID; @@ -203,7 +294,7 @@ Reader.prototype.readOID = function(tag) { value <<= 7; value += byte & 0x7f; - if ((byte & 0x80) == 0) { + if ((byte & 0x80) === 0) { values.push(value); value = 0; } @@ -217,7 +308,7 @@ Reader.prototype.readOID = function(tag) { }; -Reader.prototype._readTag = function(tag) { +Reader.prototype._readTag = function (tag) { assert.ok(tag !== undefined); var b = this.peek(); @@ -233,7 +324,7 @@ Reader.prototype._readTag = function(tag) { if (o === null) return null; - if (this.length > 4) + if (this.length > 8) throw newInvalidAsn1Error('Integer too long: ' + this.length); if (this.length > this._size - o) @@ -248,7 +339,7 @@ Reader.prototype._readTag = function(tag) { value |= (this._buf[this._offset++] & 0xff); } - if ((fb & 0x80) == 0x80 && i !== 4) + if ((fb & 0x80) === 0x80 && i !== 4) value -= (1 << (i * 8)); return value >> 0; diff --git a/lib/ber/writer.js b/lib/ber/writer.js old mode 100644 new mode 100755 index d9d99af..a88a7d7 --- a/lib/ber/writer.js +++ b/lib/ber/writer.js @@ -1,6 +1,7 @@ // Copyright 2011 Mark Cavage All rights reserved. var assert = require('assert'); +var Buffer = require('safer-buffer').Buffer; var ASN1 = require('./types'); var errors = require('./errors'); @@ -19,12 +20,12 @@ var DEFAULT_OPTS = { function merge(from, to) { assert.ok(from); - assert.equal(typeof(from), 'object'); + assert.equal(typeof (from), 'object'); assert.ok(to); - assert.equal(typeof(to), 'object'); + assert.equal(typeof (to), 'object'); var keys = Object.getOwnPropertyNames(from); - keys.forEach(function(key) { + keys.forEach(function (key) { if (to[key]) return; @@ -42,7 +43,7 @@ function merge(from, to) { function Writer(options) { options = merge(DEFAULT_OPTS, options || {}); - this._buf = new Buffer(options.size || 1024); + this._buf = Buffer.alloc(options.size || 1024); this._size = this._buf.length; this._offset = 0; this._options = options; @@ -55,14 +56,14 @@ function Writer(options) { Object.defineProperty(Writer.prototype, 'buffer', { get: function () { if (this._seq.length) - throw new InvalidAsn1Error(this._seq.length + ' unended sequence(s)'); + throw newInvalidAsn1Error(this._seq.length + ' unended sequence(s)'); return (this._buf.slice(0, this._offset)); } }); -Writer.prototype.writeByte = function(b) { - if (typeof(b) !== 'number') +Writer.prototype.writeByte = function (b) { + if (typeof (b) !== 'number') throw new TypeError('argument must be a Number'); this._ensure(1); @@ -70,10 +71,10 @@ Writer.prototype.writeByte = function(b) { }; -Writer.prototype.writeInt = function(i, tag) { - if (typeof(i) !== 'number') +Writer.prototype.writeInt = function (i, tag) { + if (typeof (i) !== 'number') throw new TypeError('argument must be a Number'); - if (typeof(tag) !== 'number') + if (typeof (tag) !== 'number') tag = ASN1.Integer; var sz = 4; @@ -85,7 +86,7 @@ Writer.prototype.writeInt = function(i, tag) { } if (sz > 4) - throw new InvalidAsn1Error('BER ints cannot be > 0xffffffff'); + throw newInvalidAsn1Error('BER ints cannot be > 0xffffffff'); this._ensure(2 + sz); this._buf[this._offset++] = tag; @@ -99,26 +100,26 @@ Writer.prototype.writeInt = function(i, tag) { }; -Writer.prototype.writeNull = function() { +Writer.prototype.writeNull = function () { this.writeByte(ASN1.Null); this.writeByte(0x00); }; -Writer.prototype.writeEnumeration = function(i, tag) { - if (typeof(i) !== 'number') +Writer.prototype.writeEnumeration = function (i, tag) { + if (typeof (i) !== 'number') throw new TypeError('argument must be a Number'); - if (typeof(tag) !== 'number') + if (typeof (tag) !== 'number') tag = ASN1.Enumeration; return this.writeInt(i, tag); }; -Writer.prototype.writeBoolean = function(b, tag) { - if (typeof(b) !== 'boolean') +Writer.prototype.writeBoolean = function (b, tag) { + if (typeof (b) !== 'boolean') throw new TypeError('argument must be a Boolean'); - if (typeof(tag) !== 'number') + if (typeof (tag) !== 'number') tag = ASN1.Boolean; this._ensure(3); @@ -130,7 +131,7 @@ Writer.prototype.writeBoolean = function(b, tag) { Writer.prototype.writeString = function(s, tag) { if (typeof(s) !== 'string') - throw new TypeError('argument must be a string (was: ' + typeof(s) + ')'); + throw new TypeError('argument must be a string (was: ' + typeof (s) + ')'); if (typeof(tag) !== 'number') tag = ASN1.OctetString; @@ -169,6 +170,46 @@ Writer.prototype.writeStringArray = function(strings) { }); }; +Writer.prototype.writeRelativeOID = function(s,tag) { + if (typeof(s) !== 'string') + throw new TypeError('argument must be a string'); + if (typeof(tag) !== 'number') + tag = ASN1.RelativeOID; + + if (!/^([0-9]+\.)*[0-9]*$/.test(s)) + throw new Error('argument is not a valid OID string'); + + var tmp = s === "" ? [] : s.split('.'); + var bytes = []; + for (var i=0; i < tmp.length; i++) { + var val = parseInt(tmp[i]); + var encodedBytes = []; + while(val > 0x7F) { + var res = val & 0x7F; + encodedBytes.push(res); + val = val >> 7; + } + encodedBytes.push(val); + var j = encodedBytes.length - 1; + while(j >= 0) { + if (j > 0) { + bytes.push(encodedBytes[j] | 0x80); + } + else { + bytes.push(encodedBytes[j]); + } + j--; + } + } + var self = this; + this._ensure(2 + bytes.length); + this.writeByte(tag); + this.writeLength(bytes.length); + bytes.forEach(function(b) { + self.writeByte(b); + }); +}; + // This is really to solve DER cases, but whatever for now Writer.prototype.writeOID = function(s, tag) { if (typeof(s) !== 'string') @@ -176,7 +217,7 @@ Writer.prototype.writeOID = function(s, tag) { if (typeof(tag) !== 'number') tag = ASN1.OID; - if (!/^([0-9]+\.){3,}[0-9]+$/.test(s)) + if (!/^([0-9]+\.)*[0-9]+$/.test(s)) throw new Error('argument is not a valid OID string'); function encodeOctet(bytes, octet) { @@ -241,7 +282,7 @@ Writer.prototype.writeLength = function(len) { this._buf[this._offset++] = len >> 8; this._buf[this._offset++] = len; } else { - throw new InvalidAsn1ERror('Length too long (> 4 bytes)'); + throw newInvalidAsn1Error('Length too long (> 4 bytes)'); } }; @@ -279,7 +320,7 @@ Writer.prototype.endSequence = function() { this._buf[seq + 2] = len >> 8; this._buf[seq + 3] = len; } else { - throw new InvalidAsn1Error('Sequence too long'); + throw newInvalidAsn1Error('Sequence too long'); } }; @@ -301,7 +342,7 @@ Writer.prototype._ensure = function(len) { if (sz - this._offset < len) sz += len; - var buf = new Buffer(sz); + var buf = Buffer.alloc(sz); this._buf.copy(buf, 0, 0, this._offset); this._buf = buf; diff --git a/lib/index.d.ts b/lib/index.d.ts new file mode 100755 index 0000000..df9c2a4 --- /dev/null +++ b/lib/index.d.ts @@ -0,0 +1,134 @@ +// Type definitions for asn1 0.2 +// Project: https://github.com/evs-broadcast/node-asn1 +// Definitions by: Gilles Dufour +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 +/// +import {Buffer} from 'safer-buffer'; + +export interface WriterOptions { + size: number, + growthFactor: number +} + +export class Reader { + readonly buffer: Buffer; + readonly offset: number; + readonly _blocklevel: number; + readonly _blockInfo: object; + readonly length: number; + readonly remain: number; + readonly _buf: Buffer; + _size: number; + _offset: number; + + constructor(data: Buffer); + + peek(): number | null; + readBlock(offset: number): number; + readBoolean(): boolean; + readByte(peek: boolean): number | null; + readEnumeration(): number; + readInt(): number; + readLength(offset?: number): number; + readOID(tag?: number): string; + readRelativeOID(tag?: number): string; + readSequence(tag?: number): number | null; + readString(tag?: number): string; + readString(tag: number, retbuf: boolean): Buffer; + _readTag(tag?: number): number; +} + +export class Writer { + readonly buffer: Buffer; + readonly _buf: Buffer; + readonly _size: number; + _offset: number; + + constructor(options?: WriterOptions); + + endSequence(): void; + startSequence(tag?: number): void; + writeBoolean(b: boolean, tag?: number): void; + writeBuffer(buf: Buffer, tag: number): void; + writeByte(b: number): void; + writeEnumeration(i: number, tag?: number): void; + writeInt(i: number, tag?: number): void; + writeLength(len: number): void; + writeNull(): void; + writeOID(s: string, tag: number): void; + writeRelativeOID(s: string,tag: number): void; + writeString(s: string, tag?: number): void; + writeStringArray(strings: ReadonlyArray): void; + _ensure(length: number): void; +} + +export namespace Ber { + const BMPString: number; + const BitString: number; + const Boolean: number; + const CharacterString: number; + const Constructor: number; + const Context: number; + const EOC: number; + const Enumeration: number; + const External: number; + const GeneralString: number; + const GeneralizedTime: number; + const GraphicString: number; + const IA5String: number; + const Integer: number; + const Null: number; + const NumericString: number; + const OID: number; + const ObjectDescriptor: number; + const OctetString: number; + const PDV: number; + const PrintableString: number; + const Real: number; + const RelativeOID: number; + const Sequence: number; + const Set: number; + const T61String: number; + const UTCTime: number; + const UniversalString: number; + const Utf8String: number; + const VideotexString: number; + const VisibleString: number; +} +/* +declare enum BerType { + EOC = 0, + Boolean = 1, + Integer = 2, + BitString = 3, + OctetString = 4, + Null = 5, + OID = 6, + ObjectDescriptor = 7, + External = 8, + Real = 9, // float + Enumeration = 10, + PDV = 11, + Utf8String = 12, + RelativeOID = 13, + Sequence = 16, + Set = 17, + NumericString = 18, + PrintableString = 19, + T61String = 20, + VideotexString = 21, + IA5String = 22, + UTCTime = 23, + GeneralizedTime = 24, + GraphicString = 25, + VisibleString = 26, + GeneralString = 28, + UniversalString = 29, + CharacterString = 30, + BMPString = 31, + Constructor = 32, + Context = 128, +} + +*/ diff --git a/lib/index.js b/lib/index.js old mode 100644 new mode 100755 index d1766e7..980214a --- a/lib/index.js +++ b/lib/index.js @@ -13,8 +13,8 @@ module.exports = { Ber: Ber, - BerReader: Ber.Reader, + Reader: Ber.Reader, - BerWriter: Ber.Writer + Writer: Ber.Writer }; diff --git a/package.json b/package.json old mode 100644 new mode 100755 index f6dfb06..00bb3f3 --- a/package.json +++ b/package.json @@ -3,22 +3,30 @@ "contributors": [ "David Gwynne ", "Yunong Xiao ", - "Alex Wilson " + "Alex Wilson ", + "Gilles Dufour All rights reserved. -var test = require('tap').test; +var test = require('tape'); +var Buffer = require('safer-buffer').Buffer; -///--- Globals +// --- Globals var BerReader; -///--- Tests +// --- Tests -test('load library', function(t) { +test('load library', function (t) { BerReader = require('../../lib/index').BerReader; t.ok(BerReader); try { - new BerReader(); + var reader = new BerReader(); + t.equal(reader, null, 'reader'); t.fail('Should have thrown'); } catch (e) { t.ok(e instanceof TypeError, 'Should have been a type error'); @@ -25,16 +27,16 @@ test('load library', function(t) { }); -test('read byte', function(t) { - var reader = new BerReader(new Buffer([0xde])); +test('read byte', function (t) { + var reader = new BerReader(Buffer.from([0xde])); t.ok(reader); t.equal(reader.readByte(), 0xde, 'wrong value'); t.end(); }); -test('read 1 byte int', function(t) { - var reader = new BerReader(new Buffer([0x02, 0x01, 0x03])); +test('read 1 byte int', function (t) { + var reader = new BerReader(Buffer.from([0x02, 0x01, 0x03])); t.ok(reader); t.equal(reader.readInt(), 0x03, 'wrong value'); t.equal(reader.length, 0x01, 'wrong length'); @@ -42,8 +44,8 @@ test('read 1 byte int', function(t) { }); -test('read 2 byte int', function(t) { - var reader = new BerReader(new Buffer([0x02, 0x02, 0x7e, 0xde])); +test('read 2 byte int', function (t) { + var reader = new BerReader(Buffer.from([0x02, 0x02, 0x7e, 0xde])); t.ok(reader); t.equal(reader.readInt(), 0x7ede, 'wrong value'); t.equal(reader.length, 0x02, 'wrong length'); @@ -51,8 +53,8 @@ test('read 2 byte int', function(t) { }); -test('read 3 byte int', function(t) { - var reader = new BerReader(new Buffer([0x02, 0x03, 0x7e, 0xde, 0x03])); +test('read 3 byte int', function (t) { + var reader = new BerReader(Buffer.from([0x02, 0x03, 0x7e, 0xde, 0x03])); t.ok(reader); t.equal(reader.readInt(), 0x7ede03, 'wrong value'); t.equal(reader.length, 0x03, 'wrong length'); @@ -60,8 +62,8 @@ test('read 3 byte int', function(t) { }); -test('read 4 byte int', function(t) { - var reader = new BerReader(new Buffer([0x02, 0x04, 0x7e, 0xde, 0x03, 0x01])); +test('read 4 byte int', function (t) { + var reader = new BerReader(Buffer.from([0x02, 0x04, 0x7e, 0xde, 0x03, 0x01])); t.ok(reader); t.equal(reader.readInt(), 0x7ede0301, 'wrong value'); t.equal(reader.length, 0x04, 'wrong length'); @@ -69,8 +71,8 @@ test('read 4 byte int', function(t) { }); -test('read 1 byte negative int', function(t) { - var reader = new BerReader(new Buffer([0x02, 0x01, 0xdc])); +test('read 1 byte negative int', function (t) { + var reader = new BerReader(Buffer.from([0x02, 0x01, 0xdc])); t.ok(reader); t.equal(reader.readInt(), -36, 'wrong value'); t.equal(reader.length, 0x01, 'wrong length'); @@ -78,8 +80,8 @@ test('read 1 byte negative int', function(t) { }); -test('read 2 byte negative int', function(t) { - var reader = new BerReader(new Buffer([0x02, 0x02, 0xc0, 0x4e])); +test('read 2 byte negative int', function (t) { + var reader = new BerReader(Buffer.from([0x02, 0x02, 0xc0, 0x4e])); t.ok(reader); t.equal(reader.readInt(), -16306, 'wrong value'); t.equal(reader.length, 0x02, 'wrong length'); @@ -87,8 +89,8 @@ test('read 2 byte negative int', function(t) { }); -test('read 3 byte negative int', function(t) { - var reader = new BerReader(new Buffer([0x02, 0x03, 0xff, 0x00, 0x19])); +test('read 3 byte negative int', function (t) { + var reader = new BerReader(Buffer.from([0x02, 0x03, 0xff, 0x00, 0x19])); t.ok(reader); t.equal(reader.readInt(), -65511, 'wrong value'); t.equal(reader.length, 0x03, 'wrong length'); @@ -96,8 +98,8 @@ test('read 3 byte negative int', function(t) { }); -test('read 4 byte negative int', function(t) { - var reader = new BerReader(new Buffer([0x02, 0x04, 0x91, 0x7c, 0x22, 0x1f])); +test('read 4 byte negative int', function (t) { + var reader = new BerReader(Buffer.from([0x02, 0x04, 0x91, 0x7c, 0x22, 0x1f])); t.ok(reader); t.equal(reader.readInt(), -1854135777, 'wrong value'); t.equal(reader.length, 0x04, 'wrong length'); @@ -105,8 +107,8 @@ test('read 4 byte negative int', function(t) { }); -test('read boolean true', function(t) { - var reader = new BerReader(new Buffer([0x01, 0x01, 0xff])); +test('read boolean true', function (t) { + var reader = new BerReader(Buffer.from([0x01, 0x01, 0xff])); t.ok(reader); t.equal(reader.readBoolean(), true, 'wrong value'); t.equal(reader.length, 0x01, 'wrong length'); @@ -114,8 +116,8 @@ test('read boolean true', function(t) { }); -test('read boolean false', function(t) { - var reader = new BerReader(new Buffer([0x01, 0x01, 0x00])); +test('read boolean false', function (t) { + var reader = new BerReader(Buffer.from([0x01, 0x01, 0x00])); t.ok(reader); t.equal(reader.readBoolean(), false, 'wrong value'); t.equal(reader.length, 0x01, 'wrong length'); @@ -123,8 +125,8 @@ test('read boolean false', function(t) { }); -test('read enumeration', function(t) { - var reader = new BerReader(new Buffer([0x0a, 0x01, 0x20])); +test('read enumeration', function (t) { + var reader = new BerReader(Buffer.from([0x0a, 0x01, 0x20])); t.ok(reader); t.equal(reader.readEnumeration(), 0x20, 'wrong value'); t.equal(reader.length, 0x01, 'wrong length'); @@ -132,9 +134,9 @@ test('read enumeration', function(t) { }); -test('read string', function(t) { +test('read string', function (t) { var dn = 'cn=foo,ou=unit,o=test'; - var buf = new Buffer(dn.length + 2); + var buf = Buffer.alloc(dn.length + 2); buf[0] = 0x04; buf[1] = Buffer.byteLength(dn); buf.write(dn, 2); @@ -146,8 +148,8 @@ test('read string', function(t) { }); -test('read sequence', function(t) { - var reader = new BerReader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff])); +test('read sequence', function (t) { + var reader = new BerReader(Buffer.from([0x30, 0x03, 0x01, 0x01, 0xff])); t.ok(reader); t.equal(reader.readSequence(), 0x30, 'wrong value'); t.equal(reader.length, 0x03, 'wrong length'); @@ -157,8 +159,8 @@ test('read sequence', function(t) { }); -test('anonymous LDAPv3 bind', function(t) { - var BIND = new Buffer(14); +test('anonymous LDAPv3 bind', function (t) { + var BIND = Buffer.alloc(14); BIND[0] = 0x30; // Sequence BIND[1] = 12; // len BIND[2] = 0x02; // ASN.1 Integer @@ -191,9 +193,8 @@ test('anonymous LDAPv3 bind', function(t) { }); -test('long string', function(t) { - var buf = new Buffer(256); - var o; +test('long string', function (t) { + var buf = Buffer.alloc(256); var s = '2;649;CN=Red Hat CS 71GA Demo,O=Red Hat CS 71GA Demo,C=US;' + 'CN=RHCS Agent - admin01,UID=admin01,O=redhat,C=US [1] This is ' + diff --git a/tst/ber/writer.test.js b/test/ber/writer.test.js similarity index 88% rename from tst/ber/writer.test.js rename to test/ber/writer.test.js index d87cb7b..17c4671 100644 --- a/tst/ber/writer.test.js +++ b/test/ber/writer.test.js @@ -1,18 +1,17 @@ // Copyright 2011 Mark Cavage All rights reserved. -var test = require('tap').test; -var sys = require('sys'); +var test = require('tape'); +var Buffer = require('safer-buffer').Buffer; -///--- Globals +// --- Globals var BerWriter; -var BerReader; -///--- Tests +// --- Tests -test('load library', function(t) { +test('load library', function (t) { BerWriter = require('../../lib/index').BerWriter; t.ok(BerWriter); t.ok(new BerWriter()); @@ -20,7 +19,7 @@ test('load library', function(t) { }); -test('write byte', function(t) { +test('write byte', function (t) { var writer = new BerWriter(); writer.writeByte(0xC2); @@ -34,7 +33,7 @@ test('write byte', function(t) { }); -test('write 1 byte int', function(t) { +test('write 1 byte int', function (t) { var writer = new BerWriter(); writer.writeInt(0x7f); @@ -50,7 +49,7 @@ test('write 1 byte int', function(t) { }); -test('write 2 byte int', function(t) { +test('write 2 byte int', function (t) { var writer = new BerWriter(); writer.writeInt(0x7ffe); @@ -67,7 +66,7 @@ test('write 2 byte int', function(t) { }); -test('write 3 byte int', function(t) { +test('write 3 byte int', function (t) { var writer = new BerWriter(); writer.writeInt(0x7ffffe); @@ -85,7 +84,7 @@ test('write 3 byte int', function(t) { }); -test('write 4 byte int', function(t) { +test('write 4 byte int', function (t) { var writer = new BerWriter(); writer.writeInt(0x7ffffffe); @@ -105,7 +104,7 @@ test('write 4 byte int', function(t) { }); -test('write 1 byte negative int', function(t) { +test('write 1 byte negative int', function (t) { var writer = new BerWriter(); writer.writeInt(-128); @@ -122,7 +121,7 @@ test('write 1 byte negative int', function(t) { }); -test('write 2 byte negative int', function(t) { +test('write 2 byte negative int', function (t) { var writer = new BerWriter(); writer.writeInt(-22400); @@ -140,7 +139,7 @@ test('write 2 byte negative int', function(t) { }); -test('write 3 byte negative int', function(t) { +test('write 3 byte negative int', function (t) { var writer = new BerWriter(); writer.writeInt(-481653); @@ -159,7 +158,7 @@ test('write 3 byte negative int', function(t) { }); -test('write 4 byte negative int', function(t) { +test('write 4 byte negative int', function (t) { var writer = new BerWriter(); writer.writeInt(-1522904131); @@ -179,7 +178,7 @@ test('write 4 byte negative int', function(t) { }); -test('write boolean', function(t) { +test('write boolean', function (t) { var writer = new BerWriter(); writer.writeBoolean(true); @@ -199,7 +198,7 @@ test('write boolean', function(t) { }); -test('write string', function(t) { +test('write string', function (t) { var writer = new BerWriter(); writer.writeString('hello world'); var ber = writer.buffer; @@ -213,13 +212,13 @@ test('write string', function(t) { t.end(); }); -test('write buffer', function(t) { +test('write buffer', function (t) { var writer = new BerWriter(); // write some stuff to start with writer.writeString('hello world'); var ber = writer.buffer; - var buf = new Buffer([0x04, 0x0b, 0x30, 0x09, 0x02, 0x01, 0x0f, 0x01, 0x01, - 0xff, 0x01, 0x01, 0xff]); + var buf = Buffer.from([0x04, 0x0b, 0x30, 0x09, 0x02, 0x01, 0x0f, 0x01, 0x01, + 0xff, 0x01, 0x01, 0xff]); writer.writeBuffer(buf.slice(2, buf.length), 0x04); ber = writer.buffer; @@ -236,7 +235,7 @@ test('write buffer', function(t) { t.end(); }); -test('write string array', function(t) { +test('write string array', function (t) { var writer = new BerWriter(); writer.writeStringArray(['hello world', 'fubar!']); var ber = writer.buffer; @@ -256,7 +255,7 @@ test('write string array', function(t) { }); -test('resize internal buffer', function(t) { +test('resize internal buffer', function (t) { var writer = new BerWriter({size: 2}); writer.writeString('hello world'); var ber = writer.buffer; @@ -271,7 +270,7 @@ test('resize internal buffer', function(t) { }); -test('sequence', function(t) { +test('sequence', function (t) { var writer = new BerWriter({size: 25}); writer.startSequence(); writer.writeString('hello world'); @@ -291,7 +290,7 @@ test('sequence', function(t) { }); -test('nested sequence', function(t) { +test('nested sequence', function (t) { var writer = new BerWriter({size: 25}); writer.startSequence(); writer.writeString('hello world'); @@ -318,7 +317,7 @@ test('nested sequence', function(t) { }); -test('LDAP bind message', function(t) { +test('LDAP bind message', function (t) { var dn = 'cn=foo,ou=unit,o=test'; var writer = new BerWriter(); writer.startSequence(); @@ -354,7 +353,7 @@ test('LDAP bind message', function(t) { }); -test('Write OID', function(t) { +test('Write OID', function (t) { var oid = '1.2.840.113549.1.1.1'; var writer = new BerWriter(); writer.writeOID(oid); @@ -362,7 +361,7 @@ test('Write OID', function(t) { var ber = writer.buffer; t.ok(ber); console.log(require('util').inspect(ber)); - console.log(require('util').inspect(new Buffer([0x06, 0x09, 0x2a, 0x86, + console.log(require('util').inspect(Buffer.from([0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01]))); diff --git a/test/run.js b/test/run.js new file mode 100644 index 0000000..5e7e80e --- /dev/null +++ b/test/run.js @@ -0,0 +1,16 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/* + * Copyright (c) 2018, Joyent, Inc. + */ + +'use strict'; + +// --- Run All Tests + +require('./ber/reader.test.js'); +require('./ber/writer.test.js');