| #!/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') |