@@ -78,59 +78,62 @@ extern uint32_t _SPIFFS_start; //See spiffs_api.h
78
78
79
79
#define STORAGE_DEBUG (message , ...) //printf("*** [Storage] %s: " message "\n", __func__, ##__VA_ARGS__)
80
80
81
- const char magic1 [] = "HAP" ;
81
+ const char hap_magic [] = "HAP" ;
82
82
83
83
// TODO: figure out alignment issues
84
84
typedef struct {
85
- char magic [sizeof (magic1 )];
85
+ char magic [sizeof (hap_magic )];
86
86
byte permissions ;
87
87
char device_id [DEVICE_ID_SIZE ];
88
88
byte device_public_key [32 ];
89
89
90
90
byte _reserved [7 ]; // align record to be 80 bytes
91
91
} pairing_data_t ;
92
92
93
+ bool homekit_storage_magic_valid () {
94
+ char magic_test [sizeof (hap_magic )];
95
+ bzero (magic_test , sizeof (magic_test ));
93
96
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
+ }
95
103
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
+ }
103
111
104
- char magic [sizeof (magic1 )];
105
- memset (magic , 0 , sizeof (magic ));
112
+ int homekit_storage_init () {
106
113
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 );
110
121
111
- if (strncmp ( magic , magic1 , sizeof ( magic1 ) )) {
122
+ if (! homekit_storage_magic_valid ( )) {
112
123
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 () ) {
114
125
ERROR ("Failed to erase HomeKit storage" );
115
- return -1 ;
126
+ return -1 ; // Fail case
116
127
}
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
125
129
}
126
-
127
- return 0 ;
130
+ return 0 ; // Was valid
128
131
}
129
132
130
133
131
134
int 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 ));
134
137
135
138
if (!spiflash_write (MAGIC_ADDR , blank , sizeof (blank ))) {
136
139
ERROR ("Failed to reset HomeKit storage" );
@@ -140,6 +143,18 @@ int homekit_storage_reset() {
140
143
return homekit_storage_init ();
141
144
}
142
145
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
+ }
143
158
144
159
void homekit_storage_save_accessory_id (const char * accessory_id ) {
145
160
if (!spiflash_write (ACCESSORY_ID_ADDR , (byte * )accessory_id , ACCESSORY_ID_SIZE )) {
@@ -209,7 +224,7 @@ bool homekit_storage_can_add_pairing() {
209
224
pairing_data_t data ;
210
225
for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
211
226
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 )))
213
228
return true;
214
229
}
215
230
return false;
@@ -226,7 +241,7 @@ static int compact_data() {
226
241
int next_pairing_idx = 0 ;
227
242
for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
228
243
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 ))) {
230
245
if (i != next_pairing_idx ) {
231
246
memcpy (& data [PAIRINGS_ADDR + sizeof (pairing_data_t )* next_pairing_idx ],
232
247
pairing_data , sizeof (* pairing_data ));
@@ -241,7 +256,7 @@ static int compact_data() {
241
256
return 0 ;
242
257
}
243
258
244
- if (homekit_storage_reset ()) {
259
+ if (homekit_storage_reset_pairing_data ()) {
245
260
ERROR ("Failed to compact HomeKit storage: error resetting flash" );
246
261
free (data );
247
262
return -1 ;
@@ -291,10 +306,10 @@ int homekit_storage_add_pairing(const char *device_id, const ed25519_key *device
291
306
292
307
pairing_data_t data ;
293
308
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 ));
296
311
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 ));
298
313
size_t device_public_key_size = sizeof (data .device_public_key );
299
314
int r = crypto_ed25519_export_public_key (
300
315
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) {
317
332
pairing_data_t data ;
318
333
for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
319
334
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 )))
321
336
continue ;
322
337
323
- if (!strncmp (data .device_id , device_id , sizeof (data .device_id ))) {
338
+ if (!memcmp (data .device_id , device_id , sizeof (data .device_id ))) {
324
339
int next_block_idx = find_empty_block ();
325
340
if (next_block_idx == -1 ) {
326
341
compact_data ();
@@ -339,7 +354,7 @@ int homekit_storage_update_pairing(const char *device_id, byte permissions) {
339
354
return -1 ;
340
355
}
341
356
342
- memset (& data , 0 , sizeof (data ));
357
+ bzero (& data , sizeof (data ));
343
358
if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ))) {
344
359
ERROR ("Failed to update pairing: error erasing old record from HomeKit storage" );
345
360
return -2 ;
@@ -356,11 +371,11 @@ int homekit_storage_remove_pairing(const char *device_id) {
356
371
pairing_data_t data ;
357
372
for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
358
373
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 )))
360
375
continue ;
361
376
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 ));
364
379
if (!spiflash_write (PAIRINGS_ADDR + sizeof (data )* i , (byte * )& data , sizeof (data ))) {
365
380
ERROR ("Failed to remove pairing from HomeKit storage" );
366
381
return -2 ;
@@ -377,10 +392,10 @@ int homekit_storage_find_pairing(const char *device_id, pairing_t *pairing) {
377
392
pairing_data_t data ;
378
393
for (int i = 0 ; i < MAX_PAIRINGS ; i ++ ) {
379
394
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 )))
381
396
continue ;
382
397
383
- if (!strncmp (data .device_id , device_id , sizeof (data .device_id ))) {
398
+ if (!memcmp (data .device_id , device_id , sizeof (data .device_id ))) {
384
399
crypto_ed25519_init (& pairing -> device_key );
385
400
int r = crypto_ed25519_import_public_key (& pairing -> device_key , data .device_public_key , sizeof (data .device_public_key ));
386
401
if (r ) {
@@ -389,7 +404,7 @@ int homekit_storage_find_pairing(const char *device_id, pairing_t *pairing) {
389
404
}
390
405
391
406
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 );
393
408
pairing -> device_id [DEVICE_ID_SIZE ] = 0 ;
394
409
pairing -> permissions = data .permissions ;
395
410
@@ -416,7 +431,7 @@ int homekit_storage_next_pairing(pairing_iterator_t *it, pairing_t *pairing) {
416
431
int id = it -> idx ++ ;
417
432
418
433
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 ))) {
420
435
crypto_ed25519_init (& pairing -> device_key );
421
436
int r = crypto_ed25519_import_public_key (& pairing -> device_key , data .device_public_key , sizeof (data .device_public_key ));
422
437
if (r ) {
@@ -425,7 +440,7 @@ int homekit_storage_next_pairing(pairing_iterator_t *it, pairing_t *pairing) {
425
440
}
426
441
427
442
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 );
429
444
pairing -> device_id [DEVICE_ID_SIZE ] = 0 ;
430
445
pairing -> permissions = data .permissions ;
431
446
0 commit comments