/* * Copyright 2018 Scytl Secure Electronic Voting SA * * All rights reserved * * See our extended copyright notice in *file 'Copyright.txt' which is part of this source code package */ /* jshint node:true */ 'use strict'; var forge = require('node-forge'); /** * Codec for converting between various types of data. */ module.exports = { /** * UTF-8 encodes a string. * * @function utf8Encode * @param {string} * str The string to UTF-8 encode. * @returns {Uint8Array} The UTF-8 encoded string. */ utf8Encode: function(str) { return this.binaryDecode(forge.util.encodeUtf8(str)); }, /** * UTF-8 decodes an encoded string. * * @function utf8Decode * @param {Uint8Array} * encoded The encoded string to UTF-8 decode. * @returns {string} The UTF-8 decoded string. */ utf8Decode: function(encoded) { return forge.util.decodeUtf8(this.binaryEncode(encoded)); }, /** * Converts a BigInteger object to bytes. * * @function bigIntegerToBytes * @param {forge.jsbn.BigInteger} * bigInt The BigInteger object to convert. * @returns {Uint8Array} The bytes from the conversion. */ bigIntegerToBytes: function(bigInt) { return new Uint8Array(bigInt.toByteArray()); }, /** * Converts some bytes to a BigInteger object. * * @function bytesToBigInteger * @param {Uint8Array} * bytes The bytes to convert. * @returns {forge.jsbn.BigInteger} The BigInteger object from the * conversion. */ bytesToBigInteger: function(bytes) { var hex = this.hexEncode(bytes); return new forge.jsbn.BigInteger(hex, 16); }, /** * Base64 encodes some data. *

* NOTE: Input of type string will be UTF-8 encoded. * * @function base64Encode * @param {Uint8Array|string|BigInteger} * data The data to Base64 encode. * @param {Object} * [options] An object containing optional arguments. * @param {number} * [options.lineLength=No line breaks] The line length of the * result. * @returns {string} The Base64 encoded data. */ base64Encode: function(data, options) { options = options || {}; if (typeof data === 'string') { data = this.utf8Encode(data); } else if (!(data instanceof Uint8Array)) { data = this.bigIntegerToBytes(data); } if (typeof options.lineLength === 'undefined') { return forge.util.binary.base64.encode(data); } else { return forge.util.binary.base64.encode(data, options.lineLength); } }, /** * Base64 decodes some encoded data. *

* NOTE: To retrieve data of type string, apply method * utf8Decode to result. *

* NOTE: To retrieve data of type BigInteger, apply method * bytesToBigInteger to result. * * @function base64Decode * @param {string} * baseB64 The encoded data to Base64 decode. * @returns {Uint8Array} The Base64 decoded data. */ base64Decode: function(baseB64) { return new Uint8Array(forge.util.binary.base64.decode(baseB64)); }, /** * Hexadecimally encodes some data. *

* NOTE: Input of type string will be UTF-8 encoded. * * @function hexEncode * @param {Uint8Array|string|BigInteger} * data The data to hexadecimally encode. * @returns {string} The hexadecimally encoded data. */ hexEncode: function(data) { if (data instanceof Uint8Array) { return forge.util.binary.hex.encode(data); } else if (typeof data === 'string') { return forge.util.binary.hex.encode(this.utf8Encode(data)); } else { var bytes = this.bigIntegerToBytes(data); return forge.util.binary.hex.encode(bytes); } }, /** * Hexadecimally decodes some encoded data. *

* NOTE: To retrieve data of type string, apply method * utf8Decode to result. *

* NOTE: To retrieve data of type BigInteger, apply method * bytesToBigInteger to result. * * @function hexDecode * @param {string} * hex The encoded data to hexadecimally decode. * @returns {Uint8Array} The hexadecimally decoded data. */ hexDecode: function(hex) { return forge.util.binary.hex.decode(hex); }, /** * Binary encodes some bytes. This method is only intended for internal use. * * @function binaryEncode * @deprecated Use Uint8Array objects instead of binary encodings to * represent bytes. * @private * @param {Uint8Array|byte[]} * byteArray The bytes to binary encode. * @returns {string} The binary encoded bytes. */ binaryEncode: function(bytes) { var encoded = ''; for (var i = 0; i < bytes.length; i++) { encoded += String.fromCharCode(bytes[i]); } return encoded; }, /** * Binary decodes some encoded bytes. This method is only intended for * internal use. * * @function binaryDecode * @deprecated Use Uint8Array objects instead of binary encodings to * represent bytes. * @private * @param {string} * encoded The encoded bytes to binary decode. * @returns {Uint8Array} The binary decoded bytes. */ binaryDecode: function(encoded) { var byteArray = []; for (var i = 0; i < encoded.length; i++) { byteArray.push(encoded.charCodeAt(i)); } return new Uint8Array(byteArray); } };