Почему после шифрования не произошло распределение ключей по конкретному bluetooth-ключу? - PullRequest
0 голосов
/ 26 сентября 2018

Я выполняю Bluetooth-соединение с низким энергопотреблением и связывание на основе пакета Python:

https://github.com/Adam-Langley/pybleno система Ubuntu, в Raspberry Pi 3 B + процесс SMP определить процесс распределения ключей должен бытьaftrer шифрование выполняется, но файл управления ключами определяет команду «загрузить долгосрочный ключ» с кодом операции 0x0013, который отличается от документа bluetooth, и вызывает ошибку.Если я определил команду для отправки EDIV, IRK, подписывающей информации, hci0 не сможет выполнить поиск, пока устройство не перезагрузится.

- это код SMP после шифрования:

    if self._pcnf == pcnf:
        self._diversifier = array.array('B', [0] * 2)
        self._random =  array.array('B', [0] * 8)
        self._stk = crypto.s1(self._tk, self._r, r)
        self._stk = bytearray(self._stk)
        mgmt.addLongTermKey(self._ia, self._iat, 0, 0, self._diversifier, self._random, self._stk)

- это управление ключами(mgmt) код:

    MGMT_OP_LOAD_LONG_TERM_KEYS = 0x0013
    def addLongTermKey(self, address, addressType,
                   authenticated, master, ediv,
                   rand, key):
        ltkInfo = array.array('B', [0]*LTK_INFO_SIZE)
        address.reverse()
        copy(address,ltkInfo, 0)
        writeUInt8(ltkInfo, readUInt8(addressType,0) + 1, 6);
        writeUInt8(ltkInfo, authenticated, 7)
        writeUInt8(ltkInfo, master, 8)
        writeUInt8(ltkInfo, len(key), 9)
        copy(ediv, ltkInfo, 10)
        copy(rand, ltkInfo, 12)
        copy(key, ltkInfo, 20)
        self._ltkInfos.append(ltkInfo)
        self.loadLongTermKeys()

def loadLongTermKeys(self):
    numLongTermKeys = len(self._ltkInfos)
    print('LTK_INFO_SIZE: ', LTK_INFO_SIZE)
    print('numLongTermKeys: ', numLongTermKeys)
    op = array.array('B', [0] * (2 + numLongTermKeys * LTK_INFO_SIZE))
    writeUInt16LE(op, numLongTermKeys, 0);

    for i in range(numLongTermKeys):
        copy(self._ltkInfos[i], op, 2 + i * LTK_INFO_SIZE)

    self.write(MGMT_OP_LOAD_LONG_TERM_KEYS, 0, op)

def write(self, opcode, index, data):
    length = 0
    if data:
        length = len(data)
    pkt = array.array('B', [0]*(6 + length))
    writeUInt16LE(pkt, opcode, 0)
    writeUInt16LE(pkt, index, 2)
    writeUInt16LE(pkt, length, 4)

    if length:
        copy(data, pkt, 6)
    self._socket.write(pkt)

Процесс распространения ключа BLE

Вот информация об ошибке:

      DEBUG:MGMT:ltkInfo: array('B', [146, 103, 10, 207, 0, 73, 2, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 249, 21, 220, 74, 45, 25, 142, 190, 99, 27, 84, 218, 137, 107, 64])

  _ltkInfos:  [array('B', [146, 103, 10, 207, 0, 73, 2, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 249, 21, 220, 74, 45, 25, 142, 190, 99, 27, 84, 218, 137, 107, 64])]

  size of ltkInfos: 1

  LTK_INFO_SIZE:  36

  numLongTermKeys:  1

  DEBUG:MGMT:pkt: array('B', [19, 0, 0, 0, 38, 0, 1, 0, 146, 103, 10, 207, 0, 73, 2, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 249, 21, 220, 74, 45, 25, 142, 190, 99, 27, 84, 218, 137, 107, 64])

  DEBUG:MGMT:pkt length: 44

  Exception in thread HCISocketPoller:

  Traceback (most recent call last):

    File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner

      self.run()

      File "/usr/lib/python3.5/threading.py", line 862, in run

      self._target(*self._args, **self._kwargs)

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/BluetoothHCI/BluetoothHCI.py", line 201, in _socket_poller

      self._socket_on_data_user_callback(bytearray(data))

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/Hci.py", line 417, in onSocketData

      self.emit('aclDataPkt', [handle, cid, pktData])

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/Emit.py", line 15, in emit

      handler(*arguments)

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/Bindings.py", line 167, in onAclDataPkt

      self._aclStream.push(cid, data)

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/AclStream.py", line 18, in push

      self.emit('data', [cid, data])

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/Emit.py", line 15, in emit

      handler(*arguments)

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/Smp.py", line 55, in onAclStreamData

      self.handlePairingRandom(data)

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/Smp.py", line 143, in handlePairingRandom

      mgmt.addLongTermKey(self._ia, self._iat, 0, 0, self._diversifier, self._random, self._stk)

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/mgmt.py", line 59, in addLongTermKey

      self.loadLongTermKeys()

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/mgmt.py", line 79, in loadLongTermKeys

      self.write(MGMT_OP_LOAD_LONG_TERM_KEYS, 0, op)

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/mgmt.py", line 95, in write

      self._socket.write(pkt)

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/BluetoothHCI/BluetoothHCI.py", line 277, in write

      self.hci.write_buffer(data)

      File "/srv/cloud/venv-cloud/lib/python3.5/site-packages/pybleno/hci_socket/BluetoothHCI/BluetoothHCI.py", line 167, in write_buffer

      self._socket.send(data)

      OSError: [Errno 22] Invalid argument
...