我正在基于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)
这是错误信息:
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