@@ -76,7 +76,7 @@ extern uint32_t _SPIFFS_start; //See spiffs_api.h
76
76
77
77
#define ACCESSORY_KEY_SIZE 64
78
78
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__)
80
80
81
81
const char hap_magic [] = "HAP" ;
82
82
@@ -94,7 +94,7 @@ bool homekit_storage_magic_valid() {
94
94
char magic_test [sizeof (hap_magic )];
95
95
bzero (magic_test , sizeof (magic_test ));
96
96
97
- if (!spiflash_read (MAGIC_ADDR , (byte * )magic_test , sizeof (magic_test ))) {
97
+ if (!spiflash_read (MAGIC_ADDR , (uint32 * )magic_test , sizeof (magic_test ))) {
98
98
ERROR ("Failed to read HomeKit storage magic" );
99
99
return false;
100
100
}
@@ -105,7 +105,7 @@ bool homekit_storage_set_magic() {
105
105
char magic [sizeof (hap_magic )];
106
106
memcpy (magic , hap_magic , sizeof (magic ));
107
107
108
- if (!spiflash_write (MAGIC_ADDR , (byte * )magic , sizeof (magic ))) {
108
+ if (!spiflash_write (MAGIC_ADDR , (uint32 * )magic , sizeof (magic ))) {
109
109
ERROR ("Failed to write HomeKit storage magic" );
110
110
return false;
111
111
}
@@ -130,6 +130,21 @@ int homekit_storage_init() {
130
130
}
131
131
return 1 ; // Wasn't valid, is now
132
132
}
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
+
133
148
return 0 ; // Was valid
134
149
}
135
150
@@ -138,7 +153,7 @@ int homekit_storage_reset() {
138
153
byte blank [sizeof (hap_magic )];
139
154
bzero (blank , sizeof (blank ));
140
155
141
- if (!spiflash_write (MAGIC_ADDR , blank , sizeof (blank ))) {
156
+ if (!spiflash_write (MAGIC_ADDR , ( uint32 * ) blank , sizeof (blank ))) {
142
157
ERROR ("Failed to reset HomeKit storage" );
143
158
return -1 ;
144
159
}
@@ -147,20 +162,20 @@ int homekit_storage_reset() {
147
162
}
148
163
149
164
int homekit_storage_reset_pairing_data () {
150
-
165
+
151
166
byte blank [sizeof (pairing_data_t ) * MAX_PAIRINGS ];
152
167
bzero (blank ,sizeof (blank ));
153
168
154
169
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 ))) {
156
171
ERROR ("Failed to erase HomeKit pairing storage" );
157
172
return -1 ; // Fail case
158
173
}
159
174
return 0 ;
160
175
}
161
176
162
177
void 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 )) {
164
179
ERROR ("Failed to write accessory ID to HomeKit storage" );
165
180
}
166
181
}
@@ -172,7 +187,7 @@ static char ishex(unsigned char c) {
172
187
}
173
188
174
189
int 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 )) {
176
191
ERROR ("Failed to read accessory ID from HomeKit storage" );
177
192
return -1 ;
178
193
}
@@ -200,15 +215,15 @@ void homekit_storage_save_accessory_key(const ed25519_key *key) {
200
215
return ;
201
216
}
202
217
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 )) {
204
219
ERROR ("Failed to write accessory key to HomeKit storage" );
205
220
return ;
206
221
}
207
222
}
208
223
209
224
int homekit_storage_load_accessory_key (ed25519_key * key ) {
210
225
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 ))) {
212
227
ERROR ("Failed to read accessory key from HomeKit storage" );
213
228
return -1 ;
214
229
}
@@ -226,16 +241,28 @@ int homekit_storage_load_accessory_key(ed25519_key *key) {
226
241
bool homekit_storage_can_add_pairing () {
227
242
pairing_data_t data ;
228
243
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 ));
230
245
if (memcmp (data .magic , hap_magic , sizeof (hap_magic )))
231
246
return true;
232
247
}
233
248
return false;
234
249
}
235
250
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
+
236
263
static int compact_data () {
237
264
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 )) {
239
266
free (data );
240
267
ERROR ("Failed to compact HomeKit storage: sector data read error" );
241
268
return -1 ;
@@ -264,7 +291,7 @@ static int compact_data() {
264
291
free (data );
265
292
return -1 ;
266
293
}
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 )) {
268
295
ERROR ("Failed to compact HomeKit storage: error writing compacted data" );
269
296
free (data );
270
297
return -1 ;
@@ -275,26 +302,6 @@ static int compact_data() {
275
302
return 0 ;
276
303
}
277
304
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
-
298
305
int homekit_storage_add_pairing (const char * device_id , const ed25519_key * device_key , byte permissions ) {
299
306
int next_block_idx = find_empty_block ();
300
307
if (next_block_idx == -1 ) {
@@ -322,7 +329,7 @@ int homekit_storage_add_pairing(const char *device_id, const ed25519_key *device
322
329
return -1 ;
323
330
}
324
331
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 ))) {
326
333
ERROR ("Failed to write pairing info to HomeKit storage" );
327
334
return -1 ;
328
335
}
@@ -334,7 +341,7 @@ int homekit_storage_add_pairing(const char *device_id, const ed25519_key *device
334
341
int homekit_storage_update_pairing (const char * device_id , byte permissions ) {
335
342
pairing_data_t data ;
336
343
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 ));
338
345
if (memcmp (data .magic , hap_magic , sizeof (data .magic )))
339
346
continue ;
340
347
@@ -352,13 +359,13 @@ int homekit_storage_update_pairing(const char *device_id, byte permissions) {
352
359
353
360
data .permissions = permissions ;
354
361
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 ))) {
356
363
ERROR ("Failed to write pairing info to HomeKit storage" );
357
364
return -1 ;
358
365
}
359
366
360
367
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 ))) {
362
369
ERROR ("Failed to update pairing: error erasing old record from HomeKit storage" );
363
370
return -2 ;
364
371
}
@@ -373,13 +380,13 @@ int homekit_storage_update_pairing(const char *device_id, byte permissions) {
373
380
int homekit_storage_remove_pairing (const char * device_id ) {
374
381
pairing_data_t data ;
375
382
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 ));
377
384
if (memcmp (data .magic , hap_magic , sizeof (data .magic )))
378
385
continue ;
379
386
380
387
if (!memcmp (data .device_id , device_id , sizeof (data .device_id ))) {
381
388
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 ))) {
383
390
ERROR ("Failed to remove pairing from HomeKit storage" );
384
391
return -2 ;
385
392
}
@@ -394,7 +401,7 @@ int homekit_storage_remove_pairing(const char *device_id) {
394
401
int homekit_storage_find_pairing (const char * device_id , pairing_t * pairing ) {
395
402
pairing_data_t data ;
396
403
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 ));
398
405
if (memcmp (data .magic , hap_magic , sizeof (data .magic )))
399
406
continue ;
400
407
@@ -433,7 +440,7 @@ int homekit_storage_next_pairing(pairing_iterator_t *it, pairing_t *pairing) {
433
440
while (it -> idx < MAX_PAIRINGS ) {
434
441
int id = it -> idx ++ ;
435
442
436
- spiflash_read (PAIRINGS_ADDR + sizeof (data )* id , (byte * )& data , sizeof (data ));
443
+ spiflash_read (PAIRINGS_ADDR + sizeof (data )* id , (uint32 * )& data , sizeof (data ));
437
444
if (!memcmp (data .magic , hap_magic , sizeof (data .magic ))) {
438
445
crypto_ed25519_init (& pairing -> device_key );
439
446
int r = crypto_ed25519_import_public_key (& pairing -> device_key , data .device_public_key , sizeof (data .device_public_key ));
0 commit comments