1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
#!/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')
|