300 lines
10 KiB
JavaScript
300 lines
10 KiB
JavaScript
|
|
||
|
var asn1 = require("../")
|
||
|
var assert = require("assert")
|
||
|
|
||
|
var BerReader = asn1.BerReader
|
||
|
|
||
|
describe("lib/ber/reader.js", function() {
|
||
|
describe("readByte()", function() {
|
||
|
it("can read a value", function() {
|
||
|
var reader = new BerReader(Buffer.from([0xde]))
|
||
|
assert.equal(reader.readByte(), 0xde)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe("readInt()", function() {
|
||
|
it("can read zero", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x01, 0x00]))
|
||
|
assert.equal(reader.readInt(), 0)
|
||
|
assert.equal(reader.length, 1)
|
||
|
})
|
||
|
|
||
|
it("can read a 1 byte positive integer - lowest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x01, 0x01]))
|
||
|
assert.equal(reader.readInt(), 1)
|
||
|
assert.equal(reader.length, 1)
|
||
|
})
|
||
|
|
||
|
it("can read a 1 byte positive integer - middle", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x01, 0x34]))
|
||
|
assert.equal(reader.readInt(), 52)
|
||
|
assert.equal(reader.length, 1)
|
||
|
})
|
||
|
|
||
|
it("can read a 1 byte positive integer - highest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x01, 0x7f]))
|
||
|
assert.equal(reader.readInt(), 127)
|
||
|
assert.equal(reader.length, 1)
|
||
|
})
|
||
|
|
||
|
it("can read a 2 byte positive integer - lowest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x02, 0x00, 0x80]))
|
||
|
assert.equal(reader.readInt(), 128)
|
||
|
assert.equal(reader.length, 2)
|
||
|
})
|
||
|
|
||
|
it("can read a 2 byte positive integer - middle", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x02, 0x7e, 0xde]))
|
||
|
assert.equal(reader.readInt(), 0x7ede)
|
||
|
assert.equal(reader.length, 2)
|
||
|
})
|
||
|
|
||
|
it("can read a 2 byte positive integer - highest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x02, 0x7f, 0xff]))
|
||
|
assert.equal(reader.readInt(), 32767)
|
||
|
assert.equal(reader.length, 2)
|
||
|
})
|
||
|
|
||
|
it("can read a 3 byte positive integer - lowest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x03, 0x00, 0x80, 0x00]))
|
||
|
assert.equal(reader.readInt(), 32768)
|
||
|
assert.equal(reader.length, 3)
|
||
|
})
|
||
|
|
||
|
it("can read a 3 byte positive integer - middle", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x03, 0x7e, 0xde, 0x03]))
|
||
|
assert.equal(reader.readInt(), 8314371)
|
||
|
assert.equal(reader.length, 3)
|
||
|
})
|
||
|
|
||
|
it("can read a 3 byte positive integer - highest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x03, 0x7e, 0xde, 0x03]))
|
||
|
assert.equal(reader.readInt(), 0x7ede03)
|
||
|
assert.equal(reader.length, 0x03)
|
||
|
})
|
||
|
|
||
|
it("can read a 4 byte positive integer - lowest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x04, 0x00, 0x80, 0x00, 0x00]))
|
||
|
assert.equal(reader.readInt(), 8388608)
|
||
|
assert.equal(reader.length, 4)
|
||
|
})
|
||
|
|
||
|
it("can read a 4 byte positive integer - middle", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x04, 0x7e, 0xde, 0x03, 0x01]))
|
||
|
assert.equal(reader.readInt(), 2128478977)
|
||
|
assert.equal(reader.length, 4)
|
||
|
})
|
||
|
|
||
|
it("can read a 4 byte positive integer - highest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x04, 0x7f, 0xff, 0xff, 0xff]))
|
||
|
assert.equal(reader.readInt(), 2147483647)
|
||
|
assert.equal(reader.length, 4)
|
||
|
})
|
||
|
|
||
|
it("can read a 5 byte positive integer - lowest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00]))
|
||
|
assert.equal(reader.readInt(), 2147483648)
|
||
|
assert.equal(reader.length, 5)
|
||
|
})
|
||
|
|
||
|
it("can read a 5 byte positive integer - middle", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x05, 0x00, 0x8b, 0xde, 0x03, 0x01]))
|
||
|
assert.equal(reader.readInt(), 2346582785)
|
||
|
assert.equal(reader.length, 5)
|
||
|
})
|
||
|
|
||
|
it("can read a 5 byte positive integer - highest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x05, 0x00, 0xff, 0xff, 0xff, 0xff]))
|
||
|
assert.equal(reader.readInt(), 4294967295)
|
||
|
assert.equal(reader.length, 5)
|
||
|
})
|
||
|
|
||
|
it("can read a 1 byte negative integer - lowest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x01, 0x80]))
|
||
|
assert.equal(reader.readInt(), -128)
|
||
|
assert.equal(reader.length, 1)
|
||
|
})
|
||
|
|
||
|
it("can read a 1 byte negative integer - middle", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x01, 0xdc]))
|
||
|
assert.equal(reader.readInt(), -36)
|
||
|
assert.equal(reader.length, 1)
|
||
|
})
|
||
|
|
||
|
it("can read a 1 byte negative integer - highest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x01, 0xff]))
|
||
|
assert.equal(reader.readInt(), -1)
|
||
|
assert.equal(reader.length, 1)
|
||
|
})
|
||
|
|
||
|
it("can read a 2 byte negative integer - lowest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x02, 0x80, 0x00]))
|
||
|
assert.equal(reader.readInt(), -32768)
|
||
|
assert.equal(reader.length, 2)
|
||
|
})
|
||
|
|
||
|
it("can read a 2 byte negative integer - middle", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x02, 0xc0, 0x4e]))
|
||
|
assert.equal(reader.readInt(), -16306)
|
||
|
assert.equal(reader.length, 2)
|
||
|
})
|
||
|
|
||
|
it("can read a 2 byte negative integer - highest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x02, 0xff, 0x7f]))
|
||
|
assert.equal(reader.readInt(), -129)
|
||
|
assert.equal(reader.length, 2)
|
||
|
})
|
||
|
|
||
|
it("can read a 3 byte negative integer - lowest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x03, 0x80, 0x00, 0x00]))
|
||
|
assert.equal(reader.readInt(), -8388608)
|
||
|
assert.equal(reader.length, 3)
|
||
|
})
|
||
|
|
||
|
it("can read a 3 byte negative integer - middle", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x03, 0xff, 0x00, 0x19]))
|
||
|
assert.equal(reader.readInt(), -65511)
|
||
|
assert.equal(reader.length, 3)
|
||
|
})
|
||
|
|
||
|
it("can read a 3 byte negative integer - highest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x03, 0xff, 0x7f, 0xff]))
|
||
|
assert.equal(reader.readInt(), -32769)
|
||
|
assert.equal(reader.length, 3)
|
||
|
})
|
||
|
|
||
|
it("can read a 4 byte negative integer - lowest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x04, 0x80, 0x00, 0x00, 0x00]))
|
||
|
assert.equal(reader.readInt(), -2147483648)
|
||
|
assert.equal(reader.length, 4)
|
||
|
})
|
||
|
|
||
|
it("can read a 4 byte negative integer - middle", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x04, 0x91, 0x7c, 0x22, 0x1f]))
|
||
|
assert.equal(reader.readInt(), -1854135777)
|
||
|
assert.equal(reader.length, 4)
|
||
|
})
|
||
|
|
||
|
it("can read a 4 byte negative integer - highest", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x02, 0x04, 0xff, 0x7f, 0xff, 0xff]))
|
||
|
assert.equal(reader.readInt(), -8388609)
|
||
|
assert.equal(reader.length, 4)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe("readBoolean()", function() {
|
||
|
it("can read a true value", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x01, 0x01, 0xff]))
|
||
|
assert.equal(reader.readBoolean(), true)
|
||
|
assert.equal(reader.length, 0x01)
|
||
|
})
|
||
|
|
||
|
it("can read a false value", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x01, 0x01, 0x00]))
|
||
|
assert.equal(reader.readBoolean(), false)
|
||
|
assert.equal(reader.length, 0x01)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe("readEnumeration()", function() {
|
||
|
it("can read a value", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x0a, 0x01, 0x20]))
|
||
|
assert.equal(reader.readEnumeration(), 0x20, 'wrong value')
|
||
|
assert.equal(reader.length, 0x01, 'wrong length')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe("readOID()", function() {
|
||
|
it("does not convert to unsigned", function() {
|
||
|
// Make sure 2887117176 is NOT converted to -1407850120
|
||
|
var buffer = Buffer.from([6, 18, 43, 6, 1, 4, 1, 245, 12, 1, 1, 5, 1, 1, 19, 138, 224, 215, 210, 120])
|
||
|
var reader = new BerReader(buffer)
|
||
|
assert.equal(reader.readOID(), "1.3.6.1.4.1.14988.1.1.5.1.1.19.2887117176")
|
||
|
assert.equal(reader.length, 18)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe("readString()", function() {
|
||
|
it("can read a value", function() {
|
||
|
var string = 'cn=foo,ou=unit,o=test'
|
||
|
var buffer = Buffer.alloc(string.length + 2)
|
||
|
buffer[0] = 0x04
|
||
|
buffer[1] = Buffer.byteLength(string)
|
||
|
buffer.write(string, 2)
|
||
|
|
||
|
var reader = new BerReader(buffer)
|
||
|
assert.equal(reader.readString(), string)
|
||
|
assert.equal(reader.length, string.length)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe("readSequence()", function() {
|
||
|
it("can read a sequence", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x30, 0x03, 0x01, 0x01, 0xff]))
|
||
|
assert.equal(reader.readSequence(), 0x30)
|
||
|
assert.equal(reader.length, 0x03)
|
||
|
assert.equal(reader.readBoolean(), true)
|
||
|
assert.equal(reader.length, 0x01)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe("readBitString()", function() {
|
||
|
it("can read a bit string", function() {
|
||
|
var reader = new BerReader(Buffer.from([0x03, 0x07, 0x04, 0x0a, 0x3b, 0x5f, 0x29, 0x1c, 0xd0]))
|
||
|
assert.equal(reader.readBitString(), '00001010001110110101111100101001000111001101')
|
||
|
assert.equal(reader.length, 7)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe("complex sequences", function() {
|
||
|
it("are processed correctly", function() {
|
||
|
var buffer = Buffer.alloc(14);
|
||
|
|
||
|
// An anonymous LDAP v3 BIND request
|
||
|
buffer[0] = 0x30 // Sequence
|
||
|
buffer[1] = 12 // len
|
||
|
buffer[2] = 0x02 // ASN.1 Integer
|
||
|
buffer[3] = 1 // len
|
||
|
buffer[4] = 0x04 // msgid (make up 4)
|
||
|
buffer[5] = 0x60 // Bind Request
|
||
|
buffer[6] = 7 // len
|
||
|
buffer[7] = 0x02 // ASN.1 Integer
|
||
|
buffer[8] = 1 // len
|
||
|
buffer[9] = 0x03 // v3
|
||
|
buffer[10] = 0x04 // String (bind dn)
|
||
|
buffer[11] = 0 // len
|
||
|
buffer[12] = 0x80 // ContextSpecific (choice)
|
||
|
buffer[13] = 0 // simple bind
|
||
|
|
||
|
var reader = new BerReader(buffer)
|
||
|
assert.equal(reader.readSequence(), 48)
|
||
|
assert.equal(reader.length, 12)
|
||
|
assert.equal(reader.readInt(), 4)
|
||
|
assert.equal(reader.readSequence(), 96)
|
||
|
assert.equal(reader.length, 7)
|
||
|
assert.equal(reader.readInt(), 3)
|
||
|
assert.equal(reader.readString(), "")
|
||
|
assert.equal(reader.length, 0)
|
||
|
assert.equal(reader.readByte(), 0x80)
|
||
|
assert.equal(reader.readByte(), 0)
|
||
|
assert.equal(null, reader.readByte())
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe("long strings", function() {
|
||
|
it("can be parsed", function() {
|
||
|
var buffer = Buffer.alloc(256)
|
||
|
var string = "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."
|
||
|
buffer[0] = 0x04
|
||
|
buffer[1] = 0x81
|
||
|
buffer[2] = 0x94
|
||
|
buffer.write(string, 3)
|
||
|
|
||
|
var reader = new BerReader(buffer.slice(0, 3 + string.length));
|
||
|
assert.equal(reader.readString(), string)
|
||
|
})
|
||
|
})
|
||
|
})
|