@@ -208,6 +208,22 @@ void BaseChatMesh::getPeerSharedSecret(uint8_t* dest_secret, int peer_idx) {
208208 }
209209}
210210
211+ uint8_t BaseChatMesh::getPeerFlags (int peer_idx) {
212+ int i = matching_peer_indexes[peer_idx];
213+ if (i >= 0 && i < num_contacts) {
214+ return contacts[i].flags ;
215+ }
216+ return 0 ;
217+ }
218+
219+ uint16_t BaseChatMesh::getPeerNextAeadNonce (int peer_idx) {
220+ int i = matching_peer_indexes[peer_idx];
221+ if (i >= 0 && i < num_contacts) {
222+ return contacts[i].nextAeadNonce ();
223+ }
224+ return 0 ;
225+ }
226+
211227void BaseChatMesh::onPeerDataRecv (mesh::Packet* packet, uint8_t type, int sender_idx, const uint8_t * secret, uint8_t * data, size_t len) {
212228 int i = matching_peer_indexes[sender_idx];
213229 if (i < 0 || i >= num_contacts) {
@@ -239,7 +255,7 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
239255 if (packet->isRouteFlood ()) {
240256 // let this sender know path TO here, so they can use sendDirect(), and ALSO encode the ACK
241257 mesh::Packet* path = createPathReturn (from.id , secret, packet->path , packet->path_len ,
242- PAYLOAD_TYPE_ACK , (uint8_t *) &ack_hash, 6 );
258+ PAYLOAD_TYPE_ACK , (uint8_t *) &ack_hash, 6 , from. nextAeadNonce () );
243259 if (path) sendFloodScoped (from, path, TXT_ACK_DELAY );
244260 } else {
245261 sendAckTo (from, ack_hash, 6 );
@@ -250,7 +266,7 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
250266
251267 if (packet->isRouteFlood ()) {
252268 // let this sender know path TO here, so they can use sendDirect() (NOTE: no ACK as extra)
253- mesh::Packet* path = createPathReturn (from.id , secret, packet->path , packet->path_len , 0 , NULL , 0 );
269+ mesh::Packet* path = createPathReturn (from.id , secret, packet->path , packet->path_len , 0 , NULL , 0 , from. nextAeadNonce () );
254270 if (path) sendFloodScoped (from, path);
255271 }
256272 } else if (flags == TXT_TYPE_SIGNED_PLAIN ) {
@@ -266,7 +282,7 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
266282 if (packet->isRouteFlood ()) {
267283 // let this sender know path TO here, so they can use sendDirect(), and ALSO encode the ACK
268284 mesh::Packet* path = createPathReturn (from.id , secret, packet->path , packet->path_len ,
269- PAYLOAD_TYPE_ACK , (uint8_t *) &ack_hash, 4 );
285+ PAYLOAD_TYPE_ACK , (uint8_t *) &ack_hash, 4 , from. nextAeadNonce () );
270286 if (path) sendFloodScoped (from, path, TXT_ACK_DELAY );
271287 } else {
272288 sendAckTo (from, (uint8_t *) &ack_hash);
@@ -282,10 +298,10 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
282298 if (packet->isRouteFlood ()) {
283299 // let this sender know path TO here, so they can use sendDirect(), and ALSO encode the response
284300 mesh::Packet* path = createPathReturn (from.id , secret, packet->path , packet->path_len ,
285- PAYLOAD_TYPE_RESPONSE , temp_buf, reply_len);
301+ PAYLOAD_TYPE_RESPONSE , temp_buf, reply_len, from. nextAeadNonce () );
286302 if (path) sendFloodScoped (from, path, SERVER_RESPONSE_DELAY );
287303 } else {
288- mesh::Packet* reply = createDatagram (PAYLOAD_TYPE_RESPONSE , from.id , secret, temp_buf, reply_len);
304+ mesh::Packet* reply = createDatagram (PAYLOAD_TYPE_RESPONSE , from.id , secret, temp_buf, reply_len, from. nextAeadNonce () );
289305 if (reply) {
290306 if (from.out_path_len != OUT_PATH_UNKNOWN ) { // we have an out_path, so send DIRECT
291307 sendDirect (reply, from.out_path , from.out_path_len , SERVER_RESPONSE_DELAY );
@@ -351,7 +367,7 @@ void BaseChatMesh::onAckRecv(mesh::Packet* packet, uint32_t ack_crc) {
351367void BaseChatMesh::handleReturnPathRetry (const ContactInfo& contact, const uint8_t * path, uint8_t path_len) {
352368 // NOTE: simplest impl is just to re-send a reciprocal return path to sender (DIRECTLY)
353369 // override this method in various firmwares, if there's a better strategy
354- mesh::Packet* rpath = createPathReturn (contact.id , contact.getSharedSecret (self_id), path, path_len, 0 , NULL , 0 );
370+ mesh::Packet* rpath = createPathReturn (contact.id , contact.getSharedSecret (self_id), path, path_len, 0 , NULL , 0 , contact. nextAeadNonce () );
355371 if (rpath) sendDirect (rpath, contact.out_path , contact.out_path_len , 3000 ); // 3 second delay
356372}
357373
@@ -427,7 +443,7 @@ mesh::Packet* BaseChatMesh::composeMsgPacket(const ContactInfo& recipient, uint3
427443 temp[len++] = attempt; // hide attempt number at tail end of payload
428444 }
429445
430- return createDatagram (PAYLOAD_TYPE_TXT_MSG , recipient.id , recipient.getSharedSecret (self_id), temp, len);
446+ return createDatagram (PAYLOAD_TYPE_TXT_MSG , recipient.id , recipient.getSharedSecret (self_id), temp, len, recipient. nextAeadNonce () );
431447}
432448
433449int BaseChatMesh::sendMessage (const ContactInfo& recipient, uint32_t timestamp, uint8_t attempt, const char * text, uint32_t & expected_ack, uint32_t & est_timeout) {
@@ -458,7 +474,7 @@ int BaseChatMesh::sendCommandData(const ContactInfo& recipient, uint32_t timest
458474 temp[4 ] = (attempt & 3 ) | (TXT_TYPE_CLI_DATA << 2 );
459475 memcpy (&temp[5 ], text, text_len + 1 );
460476
461- auto pkt = createDatagram (PAYLOAD_TYPE_TXT_MSG , recipient.id , recipient.getSharedSecret (self_id), temp, 5 + text_len);
477+ auto pkt = createDatagram (PAYLOAD_TYPE_TXT_MSG , recipient.id , recipient.getSharedSecret (self_id), temp, 5 + text_len, recipient. nextAeadNonce () );
462478 if (pkt == NULL ) return MSG_SEND_FAILED ;
463479
464480 uint32_t t = _radio->getEstAirtimeFor (pkt->getRawLength ());
@@ -630,7 +646,7 @@ int BaseChatMesh::sendRequest(const ContactInfo& recipient, const uint8_t* req_
630646 memcpy (temp, &tag, 4 ); // mostly an extra blob to help make packet_hash unique
631647 memcpy (&temp[4 ], req_data, data_len);
632648
633- pkt = createDatagram (PAYLOAD_TYPE_REQ , recipient.id , recipient.getSharedSecret (self_id), temp, 4 + data_len);
649+ pkt = createDatagram (PAYLOAD_TYPE_REQ , recipient.id , recipient.getSharedSecret (self_id), temp, 4 + data_len, recipient. nextAeadNonce () );
634650 }
635651 if (pkt) {
636652 uint32_t t = _radio->getEstAirtimeFor (pkt->getRawLength ());
@@ -657,7 +673,7 @@ int BaseChatMesh::sendRequest(const ContactInfo& recipient, uint8_t req_type, u
657673 memset (&temp[5 ], 0 , 4 ); // reserved (possibly for 'since' param)
658674 getRNG ()->random (&temp[9 ], 4 ); // random blob to help make packet-hash unique
659675
660- pkt = createDatagram (PAYLOAD_TYPE_REQ , recipient.id , recipient.getSharedSecret (self_id), temp, sizeof (temp));
676+ pkt = createDatagram (PAYLOAD_TYPE_REQ , recipient.id , recipient.getSharedSecret (self_id), temp, sizeof (temp), recipient. nextAeadNonce () );
661677 }
662678 if (pkt) {
663679 uint32_t t = _radio->getEstAirtimeFor (pkt->getRawLength ());
@@ -780,7 +796,7 @@ void BaseChatMesh::checkConnections() {
780796 // calc expected ACK reply
781797 mesh::Utils::sha256 ((uint8_t *)&connections[i].expected_ack , 4 , data, 9 , self_id.pub_key , PUB_KEY_SIZE );
782798
783- auto pkt = createDatagram (PAYLOAD_TYPE_REQ , contact->id , contact->getSharedSecret (self_id), data, 9 );
799+ auto pkt = createDatagram (PAYLOAD_TYPE_REQ , contact->id , contact->getSharedSecret (self_id), data, 9 , contact-> nextAeadNonce () );
784800 if (pkt) {
785801 sendDirect (pkt, contact->out_path , contact->out_path_len );
786802 }
0 commit comments