@@ -76,7 +76,7 @@ extern uint32_t _SPIFFS_start; //See spiffs_api.h
7676
7777#define ACCESSORY_KEY_SIZE 64
7878
79- #define STORAGE_DEBUG (message , ...) // printf("*** [Storage] %s: " message "\n", __func__, ##__VA_ARGS__)
79+ #define STORAGE_DEBUG (message , ...) printf("*** [Storage] %s: " message "\n", __func__, ##__VA_ARGS__)
8080
8181const char hap_magic [] = "HAP" ;
8282
@@ -94,7 +94,7 @@ bool homekit_storage_magic_valid() {
9494 char magic_test [sizeof (hap_magic )];
9595 bzero (magic_test , sizeof (magic_test ));
9696
97- if (!spiflash_read (MAGIC_ADDR , (byte * )magic_test , sizeof (magic_test ))) {
97+ if (!spiflash_read (MAGIC_ADDR , (uint32 * )magic_test , sizeof (magic_test ))) {
9898 ERROR ("Failed to read HomeKit storage magic" );
9999 return false;
100100 }
@@ -105,7 +105,7 @@ bool homekit_storage_set_magic() {
105105 char magic [sizeof (hap_magic )];
106106 memcpy (magic , hap_magic , sizeof (magic ));
107107
108- if (!spiflash_write (MAGIC_ADDR , (byte * )magic , sizeof (magic ))) {
108+ if (!spiflash_write (MAGIC_ADDR , (uint32 * )magic , sizeof (magic ))) {
109109 ERROR ("Failed to write HomeKit storage magic" );
110110 return false;
111111 }
@@ -130,6 +130,21 @@ int homekit_storage_init() {
130130 }
131131 return 1 ; // Wasn't valid, is now
132132 }
133+
134+ pairing_data_t data ;
135+ int paired = 0 ;
136+ for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
137+ spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (uint32 * )& data , sizeof (data ));
138+ if (memcmp (data .magic , hap_magic , sizeof (hap_magic )) == 0 ) {
139+ paired ++ ;
140+ char device_id [DEVICE_ID_SIZE + 1 ];
141+ memset (device_id , 0 , sizeof (device_id ));
142+ memcpy (device_id , data .device_id , DEVICE_ID_SIZE );
143+ STORAGE_DEBUG ("%spaired with %s" , (data .permissions & pairing_permissions_admin ) ? "[admin] " : "" , device_id );
144+ }
145+ }
146+ STORAGE_DEBUG ("%d paired devices" , paired );
147+
133148 return 0 ; // Was valid
134149}
135150
@@ -138,7 +153,7 @@ int homekit_storage_reset() {
138153 byte blank [sizeof (hap_magic )];
139154 bzero (blank , sizeof (blank ));
140155
141- if (!spiflash_write (MAGIC_ADDR , blank , sizeof (blank ))) {
156+ if (!spiflash_write (MAGIC_ADDR , ( uint32 * ) blank , sizeof (blank ))) {
142157 ERROR ("Failed to reset HomeKit storage" );
143158 return -1 ;
144159 }
@@ -147,20 +162,20 @@ int homekit_storage_reset() {
147162}
148163
149164int homekit_storage_reset_pairing_data () {
150-
165+
151166 byte blank [sizeof (pairing_data_t ) * MAX_PAIRINGS ];
152167 bzero (blank ,sizeof (blank ));
153168
154169 INFO ("Formatting HomeKit storage at 0x%x" , PAIRINGS_OFFSET );
155- if (!spiflash_write (PAIRINGS_ADDR , blank , sizeof (blank ))) {
170+ if (!spiflash_write (PAIRINGS_ADDR , ( uint32 * ) blank , sizeof (blank ))) {
156171 ERROR ("Failed to erase HomeKit pairing storage" );
157172 return -1 ; // Fail case
158173 }
159174 return 0 ;
160175}
161176
162177void homekit_storage_save_accessory_id (const char * accessory_id ) {
163- if (!spiflash_write (ACCESSORY_ID_ADDR , (byte * )accessory_id , ACCESSORY_ID_SIZE )) {
178+ if (!spiflash_write (ACCESSORY_ID_ADDR , (uint32 * )accessory_id , ACCESSORY_ID_SIZE )) {
164179 ERROR ("Failed to write accessory ID to HomeKit storage" );
165180 }
166181}
@@ -172,7 +187,7 @@ static char ishex(unsigned char c) {
172187}
173188
174189int homekit_storage_load_accessory_id (char * data ) {
175- if (!spiflash_read (ACCESSORY_ID_ADDR , (byte * )data , ACCESSORY_ID_SIZE )) {
190+ if (!spiflash_read (ACCESSORY_ID_ADDR , (uint32 * )data , ACCESSORY_ID_SIZE )) {
176191 ERROR ("Failed to read accessory ID from HomeKit storage" );
177192 return -1 ;
178193 }
@@ -200,15 +215,15 @@ void homekit_storage_save_accessory_key(const ed25519_key *key) {
200215 return ;
201216 }
202217
203- if (!spiflash_write (ACCESSORY_KEY_ADDR , key_data , key_data_size )) {
218+ if (!spiflash_write (ACCESSORY_KEY_ADDR , ( uint32 * ) key_data , key_data_size )) {
204219 ERROR ("Failed to write accessory key to HomeKit storage" );
205220 return ;
206221 }
207222}
208223
209224int homekit_storage_load_accessory_key (ed25519_key * key ) {
210225 byte key_data [ACCESSORY_KEY_SIZE ];
211- if (!spiflash_read (ACCESSORY_KEY_ADDR , key_data , sizeof (key_data ))) {
226+ if (!spiflash_read (ACCESSORY_KEY_ADDR , ( uint32 * ) key_data , sizeof (key_data ))) {
212227 ERROR ("Failed to read accessory key from HomeKit storage" );
213228 return -1 ;
214229 }
@@ -226,16 +241,28 @@ int homekit_storage_load_accessory_key(ed25519_key *key) {
226241bool homekit_storage_can_add_pairing () {
227242 pairing_data_t data ;
228243 for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
229- spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ));
244+ spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (uint32 * )& data , sizeof (data ));
230245 if (memcmp (data .magic , hap_magic , sizeof (hap_magic )))
231246 return true;
232247 }
233248 return false;
234249}
235250
251+ static int find_empty_block () {
252+ pairing_data_t data ;
253+ for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
254+ spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (uint32 * )& data , sizeof (data ));
255+ if (memcmp (data .magic , hap_magic , sizeof (hap_magic ))) {
256+ INFO ("empty block %d" , i );
257+ return i ;
258+ }
259+ }
260+ return -1 ;
261+ }
262+
236263static int compact_data () {
237264 byte * data = malloc (SPI_FLASH_SECTOR_SIZE );
238- if (!spiflash_read (STORAGE_BASE_ADDR , data , SPI_FLASH_SECTOR_SIZE )) {
265+ if (!spiflash_read (STORAGE_BASE_ADDR , ( uint32 * ) data , SPI_FLASH_SECTOR_SIZE )) {
239266 free (data );
240267 ERROR ("Failed to compact HomeKit storage: sector data read error" );
241268 return -1 ;
@@ -264,7 +291,7 @@ static int compact_data() {
264291 free (data );
265292 return -1 ;
266293 }
267- if (!spiflash_write (STORAGE_BASE_ADDR , data , PAIRINGS_OFFSET + sizeof (pairing_data_t )* next_pairing_idx )) {
294+ if (!spiflash_write (STORAGE_BASE_ADDR , ( uint32 * ) data , PAIRINGS_OFFSET + sizeof (pairing_data_t )* next_pairing_idx )) {
268295 ERROR ("Failed to compact HomeKit storage: error writing compacted data" );
269296 free (data );
270297 return -1 ;
@@ -275,26 +302,6 @@ static int compact_data() {
275302 return 0 ;
276303}
277304
278- static int find_empty_block () {
279- byte data [sizeof (pairing_data_t )];
280-
281- for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
282- spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , data , sizeof (data ));
283-
284- bool block_empty = true;
285- for (int j = 0 ; j < sizeof (data ); j ++ )
286- if (data [j ] != 0xff ) {
287- block_empty = false;
288- break ;
289- }
290-
291- if (block_empty )
292- return i ;
293- }
294-
295- return -1 ;
296- }
297-
298305int homekit_storage_add_pairing (const char * device_id , const ed25519_key * device_key , byte permissions ) {
299306 int next_block_idx = find_empty_block ();
300307 if (next_block_idx == -1 ) {
@@ -322,7 +329,7 @@ int homekit_storage_add_pairing(const char *device_id, const ed25519_key *device
322329 return -1 ;
323330 }
324331
325- if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* next_block_idx , (byte * )& data , sizeof (data ))) {
332+ if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* next_block_idx , (uint32 * )& data , sizeof (data ))) {
326333 ERROR ("Failed to write pairing info to HomeKit storage" );
327334 return -1 ;
328335 }
@@ -334,7 +341,7 @@ int homekit_storage_add_pairing(const char *device_id, const ed25519_key *device
334341int homekit_storage_update_pairing (const char * device_id , byte permissions ) {
335342 pairing_data_t data ;
336343 for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
337- spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ));
344+ spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (uint32 * )& data , sizeof (data ));
338345 if (memcmp (data .magic , hap_magic , sizeof (data .magic )))
339346 continue ;
340347
@@ -352,13 +359,13 @@ int homekit_storage_update_pairing(const char *device_id, byte permissions) {
352359
353360 data .permissions = permissions ;
354361
355- if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* next_block_idx , (byte * )& data , sizeof (data ))) {
362+ if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* next_block_idx , (uint32 * )& data , sizeof (data ))) {
356363 ERROR ("Failed to write pairing info to HomeKit storage" );
357364 return -1 ;
358365 }
359366
360367 bzero (& data , sizeof (data ));
361- if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ))) {
368+ if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* i , (uint32 * )& data , sizeof (data ))) {
362369 ERROR ("Failed to update pairing: error erasing old record from HomeKit storage" );
363370 return -2 ;
364371 }
@@ -373,13 +380,13 @@ int homekit_storage_update_pairing(const char *device_id, byte permissions) {
373380int homekit_storage_remove_pairing (const char * device_id ) {
374381 pairing_data_t data ;
375382 for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
376- spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ));
383+ spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (uint32 * )& data , sizeof (data ));
377384 if (memcmp (data .magic , hap_magic , sizeof (data .magic )))
378385 continue ;
379386
380387 if (!memcmp (data .device_id , device_id , sizeof (data .device_id ))) {
381388 bzero (& data , sizeof (data ));
382- if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ))) {
389+ if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* i , (uint32 * )& data , sizeof (data ))) {
383390 ERROR ("Failed to remove pairing from HomeKit storage" );
384391 return -2 ;
385392 }
@@ -394,7 +401,7 @@ int homekit_storage_remove_pairing(const char *device_id) {
394401int homekit_storage_find_pairing (const char * device_id , pairing_t * pairing ) {
395402 pairing_data_t data ;
396403 for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
397- spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ));
404+ spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (uint32 * )& data , sizeof (data ));
398405 if (memcmp (data .magic , hap_magic , sizeof (data .magic )))
399406 continue ;
400407
@@ -433,7 +440,7 @@ int homekit_storage_next_pairing(pairing_iterator_t *it, pairing_t *pairing) {
433440 while (it -> idx < MAX_PAIRINGS ) {
434441 int id = it -> idx ++ ;
435442
436- spiflash_read (PAIRINGS_ADDR + sizeof (data )* id , (byte * )& data , sizeof (data ));
443+ spiflash_read (PAIRINGS_ADDR + sizeof (data )* id , (uint32 * )& data , sizeof (data ));
437444 if (!memcmp (data .magic , hap_magic , sizeof (data .magic ))) {
438445 crypto_ed25519_init (& pairing -> device_key );
439446 int r = crypto_ed25519_import_public_key (& pairing -> device_key , data .device_public_key , sizeof (data .device_public_key ));
0 commit comments