「SPIFFS で平文ファイルを暗号化して保存し直してるけれど、コレ実はもとのファイルの内容がフラッシュメモリ上に残ってるんじゃね?」
疑惑について検証することにしました。
まずはフラッシュメモリの中身はパーティションに分割して使われているのですが、どういうパーティション構成になっているか確認しよう…とすると、どうもそういうツールが無いようです。
仕方ないので、M5Paper 自身にパーティション構成をシリアルから出力させるツールを作りました:
https://github.com/ikedam/m5paper-test/tree/list-partitions
こんな感じの出力が得られます:
APP partitions:
label type subtype encrypted address-start address-end size:
app0 00 10 0 0x010000 0x650000 6553600
app1 00 11 0 0x650000 0xc90000 6553600
DATA partitions:
label type subtype encrypted address-start address-end size:
nvs 01 02 0 0x009000 0x00e000 20480
otadata 01 00 0 0x00e000 0x010000 8192
spiffs 01 82 0 0xc90000 0x1000000 3604480
そして SPIFFS となっている領域をファイルにダンプします。
esptool というのがあるはずなのですが見当たらないので探し回った結果、
QUICK ACCESS > Miscellaneous > PlatformIO CoreCLI から CLI を起動して
cmd
python %USERPROFILE%\.platformio\packages\tool-esptoolpy\esptool.py --port COM3 read_flash 0xc90000 3604480 spiffs.dat
でダンプします。
ダンプしたファイルをテキストエディタで開くと、平文のパスワードが残っていることを発見。
ついでに、「WiFi を使うと NVS に ESSID とパスワードが保存されてしまう」という話もみたので、 NVS をダンプするツールも作りました。
nvs_entry_find() という API でできるのですが、なぜか Arduino 向けのライブラリには含まれていないので、 ESPIDF というのでやります。
platformio.ini 的には
-framework = arduino
+framework = espidf
と変更すれば良いようです。(実際にはこの他に CMakeFile.txt などもあるのでウィザートから新しくプロジェクトを作り直したほうがいい)
https://github.com/ikedam/m5paper-test-espidf/tree/dump-nvs
ダンプしてみると
(1394) app: nvs.net80211:sta.ssid (42)
(1404) app: 13 00 00 00 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00
(1414) app:
(1414) app: nvs.net80211:sta.pswd (42)
(1424) app: xx xx xx xx xx xx xx xx xx xx xx xx xx 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(1444) app: XXXXXXXXXXXXX
...
(1544) app: Setting:ssid (21)
(1544) app: XXXXXXXXXXXXXXXXXXX
(1554) app: Setting:pswd (21)
(1554) app: XXXXXXXXXXXXX
とバッチリとパスワードが含まれています。 (xx や X としているのは伏せ字)
nvs.net80211 ネームスペースの sta.ssid と sta.pswd をキーにしているのが WiFi ライブラリのようで、
Setting ネームスペースの ssid と pswd は M5Paper_FactoryTest が保存するもののようです。なんてものを保存するんだ。
フラッシュメモリにパスワードがまんま入っているというのもアレなので、一度 Flash をリセットします。
python %USERPROFILE%\.platformio\packages\tool-esptoolpy\esptool.py erase_flash
また、ファイルの暗号化は、暗号化済みのファイルを登録すればいいので、先程ダンプした SPIFFS のイメージを
https://github.com/igrr/mkspiffs
を使って展開して、暗号化済みのファイルを直接登録します。
WiFi のパスワードについては
https://github.com/ikedam/m5paper-ikedamclock/blob/v0.2.0/src/ikedam_clock.cpp#L229
の通り
WiFi.persistent(false);
を設定すれば保存されないようです。
イケダム時計を動かした後、再度先程のツールで NVS をダンプすると
(400) app: nvs.net80211:sta.ssid (42)
(410) app: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
(420) app:
(430) app: nvs.net80211:sta.pswd (42)
(440) app: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
(460) app:
という具合に設定されていないことが確認できました。