mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-16 00:34:39 +08:00
7f0a643d54
To pass IOP testing, we need to be able to support Input OOB and Out of band Public Key exchange, This patch adds agent methods to support those capabilities, but are turned off because the test code uses insecure fixed values instead of randomized values.
92 lines
2.7 KiB
Python
Executable File
92 lines
2.7 KiB
Python
Executable File
#!/usr/bin/python3
|
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
import sys
|
|
import dbus
|
|
import dbus.service
|
|
import numpy
|
|
|
|
try:
|
|
from termcolor import colored, cprint
|
|
set_green = lambda x: colored(x, 'green', attrs=['bold'])
|
|
set_cyan = lambda x: colored(x, 'cyan', attrs=['bold'])
|
|
except ImportError:
|
|
set_green = lambda x: x
|
|
set_cyan = lambda x: x
|
|
|
|
AGENT_IFACE = 'org.bluez.mesh.ProvisionAgent1'
|
|
AGENT_PATH = "/mesh/test/agent"
|
|
|
|
bus = None
|
|
|
|
def array_to_string(b_array):
|
|
str_value = ""
|
|
for b in b_array:
|
|
str_value += "%02x" % b
|
|
return str_value
|
|
|
|
class Agent(dbus.service.Object):
|
|
def __init__(self, bus):
|
|
self.path = AGENT_PATH
|
|
self.bus = bus
|
|
dbus.service.Object.__init__(self, bus, self.path)
|
|
|
|
def get_properties(self):
|
|
caps = []
|
|
oob = []
|
|
caps.append('out-numeric')
|
|
#caps.append('in-numeric') -- Do not use well known in-oob
|
|
caps.append('static-oob')
|
|
#caps.append('public-oob') -- Do not use well known key pairs
|
|
oob.append('other')
|
|
return {
|
|
AGENT_IFACE: {
|
|
'Capabilities': dbus.Array(caps, 's'),
|
|
'OutOfBandInfo': dbus.Array(oob, 's')
|
|
}
|
|
}
|
|
|
|
def get_path(self):
|
|
return dbus.ObjectPath(self.path)
|
|
|
|
@dbus.service.method(AGENT_IFACE, in_signature="", out_signature="")
|
|
def Cancel(self):
|
|
print("Cancel")
|
|
|
|
@dbus.service.method(AGENT_IFACE, in_signature="su", out_signature="")
|
|
def DisplayNumeric(self, type, value):
|
|
print(set_cyan('DisplayNumeric ('), type,
|
|
set_cyan(') number ='), set_green(value))
|
|
|
|
@dbus.service.method(AGENT_IFACE, in_signature="s", out_signature="u")
|
|
def PromptNumeric(self, type):
|
|
# Sample in-oob -- DO-NOT-USE
|
|
value = 12345
|
|
print(set_cyan('PromptNumeric ('), type,
|
|
set_cyan(') number ='), set_green(value))
|
|
return dbus.UInt32(value)
|
|
|
|
@dbus.service.method(AGENT_IFACE, in_signature="", out_signature="ay")
|
|
def PrivateKey(self):
|
|
# Sample Public/Private pair from Mesh Profile Spec DO-NOT-USE
|
|
private_key_str = '6872b109ea0574adcf88bf6da64996a4624fe018191d9322a4958837341284bc'
|
|
public_key_str = 'ce9027b5375fe5d3ed3ac89cef6a8370f699a2d3130db02b87e7a632f15b0002e5b72c775127dc0ce686002ecbe057e3d6a8000d4fbf2cdfffe0d38a1c55a043'
|
|
print(set_cyan('PrivateKey ()'))
|
|
print(set_cyan('Enter Public key on remote device: '),
|
|
set_green(public_key_str));
|
|
private_key = bytearray.fromhex(private_key_str)
|
|
|
|
return dbus.Array(private_key, signature='y')
|
|
|
|
|
|
@dbus.service.method(AGENT_IFACE, in_signature="s", out_signature="ay")
|
|
def PromptStatic(self, type):
|
|
static_key = numpy.random.randint(0, 255, 16)
|
|
key_str = array_to_string(static_key)
|
|
|
|
print(set_cyan('PromptStatic ('), type, set_cyan(')'))
|
|
print(set_cyan('Enter 16 octet key on remote device: '),
|
|
set_green(key_str));
|
|
|
|
return dbus.Array(static_key, signature='y')
|