Skip to content

Commit 54ecb3f

Browse files
committed
Rough key-verification implementation
1 parent 0deb98b commit 54ecb3f

2 files changed

Lines changed: 80 additions & 0 deletions

File tree

meshtastic/__main__.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,21 @@ def onConnected(interface):
472472
waitForAckNak = True
473473
interface.getNode(args.dest, False, **getNode_kwargs).removeIgnored(args.remove_ignored_node)
474474

475+
if args.key_verification:
476+
closeNow = True
477+
waitForAckNak = True
478+
interface.getNode(args.dest, False, **getNode_kwargs).keyVerification(args.key_verification)
479+
480+
if args.key_verification_number:
481+
closeNow = True
482+
waitForAckNak = True
483+
interface.getNode(args.dest, False, **getNode_kwargs).keyVerificationNumber(args.key_verification_number, args.key_verification_nonce)
484+
485+
if args.key_verification_confirm:
486+
closeNow = True
487+
waitForAckNak = True
488+
interface.getNode(args.dest, False, **getNode_kwargs).keyVerificationConfirm(args.key_verification_confirm)
489+
475490
if args.reset_nodedb:
476491
closeNow = True
477492
waitForAckNak = True
@@ -1832,6 +1847,22 @@ def addRemoteAdminArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPars
18321847
"Use the node ID with a '!' or '0x' prefix or the node number.",
18331848
metavar="!xxxxxxxx"
18341849
)
1850+
group.add_argument(
1851+
"--key-verification",
1852+
help="start key verification. "
1853+
"Use the node ID with a '!' or '0x' prefix or the node number.",
1854+
metavar="!xxxxxxxx"
1855+
)
1856+
group.add_argument(
1857+
"--key-verification-number",
1858+
help="start key verification. "
1859+
"Use the node ID with a '!' or '0x' prefix or the node number.",
1860+
)
1861+
group.add_argument(
1862+
"--key-verification-confirm",
1863+
help="start key verification. "
1864+
"Use the node ID with a '!' or '0x' prefix or the node number.",
1865+
)
18351866
group.add_argument(
18361867
"--reset-nodedb",
18371868
help="Tell the destination node to clear its list of nodes",
@@ -1961,6 +1992,12 @@ def initParser():
19611992
action="store_true",
19621993
)
19631994

1995+
group.add_argument(
1996+
"--key-verification-nonce",
1997+
help="start key verification. "
1998+
"Use the node ID with a '!' or '0x' prefix or the node number.",
1999+
)
2000+
19642001
power_group = parser.add_argument_group(
19652002
"Power Testing", "Options for power testing/logging."
19662003
)

meshtastic/node.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,49 @@ def removeIgnored(self, nodeId: Union[int, str]):
770770
onResponse = self.onAckNak
771771
return self._sendAdmin(p, onResponse=onResponse)
772772

773+
def keyVerification(self, nodeId: Union[int, str]):
774+
if isinstance(nodeId, str):
775+
if nodeId.startswith("!"):
776+
nodeId = int(nodeId[1:], 16)
777+
else:
778+
nodeId = int(nodeId)
779+
p = admin_pb2.KeyVerificationAdmin()
780+
p.message_type = p.MessageType.INITIATE_VERIFICATION
781+
p.remote_nodenum = nodeId
782+
p.nonce = 0
783+
a = admin_pb2.AdminMessage()
784+
a.key_verification_admin.CopyFrom(p)
785+
if self == self.iface.localNode:
786+
onResponse = None
787+
else:
788+
onResponse = self.onAckNak
789+
return self._sendAdmin(a, onResponse=onResponse)
790+
def keyVerificationNumber(self, number: int, nonce: int,):
791+
print(int(number))
792+
print(int(nonce))
793+
p = admin_pb2.KeyVerificationAdmin()
794+
p.message_type = p.MessageType.PROVIDE_SECURITY_NUMBER
795+
p.nonce = int(nonce)
796+
p.security_number = int(number)
797+
a = admin_pb2.AdminMessage()
798+
a.key_verification_admin.CopyFrom(p)
799+
if self == self.iface.localNode:
800+
onResponse = None
801+
else:
802+
onResponse = self.onAckNak
803+
return self._sendAdmin(a, onResponse=onResponse)
804+
def keyVerificationConfirm(self, nonce: int,):
805+
print(int(nonce))
806+
p = admin_pb2.KeyVerificationAdmin()
807+
p.message_type = p.MessageType.DO_VERIFY
808+
p.nonce = int(nonce)
809+
a = admin_pb2.AdminMessage()
810+
a.key_verification_admin.CopyFrom(p)
811+
if self == self.iface.localNode:
812+
onResponse = None
813+
else:
814+
onResponse = self.onAckNak
815+
return self._sendAdmin(a, onResponse=onResponse)
773816
def resetNodeDb(self):
774817
"""Tell the node to reset its list of nodes."""
775818
self.ensureSessionKey()

0 commit comments

Comments
 (0)