主にSoftDevice。
ボンディング時に渡される情報
-
master_id
: 暗号化情報を識別するための情報ediv
: 後に出てくるLTKが変わると変わるrand
: これもLTKが変わると変わるが、edivがクライアントの内部でLTKへのKeyとして扱われているのに対してrand
はその名の通り適当なランダムの値だと思われる
参照: https://stackoverflow.com/questions/48165520/need-details-about-ediv-and-rand
-
enc
: ボンディングで保存されるべき暗号化情報ltk
: Long Term Key。これがメインで用いられる暗号化のためのキーである。flags
: 要調査。ボンディングすべきかなどのフラグを含んでいるらしい…?
つまり、
Map<(ediv, rand), ltk>
のような構造となっていることがわかる。再接続する再には送られてきたmaster_id
を用いてltk
をストレージなどから読み出し、その値を暗号化に用いる。peer_id
: クライアントを識別するための情報。暗号化とは違うaddr
: いわゆるBluetoothのアドレスであるが、プライバシーのためにこのアドレスは接続の度に変化することが普通である。ではどうやってクライアイントを識別するのか。これが次のirk
である。irk
: Rustのnrf-softdeviceでは実際はこの値はprivateな値になっており、peer_idが同じものか判定するメソッドのみが提供されている。