| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- /*
- * Copyright (c) 2014-2015 Sylvain Peyrefitte
- *
- * This file is part of node-rdpjs.
- *
- * node-rdpjs is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- var type = require('../../core').type;
- var error = require('../../core').error;
- /**
- * @param s {type.Stream} read value from stream
- * @returns read length from per format
- */
- function readLength(s) {
- var byte = new type.UInt8().read(s).value;
- var size = 0;
- if(byte & 0x80) {
- byte &= ~0x80;
- size = byte << 8;
- size += new type.UInt8().read(s).value;
- }
- else {
- size = byte;
- }
- return size;
- }
- /**
- * @param value {raw} value to convert to per format
- * @returns type objects per encoding value
- */
- function writeLength(value) {
- if(value > 0x7f) {
- return new type.UInt16Be(value | 0x8000);
- }
- else {
- return new type.UInt8(value);
- }
- }
- /**
- * @param s {type.Stream}
- * @returns {integer} choice decoding from per encoding
- */
- function readChoice(s) {
- return new type.UInt8().read(s).value;
- }
- /**
- * @param choice {integer}
- * @returns {type.UInt8} choice per encoded
- */
- function writeChoice(choice) {
- return new type.UInt8(choice);
- }
- /**
- * @param s {type.Stream}
- * @returns {integer} number represent selection
- */
- function readSelection(s) {
- return new type.UInt8().read(s).value;
- }
- /**
- * @param selection {integer}
- * @returns {type.UInt8} per encoded selection
- */
- function writeSelection(selection) {
- return new type.UInt8(selection);
- }
- /**
- * @param s {type.Stream}
- * @returns {integer} number of sets
- */
- function readNumberOfSet(s) {
- return new type.UInt8().read(s).value;
- }
- /**
- * @param numberOfSet {integer}
- * @returns {type.UInt8} per encoded nuimber of sets
- */
- function writeNumberOfSet(numberOfSet) {
- return new type.UInt8(numberOfSet);
- }
- /**
- * @param s {type.Stream}
- * @returns {integer} enumerates number
- */
- function readEnumerates(s) {
- return new type.UInt8().read(s).value;
- }
- /**
- * @param enumerate {integer}
- * @returns {type.UInt8} per encoded enumerate
- */
- function writeEnumerates(enumerate) {
- return new type.UInt8(enumerate);
- }
- /**
- * @param s {type.Stream}
- * @returns {integer} integer per decoded
- */
- function readInteger(s) {
- var result;
- var size = readLength(s);
- switch(size) {
- case 1:
- result = new type.UInt8();
- break;
- case 2:
- result = new type.UInt16Be();
- break;
- case 4:
- result = new type.UInt32Be();
- break;
- default:
- throw new error.UnexpectedFatalError('NODE_RDP_PROTOCOL_T125_PER_BAD_INTEGER_LENGTH');
- }
- return result.read(s).value;
- }
- /**
- * @param value {integer}
- * @returns {type.Component} per encoded integer
- */
- function writeInteger(value) {
- if(value <= 0xff) {
- return new type.Component([writeLength(1), new type.UInt8(value)]);
- }
- else if(value < 0xffff) {
- return new type.Component([writeLength(2), new type.UInt16Be(value)]);
- }
- else {
- return new type.Component([writeLength(4), new type.UInt32Be(value)]);
- }
- }
- /**
- * @param s {type.Stream}
- * @param minimum {integer} increment (default 0)
- * @returns {integer} per decoded integer 16 bits
- */
- function readInteger16(s, minimum) {
- return new type.UInt16Be().read(s).value + (minimum || 0);
- }
- /**
- * @param value {integer}
- * @param minimum {integer} decrement (default 0)
- * @returns {type.UInt16Be} per encoded integer 16 bits
- */
- function writeInteger16(value, minimum) {
- return new type.UInt16Be(value - (minimum || 0));
- }
- /**
- * Check object identifier
- * @param s {type.Stream}
- * @param oid {array} object identifier to check
- */
- function readObjectIdentifier(s, oid) {
- var size = readLength(s);
- if(size !== 5) {
- return false;
- }
- var a_oid = [0, 0, 0, 0, 0, 0];
- var t12 = new type.UInt8().read(s).value;
- a_oid[0] = t12 >> 4;
- a_oid[1] = t12 & 0x0f;
- a_oid[2] = new type.UInt8().read(s).value;
- a_oid[3] = new type.UInt8().read(s).value;
- a_oid[4] = new type.UInt8().read(s).value;
- a_oid[5] = new type.UInt8().read(s).value;
- for(var i in oid) {
- if(oid[i] !== a_oid[i]) return false;
- }
- return true;
- }
- /**
- * @param oid {array} oid to write
- * @returns {type.Component} per encoded object identifier
- */
- function writeObjectIdentifier(oid) {
- return new type.Component([new type.UInt8(5), new type.UInt8((oid[0] << 4) & (oid[1] & 0x0f)), new type.UInt8(oid[2]), new type.UInt8(oid[3]), new type.UInt8(oid[4]), new type.UInt8(oid[5])]);
- }
- /**
- * Read as padding...
- * @param s {type.Stream}
- * @param minValue
- */
- function readNumericString(s, minValue) {
- var length = readLength(s);
- length = (length + minValue + 1) / 2;
- s.readPadding(length);
- }
- /**
- * @param nStr {String}
- * @param minValue {integer}
- * @returns {type.Component} per encoded numeric string
- */
- function writeNumericString(nStr, minValue) {
- var length = nStr.length;
- var mlength = minValue;
- if(length - minValue >= 0) {
- mlength = length - minValue;
- }
-
- var result = [];
-
- for(var i = 0; i < length; i += 2) {
- var c1 = nStr.charCodeAt(i);
- var c2 = 0;
- if(i + 1 < length) {
- c2 = nStr.charCodeAt(i + 1);
- }
- else {
- c2 = 0x30;
- }
- c1 = (c1 - 0x30) % 10;
- c2 = (c2 - 0x30) % 10;
-
- result[result.length] = new type.UInt8((c1 << 4) | c2);
- }
-
- return new type.Component([writeLength(mlength), new type.Component(result)]);
- }
- /**
- * @param s {type.Stream}
- * @param length {integer} length of padding
- */
- function readPadding(s, length) {
- s.readPadding(length);
- }
- /**
- * @param length {integer} length of padding
- * @returns {type.BinaryString} per encoded padding
- */
- function writePadding(length) {
- return new type.BinaryString(Buffer.from(Array(length + 1).join("\x00")));
- }
- /**
- * @param s {type.Stream}
- * @param octetStream {String}
- * @param minValue {integer} default 0
- * @returns {Boolean} true if read octectStream is equal to octetStream
- */
- function readOctetStream(s, octetStream, minValue) {
- var size = readLength(s) + (minValue || 0);
- if(size !== octetStream.length) {
- return false;
- }
- for(var i = 0; i < size; i++) {
- var c = new type.UInt8().read(s);
- if(octetStream.charCodeAt(i) !== c.value) {
- return false;
- }
- }
-
- return true;
- }
- /**
- * @param oStr {String}
- * @param minValue {integer} default 0
- * @returns {type.Component} per encoded octet stream
- */
- function writeOctetStream(oStr, minValue) {
- minValue = minValue || 0;
- var length = oStr.length;
- var mlength = minValue;
-
- if(length - minValue >= 0) {
- mlength = length - minValue;
- }
-
- result = [];
- for(var i = 0; i < length; i++) {
- result[result.length] = new type.UInt8(oStr[i]);
- }
-
- return new type.Component([writeLength(mlength), new type.Component(result)]);
- }
- /**
- * Module exports
- */
- module.exports = {
- readLength : readLength,
- writeLength : writeLength,
- readChoice : readChoice,
- writeChoice : writeChoice,
- readSelection : readSelection,
- writeSelection : writeSelection,
- readNumberOfSet : readNumberOfSet,
- writeNumberOfSet : writeNumberOfSet,
- readEnumerates : readEnumerates,
- writeEnumerates : writeEnumerates,
- readInteger : readInteger,
- writeInteger : writeInteger,
- readInteger16 : readInteger16,
- writeInteger16 : writeInteger16,
- readObjectIdentifier : readObjectIdentifier,
- writeObjectIdentifier : writeObjectIdentifier,
- readNumericString : readNumericString,
- writeNumericString : writeNumericString,
- readPadding : readPadding,
- writePadding : writePadding,
- readOctetStream : readOctetStream,
- writeOctetStream : writeOctetStream
- };
|