Przeglądaj źródła

Share the frequency via NFC too

Warning: this breaks compatibility with older versions of the app!
twisted_pear 2 lat temu
rodzic
commit
3409467f67

+ 7 - 0
helpers/nfc_helpers.h

@@ -7,6 +7,13 @@ extern "C" {
 #define NFC_MAX_BYTES 256
 #define NFC_CONFIG_PAGES 4
 
+struct FreqNfcEntry {
+	uint32_t frequency;
+	uint32_t unused1;
+	uint32_t unused2;
+	uint32_t unused3;
+} __attribute__ ((packed));
+
 struct ReplayDictNfcEntry {
 	uint64_t run_id;
 	uint32_t counter;

+ 9 - 1
scenes/esubghz_chat_key_read_popup.c

@@ -93,9 +93,17 @@ static bool key_read_popup_handle_key_read(ESubGhzChatState *state)
 		return false;
 	}
 
+	/* read the frequency */
+	if (data_read >= (KEY_BITS / 8) + sizeof(struct FreqNfcEntry)) {
+		struct FreqNfcEntry *freq_entry = (struct FreqNfcEntry *)
+			(dev_data->mf_ul_data.data + (KEY_BITS / 8));
+		state->frequency = __ntohl(freq_entry->frequency);
+	}
+
 	/* read the replay dict */
 	struct ReplayDictNfcReaderContext rd_ctx = {
-		.cur = dev_data->mf_ul_data.data + (KEY_BITS / 8),
+		.cur = dev_data->mf_ul_data.data + (KEY_BITS / 8) +
+			sizeof(struct FreqNfcEntry),
 		.max = dev_data->mf_ul_data.data + (data_read < NFC_MAX_BYTES ?
 				data_read : NFC_MAX_BYTES)
 	};

+ 15 - 4
scenes/esubghz_chat_key_share_popup.c

@@ -49,22 +49,33 @@ static void prepare_nfc_dev_data(ESubGhzChatState *state)
 	dev_data->mf_ul_data.version.storage_size = 0x11;
 	dev_data->mf_ul_data.version.protocol_type = 0x03;
 
+	size_t data_written = 0;
+
 	/* write key */
 	crypto_ctx_get_key(state->crypto_ctx, dev_data->mf_ul_data.data);
+	data_written += (KEY_BITS / 8);
+
+	/* write frequency */
+	struct FreqNfcEntry *freq_entry = (struct FreqNfcEntry *)
+		(dev_data->mf_ul_data.data + data_written);
+	freq_entry->frequency = __htonl(state->frequency);
+	freq_entry->unused1 = 0;
+	freq_entry->unused2 = 0;
+	freq_entry->unused3 = 0;
+	data_written += sizeof(struct FreqNfcEntry);
 
 	/* write the replay dict */
 	struct ReplayDictNfcWriterContext wr_ctx = {
-		.cur = dev_data->mf_ul_data.data + (KEY_BITS / 8),
+		.cur = dev_data->mf_ul_data.data + data_written,
 		.max = dev_data->mf_ul_data.data + NFC_MAX_BYTES
 	};
 
 	size_t n_entries = crypto_ctx_dump_replay_dict(state->crypto_ctx,
 			replay_dict_nfc_writer, &wr_ctx);
+	data_written += n_entries * sizeof(struct ReplayDictNfcEntry);
 
 	/* calculate size of data, add 16 for config pages */
-	dev_data->mf_ul_data.data_size = (KEY_BITS / 8) + (n_entries *
-			sizeof(struct ReplayDictNfcEntry)) + (NFC_CONFIG_PAGES
-			* 4);
+	dev_data->mf_ul_data.data_size = data_written + (NFC_CONFIG_PAGES * 4);
 }
 
 /* Prepares the key share popup scene. */