agent.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/usr/bin/python3
  2. # SPDX-License-Identifier: LGPL-2.1-or-later
  3. import sys
  4. import dbus
  5. import dbus.service
  6. import numpy
  7. try:
  8. from termcolor import colored, cprint
  9. set_green = lambda x: colored(x, 'green', attrs=['bold'])
  10. set_cyan = lambda x: colored(x, 'cyan', attrs=['bold'])
  11. except ImportError:
  12. set_green = lambda x: x
  13. set_cyan = lambda x: x
  14. AGENT_IFACE = 'org.bluez.mesh.ProvisionAgent1'
  15. AGENT_PATH = "/mesh/test/agent"
  16. bus = None
  17. def array_to_string(b_array):
  18. str_value = ""
  19. for b in b_array:
  20. str_value += "%02x" % b
  21. return str_value
  22. class Agent(dbus.service.Object):
  23. def __init__(self, bus):
  24. self.path = AGENT_PATH
  25. self.bus = bus
  26. dbus.service.Object.__init__(self, bus, self.path)
  27. def get_properties(self):
  28. caps = []
  29. oob = []
  30. caps.append('out-numeric')
  31. #caps.append('in-numeric') -- Do not use well known in-oob
  32. caps.append('static-oob')
  33. #caps.append('public-oob') -- Do not use well known key pairs
  34. oob.append('other')
  35. return {
  36. AGENT_IFACE: {
  37. 'Capabilities': dbus.Array(caps, 's'),
  38. 'OutOfBandInfo': dbus.Array(oob, 's')
  39. }
  40. }
  41. def get_path(self):
  42. return dbus.ObjectPath(self.path)
  43. @dbus.service.method(AGENT_IFACE, in_signature="", out_signature="")
  44. def Cancel(self):
  45. print("Cancel")
  46. @dbus.service.method(AGENT_IFACE, in_signature="su", out_signature="")
  47. def DisplayNumeric(self, type, value):
  48. print(set_cyan('DisplayNumeric ('), type,
  49. set_cyan(') number ='), set_green(value))
  50. @dbus.service.method(AGENT_IFACE, in_signature="s", out_signature="u")
  51. def PromptNumeric(self, type):
  52. # Sample in-oob -- DO-NOT-USE
  53. value = 12345
  54. print(set_cyan('PromptNumeric ('), type,
  55. set_cyan(') number ='), set_green(value))
  56. return dbus.UInt32(value)
  57. @dbus.service.method(AGENT_IFACE, in_signature="", out_signature="ay")
  58. def PrivateKey(self):
  59. # Sample Public/Private pair from Mesh Profile Spec DO-NOT-USE
  60. private_key_str = '6872b109ea0574adcf88bf6da64996a4624fe018191d9322a4958837341284bc'
  61. public_key_str = 'ce9027b5375fe5d3ed3ac89cef6a8370f699a2d3130db02b87e7a632f15b0002e5b72c775127dc0ce686002ecbe057e3d6a8000d4fbf2cdfffe0d38a1c55a043'
  62. print(set_cyan('PrivateKey ()'))
  63. print(set_cyan('Enter Public key on remote device: '),
  64. set_green(public_key_str));
  65. private_key = bytearray.fromhex(private_key_str)
  66. return dbus.Array(private_key, signature='y')
  67. @dbus.service.method(AGENT_IFACE, in_signature="s", out_signature="ay")
  68. def PromptStatic(self, type):
  69. static_key = numpy.random.randint(0, 255, 16)
  70. key_str = array_to_string(static_key)
  71. print(set_cyan('PromptStatic ('), type, set_cyan(')'))
  72. print(set_cyan('Enter 16 octet key on remote device: '),
  73. set_green(key_str));
  74. return dbus.Array(static_key, signature='y')