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