为什么在加密完成后没有发生蓝牙LE专用密钥分配?

时间:2018-09-26 10:21:26

标签: python-3.x bluetooth-lowenergy bleno

我正在基于python软件包进行蓝牙低功耗配对和绑定:

https://github.com/Adam-Langley/pybleno 系统是Ubuntu,在raspberry pi 3 b +中 SMP进程定义密钥分发过程应在加密后进行,但是密钥管理文件使用0x0013操作码定义“加载长期密钥”命令,该命令不同于蓝牙文档,并会导致错误。如果我定义了发送EDIV,IRK,签名信息的命令,则除非设备重新启动,否则hci0将无法进行piscan。

这是加密后的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 key distribution process

这是错误信息:

      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

0 个答案:

没有答案