Template Upload
This commit is contained in:
2
node_modules/asn1/.npmignore
generated
vendored
Normal file
2
node_modules/asn1/.npmignore
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
node_modules
|
||||
*.log
|
4
node_modules/asn1/.travis.yml
generated
vendored
Normal file
4
node_modules/asn1/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- 0.8
|
||||
- 0.10
|
19
node_modules/asn1/LICENSE
generated
vendored
Normal file
19
node_modules/asn1/LICENSE
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
Copyright (c) 2011 Mark Cavage, All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE
|
50
node_modules/asn1/README.md
generated
vendored
Normal file
50
node_modules/asn1/README.md
generated
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS.
|
||||
Currently BER encoding is supported; at some point I'll likely have to do DER.
|
||||
|
||||
## Usage
|
||||
|
||||
Mostly, if you're *actually* needing to read and write ASN.1, you probably don't
|
||||
need this readme to explain what and why. If you have no idea what ASN.1 is,
|
||||
see this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc
|
||||
|
||||
The source is pretty much self-explanatory, and has read/write methods for the
|
||||
common types out there.
|
||||
|
||||
### Decoding
|
||||
|
||||
The following reads an ASN.1 sequence with a boolean.
|
||||
|
||||
var Ber = require('asn1').Ber;
|
||||
|
||||
var reader = new Ber.Reader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff]));
|
||||
|
||||
reader.readSequence();
|
||||
console.log('Sequence len: ' + reader.length);
|
||||
if (reader.peek() === Ber.Boolean)
|
||||
console.log(reader.readBoolean());
|
||||
|
||||
### Encoding
|
||||
|
||||
The following generates the same payload as above.
|
||||
|
||||
var Ber = require('asn1').Ber;
|
||||
|
||||
var writer = new Ber.Writer();
|
||||
|
||||
writer.startSequence();
|
||||
writer.writeBoolean(true);
|
||||
writer.endSequence();
|
||||
|
||||
console.log(writer.buffer);
|
||||
|
||||
## Installation
|
||||
|
||||
npm install asn1
|
||||
|
||||
## License
|
||||
|
||||
MIT.
|
||||
|
||||
## Bugs
|
||||
|
||||
See <https://github.com/mcavage/node-asn1/issues>.
|
13
node_modules/asn1/lib/ber/errors.js
generated
vendored
Normal file
13
node_modules/asn1/lib/ber/errors.js
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
|
||||
|
||||
|
||||
module.exports = {
|
||||
|
||||
newInvalidAsn1Error: function(msg) {
|
||||
var e = new Error();
|
||||
e.name = 'InvalidAsn1Error';
|
||||
e.message = msg || '';
|
||||
return e;
|
||||
}
|
||||
|
||||
};
|
27
node_modules/asn1/lib/ber/index.js
generated
vendored
Normal file
27
node_modules/asn1/lib/ber/index.js
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
|
||||
|
||||
var errors = require('./errors');
|
||||
var types = require('./types');
|
||||
|
||||
var Reader = require('./reader');
|
||||
var Writer = require('./writer');
|
||||
|
||||
|
||||
///--- Exports
|
||||
|
||||
module.exports = {
|
||||
|
||||
Reader: Reader,
|
||||
|
||||
Writer: Writer
|
||||
|
||||
};
|
||||
|
||||
for (var t in types) {
|
||||
if (types.hasOwnProperty(t))
|
||||
module.exports[t] = types[t];
|
||||
}
|
||||
for (var e in errors) {
|
||||
if (errors.hasOwnProperty(e))
|
||||
module.exports[e] = errors[e];
|
||||
}
|
261
node_modules/asn1/lib/ber/reader.js
generated
vendored
Normal file
261
node_modules/asn1/lib/ber/reader.js
generated
vendored
Normal file
@ -0,0 +1,261 @@
|
||||
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
|
||||
|
||||
var assert = require('assert');
|
||||
|
||||
var ASN1 = require('./types');
|
||||
var errors = require('./errors');
|
||||
|
||||
|
||||
///--- Globals
|
||||
|
||||
var newInvalidAsn1Error = errors.newInvalidAsn1Error;
|
||||
|
||||
|
||||
|
||||
///--- API
|
||||
|
||||
function Reader(data) {
|
||||
if (!data || !Buffer.isBuffer(data))
|
||||
throw new TypeError('data must be a node Buffer');
|
||||
|
||||
this._buf = data;
|
||||
this._size = data.length;
|
||||
|
||||
// These hold the "current" state
|
||||
this._len = 0;
|
||||
this._offset = 0;
|
||||
}
|
||||
|
||||
Object.defineProperty(Reader.prototype, 'length', {
|
||||
enumerable: true,
|
||||
get: function () { return (this._len); }
|
||||
});
|
||||
|
||||
Object.defineProperty(Reader.prototype, 'offset', {
|
||||
enumerable: true,
|
||||
get: function () { return (this._offset); }
|
||||
});
|
||||
|
||||
Object.defineProperty(Reader.prototype, 'remain', {
|
||||
get: function () { return (this._size - this._offset); }
|
||||
});
|
||||
|
||||
Object.defineProperty(Reader.prototype, 'buffer', {
|
||||
get: function () { return (this._buf.slice(this._offset)); }
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* Reads a single byte and advances offset; you can pass in `true` to make this
|
||||
* a "peek" operation (i.e., get the byte, but don't advance the offset).
|
||||
*
|
||||
* @param {Boolean} peek true means don't move offset.
|
||||
* @return {Number} the next byte, null if not enough data.
|
||||
*/
|
||||
Reader.prototype.readByte = function(peek) {
|
||||
if (this._size - this._offset < 1)
|
||||
return null;
|
||||
|
||||
var b = this._buf[this._offset] & 0xff;
|
||||
|
||||
if (!peek)
|
||||
this._offset += 1;
|
||||
|
||||
return b;
|
||||
};
|
||||
|
||||
|
||||
Reader.prototype.peek = function() {
|
||||
return this.readByte(true);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Reads a (potentially) variable length off the BER buffer. This call is
|
||||
* not really meant to be called directly, as callers have to manipulate
|
||||
* the internal buffer afterwards.
|
||||
*
|
||||
* As a result of this call, you can call `Reader.length`, until the
|
||||
* next thing called that does a readLength.
|
||||
*
|
||||
* @return {Number} the amount of offset to advance the buffer.
|
||||
* @throws {InvalidAsn1Error} on bad ASN.1
|
||||
*/
|
||||
Reader.prototype.readLength = function(offset) {
|
||||
if (offset === undefined)
|
||||
offset = this._offset;
|
||||
|
||||
if (offset >= this._size)
|
||||
return null;
|
||||
|
||||
var lenB = this._buf[offset++] & 0xff;
|
||||
if (lenB === null)
|
||||
return null;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
return offset;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Parses the next sequence in this BER buffer.
|
||||
*
|
||||
* To get the length of the sequence, call `Reader.length`.
|
||||
*
|
||||
* @return {Number} the sequence's tag.
|
||||
*/
|
||||
Reader.prototype.readSequence = function(tag) {
|
||||
var seq = this.peek();
|
||||
if (seq === null)
|
||||
return null;
|
||||
if (tag !== undefined && tag !== seq)
|
||||
throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
|
||||
': got 0x' + seq.toString(16));
|
||||
|
||||
var o = this.readLength(this._offset + 1); // stored in `length`
|
||||
if (o === null)
|
||||
return null;
|
||||
|
||||
this._offset = o;
|
||||
return seq;
|
||||
};
|
||||
|
||||
|
||||
Reader.prototype.readInt = function() {
|
||||
return this._readTag(ASN1.Integer);
|
||||
};
|
||||
|
||||
|
||||
Reader.prototype.readBoolean = function() {
|
||||
return (this._readTag(ASN1.Boolean) === 0 ? false : true);
|
||||
};
|
||||
|
||||
|
||||
Reader.prototype.readEnumeration = function() {
|
||||
return this._readTag(ASN1.Enumeration);
|
||||
};
|
||||
|
||||
|
||||
Reader.prototype.readString = function(tag, retbuf) {
|
||||
if (!tag)
|
||||
tag = ASN1.OctetString;
|
||||
|
||||
var b = this.peek();
|
||||
if (b === null)
|
||||
return null;
|
||||
|
||||
if (b !== tag)
|
||||
throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
|
||||
': got 0x' + b.toString(16));
|
||||
|
||||
var o = this.readLength(this._offset + 1); // stored in `length`
|
||||
|
||||
if (o === null)
|
||||
return null;
|
||||
|
||||
if (this.length > this._size - o)
|
||||
return null;
|
||||
|
||||
this._offset = o;
|
||||
|
||||
if (this.length === 0)
|
||||
return retbuf ? new Buffer(0) : '';
|
||||
|
||||
var str = this._buf.slice(this._offset, this._offset + this.length);
|
||||
this._offset += this.length;
|
||||
|
||||
return retbuf ? str : str.toString('utf8');
|
||||
};
|
||||
|
||||
Reader.prototype.readOID = function(tag) {
|
||||
if (!tag)
|
||||
tag = ASN1.OID;
|
||||
|
||||
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 <<= 7;
|
||||
value += byte & 0x7f;
|
||||
if ((byte & 0x80) == 0) {
|
||||
values.push(value);
|
||||
value = 0;
|
||||
}
|
||||
}
|
||||
|
||||
value = values.shift();
|
||||
values.unshift(value % 40);
|
||||
values.unshift((value / 40) >> 0);
|
||||
|
||||
return values.join('.');
|
||||
};
|
||||
|
||||
|
||||
Reader.prototype._readTag = function(tag) {
|
||||
assert.ok(tag !== undefined);
|
||||
|
||||
var b = this.peek();
|
||||
|
||||
if (b === null)
|
||||
return null;
|
||||
|
||||
if (b !== tag)
|
||||
throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
|
||||
': got 0x' + b.toString(16));
|
||||
|
||||
var o = this.readLength(this._offset + 1); // stored in `length`
|
||||
if (o === null)
|
||||
return null;
|
||||
|
||||
if (this.length > 4)
|
||||
throw newInvalidAsn1Error('Integer too long: ' + this.length);
|
||||
|
||||
if (this.length > this._size - o)
|
||||
return null;
|
||||
this._offset = o;
|
||||
|
||||
var fb = this._buf[this._offset];
|
||||
var value = 0;
|
||||
|
||||
for (var i = 0; i < this.length; i++) {
|
||||
value <<= 8;
|
||||
value |= (this._buf[this._offset++] & 0xff);
|
||||
}
|
||||
|
||||
if ((fb & 0x80) == 0x80 && i !== 4)
|
||||
value -= (1 << (i * 8));
|
||||
|
||||
return value >> 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
///--- Exported API
|
||||
|
||||
module.exports = Reader;
|
36
node_modules/asn1/lib/ber/types.js
generated
vendored
Normal file
36
node_modules/asn1/lib/ber/types.js
generated
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
|
||||
|
||||
|
||||
module.exports = {
|
||||
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
|
||||
};
|
316
node_modules/asn1/lib/ber/writer.js
generated
vendored
Normal file
316
node_modules/asn1/lib/ber/writer.js
generated
vendored
Normal file
@ -0,0 +1,316 @@
|
||||
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
|
||||
|
||||
var assert = require('assert');
|
||||
var ASN1 = require('./types');
|
||||
var errors = require('./errors');
|
||||
|
||||
|
||||
///--- Globals
|
||||
|
||||
var newInvalidAsn1Error = errors.newInvalidAsn1Error;
|
||||
|
||||
var DEFAULT_OPTS = {
|
||||
size: 1024,
|
||||
growthFactor: 8
|
||||
};
|
||||
|
||||
|
||||
///--- Helpers
|
||||
|
||||
function merge(from, to) {
|
||||
assert.ok(from);
|
||||
assert.equal(typeof(from), 'object');
|
||||
assert.ok(to);
|
||||
assert.equal(typeof(to), 'object');
|
||||
|
||||
var keys = Object.getOwnPropertyNames(from);
|
||||
keys.forEach(function(key) {
|
||||
if (to[key])
|
||||
return;
|
||||
|
||||
var value = Object.getOwnPropertyDescriptor(from, key);
|
||||
Object.defineProperty(to, key, value);
|
||||
});
|
||||
|
||||
return to;
|
||||
}
|
||||
|
||||
|
||||
|
||||
///--- API
|
||||
|
||||
function Writer(options) {
|
||||
options = merge(DEFAULT_OPTS, options || {});
|
||||
|
||||
this._buf = new Buffer(options.size || 1024);
|
||||
this._size = this._buf.length;
|
||||
this._offset = 0;
|
||||
this._options = options;
|
||||
|
||||
// A list of offsets in the buffer where we need to insert
|
||||
// sequence tag/len pairs.
|
||||
this._seq = [];
|
||||
}
|
||||
|
||||
Object.defineProperty(Writer.prototype, 'buffer', {
|
||||
get: function () {
|
||||
if (this._seq.length)
|
||||
throw new InvalidAsn1Error(this._seq.length + ' unended sequence(s)');
|
||||
|
||||
return (this._buf.slice(0, this._offset));
|
||||
}
|
||||
});
|
||||
|
||||
Writer.prototype.writeByte = function(b) {
|
||||
if (typeof(b) !== 'number')
|
||||
throw new TypeError('argument must be a Number');
|
||||
|
||||
this._ensure(1);
|
||||
this._buf[this._offset++] = b;
|
||||
};
|
||||
|
||||
|
||||
Writer.prototype.writeInt = function(i, tag) {
|
||||
if (typeof(i) !== 'number')
|
||||
throw new TypeError('argument must be a Number');
|
||||
if (typeof(tag) !== 'number')
|
||||
tag = ASN1.Integer;
|
||||
|
||||
var sz = 4;
|
||||
|
||||
while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) &&
|
||||
(sz > 1)) {
|
||||
sz--;
|
||||
i <<= 8;
|
||||
}
|
||||
|
||||
if (sz > 4)
|
||||
throw new InvalidAsn1Error('BER ints cannot be > 0xffffffff');
|
||||
|
||||
this._ensure(2 + sz);
|
||||
this._buf[this._offset++] = tag;
|
||||
this._buf[this._offset++] = sz;
|
||||
|
||||
while (sz-- > 0) {
|
||||
this._buf[this._offset++] = ((i & 0xff000000) >>> 24);
|
||||
i <<= 8;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
Writer.prototype.writeNull = function() {
|
||||
this.writeByte(ASN1.Null);
|
||||
this.writeByte(0x00);
|
||||
};
|
||||
|
||||
|
||||
Writer.prototype.writeEnumeration = function(i, tag) {
|
||||
if (typeof(i) !== 'number')
|
||||
throw new TypeError('argument must be a Number');
|
||||
if (typeof(tag) !== 'number')
|
||||
tag = ASN1.Enumeration;
|
||||
|
||||
return this.writeInt(i, tag);
|
||||
};
|
||||
|
||||
|
||||
Writer.prototype.writeBoolean = function(b, tag) {
|
||||
if (typeof(b) !== 'boolean')
|
||||
throw new TypeError('argument must be a Boolean');
|
||||
if (typeof(tag) !== 'number')
|
||||
tag = ASN1.Boolean;
|
||||
|
||||
this._ensure(3);
|
||||
this._buf[this._offset++] = tag;
|
||||
this._buf[this._offset++] = 0x01;
|
||||
this._buf[this._offset++] = b ? 0xff : 0x00;
|
||||
};
|
||||
|
||||
|
||||
Writer.prototype.writeString = function(s, tag) {
|
||||
if (typeof(s) !== 'string')
|
||||
throw new TypeError('argument must be a string (was: ' + typeof(s) + ')');
|
||||
if (typeof(tag) !== 'number')
|
||||
tag = ASN1.OctetString;
|
||||
|
||||
var len = Buffer.byteLength(s);
|
||||
this.writeByte(tag);
|
||||
this.writeLength(len);
|
||||
if (len) {
|
||||
this._ensure(len);
|
||||
this._buf.write(s, this._offset);
|
||||
this._offset += len;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Writer.prototype.writeBuffer = function(buf, tag) {
|
||||
if (typeof(tag) !== 'number')
|
||||
throw new TypeError('tag must be a number');
|
||||
if (!Buffer.isBuffer(buf))
|
||||
throw new TypeError('argument must be a buffer');
|
||||
|
||||
this.writeByte(tag);
|
||||
this.writeLength(buf.length);
|
||||
this._ensure(buf.length);
|
||||
buf.copy(this._buf, this._offset, 0, buf.length);
|
||||
this._offset += buf.length;
|
||||
};
|
||||
|
||||
|
||||
Writer.prototype.writeStringArray = function(strings) {
|
||||
if ((!strings instanceof Array))
|
||||
throw new TypeError('argument must be an Array[String]');
|
||||
|
||||
var self = this;
|
||||
strings.forEach(function(s) {
|
||||
self.writeString(s);
|
||||
});
|
||||
};
|
||||
|
||||
// This is really to solve DER cases, but whatever for now
|
||||
Writer.prototype.writeOID = function(s, tag) {
|
||||
if (typeof(s) !== 'string')
|
||||
throw new TypeError('argument must be a string');
|
||||
if (typeof(tag) !== 'number')
|
||||
tag = ASN1.OID;
|
||||
|
||||
if (!/^([0-9]+\.){3,}[0-9]+$/.test(s))
|
||||
throw new Error('argument is not a valid OID string');
|
||||
|
||||
function encodeOctet(bytes, octet) {
|
||||
if (octet < 128) {
|
||||
bytes.push(octet);
|
||||
} else if (octet < 16384) {
|
||||
bytes.push((octet >>> 7) | 0x80);
|
||||
bytes.push(octet & 0x7F);
|
||||
} else if (octet < 2097152) {
|
||||
bytes.push((octet >>> 14) | 0x80);
|
||||
bytes.push(((octet >>> 7) | 0x80) & 0xFF);
|
||||
bytes.push(octet & 0x7F);
|
||||
} else if (octet < 268435456) {
|
||||
bytes.push((octet >>> 21) | 0x80);
|
||||
bytes.push(((octet >>> 14) | 0x80) & 0xFF);
|
||||
bytes.push(((octet >>> 7) | 0x80) & 0xFF);
|
||||
bytes.push(octet & 0x7F);
|
||||
} else {
|
||||
bytes.push(((octet >>> 28) | 0x80) & 0xFF);
|
||||
bytes.push(((octet >>> 21) | 0x80) & 0xFF);
|
||||
bytes.push(((octet >>> 14) | 0x80) & 0xFF);
|
||||
bytes.push(((octet >>> 7) | 0x80) & 0xFF);
|
||||
bytes.push(octet & 0x7F);
|
||||
}
|
||||
}
|
||||
|
||||
var tmp = s.split('.');
|
||||
var bytes = [];
|
||||
bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10));
|
||||
tmp.slice(2).forEach(function(b) {
|
||||
encodeOctet(bytes, parseInt(b, 10));
|
||||
});
|
||||
|
||||
var self = this;
|
||||
this._ensure(2 + bytes.length);
|
||||
this.writeByte(tag);
|
||||
this.writeLength(bytes.length);
|
||||
bytes.forEach(function(b) {
|
||||
self.writeByte(b);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
Writer.prototype.writeLength = function(len) {
|
||||
if (typeof(len) !== 'number')
|
||||
throw new TypeError('argument must be a Number');
|
||||
|
||||
this._ensure(4);
|
||||
|
||||
if (len <= 0x7f) {
|
||||
this._buf[this._offset++] = len;
|
||||
} else if (len <= 0xff) {
|
||||
this._buf[this._offset++] = 0x81;
|
||||
this._buf[this._offset++] = len;
|
||||
} else if (len <= 0xffff) {
|
||||
this._buf[this._offset++] = 0x82;
|
||||
this._buf[this._offset++] = len >> 8;
|
||||
this._buf[this._offset++] = len;
|
||||
} else if (len <= 0xffffff) {
|
||||
this._buf[this._offset++] = 0x83;
|
||||
this._buf[this._offset++] = len >> 16;
|
||||
this._buf[this._offset++] = len >> 8;
|
||||
this._buf[this._offset++] = len;
|
||||
} else {
|
||||
throw new InvalidAsn1ERror('Length too long (> 4 bytes)');
|
||||
}
|
||||
};
|
||||
|
||||
Writer.prototype.startSequence = function(tag) {
|
||||
if (typeof(tag) !== 'number')
|
||||
tag = ASN1.Sequence | ASN1.Constructor;
|
||||
|
||||
this.writeByte(tag);
|
||||
this._seq.push(this._offset);
|
||||
this._ensure(3);
|
||||
this._offset += 3;
|
||||
};
|
||||
|
||||
|
||||
Writer.prototype.endSequence = function() {
|
||||
var seq = this._seq.pop();
|
||||
var start = seq + 3;
|
||||
var len = this._offset - start;
|
||||
|
||||
if (len <= 0x7f) {
|
||||
this._shift(start, len, -2);
|
||||
this._buf[seq] = len;
|
||||
} else if (len <= 0xff) {
|
||||
this._shift(start, len, -1);
|
||||
this._buf[seq] = 0x81;
|
||||
this._buf[seq + 1] = len;
|
||||
} else if (len <= 0xffff) {
|
||||
this._buf[seq] = 0x82;
|
||||
this._buf[seq + 1] = len >> 8;
|
||||
this._buf[seq + 2] = len;
|
||||
} else if (len <= 0xffffff) {
|
||||
this._shift(start, len, 1);
|
||||
this._buf[seq] = 0x83;
|
||||
this._buf[seq + 1] = len >> 16;
|
||||
this._buf[seq + 2] = len >> 8;
|
||||
this._buf[seq + 3] = len;
|
||||
} else {
|
||||
throw new InvalidAsn1Error('Sequence too long');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Writer.prototype._shift = function(start, len, shift) {
|
||||
assert.ok(start !== undefined);
|
||||
assert.ok(len !== undefined);
|
||||
assert.ok(shift);
|
||||
|
||||
this._buf.copy(this._buf, start + shift, start, start + len);
|
||||
this._offset += shift;
|
||||
};
|
||||
|
||||
Writer.prototype._ensure = function(len) {
|
||||
assert.ok(len);
|
||||
|
||||
if (this._size - this._offset < len) {
|
||||
var sz = this._size * this._options.growthFactor;
|
||||
if (sz - this._offset < len)
|
||||
sz += len;
|
||||
|
||||
var buf = new Buffer(sz);
|
||||
|
||||
this._buf.copy(buf, 0, 0, this._offset);
|
||||
this._buf = buf;
|
||||
this._size = sz;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
///--- Exported API
|
||||
|
||||
module.exports = Writer;
|
20
node_modules/asn1/lib/index.js
generated
vendored
Normal file
20
node_modules/asn1/lib/index.js
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
|
||||
|
||||
// If you have no idea what ASN.1 or BER is, see this:
|
||||
// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc
|
||||
|
||||
var Ber = require('./ber/index');
|
||||
|
||||
|
||||
|
||||
///--- Exported API
|
||||
|
||||
module.exports = {
|
||||
|
||||
Ber: Ber,
|
||||
|
||||
BerReader: Ber.Reader,
|
||||
|
||||
BerWriter: Ber.Writer
|
||||
|
||||
};
|
89
node_modules/asn1/package.json
generated
vendored
Normal file
89
node_modules/asn1/package.json
generated
vendored
Normal file
@ -0,0 +1,89 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
"asn1@~0.2.3",
|
||||
"C:\\Users\\x2mjbyrn\\Source\\Repos\\Skeleton\\node_modules\\sshpk"
|
||||
]
|
||||
],
|
||||
"_from": "asn1@>=0.2.3-0 <0.3.0-0",
|
||||
"_id": "asn1@0.2.3",
|
||||
"_inCache": true,
|
||||
"_location": "/asn1",
|
||||
"_npmUser": {
|
||||
"email": "patrick.f.mooney@gmail.com",
|
||||
"name": "pfmooney"
|
||||
},
|
||||
"_npmVersion": "1.4.28",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"name": "asn1",
|
||||
"raw": "asn1@~0.2.3",
|
||||
"rawSpec": "~0.2.3",
|
||||
"scope": null,
|
||||
"spec": ">=0.2.3-0 <0.3.0-0",
|
||||
"type": "range"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/sshpk"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
|
||||
"_shasum": "dac8787713c9966849fc8180777ebe9c1ddf3b86",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "asn1@~0.2.3",
|
||||
"_where": "C:\\Users\\x2mjbyrn\\Source\\Repos\\Skeleton\\node_modules\\sshpk",
|
||||
"author": {
|
||||
"email": "mcavage@gmail.com",
|
||||
"name": "Mark Cavage"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/mcavage/node-asn1/issues"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "David Gwynne",
|
||||
"email": "loki@animata.net"
|
||||
},
|
||||
{
|
||||
"name": "Yunong Xiao",
|
||||
"email": "yunong@joyent.com"
|
||||
},
|
||||
{
|
||||
"name": "Alex Wilson",
|
||||
"email": "alex.wilson@joyent.com"
|
||||
}
|
||||
],
|
||||
"dependencies": {},
|
||||
"description": "Contains parsers and serializers for ASN.1 (currently BER only)",
|
||||
"devDependencies": {
|
||||
"tap": "0.4.8"
|
||||
},
|
||||
"directories": {},
|
||||
"dist": {
|
||||
"shasum": "dac8787713c9966849fc8180777ebe9c1ddf3b86",
|
||||
"tarball": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz"
|
||||
},
|
||||
"homepage": "https://github.com/mcavage/node-asn1",
|
||||
"installable": true,
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "mcavage",
|
||||
"email": "mcavage@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "pfmooney",
|
||||
"email": "patrick.f.mooney@gmail.com"
|
||||
}
|
||||
],
|
||||
"name": "asn1",
|
||||
"optionalDependencies": {},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/mcavage/node-asn1.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tap ./tst"
|
||||
},
|
||||
"version": "0.2.3"
|
||||
}
|
208
node_modules/asn1/tst/ber/reader.test.js
generated
vendored
Normal file
208
node_modules/asn1/tst/ber/reader.test.js
generated
vendored
Normal file
@ -0,0 +1,208 @@
|
||||
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
|
||||
|
||||
var test = require('tap').test;
|
||||
|
||||
|
||||
|
||||
///--- Globals
|
||||
|
||||
var BerReader;
|
||||
|
||||
|
||||
|
||||
///--- Tests
|
||||
|
||||
test('load library', function(t) {
|
||||
BerReader = require('../../lib/index').BerReader;
|
||||
t.ok(BerReader);
|
||||
try {
|
||||
new BerReader();
|
||||
t.fail('Should have thrown');
|
||||
} catch (e) {
|
||||
t.ok(e instanceof TypeError, 'Should have been a type error');
|
||||
}
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read byte', function(t) {
|
||||
var reader = new BerReader(new Buffer([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]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readInt(), 0x03, 'wrong value');
|
||||
t.equal(reader.length, 0x01, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read 2 byte int', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x02, 0x02, 0x7e, 0xde]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readInt(), 0x7ede, 'wrong value');
|
||||
t.equal(reader.length, 0x02, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read 3 byte int', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x02, 0x03, 0x7e, 0xde, 0x03]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readInt(), 0x7ede03, 'wrong value');
|
||||
t.equal(reader.length, 0x03, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read 4 byte int', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x02, 0x04, 0x7e, 0xde, 0x03, 0x01]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readInt(), 0x7ede0301, 'wrong value');
|
||||
t.equal(reader.length, 0x04, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read 1 byte negative int', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x02, 0x01, 0xdc]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readInt(), -36, 'wrong value');
|
||||
t.equal(reader.length, 0x01, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read 2 byte negative int', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x02, 0x02, 0xc0, 0x4e]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readInt(), -16306, 'wrong value');
|
||||
t.equal(reader.length, 0x02, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read 3 byte negative int', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x02, 0x03, 0xff, 0x00, 0x19]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readInt(), -65511, 'wrong value');
|
||||
t.equal(reader.length, 0x03, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read 4 byte negative int', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x02, 0x04, 0x91, 0x7c, 0x22, 0x1f]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readInt(), -1854135777, 'wrong value');
|
||||
t.equal(reader.length, 0x04, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read boolean true', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x01, 0x01, 0xff]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readBoolean(), true, 'wrong value');
|
||||
t.equal(reader.length, 0x01, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read boolean false', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x01, 0x01, 0x00]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readBoolean(), false, 'wrong value');
|
||||
t.equal(reader.length, 0x01, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read enumeration', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x0a, 0x01, 0x20]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readEnumeration(), 0x20, 'wrong value');
|
||||
t.equal(reader.length, 0x01, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read string', function(t) {
|
||||
var dn = 'cn=foo,ou=unit,o=test';
|
||||
var buf = new Buffer(dn.length + 2);
|
||||
buf[0] = 0x04;
|
||||
buf[1] = Buffer.byteLength(dn);
|
||||
buf.write(dn, 2);
|
||||
var reader = new BerReader(buf);
|
||||
t.ok(reader);
|
||||
t.equal(reader.readString(), dn, 'wrong value');
|
||||
t.equal(reader.length, dn.length, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('read sequence', function(t) {
|
||||
var reader = new BerReader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff]));
|
||||
t.ok(reader);
|
||||
t.equal(reader.readSequence(), 0x30, 'wrong value');
|
||||
t.equal(reader.length, 0x03, 'wrong length');
|
||||
t.equal(reader.readBoolean(), true, 'wrong value');
|
||||
t.equal(reader.length, 0x01, 'wrong length');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('anonymous LDAPv3 bind', function(t) {
|
||||
var BIND = new Buffer(14);
|
||||
BIND[0] = 0x30; // Sequence
|
||||
BIND[1] = 12; // len
|
||||
BIND[2] = 0x02; // ASN.1 Integer
|
||||
BIND[3] = 1; // len
|
||||
BIND[4] = 0x04; // msgid (make up 4)
|
||||
BIND[5] = 0x60; // Bind Request
|
||||
BIND[6] = 7; // len
|
||||
BIND[7] = 0x02; // ASN.1 Integer
|
||||
BIND[8] = 1; // len
|
||||
BIND[9] = 0x03; // v3
|
||||
BIND[10] = 0x04; // String (bind dn)
|
||||
BIND[11] = 0; // len
|
||||
BIND[12] = 0x80; // ContextSpecific (choice)
|
||||
BIND[13] = 0; // simple bind
|
||||
|
||||
// Start testing ^^
|
||||
var ber = new BerReader(BIND);
|
||||
t.equal(ber.readSequence(), 48, 'Not an ASN.1 Sequence');
|
||||
t.equal(ber.length, 12, 'Message length should be 12');
|
||||
t.equal(ber.readInt(), 4, 'Message id should have been 4');
|
||||
t.equal(ber.readSequence(), 96, 'Bind Request should have been 96');
|
||||
t.equal(ber.length, 7, 'Bind length should have been 7');
|
||||
t.equal(ber.readInt(), 3, 'LDAP version should have been 3');
|
||||
t.equal(ber.readString(), '', 'Bind DN should have been empty');
|
||||
t.equal(ber.length, 0, 'string length should have been 0');
|
||||
t.equal(ber.readByte(), 0x80, 'Should have been ContextSpecific (choice)');
|
||||
t.equal(ber.readByte(), 0, 'Should have been simple bind');
|
||||
t.equal(null, ber.readByte(), 'Should be out of data');
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('long string', function(t) {
|
||||
var buf = new Buffer(256);
|
||||
var o;
|
||||
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 ' +
|
||||
'Teena Vradmin\'s description.';
|
||||
buf[0] = 0x04;
|
||||
buf[1] = 0x81;
|
||||
buf[2] = 0x94;
|
||||
buf.write(s, 3);
|
||||
var ber = new BerReader(buf.slice(0, 3 + s.length));
|
||||
t.equal(ber.readString(), s);
|
||||
t.end();
|
||||
});
|
370
node_modules/asn1/tst/ber/writer.test.js
generated
vendored
Normal file
370
node_modules/asn1/tst/ber/writer.test.js
generated
vendored
Normal file
@ -0,0 +1,370 @@
|
||||
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
|
||||
|
||||
var test = require('tap').test;
|
||||
var sys = require('sys');
|
||||
|
||||
///--- Globals
|
||||
|
||||
var BerWriter;
|
||||
|
||||
var BerReader;
|
||||
|
||||
|
||||
///--- Tests
|
||||
|
||||
test('load library', function(t) {
|
||||
BerWriter = require('../../lib/index').BerWriter;
|
||||
t.ok(BerWriter);
|
||||
t.ok(new BerWriter());
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write byte', function(t) {
|
||||
var writer = new BerWriter();
|
||||
|
||||
writer.writeByte(0xC2);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
t.equal(ber.length, 1, 'Wrong length');
|
||||
t.equal(ber[0], 0xC2, 'value wrong');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write 1 byte int', function(t) {
|
||||
var writer = new BerWriter();
|
||||
|
||||
writer.writeInt(0x7f);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
t.equal(ber.length, 3, 'Wrong length for an int: ' + ber.length);
|
||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong (2) -> ' + ber[0]);
|
||||
t.equal(ber[1], 0x01, 'length wrong(1) -> ' + ber[1]);
|
||||
t.equal(ber[2], 0x7f, 'value wrong(3) -> ' + ber[2]);
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write 2 byte int', function(t) {
|
||||
var writer = new BerWriter();
|
||||
|
||||
writer.writeInt(0x7ffe);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
t.equal(ber.length, 4, 'Wrong length for an int');
|
||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
|
||||
t.equal(ber[1], 0x02, 'length wrong');
|
||||
t.equal(ber[2], 0x7f, 'value wrong (byte 1)');
|
||||
t.equal(ber[3], 0xfe, 'value wrong (byte 2)');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write 3 byte int', function(t) {
|
||||
var writer = new BerWriter();
|
||||
|
||||
writer.writeInt(0x7ffffe);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
t.equal(ber.length, 5, 'Wrong length for an int');
|
||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
|
||||
t.equal(ber[1], 0x03, 'length wrong');
|
||||
t.equal(ber[2], 0x7f, 'value wrong (byte 1)');
|
||||
t.equal(ber[3], 0xff, 'value wrong (byte 2)');
|
||||
t.equal(ber[4], 0xfe, 'value wrong (byte 3)');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write 4 byte int', function(t) {
|
||||
var writer = new BerWriter();
|
||||
|
||||
writer.writeInt(0x7ffffffe);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
|
||||
t.equal(ber.length, 6, 'Wrong length for an int');
|
||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
|
||||
t.equal(ber[1], 0x04, 'length wrong');
|
||||
t.equal(ber[2], 0x7f, 'value wrong (byte 1)');
|
||||
t.equal(ber[3], 0xff, 'value wrong (byte 2)');
|
||||
t.equal(ber[4], 0xff, 'value wrong (byte 3)');
|
||||
t.equal(ber[5], 0xfe, 'value wrong (byte 4)');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write 1 byte negative int', function(t) {
|
||||
var writer = new BerWriter();
|
||||
|
||||
writer.writeInt(-128);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
|
||||
t.equal(ber.length, 3, 'Wrong length for an int');
|
||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
|
||||
t.equal(ber[1], 0x01, 'length wrong');
|
||||
t.equal(ber[2], 0x80, 'value wrong (byte 1)');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write 2 byte negative int', function(t) {
|
||||
var writer = new BerWriter();
|
||||
|
||||
writer.writeInt(-22400);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
|
||||
t.equal(ber.length, 4, 'Wrong length for an int');
|
||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
|
||||
t.equal(ber[1], 0x02, 'length wrong');
|
||||
t.equal(ber[2], 0xa8, 'value wrong (byte 1)');
|
||||
t.equal(ber[3], 0x80, 'value wrong (byte 2)');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write 3 byte negative int', function(t) {
|
||||
var writer = new BerWriter();
|
||||
|
||||
writer.writeInt(-481653);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
|
||||
t.equal(ber.length, 5, 'Wrong length for an int');
|
||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
|
||||
t.equal(ber[1], 0x03, 'length wrong');
|
||||
t.equal(ber[2], 0xf8, 'value wrong (byte 1)');
|
||||
t.equal(ber[3], 0xa6, 'value wrong (byte 2)');
|
||||
t.equal(ber[4], 0x8b, 'value wrong (byte 3)');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write 4 byte negative int', function(t) {
|
||||
var writer = new BerWriter();
|
||||
|
||||
writer.writeInt(-1522904131);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
|
||||
t.equal(ber.length, 6, 'Wrong length for an int');
|
||||
t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
|
||||
t.equal(ber[1], 0x04, 'length wrong');
|
||||
t.equal(ber[2], 0xa5, 'value wrong (byte 1)');
|
||||
t.equal(ber[3], 0x3a, 'value wrong (byte 2)');
|
||||
t.equal(ber[4], 0x53, 'value wrong (byte 3)');
|
||||
t.equal(ber[5], 0xbd, 'value wrong (byte 4)');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write boolean', function(t) {
|
||||
var writer = new BerWriter();
|
||||
|
||||
writer.writeBoolean(true);
|
||||
writer.writeBoolean(false);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
t.equal(ber.length, 6, 'Wrong length');
|
||||
t.equal(ber[0], 0x01, 'tag wrong');
|
||||
t.equal(ber[1], 0x01, 'length wrong');
|
||||
t.equal(ber[2], 0xff, 'value wrong');
|
||||
t.equal(ber[3], 0x01, 'tag wrong');
|
||||
t.equal(ber[4], 0x01, 'length wrong');
|
||||
t.equal(ber[5], 0x00, 'value wrong');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('write string', function(t) {
|
||||
var writer = new BerWriter();
|
||||
writer.writeString('hello world');
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
t.equal(ber.length, 13, 'wrong length');
|
||||
t.equal(ber[0], 0x04, 'wrong tag');
|
||||
t.equal(ber[1], 11, 'wrong length');
|
||||
t.equal(ber.slice(2).toString('utf8'), 'hello world', 'wrong value');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
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]);
|
||||
writer.writeBuffer(buf.slice(2, buf.length), 0x04);
|
||||
ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
t.equal(ber.length, 26, 'wrong length');
|
||||
t.equal(ber[0], 0x04, 'wrong tag');
|
||||
t.equal(ber[1], 11, 'wrong length');
|
||||
t.equal(ber.slice(2, 13).toString('utf8'), 'hello world', 'wrong value');
|
||||
t.equal(ber[13], buf[0], 'wrong tag');
|
||||
t.equal(ber[14], buf[1], 'wrong length');
|
||||
for (var i = 13, j = 0; i < ber.length && j < buf.length; i++, j++) {
|
||||
t.equal(ber[i], buf[j], 'buffer contents not identical');
|
||||
}
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('write string array', function(t) {
|
||||
var writer = new BerWriter();
|
||||
writer.writeStringArray(['hello world', 'fubar!']);
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
|
||||
t.equal(ber.length, 21, 'wrong length');
|
||||
t.equal(ber[0], 0x04, 'wrong tag');
|
||||
t.equal(ber[1], 11, 'wrong length');
|
||||
t.equal(ber.slice(2, 13).toString('utf8'), 'hello world', 'wrong value');
|
||||
|
||||
t.equal(ber[13], 0x04, 'wrong tag');
|
||||
t.equal(ber[14], 6, 'wrong length');
|
||||
t.equal(ber.slice(15).toString('utf8'), 'fubar!', 'wrong value');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('resize internal buffer', function(t) {
|
||||
var writer = new BerWriter({size: 2});
|
||||
writer.writeString('hello world');
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
t.equal(ber.length, 13, 'wrong length');
|
||||
t.equal(ber[0], 0x04, 'wrong tag');
|
||||
t.equal(ber[1], 11, 'wrong length');
|
||||
t.equal(ber.slice(2).toString('utf8'), 'hello world', 'wrong value');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('sequence', function(t) {
|
||||
var writer = new BerWriter({size: 25});
|
||||
writer.startSequence();
|
||||
writer.writeString('hello world');
|
||||
writer.endSequence();
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
console.log(ber);
|
||||
t.equal(ber.length, 15, 'wrong length');
|
||||
t.equal(ber[0], 0x30, 'wrong tag');
|
||||
t.equal(ber[1], 13, 'wrong length');
|
||||
t.equal(ber[2], 0x04, 'wrong tag');
|
||||
t.equal(ber[3], 11, 'wrong length');
|
||||
t.equal(ber.slice(4).toString('utf8'), 'hello world', 'wrong value');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('nested sequence', function(t) {
|
||||
var writer = new BerWriter({size: 25});
|
||||
writer.startSequence();
|
||||
writer.writeString('hello world');
|
||||
writer.startSequence();
|
||||
writer.writeString('hello world');
|
||||
writer.endSequence();
|
||||
writer.endSequence();
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
t.equal(ber.length, 30, 'wrong length');
|
||||
t.equal(ber[0], 0x30, 'wrong tag');
|
||||
t.equal(ber[1], 28, 'wrong length');
|
||||
t.equal(ber[2], 0x04, 'wrong tag');
|
||||
t.equal(ber[3], 11, 'wrong length');
|
||||
t.equal(ber.slice(4, 15).toString('utf8'), 'hello world', 'wrong value');
|
||||
t.equal(ber[15], 0x30, 'wrong tag');
|
||||
t.equal(ber[16], 13, 'wrong length');
|
||||
t.equal(ber[17], 0x04, 'wrong tag');
|
||||
t.equal(ber[18], 11, 'wrong length');
|
||||
t.equal(ber.slice(19, 30).toString('utf8'), 'hello world', 'wrong value');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('LDAP bind message', function(t) {
|
||||
var dn = 'cn=foo,ou=unit,o=test';
|
||||
var writer = new BerWriter();
|
||||
writer.startSequence();
|
||||
writer.writeInt(3); // msgid = 3
|
||||
writer.startSequence(0x60); // ldap bind
|
||||
writer.writeInt(3); // ldap v3
|
||||
writer.writeString(dn);
|
||||
writer.writeByte(0x80);
|
||||
writer.writeByte(0x00);
|
||||
writer.endSequence();
|
||||
writer.endSequence();
|
||||
var ber = writer.buffer;
|
||||
|
||||
t.ok(ber);
|
||||
t.equal(ber.length, 35, 'wrong length (buffer)');
|
||||
t.equal(ber[0], 0x30, 'wrong tag');
|
||||
t.equal(ber[1], 33, 'wrong length');
|
||||
t.equal(ber[2], 0x02, 'wrong tag');
|
||||
t.equal(ber[3], 1, 'wrong length');
|
||||
t.equal(ber[4], 0x03, 'wrong value');
|
||||
t.equal(ber[5], 0x60, 'wrong tag');
|
||||
t.equal(ber[6], 28, 'wrong length');
|
||||
t.equal(ber[7], 0x02, 'wrong tag');
|
||||
t.equal(ber[8], 1, 'wrong length');
|
||||
t.equal(ber[9], 0x03, 'wrong value');
|
||||
t.equal(ber[10], 0x04, 'wrong tag');
|
||||
t.equal(ber[11], dn.length, 'wrong length');
|
||||
t.equal(ber.slice(12, 33).toString('utf8'), dn, 'wrong value');
|
||||
t.equal(ber[33], 0x80, 'wrong tag');
|
||||
t.equal(ber[34], 0x00, 'wrong len');
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
|
||||
test('Write OID', function(t) {
|
||||
var oid = '1.2.840.113549.1.1.1';
|
||||
var writer = new BerWriter();
|
||||
writer.writeOID(oid);
|
||||
|
||||
var ber = writer.buffer;
|
||||
t.ok(ber);
|
||||
console.log(require('util').inspect(ber));
|
||||
console.log(require('util').inspect(new Buffer([0x06, 0x09, 0x2a, 0x86,
|
||||
0x48, 0x86, 0xf7, 0x0d,
|
||||
0x01, 0x01, 0x01])));
|
||||
|
||||
t.end();
|
||||
});
|
Reference in New Issue
Block a user