nazo6 notememo

BLE Bondigメモ

作成:2025/01/14

更新:2025/02/01

主にSoftDevice。

ボンディング時に渡される情報

master_id = {
ediv: u16,
rand: [u8; 8],
}

enc = {
ltk: [u8; 16],
flags: u8,
}

peer_id = {
irk: [u8; 16],
addr: {
flags: u8,
bytes: [u8; 6],
}
}
  • master_id: 暗号化情報を識別するための情報
  • 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が同じものか判定するメソッドのみが提供されている。