62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
'use strict'
|
|
|
|
const { BerReader } = require('@ldapjs/asn1')
|
|
|
|
const isValidHexCode = code => /[0-9a-fA-F]{2}/.test(code) === true
|
|
|
|
/**
|
|
* @typedef {object} ReadHexStringResult
|
|
* @property {number} endPos The position in the buffer where the end of the
|
|
* hex string was encountered.
|
|
* @property {import('@ldapjs/asn1').BerReader} berReader The parsed hex string
|
|
* as an BER object.
|
|
*/
|
|
|
|
/**
|
|
* Read a sequence of bytes as a hex encoded octet string. The sequence is
|
|
* assumed to be a spec compliant encoded BER object.
|
|
*
|
|
* @param {Buffer} searchBuffer The buffer to read.
|
|
* @param {number} startPos The position in the buffer to start reading from.
|
|
*
|
|
* @returns {ReadHexStringResult}
|
|
*
|
|
* @throws When an invalid hex pair has been encountered.
|
|
*/
|
|
module.exports = function readHexString ({ searchBuffer, startPos }) {
|
|
const bytes = []
|
|
|
|
let pos = startPos
|
|
while (pos < searchBuffer.byteLength) {
|
|
if (isEndChar(searchBuffer[pos])) {
|
|
break
|
|
}
|
|
|
|
const hexPair = String.fromCharCode(searchBuffer[pos]) +
|
|
String.fromCharCode(searchBuffer[pos + 1])
|
|
if (isValidHexCode(hexPair) === false) {
|
|
throw Error('invalid hex pair encountered: 0x' + hexPair)
|
|
}
|
|
|
|
bytes.push(parseInt(hexPair, 16))
|
|
pos += 2
|
|
}
|
|
|
|
return {
|
|
endPos: pos,
|
|
berReader: new BerReader(Buffer.from(bytes))
|
|
}
|
|
}
|
|
|
|
function isEndChar (c) {
|
|
switch (c) {
|
|
case 0x20: // space
|
|
case 0x2b: // +
|
|
case 0x2c: // ,
|
|
case 0x3b: // ;
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|