@@ -199,6 +199,22 @@ void BaseChatMesh::getPeerSharedSecret(uint8_t* dest_secret, int peer_idx) {
199199 }
200200}
201201
202+ uint8_t BaseChatMesh::getPeerFlags (int peer_idx) {
203+ int i = matching_peer_indexes[peer_idx];
204+ if (i >= 0 && i < num_contacts) {
205+ return contacts[i].flags ;
206+ }
207+ return 0 ;
208+ }
209+
210+ uint16_t BaseChatMesh::getPeerNextAeadNonce (int peer_idx) {
211+ int i = matching_peer_indexes[peer_idx];
212+ if (i >= 0 && i < num_contacts) {
213+ return contacts[i].nextAeadNonce ();
214+ }
215+ return 0 ;
216+ }
217+
202218void BaseChatMesh::onPeerDataRecv (mesh::Packet* packet, uint8_t type, int sender_idx, const uint8_t * secret, uint8_t * data, size_t len) {
203219 int i = matching_peer_indexes[sender_idx];
204220 if (i < 0 || i >= num_contacts) {
@@ -226,7 +242,7 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
226242 if (packet->isRouteFlood ()) {
227243 // let this sender know path TO here, so they can use sendDirect(), and ALSO encode the ACK
228244 mesh::Packet* path = createPathReturn (from.id , secret, packet->path , packet->path_len ,
229- PAYLOAD_TYPE_ACK , (uint8_t *) &ack_hash, 4 );
245+ PAYLOAD_TYPE_ACK , (uint8_t *) &ack_hash, 4 , from. nextAeadNonce () );
230246 if (path) sendFloodScoped (from, path, TXT_ACK_DELAY );
231247 } else {
232248 sendAckTo (from, ack_hash);
@@ -237,7 +253,7 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
237253
238254 if (packet->isRouteFlood ()) {
239255 // let this sender know path TO here, so they can use sendDirect() (NOTE: no ACK as extra)
240- mesh::Packet* path = createPathReturn (from.id , secret, packet->path , packet->path_len , 0 , NULL , 0 );
256+ mesh::Packet* path = createPathReturn (from.id , secret, packet->path , packet->path_len , 0 , NULL , 0 , from. nextAeadNonce () );
241257 if (path) sendFloodScoped (from, path);
242258 }
243259 } else if (flags == TXT_TYPE_SIGNED_PLAIN ) {
@@ -253,7 +269,7 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
253269 if (packet->isRouteFlood ()) {
254270 // let this sender know path TO here, so they can use sendDirect(), and ALSO encode the ACK
255271 mesh::Packet* path = createPathReturn (from.id , secret, packet->path , packet->path_len ,
256- PAYLOAD_TYPE_ACK , (uint8_t *) &ack_hash, 4 );
272+ PAYLOAD_TYPE_ACK , (uint8_t *) &ack_hash, 4 , from. nextAeadNonce () );
257273 if (path) sendFloodScoped (from, path, TXT_ACK_DELAY );
258274 } else {
259275 sendAckTo (from, ack_hash);
@@ -269,10 +285,10 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
269285 if (packet->isRouteFlood ()) {
270286 // let this sender know path TO here, so they can use sendDirect(), and ALSO encode the response
271287 mesh::Packet* path = createPathReturn (from.id , secret, packet->path , packet->path_len ,
272- PAYLOAD_TYPE_RESPONSE , temp_buf, reply_len);
288+ PAYLOAD_TYPE_RESPONSE , temp_buf, reply_len, from. nextAeadNonce () );
273289 if (path) sendFloodScoped (from, path, SERVER_RESPONSE_DELAY );
274290 } else {
275- mesh::Packet* reply = createDatagram (PAYLOAD_TYPE_RESPONSE , from.id , secret, temp_buf, reply_len);
291+ mesh::Packet* reply = createDatagram (PAYLOAD_TYPE_RESPONSE , from.id , secret, temp_buf, reply_len, from. nextAeadNonce () );
276292 if (reply) {
277293 if (from.out_path_len >= 0 ) { // we have an out_path, so send DIRECT
278294 sendDirect (reply, from.out_path , from.out_path_len , SERVER_RESPONSE_DELAY );
@@ -338,7 +354,7 @@ void BaseChatMesh::onAckRecv(mesh::Packet* packet, uint32_t ack_crc) {
338354void BaseChatMesh::handleReturnPathRetry (const ContactInfo& contact, const uint8_t * path, uint8_t path_len) {
339355 // NOTE: simplest impl is just to re-send a reciprocal return path to sender (DIRECTLY)
340356 // override this method in various firmwares, if there's a better strategy
341- mesh::Packet* rpath = createPathReturn (contact.id , contact.getSharedSecret (self_id), path, path_len, 0 , NULL , 0 );
357+ mesh::Packet* rpath = createPathReturn (contact.id , contact.getSharedSecret (self_id), path, path_len, 0 , NULL , 0 , contact. nextAeadNonce () );
342358 if (rpath) sendDirect (rpath, contact.out_path , contact.out_path_len , 3000 ); // 3 second delay
343359}
344360
@@ -387,7 +403,7 @@ mesh::Packet* BaseChatMesh::composeMsgPacket(const ContactInfo& recipient, uint3
387403 temp[len++] = attempt; // hide attempt number at tail end of payload
388404 }
389405
390- return createDatagram (PAYLOAD_TYPE_TXT_MSG , recipient.id , recipient.getSharedSecret (self_id), temp, len);
406+ return createDatagram (PAYLOAD_TYPE_TXT_MSG , recipient.id , recipient.getSharedSecret (self_id), temp, len, recipient. nextAeadNonce () );
391407}
392408
393409int BaseChatMesh::sendMessage (const ContactInfo& recipient, uint32_t timestamp, uint8_t attempt, const char * text, uint32_t & expected_ack, uint32_t & est_timeout) {
@@ -418,7 +434,7 @@ int BaseChatMesh::sendCommandData(const ContactInfo& recipient, uint32_t timest
418434 temp[4 ] = (attempt & 3 ) | (TXT_TYPE_CLI_DATA << 2 );
419435 memcpy (&temp[5 ], text, text_len + 1 );
420436
421- auto pkt = createDatagram (PAYLOAD_TYPE_TXT_MSG , recipient.id , recipient.getSharedSecret (self_id), temp, 5 + text_len);
437+ auto pkt = createDatagram (PAYLOAD_TYPE_TXT_MSG , recipient.id , recipient.getSharedSecret (self_id), temp, 5 + text_len, recipient. nextAeadNonce () );
422438 if (pkt == NULL ) return MSG_SEND_FAILED ;
423439
424440 uint32_t t = _radio->getEstAirtimeFor (pkt->getRawLength ());
@@ -559,7 +575,7 @@ int BaseChatMesh::sendRequest(const ContactInfo& recipient, const uint8_t* req_
559575 memcpy (temp, &tag, 4 ); // mostly an extra blob to help make packet_hash unique
560576 memcpy (&temp[4 ], req_data, data_len);
561577
562- pkt = createDatagram (PAYLOAD_TYPE_REQ , recipient.id , recipient.getSharedSecret (self_id), temp, 4 + data_len);
578+ pkt = createDatagram (PAYLOAD_TYPE_REQ , recipient.id , recipient.getSharedSecret (self_id), temp, 4 + data_len, recipient. nextAeadNonce () );
563579 }
564580 if (pkt) {
565581 uint32_t t = _radio->getEstAirtimeFor (pkt->getRawLength ());
@@ -586,7 +602,7 @@ int BaseChatMesh::sendRequest(const ContactInfo& recipient, uint8_t req_type, u
586602 memset (&temp[5 ], 0 , 4 ); // reserved (possibly for 'since' param)
587603 getRNG ()->random (&temp[9 ], 4 ); // random blob to help make packet-hash unique
588604
589- pkt = createDatagram (PAYLOAD_TYPE_REQ , recipient.id , recipient.getSharedSecret (self_id), temp, sizeof (temp));
605+ pkt = createDatagram (PAYLOAD_TYPE_REQ , recipient.id , recipient.getSharedSecret (self_id), temp, sizeof (temp), recipient. nextAeadNonce () );
590606 }
591607 if (pkt) {
592608 uint32_t t = _radio->getEstAirtimeFor (pkt->getRawLength ());
@@ -709,7 +725,7 @@ void BaseChatMesh::checkConnections() {
709725 // calc expected ACK reply
710726 mesh::Utils::sha256 ((uint8_t *)&connections[i].expected_ack , 4 , data, 9 , self_id.pub_key , PUB_KEY_SIZE );
711727
712- auto pkt = createDatagram (PAYLOAD_TYPE_REQ , contact->id , contact->getSharedSecret (self_id), data, 9 );
728+ auto pkt = createDatagram (PAYLOAD_TYPE_REQ , contact->id , contact->getSharedSecret (self_id), data, 9 , contact-> nextAeadNonce () );
713729 if (pkt) {
714730 sendDirect (pkt, contact->out_path , contact->out_path_len );
715731 }
0 commit comments