forked from oyooyo/keyble
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkeyble.js.map
13 lines (13 loc) · 58.7 KB
/
keyble.js.map
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"version": 3,
"file": "keyble.js",
"sourceRoot": "",
"sources": [
"keyble.coffee"
],
"names": [],
"mappings": "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",
"sourcesContent": [
"'use strict'\n\n# Checks if <value> is an array. Returns true if it is an array, false otherwise\nis_array = (value) ->\n\tArray.isArray(value)\n\narrays_are_equal = (array1, array2) ->\n\tif (not (is_array(array1) and is_array(array2))) then return false\n\tif (array1 is array2) then return true\n\tif (array1.length isnt array2.length) then return false\n\tfor index in [0...array1.length] by 1\n\t\tif (array1[index] isnt array2[index]) then return false\n\ttrue\n\n# Returns true if the passed argument <value> is neither null nor undefined\nis_valid_value = (value) ->\n\t((value isnt undefined) and (value isnt null))\n\n# Returns the first value in <values...> that is neither null nor undefined\nfirst_valid_value = (values...) ->\n\tfor value in values\n\t\tif is_valid_value(value)\n\t\t\treturn value\n\treturn\n\n# Converts integer value <integer> into a zero-prefixed hexadecimal string of length <number_of_digits>\ninteger_to_zero_prefixed_hex_string = (integer, number_of_digits) ->\n\t('0'.repeat(number_of_digits) + integer.toString(0x10)).slice(-number_of_digits)\n\n# Convert the byte array <byte_array> to a hexadecimal string. Every byte value is converted to a two-digit, zero padded hexadecimal string, prefixed with string <prefix_string> (default:\"\"), suffixed with string <suffix_string> (default:\"\"). All bytes are separated with string <separator_string> (default:\" \")\nbyte_array_to_hex_string = (byte_array, separator_string, prefix_string, suffix_string) ->\n\tseparator_string = first_valid_value(separator_string, ' ')\n\tprefix_string = first_valid_value(prefix_string, '')\n\tsuffix_string = first_valid_value(suffix_string, '')\n\t(\"#{prefix_string}#{integer_to_zero_prefixed_hex_string(byte, 2)}#{suffix_string}\" for byte in byte_array).join(separator_string)\n\nbyte_array_to_integer = (byte_array, start_offset, end_offset) ->\n\tstart_offset = first_valid_value(start_offset, 0)\n\tend_offset = first_valid_value(end_offset, byte_array.length)\n\ttemp = 0\n\tfor offset in [start_offset...end_offset] by 1\n\t\tif offset < 0\n\t\t\toffset += byte_array.length\n\t\ttemp = ((temp * 0x100) + byte_array[offset])\n\ttemp\n\n# Returns true if the bit with index <bit_index> is set in <value>, false otherwise\nbit_is_set = (value, bit_index) ->\n\t((value & (1 << bit_index)) isnt 0)\n\n# Creates and returns mixin function (<object>, <mixin_objects...>) -> that mixins all properties for which <key_filter_function>(<key>, <mixin_object>, <object>) returns true into <object>\nmixin_factory = (key_filter_function) ->\n\t(object, mixin_objects...) ->\n\t\tfor mixin_object in mixin_objects\n\t\t\tif mixin_object\n\t\t\t\tfor key of mixin_object\n\t\t\t\t\tif key_filter_function(key, mixin_object, object)\n\t\t\t\t\t\tobject[key] = mixin_object[key]\n\t\tobject\n\n# (<object>, <mixin_objects...>) -> Mixin all own properties of <mixin_objects...> into <object>\nmixin_own = mixin_factory (key, mixin_object) ->\n\tmixin_object.hasOwnProperty(key)\n\n# A prototype object providing the basic features of extendable classes\nExtendable =\n\textend: (properties) ->\n\t\textended = Object.create(@)\n\t\textended.__super__ = @\n\t\tmixin_own(extended, properties)\n\tcreate: ->\n\t\tinstance = Object.create(@)\n\t\tinstance.__type__ = @\n\t\[email protected](instance, arguments)\n\t\tinstance\n\tinitialize: ->\n\n# An abstract prototype object for message types\nMessage = Extendable.extend\n\tinitialize: (data) ->\n\t\tif is_array(data)\n\t\t\t@data_bytes = data\n\t\telse\n\t\t\t@data_bytes = @encode(data)\n\t\t@data = @decode()\n\t\treturn\n\tdecode: ->\n\t\tdata = {}\n\t\tfor key, value_function of @properties\n\t\t\tdata[key] = value_function.apply(@)\n\t\tdata\n\tencode: -> []\n\tis_secure: ->\n\t\tbit_is_set(@id, 7)\n\tproperties: {}\n\n# Create a new message type with properties <properties>\nmessage_type = (properties) ->\n\tMessage.extend properties\n\n# This class represents \"CLOSE_CONNECTION\" messages; messages sent to the Smart Lock in order to close the connection\n# Java class \"de.eq3.ble.key.android.a.a.o\" in original app\nClose_Connection_Message = message_type\n\tid: 0x06\n\tlabel: 'CLOSE_CONNECTION'\n\n# This class represents \"COMMAND\" messages; messages sent to the Smart Lock requesting to perform one of the three commands/actions (0=Lock, 1=Unlock, 2=Open)\n# Java class \"de.eq3.ble.key.android.a.a.p\" in original app\nCommand_Message = message_type\n\tid: 0x87\n\tlabel: 'COMMAND'\n\tencode: (data) ->\n\t\t[data.command_id]\n\tproperties:\n\t\tcommand_id: -> @data_bytes[0]\n\n# Returns a new array obtained by concatenating all arrays passed as arguments\nconcatenated_array = ->\n\tArray.prototype.concat.apply([], arguments)\n\n# Convert a Buffer instance <buffer> to an array of byte integers\nbuffer_to_byte_array = (buffer) ->\n\t[buffer...]\n\n# AES-128-encrypt <data> (a byte array) with <key> (a byte array), in ECB mode, and return the encrypted data as a byte array\nencrypt_aes_ecb = (data, key) ->\n\taesjs = require('aes-js')\n\tcipher = new aesjs.ModeOfOperation.ecb(key)\n\tbuffer_to_byte_array(cipher.encrypt(data))\n\n# Returns the smallest value equal or larger than <value> that equals (<minimum> + (x * <step>)) for a natural number x\ngeneric_ceil = (value, step, minimum) ->\n\tstep = first_valid_value(step, 1)\n\tminimum = first_valid_value(minimum, 0)\n\t((Math.ceil((value - minimum) / step) * step) + minimum)\n\n# Extract the byte with index <byte_index> from the multi-byte integer value <integer>. 0 is the lowest/least significant byte index\nextract_byte = (integer, byte_index) ->\n\t((integer >> (byte_index * 8)) & 0xFF)\n\n# Convert the integer value <integer> to a low-endian byte array of length <number_of_bytes>\ninteger_to_byte_array = (integer, number_of_bytes) ->\n\t(extract_byte(integer, byte_index) for byte_index in [(number_of_bytes - 1)..0] by -1)\n\n# Returns a function with argument <value> that returns true if <value> is of type <type_string>, false otherwise\nis_of_type = (type_string) ->\n\t(value) ->\n\t\t(typeof(value) is type_string)\n\n# Returns true if the passed argument <value> is of type \"function\", false otherwise\nis_function = is_of_type('function')\n\n# Create a new array of length <length>, filled with <element>. If <element> is a function, it will be called with the index of the element to be created as argument, and must return the element at this index\ncreate_array_of_length = (length, element) ->\n\tcreate_element = (if is_function(element) then element else (-> element))\n\t(create_element(index) for index in [0...length] by 1)\n\n# Returns a new array by padding array <array> with as many <pad_element> elements until it has length <length>\npadded_array = (array, length, pad_element) ->\n\tconcatenated_array(array, create_array_of_length(Math.max((length - array.length), 0), pad_element))\n\n# XOR the byte array <byte_array> with <xor_byte_array>. Returns a new byte array with the same length as <byte_array>. The first byte in <byte_array> will be XORed with the byte at index <xor_byte_array_offset> in <xor_byte_array> (default: 0), if the end of <xor_byte_array> is reached, it will begin at the start of <byte_array> again\nxor_array = (byte_array, xor_byte_array, xor_byte_array_offset) ->\n\txor_byte_array_offset = first_valid_value(xor_byte_array_offset, 0)\n\t((byte ^ xor_byte_array[(xor_byte_array_offset + index) % xor_byte_array.length]) for byte, index in byte_array)\n\n# Compute the authentication value for <data> (a byte array) with message type ID <message_type_id> (an integer), session-open-nonce <session_open_nonce> (a byte array), security_counter <security_counter> (an integer) and AES-128-key <key> (a byte array)\ncompute_authentication_value = (data, message_type_id, session_open_nonce, security_counter, key) ->\n\tnonce = compute_nonce(message_type_id, session_open_nonce, security_counter)\n\tdata_length = data.length\n\tpadded_data_length = generic_ceil(data_length, 16, 0)\n\tpadded_data = padded_array(data, padded_data_length, 0)\n\tencrypted_xor_data = encrypt_aes_ecb(\n\t\tconcatenated_array(\n\t\t\t[9],\n\t\t\tnonce,\n\t\t\tinteger_to_byte_array(data_length, 2),\n\t\t),\n\t\tkey,\n\t)\n\tfor padded_data_offset in [0...padded_data_length] by 0x10\n\t\tencrypted_xor_data = encrypt_aes_ecb(\n\t\t\txor_array(\n\t\t\t\tencrypted_xor_data,\n\t\t\t\tpadded_data,\n\t\t\t\tpadded_data_offset,\n\t\t\t),\n\t\t\tkey,\n\t\t)\n\txor_array(\n\t\tencrypted_xor_data.slice(0, 4),\n\t\tencrypt_aes_ecb(\n\t\t\tconcatenated_array(\n\t\t\t\t[1],\n\t\t\t\tnonce,\n\t\t\t\t[0, 0],\n\t\t\t),\n\t\t\tkey,\n\t\t),\n\t)\n\n# This class represents \"CONNECTION_INFO\" messages; messages with informations like the remote session nonce etc.. Sent by the Smart Lock in response to CONNECTION_REQUEST messages\n# Java class \"de.eq3.ble.key.android.a.a.q\" in original app\nConnection_Info_Message = message_type\n\tid: 0x03\n\tlabel: 'CONNECTION_INFO'\n\tproperties:\n\t\tuser_id: -> @data_bytes[0]\n\t\tremote_session_nonce: -> @data_bytes.slice(1, 9)\n\t\tbootloader_version: -> @data_bytes[10]\n\t\tapplication_version: -> @data_bytes[11]\n\n# This class represents \"CONNECTION_REQUEST\" messages; messages sent to the Smart Lock in order to set up a secure connection\n# Java class \"de.eq3.ble.key.android.a.a.r\" in original app\nConnection_Request_Message = message_type\n\tid: 0x02\n\tlabel: 'CONNECTION_REQUEST'\n\tencode: (data) ->\n\t\tconcatenated_array(\n\t\t\t[data.user_id],\n\t\t\tdata.local_session_nonce,\n\t\t)\n\tproperties:\n\t\tuser_id: -> @data_bytes[0]\n\t\tlocal_session_nonce: -> @data_bytes.slice(1, 9)\n\n# This class represents \"STATUS_CHANGED_NOTIFICATION\" messages\n# Java class \"de.eq3.ble.key.android.a.a.ae\" in original app\nStatus_Changed_Notification_Message = message_type\n\tid: 0x05\n\tlabel: 'STATUS_CHANGED_NOTIFICATION'\n\n# This class represents \"STATUS_INFO\" messages\n# Java class \"de.eq3.ble.key.android.a.a.af\" in original app\nStatus_Info_Message = message_type\n\tid: 0x83\n\tlabel: 'STATUS_INFO'\n\tproperties:\n\t\ta: -> bit_is_set(@data_bytes[0], 6)\n\t\tuser_right_type: -> ((@data_bytes[0] & 0x30) >> 4)\n\t\te: -> bit_is_set(@data_bytes[1], 7)\n\t\tf: -> bit_is_set(@data_bytes[1], 4)\n\t\tg: -> bit_is_set(@data_bytes[1], 0)\n\t\th: -> bit_is_set(@data_bytes[2], 5)\n\t\ti: -> bit_is_set(@data_bytes[2], 4)\n\t\tj: -> bit_is_set(@data_bytes[2], 3)\n\t\tlock_status: -> (@data_bytes[2] & 0x07)\n\t\tl: -> @data_bytes[4]\n\t\tm: -> @data_bytes[5]\n\n# Canonicalize hexadecimal string <hex_string> by removing all non-hexadecimal characters, and converting all hex digits to lower case\ncanonicalize_hex_string = (hex_string) ->\n\thex_string.replace(/[^0-9A-Fa-f]/g, '').toLowerCase()\n\n# Returns an array with chunks/slices of <slicable>. Each chunk/slice has the same length <chunk_length> (except for the last chunk/slice, which may have a smaller length)\nsplit_into_chunks = (slicable, chunk_length) ->\n\t(slicable.slice(index, (index + chunk_length)) for index in [0...slicable.length] by chunk_length)\n\n# Convert the hexadecimal string <hex_string> to a byte array\nhex_string_to_byte_array = (hex_string) ->\n\t(parseInt(byte_hex_string, 0x10) for byte_hex_string in split_into_chunks(canonicalize_hex_string(hex_string), 2))\n\n# Returns true if the passed argument <value> is a Buffer instance, false otherwise\nis_buffer = (value) ->\n\tBuffer.isBuffer(value)\n\n# Returns true if the passed argument <value> is a string, false otherwise\nis_string = is_of_type('string')\n\n# Convert <value>, which may either be a byte array, a hexadecimal string or a Buffer instance, to a byte array. If <value> is neither of those, null is returned\nconvert_to_byte_array = (value) ->\n\tif is_array(value)\n\t\treturn value\n\tif is_string(value)\n\t\treturn hex_string_to_byte_array(value)\n\tif is_buffer(value)\n\t\treturn buffer_to_byte_array(value)\n\treturn null\n\n# Returns a random integer value, in the range from <minimum_value> (inclusive, default:0) to <maximum_value_exclusive> (exclusive)\ncreate_random_integer = (maximum_value, minimum_value) ->\n\tminimum_value = first_valid_value(minimum_value, 0)\n\t(Math.floor(Math.random() * (maximum_value - minimum_value)) + minimum_value)\n\n# Returns a single random integer in the byte range\ncreate_random_byte = ->\n\tcreate_random_integer(0x100)\n\n# Create a new array of length <length>, filled with random byte values\ncreate_random_byte_array = (length) ->\n\tcreate_array_of_length(length, create_random_byte)\n\n# Compute the \"nonce\" for a message with type ID <message_type_id>, session-open-nonce <session_open_nonce>, and security counter <security_counter>\ncompute_nonce = (message_type_id, session_open_nonce, security_counter) ->\n\tconcatenated_array(\n\t\t[message_type_id],\n\t\tsession_open_nonce,\n\t\t[0, 0],\n\t\tinteger_to_byte_array(security_counter, 2),\n\t)\n\n# Encrypt/Decrypt <data> (a byte array) with message type ID <message_type_id> (an integer), session-open-nonce <session_open_nonce> (a byte array), security_counter <security_counter> (an integer) and AES-128-key <key> (a byte array). If <data> is decrypted, it will be encrypted; if it is encrypted, it will be decrypted\ncrypt_data = (data, message_type_id, session_open_nonce, security_counter, key) ->\n\tnonce = compute_nonce(message_type_id, session_open_nonce, security_counter)\n\txor_data = []\n\tfor index in [0...(generic_ceil(data.length, 16, 0) // 0x10)] by 1\n\t\txor_data = concatenated_array(\n\t\t\txor_data,\n\t\t\tencrypt_aes_ecb(\n\t\t\t\tconcatenated_array(\n\t\t\t\t\t[1],\n\t\t\t\t\tnonce,\n\t\t\t\t\tinteger_to_byte_array((index + 1), 2),\n\t\t\t\t),\n\t\t\t\tkey,\n\t\t\t),\n\t\t)\n\txor_array(\n\t\tdata,\n\t\txor_data,\n\t)\n\n# Debug output function for keyble Bluetooth communication\ndebug_communication = require('debug')('keyble:communication')\n\n# Debug output function for keyble events\ndebug_events = require('debug')('keyble:events')\n\n# Import/Require the \"events\" module = the EventEmitter class\nEvent_Emitter = require('events')\n\n# This class represents \"FRAGMENT_ACK\" messages; messages that acknowledge the receival of a fragment of a message (except for the last one)\n# Java class \"de.eq3.ble.key.android.a.a.t\" in original app\nFragment_Ack_Message = message_type\n\tid: 0x00\n\tlabel: 'FRAGMENT_ACK'\n\tencode: (data) ->\n\t\t[data.fragment_id]\n\tproperties:\n\t\tfragment_id: -> @data_bytes[0]\n\n# This class represents a message fragment. Bluetooth characteristics can only transfer a very limited number of bytes at once, so larger messages need to be split into several fragments/parts\nMessage_Fragment = Extendable.extend\n\tinitialize: (@byte_array) ->\n\tget_status_byte: ->\n\t\t@byte_array[0]\n\tget_number_of_remaining_fragments: ->\n\t\t(@get_status_byte() & 0x7F)\n\tget_message_type_id: ->\n\t\tif not @is_first()\n\t\t\tthrow new Error('Is not first fragment')\n\t\t@byte_array[1]\n\tis_first: ->\n\t\tbit_is_set(@get_status_byte(), 7)\n\tis_last: ->\n\t\t(@get_number_of_remaining_fragments() is 0)\n\tis_complete_message: ->\n\t\t(@is_first() and @is_last())\n\tget_data_byte_array: ->\n\t\t@byte_array.slice(if @is_first() then 2 else 1)\n\n# Convert an array of objects <objects_array> to an object of objects, where each property key/name is the value of property <property_name> of the object, and the property value is the object itself\ndictify_array = (objects_array, property_name) ->\n\ttemp = {}\n\tfor object in objects_array\n\t\ttemp[object[property_name]] = object\n\ttemp\n\n# This class represents \"ANSWER_WITH_SECURITY\" messages\n# Java class \"de.eq3.ble.key.android.a.a.e\" in original app\nAnswer_With_Security_Message = message_type\n\tid: 0x81\n\tlabel: 'ANSWER_WITH_SECURITY'\n\tproperties:\n\t\ta: -> ((@data_bytes[0] & 0x80) is 0)\n\t\tb: -> ((@data_bytes[0] & 0x81) is 1)\n\n# This class represents \"ANSWER_WITHOUT_SECURITY\" messages\n# Java class \"de.eq3.ble.key.android.a.a.f\" in original app\nAnswer_Without_Security_Message = message_type\n\tid: 0x01\n\tlabel: 'ANSWER_WITHOUT_SECURITY'\n\tproperties:\n\t\ta: -> ((@data_bytes[0] & 0x80) is 0)\n\t\tb: -> ((@data_bytes[0] & 0x81) is 1)\n\n# This class represents \"PAIRING_REQUEST\" messages\n# Java class \"de.eq3.ble.key.android.a.a.ac\" in original app\nPairing_Request_Message = message_type\n\tid: 0x04\n\tlabel: 'PAIRING_REQUEST'\n\tencode: (data) ->\n\t\tconcatenated_array(\n\t\t\t[data.user_id],\n\t\t\tpadded_array(data.encrypted_pair_key, 22, 0),\n\t\t\tinteger_to_byte_array(data.security_counter, 2),\n\t\t\tdata.authentication_value,\n\t\t)\n\tproperties:\n\t\tuser_id: -> @data_bytes[0]\n\t\tencrypted_pair_key: -> @data_bytes.slice(1, 23)\n\t\tsecurity_counter: -> byte_array_to_integer(@data_bytes, 23, 2)\n\t\tauthentication_value: -> @data_bytes.slice(25, 29)\n\n# This class represents \"STATUS_REQUEST\" messages; messages sent to the Smart Lock, informing the current date/time, and requesting status information\n# Java class \"de.eq3.ble.key.android.a.a.ag\" in original app\nStatus_Request_Message = message_type\n\tid: 0x82\n\tlabel: 'STATUS_REQUEST'\n\tencode: (data) ->\n\t\tdate = data.date\n\t\t[\n\t\t\t(date.getFullYear() - 2000)\n\t\t\t(date.getMonth() + 1)\n\t\t\tdate.getDate()\n\t\t\tdate.getHours()\n\t\t\tdate.getMinutes()\n\t\t\tdate.getSeconds()\n\t\t]\n\tproperties:\n\t\tdate: -> (new Date(\n\t\t\t(@data_bytes[0] + 2000),\n\t\t\t(@data_bytes[1] - 1),\n\t\t\t@data_bytes[2],\n\t\t\t@data_bytes[3],\n\t\t\t@data_bytes[4],\n\t\t\t@data_bytes[5],\n\t\t))\n\n# This class represents \"USER_INFO\" messages\n# Java class \"de.eq3.ble.key.android.a.a.ah\" in original app\nUser_Info_Message = message_type\n\tid: 0x8f\n\tlabel: 'USER_INFO'\n\n# Convert string <string> to a UTF-8 byte array\nstring_to_utf8_byte_array = (string) ->\n\tbuffer_to_byte_array(Buffer.from(string, 'utf8'))\n\n# Convert UTF-8 encoded byte array <byte_array> to a String\nutf8_byte_array_to_string = (byte_array) ->\n\tBuffer.from(byte_array).toString('utf8')\n\n# This class represents \"USER_NAME_SET\" messages; messages sent to the Smart Lock requesting to change a user name\n# Java class \"de.eq3.ble.key.android.a.a.al\" in original app\nUser_Name_Set_Message = message_type\n\tid: 0x90\n\tlabel: 'USER_NAME_SET'\n\tencode: (data) ->\n\t\tconcatenated_array(\n\t\t\t[data.user_id],\n\t\t\tpadded_array(string_to_utf8_byte_array(data.user_name), 20, 0),\n\t\t)\n\tproperties:\n\t\tuser_id: -> @data_bytes[0]\n\t\tuser_name: -> utf8_byte_array_to_string(@data_bytes.slice(1, @data_bytes.indexOf(0, 1)))\n\n# An array of all (currently implemented) message types\nmessage_types = [\n\tFragment_Ack_Message\n\tAnswer_Without_Security_Message\n\tConnection_Request_Message\n\tConnection_Info_Message\n\tPairing_Request_Message\n\tStatus_Changed_Notification_Message\n\tClose_Connection_Message\n\tAnswer_With_Security_Message\n\tStatus_Request_Message\n\tStatus_Info_Message\n\tCommand_Message\n\tUser_Info_Message\n\tUser_Name_Set_Message\n]\n\n# An object that has the various message types as properties, and the labels of these message types as property names/keys\nmessage_types_by_id = dictify_array(message_types, 'id')\n\n# Import/Require the \"simble\" module for communicating with Bluetooth Low Energy peripherals\nsimble = require('simble')\n\n# An object with the possible Key_Ble states\nstate = \n\tdisconnected: 0\n\tconnected: 1\n\tnonces_exchanged: 2\n\tsecured: 3\n\n# A class that represents the eQ-3 eqiva Bluetooth smart lock\nKey_Ble = class extends Event_Emitter\n\n\tconstructor: (options) ->\n\t\tsuper()\n\t\t@address = simble.canonicalize.address(options.address)\n\t\t@user_id = first_valid_value(options.user_id, 0xFF)\n\t\t@user_key = convert_to_byte_array(options.user_key)\n\t\t@auto_disconnect_time = first_valid_value(options.auto_disconnect_time, 15.0)\n\t\t@set_status_update_time(options.status_update_time)\n\t\t@received_message_fragments = []\n\t\t@local_security_counter = 1\n\t\t@remote_security_counter = 0\n\t\t@state = state.disconnected\n\t\t@lock_status_id = null\n\t\treturn\n\n\tset_status_update_time: (status_update_time) ->\n\t\t@status_update_time = first_valid_value(status_update_time, 600.0)\n\t\t@set_status_update_timer()\n\t\treturn\n\n\t# Await up to <timeout> (default: 1000) milliseconds for the event with ID <event_id> (a string). If <timeout> is 0, wait forever. Returns a Promise that resolves when the event occurs, and rejects if a timeout situation occurs\n\tawait_event: (event_id) ->\n\t\tnew Promise (resolve, reject) =>\n\t\t\t@once event_id, (args...) ->\n\t\t\t\tresolve(args)\n\t\t\t\treturn\n\t\t\treturn\n\n\tawait_message: (message_type) ->\n\t\t@await_event(\"received:message:#{message_type}\")\n\n\tset_user_name: (user_name, user_id) ->\n\t\tuser_id = first_valid_value(user_id, @user_id)\n\t\t@send_message User_Name_Set_Message.create\n\t\t\tuser_id: user_id\n\t\t\tuser_name: user_name\n\t\t.then =>\n\t\t\t@await_message('USER_INFO')\n\n\tpairing_request: (card_key) ->\n\t\tcard_key = convert_to_byte_array(card_key)\n\t\t@user_key = create_random_byte_array(16)\n\t\t@ensure_nonces_exchanged()\n\t\t.then =>\n\t\t\t@send_message Pairing_Request_Message.create\n\t\t\t\tuser_id: @user_id\n\t\t\t\tencrypted_pair_key: crypt_data(\n\t\t\t\t\t@user_key,\n\t\t\t\t\tPairing_Request_Message.id,\n\t\t\t\t\t@remote_session_nonce,\n\t\t\t\t\t@local_security_counter,\n\t\t\t\t\tcard_key\n\t\t\t\t)\n\t\t\t\tsecurity_counter: @local_security_counter\n\t\t\t\tauthentication_value: compute_authentication_value(\n\t\t\t\t\tpadded_array(concatenated_array([@user_id], @user_key), 23, 0),\n\t\t\t\t\tPairing_Request_Message.id,\n\t\t\t\t\t@remote_session_nonce,\n\t\t\t\t\t@local_security_counter,\n\t\t\t\t\tcard_key\n\t\t\t\t)\n\t\t.then =>\n\t\t\t@await_message('ANSWER_WITH_SECURITY')\n\t\t.then =>\n\t\t\tuser_id: @user_id\n\t\t\tuser_key: byte_array_to_hex_string(@user_key, '')\n\n\temit: (event_id) ->\n\t\tdebug_events \"Event: #{event_id}\"\n\t\tsuper arguments...\n\n\t# Lock the smart lock\n\tlock: ->\n\t\tif (@lock_status_id is 3) then return Promise.resolve()\n\t\t@send_command(0)\n\t\t.then =>\n\t\t\t@await_event 'status:LOCKED'\n\n\t# Unlock the smart lock\n\tunlock: ->\n\t\tif (@lock_status_id is 2) then return Promise.resolve()\n\t\t@send_command(1)\n\t\t.then =>\n\t\t\t@await_event 'status:UNLOCKED'\n\n\t# Open the smart lock\n\topen: ->\n\t\tif (@lock_status_id is 4) then return Promise.resolve()\n\t\t@send_command(2)\n\t\t.then =>\n\t\t\t@await_event 'status:OPENED'\n\n\t# Send a COMMAND message with command/action ID <command_id> (0 = lock, 1 = unlock, 2 = open)\n\tsend_command: (command_id) ->\n\t\t@send_message Command_Message.create\n\t\t\tcommand_id: command_id\n\n\ton_message_fragment_received: (message_fragment) ->\n\t\t@received_message_fragments.push(message_fragment)\n\t\t@emit 'received:fragment', message_fragment\n\t\tif message_fragment.is_last()\n\t\t\tmessage_data_bytes = @received_message_fragments.reduce (byte_array, message_fragment) ->\n\t\t\t\t\tconcatenated_array(byte_array, message_fragment.get_data_byte_array())\n\t\t\t\t, []\n\t\t\tMessage_Type = message_types_by_id[@received_message_fragments[0].get_message_type_id()]\n\t\t\tif Message_Type.is_secure()\n\t\t\t\tmessage_security_counter = byte_array_to_integer(message_data_bytes, -6, -4)\n\t\t\t\tif (message_security_counter <= @remote_security_counter) then throw new Error('Received message contains invalid security counter')\n\t\t\t\tmessage_authentication_value = message_data_bytes.slice(-4)\n\t\t\t\t@remote_security_counter = message_security_counter\n\t\t\t\tmessage_data_bytes = crypt_data(message_data_bytes.slice(0, -6), Message_Type.id, @local_session_nonce, @remote_security_counter, @user_key)\n\t\t\t\tcomputed_authentication_value = compute_authentication_value(message_data_bytes, Message_Type.id, @local_session_nonce, @remote_security_counter, @user_key)\n\t\t\t\tif (not arrays_are_equal(message_authentication_value, computed_authentication_value)) then throw new Error('Received message contains invalid authentication value')\n\t\t\t@received_message_fragments = []\n\t\t\t@on_message_received(Message_Type.create(message_data_bytes))\n\t\telse\n\t\t\t@send_message Fragment_Ack_Message.create\n\t\t\t\tfragment_id: message_fragment.get_status_byte()\n\t\treturn\n\n\tset_status_update_timer: ->\n\t\tclearTimeout(@status_update_timer)\n\t\tif (@status_update_time > 0)\n\t\t\t@status_update_timer = setTimeout =>\n\t\t\t\t\t@request_status()\n\t\t\t\t\treturn\n\t\t\t\t, (@status_update_time * 1000)\n\n\ton_message_received: (message) ->\n\t\tdebug_communication \"Received message of type #{message.label}, data bytes <#{byte_array_to_hex_string(message.data_bytes, ' ')}>, data #{JSON.stringify(message.data)}\"\n\t\t@emit 'received:message', message\n\t\t@emit \"received:message:#{message.label}\", message\n\t\tswitch message.__type__\n\t\t\twhen Connection_Info_Message\n\t\t\t\t@user_id = message.data.user_id\n\t\t\t\t@remote_session_nonce = message.data.remote_session_nonce\n\t\t\t\t@local_security_counter = 1\n\t\t\t\t@remote_security_counter = 0\n\t\t\twhen Status_Info_Message\n\t\t\t\tlock_status_id = message.data.lock_status\n\t\t\t\tlock_status_string = {\n\t\t\t\t\t0:'UNKNOWN',\n\t\t\t\t\t1:'MOVING',\n\t\t\t\t\t2:'UNLOCKED',\n\t\t\t\t\t3:'LOCKED',\n\t\t\t\t\t4:'OPENED',\n\t\t\t\t}[lock_status_id]\n\t\t\t\t@emit 'status_update', lock_status_id, lock_status_string\n\t\t\t\tif (@lock_status_id isnt lock_status_id)\n\t\t\t\t\t@lock_status_id = lock_status_id\n\t\t\t\t\t@emit \"status:#{lock_status_string}\", lock_status_id, lock_status_string\n\t\t\t\t\t@emit 'status_change', lock_status_id, lock_status_string\n\t\t\t\t@set_status_update_timer()\n\t\t\twhen Status_Changed_Notification_Message\n\t\t\t\t@request_status()\n\t\treturn\n\n\tsend_message_fragment: (message_fragment) ->\n\t\t@ensure_connected()\n\t\t.then =>\n\t\t\tsend_promise = @send_characteristic.write(message_fragment.byte_array)\n\t\t\tack_promise = (if (not message_fragment.is_last()) then @await_message('FRAGMENT_ACK') else Promise.resolve())\n\t\t\tPromise.all([send_promise, ack_promise])\n\n\tsend_message_fragments: (message_fragments) ->\n\t\tsend_message_fragment_with_index = (message_fragment_index) =>\n\t\t\tif message_fragment_index < message_fragments.length\n\t\t\t\tmessage_fragment = message_fragments[message_fragment_index]\n\t\t\t\t@send_message_fragment(message_fragment)\n\t\t\t\t.then ->\n\t\t\t\t\tsend_message_fragment_with_index(message_fragment_index + 1)\n\t\t\telse\n\t\t\t\tPromise.resolve()\n\t\tsend_message_fragment_with_index(0)\n\n\tsend_message: (message) ->\n\t\t(if message.is_secure() then @ensure_nonces_exchanged() else @ensure_connected())\n\t\t.then =>\n\t\t\tdebug_communication \"Sending message of type #{message.label}, data bytes <#{byte_array_to_hex_string(message.data_bytes, ' ')}>, data #{JSON.stringify(message.data)}\"\n\t\t\tif message.is_secure()\n\t\t\t\tpadded_data = padded_array(message.data_bytes, generic_ceil(message.data_bytes.length, 15, 8), 0)\n\t\t\t\tcrypt_data(padded_data, message.id, @remote_session_nonce, @local_security_counter, @user_key)\n\t\t\t\tmessage_data_bytes = concatenated_array(\n\t\t\t\t\tcrypt_data(padded_data, message.id, @remote_session_nonce, @local_security_counter, @user_key),\n\t\t\t\t\tinteger_to_byte_array(@local_security_counter, 2),\n\t\t\t\t\tcompute_authentication_value(padded_data, message.id, @remote_session_nonce, @local_security_counter, @user_key),\n\t\t\t\t)\n\t\t\t\t@local_security_counter++\n\t\t\telse\n\t\t\t\tmessage_data_bytes = message.data_bytes\n\t\t\tmessage_fragments = split_into_chunks(concatenated_array([message.id], message_data_bytes), 15).map (fragment_bytes, index, chunks) ->\n\t\t\t\tMessage_Fragment.create(concatenated_array([(chunks.length - 1 - index) + (if (index is 0) then 0x80 else 0x00)], padded_array(fragment_bytes, 15, 0)))\n\t\t\t@send_message_fragments(message_fragments)\n\n\tensure_peripheral: ->\n\t\tif @peripheral then return Promise.resolve(@peripheral)\n\t\tsimble.scan_for_peripheral simble.filter.address(@address)\n\t\t.then (peripheral) =>\n\t\t\tperipheral.ensure_discovered()\n\t\t.then (@peripheral) =>\n\t\t\[email protected]_auto_disconnect_time(@auto_disconnect_time * 1000)\n\t\t\[email protected] 'connected', =>\n\t\t\t\t@state = state.connected\n\t\t\t\t@emit 'connected'\n\t\t\t\treturn\n\t\t\[email protected] 'disconnected', =>\n\t\t\t\t@state = state.disconnected\n\t\t\t\t@emit 'disconnected'\n\t\t\t\treturn\n\t\t\tcommunication_service = @peripheral.get_discovered_service('58e06900-15d8-11e6-b737-0002a5d5c51b')\n\t\t\t@send_characteristic = communication_service.get_discovered_characteristic('3141dd40-15db-11e6-a24b-0002a5d5c51b')\n\t\t\t@receive_characteristic = communication_service.get_discovered_characteristic('359d4820-15db-11e6-82bd-0002a5d5c51b')\n\t\t\t@receive_characteristic.subscribe (message_fragment_bytes) =>\n\t\t\t\t@on_message_fragment_received(Message_Fragment.create(message_fragment_bytes))\n\n\tensure_connected: ->\n\t\t@ensure_peripheral()\n\t\t.then =>\n\t\t\treturn (if (@state >= state.connected) then Promise.resolve() else @peripheral.ensure_discovered())\n\n\tensure_nonces_exchanged: ->\n\t\tif (@state >= state.nonces_exchanged) then return Promise.resolve()\n\t\t@local_session_nonce = create_random_byte_array(8)\n\t\t@send_message Connection_Request_Message.create\n\t\t\tuser_id: @user_id\n\t\t\tlocal_session_nonce: @local_session_nonce\n\t\t.then =>\n\t\t\t@await_message 'CONNECTION_INFO'\n\t\t.then =>\n\t\t\t@state = state.nonces_exchanged\n\t\t\t@emit 'nonces_exchanged'\n\t\t\treturn\n\n\trequest_status: ->\n\t\t@send_message Status_Request_Message.create\n\t\t\tdate: (new Date())\n\t\t.then =>\n\t\t\t@await_event 'status_update'\n\n\tensure_disconnected: ->\n\t\tif (@state < state.connected) then return Promise.resolve()\n\t\t@send_message Close_Connection_Message.create()\n\t\t.then =>\n\t\t\[email protected]()\n\n\tdisconnect: ->\n\t\t@ensure_disconnected()\n\n# The pattern of the data encoded in the QR-Code on the \"Key Card\"s of the eQ-3 eqiva Bluetooth smart locks, as a string\nkey_card_data_pattern = '^M([0-9A-F]{12})K([0-9A-F]{32})([0-9A-Z]{10})$'\n\n# The pattern of the data encoded in the QR-Code on the \"Key Card\"s of the eQ-3 eqiva Bluetooth smart locks, as a regular expression/RegExp\nkey_card_data_regexp = (new RegExp(key_card_data_pattern))\n\n# Convert byte array <byte_array> into several formats/represenations. Returns an array with \"buffer\" (the byte array as a Buffer instance), \"array\" (the original byte array), \"short\" (the byte array as a short hexadecimal string without any non-hexadecimal characters) and \"long\" (the byte array as a long hexadecimal string, where the bytes are separated by string <long_format_separator> (default: ' ')) properties\nbyte_array_formats = (byte_array, long_format_separator) ->\n\tbyte_array = convert_to_byte_array(byte_array)\n\tlong_format_separator = first_valid_value(long_format_separator, ' ')\n\tarray: byte_array\n\tbuffer: Buffer.from(byte_array)\n\tlong: byte_array_to_hex_string(byte_array, long_format_separator)\n\tshort: byte_array_to_hex_string(byte_array, '')\n\n# Parse the data string encoded in the QR-Code of the \"Key Card\"s of the eQ-3 eqiva Bluetooth smart locks. Returns an object with \"address\", \"register_key\" and \"serial\" properties\nparse_key_card_data = (key_card_data_string) ->\n\tmatch = key_card_data_string.trim().match(key_card_data_regexp)\n\tif not match then throw new Error('Not a valid Key Card data string')\n\taddress: byte_array_formats(hex_string_to_byte_array(match[1]), ':').long\n\tregister_key: byte_array_formats(hex_string_to_byte_array(match[2]), ' ').short\n\tserial: match[3]\n\n# Returns a promise that is a time-limited wrapper for promise <promise>. If the promise <promise> does not resolve within <time_limit> milliseconds, the promise is rejected\ntime_limit_promise = (promise, time_limit, timeout_error_message) ->\n\tif (time_limit is 0) then return promise\n\ttimeout_error_message = first_valid_value(timeout_error_message, \"Promise did not resolve within #{time_limit} milliseconds\")\n\tnew Promise (resolve, reject) ->\n\t\ttimeout = setTimeout ->\n\t\t\t\treject(timeout_error_message)\n\t\t\t\treturn\n\t\t\t, time_limit\n\t\tPromise.resolve(promise)\n\t\t.then (promise_result) ->\n\t\t\tclearTimeout(timeout)\n\t\t\tresolve(promise_result)\n\t\t\treturn\n\t\t.catch (promise_error) ->\n\t\t\tclearTimeout(timeout)\n\t\t\treject(promise_error)\n\t\t\treturn\n\t\treturn\n\n# What this module exports\nmodule.exports =\n\tKey_Ble: Key_Ble\n\tkey_card:\n\t\tparse: parse_key_card_data\n\t\tpattern: key_card_data_pattern\n\t\tregexp: key_card_data_regexp\n\tutils:\n\t\ttime_limit: time_limit_promise\n\n"
]
}