Я выполняю 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