@@ -78,59 +78,62 @@ extern uint32_t _SPIFFS_start; //See spiffs_api.h
7878
7979#define STORAGE_DEBUG (message , ...) //printf("*** [Storage] %s: " message "\n", __func__, ##__VA_ARGS__)
8080
81- const char magic1 [] = "HAP" ;
81+ const char hap_magic [] = "HAP" ;
8282
8383// TODO: figure out alignment issues
8484typedef struct {
85- char magic [sizeof (magic1 )];
85+ char magic [sizeof (hap_magic )];
8686 byte permissions ;
8787 char device_id [DEVICE_ID_SIZE ];
8888 byte device_public_key [32 ];
8989
9090 byte _reserved [7 ]; // align record to be 80 bytes
9191} pairing_data_t ;
9292
93+ bool homekit_storage_magic_valid () {
94+ char magic_test [sizeof (hap_magic )];
95+ bzero (magic_test , sizeof (magic_test ));
9396
94- int homekit_storage_init () {
97+ if (!spiflash_read (MAGIC_ADDR , (byte * )magic_test , sizeof (magic_test ))) {
98+ ERROR ("Failed to read HomeKit storage magic" );
99+ return false;
100+ }
101+ return (memcmp (magic_test , hap_magic , sizeof (hap_magic )) == 0 );
102+ }
95103
96- STORAGE_DEBUG ( "EEPROM max: %d B" , SPI_FLASH_SEC_SIZE ); //4096B
97- STORAGE_DEBUG ( "Pairing_data size: %d " , (sizeof (pairing_data_t ))); //80B
98- STORAGE_DEBUG ( "MAX pairing count: %d " , MAX_PAIRINGS ); //16
99- STORAGE_DEBUG ( "_EEPROM_start: 0x%x (%u)" ,
100- HOMEKIT_EEPROM_PHYS_ADDR , HOMEKIT_EEPROM_PHYS_ADDR );
101- STORAGE_DEBUG ( "_SPIFFS_start: 0x%x (%u)" ,
102- HOMEKIT_SPIFFS_PHYS_ADDR , HOMEKIT_SPIFFS_PHYS_ADDR );
104+ bool homekit_storage_set_magic () {
105+ if (! spiflash_write ( MAGIC_ADDR , (byte * ) hap_magic , sizeof (hap_magic ))) {
106+ ERROR ( "Failed to write HomeKit storage magic" );
107+ return false;
108+ }
109+ return true;
110+ }
103111
104- char magic [sizeof (magic1 )];
105- memset (magic , 0 , sizeof (magic ));
112+ int homekit_storage_init () {
106113
107- if (!spiflash_read (MAGIC_ADDR , (byte * )magic , sizeof (magic ))) {
108- ERROR ("Failed to read HomeKit storage magic" );
109- }
114+ STORAGE_DEBUG ("EEPROM max: %d B" , SPI_FLASH_SEC_SIZE );//4096B
115+ STORAGE_DEBUG ("Pairing_data size: %d " , (sizeof (pairing_data_t )));//80B
116+ STORAGE_DEBUG ("MAX pairing count: %d " , MAX_PAIRINGS );//16
117+ STORAGE_DEBUG ("_EEPROM_start: 0x%x (%u)" ,
118+ HOMEKIT_EEPROM_PHYS_ADDR , HOMEKIT_EEPROM_PHYS_ADDR );
119+ STORAGE_DEBUG ("_SPIFFS_start: 0x%x (%u)" ,
120+ HOMEKIT_SPIFFS_PHYS_ADDR , HOMEKIT_SPIFFS_PHYS_ADDR );
110121
111- if (strncmp ( magic , magic1 , sizeof ( magic1 ) )) {
122+ if (! homekit_storage_magic_valid ( )) {
112123 INFO ("Formatting HomeKit storage at 0x%x" , STORAGE_BASE_ADDR );
113- if (!spiflash_erase_sector (STORAGE_BASE_ADDR )) {
124+ if (!spiflash_erase_sector (STORAGE_BASE_ADDR ) || ! homekit_storage_set_magic () ) {
114125 ERROR ("Failed to erase HomeKit storage" );
115- return -1 ;
126+ return -1 ; // Fail case
116127 }
117-
118- strncpy (magic , magic1 , sizeof (magic ));
119- if (!spiflash_write (MAGIC_ADDR , (byte * )magic , sizeof (magic ))) {
120- ERROR ("Failed to write HomeKit storage magic" );
121- return -1 ;
122- }
123-
124- return 1 ;
128+ return 1 ; // Wasn't valid, is now
125129 }
126-
127- return 0 ;
130+ return 0 ; // Was valid
128131}
129132
130133
131134int homekit_storage_reset () {
132- byte blank [sizeof (magic1 )];
133- memset (blank , 0 , sizeof (blank ));
135+ byte blank [sizeof (hap_magic )];
136+ bzero (blank , sizeof (blank ));
134137
135138 if (!spiflash_write (MAGIC_ADDR , blank , sizeof (blank ))) {
136139 ERROR ("Failed to reset HomeKit storage" );
@@ -140,6 +143,18 @@ int homekit_storage_reset() {
140143 return homekit_storage_init ();
141144}
142145
146+ int homekit_storage_reset_pairing_data () {
147+
148+ byte blank [sizeof (pairing_data_t ) * MAX_PAIRINGS ];
149+ bzero (blank ,sizeof (blank ));
150+
151+ INFO ("Formatting HomeKit storage at 0x%x" , PAIRINGS_OFFSET );
152+ if (!spiflash_write (PAIRINGS_OFFSET , blank , sizeof (blank ))) {
153+ ERROR ("Failed to erase HomeKit pairing storage" );
154+ return -1 ; // Fail case
155+ }
156+ return 0 ;
157+ }
143158
144159void homekit_storage_save_accessory_id (const char * accessory_id ) {
145160 if (!spiflash_write (ACCESSORY_ID_ADDR , (byte * )accessory_id , ACCESSORY_ID_SIZE )) {
@@ -209,7 +224,7 @@ bool homekit_storage_can_add_pairing() {
209224 pairing_data_t data ;
210225 for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
211226 spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ));
212- if (strncmp (data .magic , magic1 , sizeof (magic1 )))
227+ if (memcmp (data .magic , hap_magic , sizeof (hap_magic )))
213228 return true;
214229 }
215230 return false;
@@ -226,7 +241,7 @@ static int compact_data() {
226241 int next_pairing_idx = 0 ;
227242 for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
228243 pairing_data_t * pairing_data = (pairing_data_t * )& data [PAIRINGS_OFFSET + sizeof (pairing_data_t )* i ];
229- if (!strncmp (pairing_data -> magic , magic1 , sizeof (magic1 ))) {
244+ if (!memcmp (pairing_data -> magic , hap_magic , sizeof (hap_magic ))) {
230245 if (i != next_pairing_idx ) {
231246 memcpy (& data [PAIRINGS_ADDR + sizeof (pairing_data_t )* next_pairing_idx ],
232247 pairing_data , sizeof (* pairing_data ));
@@ -241,7 +256,7 @@ static int compact_data() {
241256 return 0 ;
242257 }
243258
244- if (homekit_storage_reset ()) {
259+ if (homekit_storage_reset_pairing_data ()) {
245260 ERROR ("Failed to compact HomeKit storage: error resetting flash" );
246261 free (data );
247262 return -1 ;
@@ -291,10 +306,10 @@ int homekit_storage_add_pairing(const char *device_id, const ed25519_key *device
291306
292307 pairing_data_t data ;
293308
294- memset (& data , 0 , sizeof (data ));
295- strncpy (data .magic , magic1 , sizeof (data .magic ));
309+ bzero (& data , sizeof (data ));
310+ memcpy (data .magic , hap_magic , sizeof (data .magic ));
296311 data .permissions = permissions ;
297- strncpy (data .device_id , device_id , sizeof (data .device_id ));
312+ memcpy (data .device_id , device_id , sizeof (data .device_id ));
298313 size_t device_public_key_size = sizeof (data .device_public_key );
299314 int r = crypto_ed25519_export_public_key (
300315 device_key , data .device_public_key , & device_public_key_size
@@ -317,10 +332,10 @@ int homekit_storage_update_pairing(const char *device_id, byte permissions) {
317332 pairing_data_t data ;
318333 for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
319334 spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ));
320- if (strncmp (data .magic , magic1 , sizeof (data .magic )))
335+ if (memcmp (data .magic , hap_magic , sizeof (data .magic )))
321336 continue ;
322337
323- if (!strncmp (data .device_id , device_id , sizeof (data .device_id ))) {
338+ if (!memcmp (data .device_id , device_id , sizeof (data .device_id ))) {
324339 int next_block_idx = find_empty_block ();
325340 if (next_block_idx == -1 ) {
326341 compact_data ();
@@ -339,7 +354,7 @@ int homekit_storage_update_pairing(const char *device_id, byte permissions) {
339354 return -1 ;
340355 }
341356
342- memset (& data , 0 , sizeof (data ));
357+ bzero (& data , sizeof (data ));
343358 if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ))) {
344359 ERROR ("Failed to update pairing: error erasing old record from HomeKit storage" );
345360 return -2 ;
@@ -356,11 +371,11 @@ int homekit_storage_remove_pairing(const char *device_id) {
356371 pairing_data_t data ;
357372 for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
358373 spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ));
359- if (strncmp (data .magic , magic1 , sizeof (data .magic )))
374+ if (memcmp (data .magic , hap_magic , sizeof (data .magic )))
360375 continue ;
361376
362- if (!strncmp (data .device_id , device_id , sizeof (data .device_id ))) {
363- memset (& data , 0 , sizeof (data ));
377+ if (!memcmp (data .device_id , device_id , sizeof (data .device_id ))) {
378+ bzero (& data , sizeof (data ));
364379 if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ))) {
365380 ERROR ("Failed to remove pairing from HomeKit storage" );
366381 return -2 ;
@@ -377,10 +392,10 @@ int homekit_storage_find_pairing(const char *device_id, pairing_t *pairing) {
377392 pairing_data_t data ;
378393 for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
379394 spiflash_read (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ));
380- if (strncmp (data .magic , magic1 , sizeof (data .magic )))
395+ if (memcmp (data .magic , hap_magic , sizeof (data .magic )))
381396 continue ;
382397
383- if (!strncmp (data .device_id , device_id , sizeof (data .device_id ))) {
398+ if (!memcmp (data .device_id , device_id , sizeof (data .device_id ))) {
384399 crypto_ed25519_init (& pairing -> device_key );
385400 int r = crypto_ed25519_import_public_key (& pairing -> device_key , data .device_public_key , sizeof (data .device_public_key ));
386401 if (r ) {
@@ -389,7 +404,7 @@ int homekit_storage_find_pairing(const char *device_id, pairing_t *pairing) {
389404 }
390405
391406 pairing -> id = i ;
392- strncpy (pairing -> device_id , data .device_id , DEVICE_ID_SIZE );
407+ memcpy (pairing -> device_id , data .device_id , DEVICE_ID_SIZE );
393408 pairing -> device_id [DEVICE_ID_SIZE ] = 0 ;
394409 pairing -> permissions = data .permissions ;
395410
@@ -416,7 +431,7 @@ int homekit_storage_next_pairing(pairing_iterator_t *it, pairing_t *pairing) {
416431 int id = it -> idx ++ ;
417432
418433 spiflash_read (PAIRINGS_ADDR + sizeof (data )* id , (byte * )& data , sizeof (data ));
419- if (!strncmp (data .magic , magic1 , sizeof (data .magic ))) {
434+ if (!memcmp (data .magic , hap_magic , sizeof (data .magic ))) {
420435 crypto_ed25519_init (& pairing -> device_key );
421436 int r = crypto_ed25519_import_public_key (& pairing -> device_key , data .device_public_key , sizeof (data .device_public_key ));
422437 if (r ) {
@@ -425,7 +440,7 @@ int homekit_storage_next_pairing(pairing_iterator_t *it, pairing_t *pairing) {
425440 }
426441
427442 pairing -> id = id ;
428- strncpy (pairing -> device_id , data .device_id , DEVICE_ID_SIZE );
443+ memcpy (pairing -> device_id , data .device_id , DEVICE_ID_SIZE );
429444 pairing -> device_id [DEVICE_ID_SIZE ] = 0 ;
430445 pairing -> permissions = data .permissions ;
431446
0 commit comments