Files
ldap-to-oauth2/node_modules/@ldapjs/dn/lib/utils/parse-string/read-hex-string.js
2025-10-08 11:12:59 -04:00

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
}
}