41
41
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
42
42
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
43
43
44
- #define FW_SIGNATURE_LENGTH 512
45
44
46
45
47
46
static int64_t getHTTPStream ( esp32FOTA* fota, int partition );
@@ -181,13 +180,14 @@ void esp32FOTA::setConfig( FOTAConfig_t cfg )
181
180
_cfg.use_device_id = cfg.use_device_id ;
182
181
_cfg.root_ca = cfg.root_ca ;
183
182
_cfg.pub_key = cfg.pub_key ;
183
+ _cfg.signature_len = cfg.signature_len ;
184
184
}
185
185
186
186
187
187
void esp32FOTA::printConfig ( FOTAConfig_t *cfg )
188
188
{
189
189
if ( cfg == nullptr ) cfg = &_cfg;
190
- log_d (" Name: %s\n Manifest URL:%s\n Semantic Version: %d.%d.%d\n Check Sig: %s\n Unsafe: %s\n Use Device ID: %s\n RootCA: %s\n PubKey: %s\n " ,
190
+ log_d (" Name: %s\n Manifest URL:%s\n Semantic Version: %d.%d.%d\n Check Sig: %s\n Unsafe: %s\n Use Device ID: %s\n RootCA: %s\n PubKey: %s\n SignatureLen: %d \ n" ,
191
191
cfg->name ? cfg->name : " None" ,
192
192
cfg->manifest_url ? cfg->manifest_url : " None" ,
193
193
cfg->sem .ver ()->major ,
@@ -197,11 +197,17 @@ void esp32FOTA::printConfig( FOTAConfig_t *cfg )
197
197
cfg->unsafe ?" true" :" false" ,
198
198
cfg->use_device_id ?" true" :" false" ,
199
199
cfg->root_ca ?" true" :" false" ,
200
- cfg->pub_key ?" true" :" false"
200
+ cfg->pub_key ?" true" :" false" ,
201
+ cfg->signature_len
201
202
);
202
203
}
203
204
204
205
206
+ void esp32FOTA::setSignatureLen ( size_t len )
207
+ {
208
+ _cfg.signature_len = len;
209
+ }
210
+
205
211
206
212
void esp32FOTA::setCertFileSystem ( fs::FS *cert_filesystem )
207
213
{
@@ -327,7 +333,7 @@ bool esp32FOTA::validate_sig( const esp_partition_t* partition, unsigned char *s
327
333
}
328
334
mbedtls_md_finish ( &rsa, hash );
329
335
330
- ret = mbedtls_pk_verify ( &pk, MBEDTLS_MD_SHA256, hash, mdinfo->size , (unsigned char *)signature, FW_SIGNATURE_LENGTH );
336
+ ret = mbedtls_pk_verify ( &pk, MBEDTLS_MD_SHA256, hash, mdinfo->size , (unsigned char *)signature, _cfg. signature_len );
331
337
332
338
free ( hash );
333
339
mbedtls_md_free ( &rsa );
@@ -467,6 +473,27 @@ bool esp32FOTA::execOTA()
467
473
return ret;
468
474
}
469
475
476
+ // OTA Logic
477
+ bool esp32FOTA::execSPIFFSOTA ()
478
+ {
479
+ bool ret;
480
+ setupStream ();
481
+
482
+ if ( !_flashFileSystemUrl.isEmpty () ) { // a data partition was specified in the json manifest, handle the spiffs partition first
483
+ if ( _fs ) { // Possible risk of overwriting certs and signatures, cancel flashing!
484
+ log_e (" Cowardly refusing to overwrite U_SPIFFS with %s. Use setCertFileSystem(nullptr) along with setPubKey()/setCAPem() to enable this feature." , _flashFileSystemUrl);
485
+ return false ;
486
+ } else {
487
+ log_i (" Will check if U_SPIFFS needs updating" );
488
+ ret = execOTA ( U_SPIFFS, false );
489
+ }
490
+ } else {
491
+ log_i (" This update is for U_FLASH only" );
492
+ }
493
+ stopStream ();
494
+ return ret;
495
+ }
496
+
470
497
471
498
bool esp32FOTA::execOTA ( int partition, bool restart_after )
472
499
{
@@ -513,11 +540,11 @@ bool esp32FOTA::execOTA( int partition, bool restart_after )
513
540
log_e (" Compressed && signed image is not (yet) supported" );
514
541
return false ;
515
542
}
516
- if ( updateSize == UPDATE_SIZE_UNKNOWN || updateSize <= FW_SIGNATURE_LENGTH ) {
543
+ if ( updateSize == UPDATE_SIZE_UNKNOWN || updateSize <= _cfg. signature_len ) {
517
544
log_e (" Malformed signature+fw combo" );
518
545
return false ;
519
546
}
520
- updateSize -= FW_SIGNATURE_LENGTH ;
547
+ updateSize -= _cfg. signature_len ;
521
548
}
522
549
523
550
// If using compression, the size is implicitely unknown
@@ -541,9 +568,9 @@ bool esp32FOTA::execOTA( int partition, bool restart_after )
541
568
});
542
569
}
543
570
544
- unsigned char signature[FW_SIGNATURE_LENGTH ];
571
+ unsigned char * signature = new unsigned char [_cfg. signature_len ];
545
572
if ( _cfg.check_sig ) {
546
- _stream->readBytes ( signature, FW_SIGNATURE_LENGTH );
573
+ _stream->readBytes ( signature, _cfg. signature_len );
547
574
}
548
575
549
576
log_i (" Begin %s OTA. This may take 2 - 5 mins to complete. Things might be quiet for a while.. Patience!" , partition==U_FLASH?" Firmware" :" Filesystem" );
@@ -560,11 +587,13 @@ bool esp32FOTA::execOTA( int partition, bool restart_after )
560
587
} else {
561
588
log_e (" Written only : %d/%d Premature end of stream?" , written, updateSize);
562
589
F_abort ();
590
+ delete[] signature;
563
591
return false ;
564
592
}
565
593
566
594
if (!F_UpdateEnd ()) {
567
595
log_e (" An Update Error Occurred. Error #: %s" , F_Update.getError ());
596
+ delete[] signature;
568
597
return false ;
569
598
}
570
599
@@ -582,6 +611,7 @@ bool esp32FOTA::execOTA( int partition, bool restart_after )
582
611
if ( !_target_partition ) {
583
612
log_e (" Can't access partition #%d to check signature!" , partition);
584
613
if ( onUpdateCheckFail ) onUpdateCheckFail ( partition, CHECK_SIG_ERROR_PARTITION_NOT_FOUND );
614
+ delete[] signature;
585
615
return false ;
586
616
}
587
617
@@ -601,6 +631,7 @@ bool esp32FOTA::execOTA( int partition, bool restart_after )
601
631
}
602
632
603
633
if ( !validate_sig ( _target_partition, signature, updateSize ) ) {
634
+ delete[] signature;
604
635
// erase partition
605
636
esp_partition_erase_range ( _target_partition, _target_partition->address , _target_partition->size );
606
637
@@ -613,6 +644,7 @@ bool esp32FOTA::execOTA( int partition, bool restart_after )
613
644
}
614
645
return false ;
615
646
} else {
647
+ delete[] signature;
616
648
log_d (" Signature check successful!" );
617
649
if ( partition == U_FLASH ) {
618
650
// Set updated partition as bootable now that it's been verified
@@ -844,39 +876,48 @@ String esp32FOTA::getDeviceID()
844
876
845
877
846
878
// Force a firmware update regardless on current version
847
- void esp32FOTA::forceUpdate (const char * firmwareURL, bool validate )
879
+ bool esp32FOTA::forceUpdate (const char * firmwareURL, bool validate )
848
880
{
849
881
_firmwareUrl = firmwareURL;
850
882
_cfg.check_sig = validate;
851
- execOTA ();
883
+ return execOTA ();
884
+ }
885
+
886
+ // Force a firmware update regardless on current version
887
+ bool esp32FOTA::forceUpdateSPIFFS (const char * firmwareURL, bool validate )
888
+ {
889
+ _firmwareUrl = firmwareURL;
890
+ _flashFileSystemUrl = firmwareURL;
891
+ _cfg.check_sig = validate;
892
+ return execSPIFFSOTA ();
852
893
}
853
894
854
895
855
- void esp32FOTA::forceUpdate (const char * firmwareHost, uint16_t firmwarePort, const char * firmwarePath, bool validate )
896
+ bool esp32FOTA::forceUpdate (const char * firmwareHost, uint16_t firmwarePort, const char * firmwarePath, bool validate )
856
897
{
857
898
static String firmwareURL (" http" );
858
899
if ( firmwarePort == 443 || firmwarePort == 4433 ) firmwareURL += " s" ;
859
900
firmwareURL += String (firmwareHost);
860
901
firmwareURL += " :" ;
861
902
firmwareURL += String (firmwarePort);
862
903
firmwareURL += firmwarePath;
863
- forceUpdate ( firmwareURL.c_str (), validate );
904
+ return forceUpdate ( firmwareURL.c_str (), validate );
864
905
}
865
906
866
907
867
- void esp32FOTA::forceUpdate (bool validate )
908
+ bool esp32FOTA::forceUpdate (bool validate )
868
909
{
869
910
// Forces an update from a manifest, ignoring the version check
870
911
if (!execHTTPcheck ()) {
871
912
if (!_firmwareUrl) {
872
913
// execHTTPcheck returns false when the manifest is malformed or when the version isn't
873
914
// an upgrade. If _firmwareUrl isn't set we can't force an upgrade.
874
915
log_e (" forceUpdate called, but unable to get _firmwareUrl from manifest via execHTTPcheck." );
875
- return ;
916
+ return false ;
876
917
}
877
918
}
878
919
_cfg.check_sig = validate;
879
- execOTA ();
920
+ return execOTA ();
880
921
}
881
922
882
923
0 commit comments