STM32 LoRa 署名付き通信
はじめに
このチュートリアルではAC07 LoRa Maryリーフに搭載されるATECC608Aを使用して、LoRaの通信に署名をつける方法を紹介します。 通信に署名をつけることで、データの送り元が、受信者が意図したデバイスであるかどうかを判定することができ、通信の安全性が向上します。
必要なもの
このチュートリアルではLoRa送信機と受信機のペアが必要です。下記の構成で組み立てたリーフを2セット用意してください。
- AC07 LoRa Mary
- AP03 STM32
- AZ01 USB
ATECC608Aで署名付き通信を行う仕組み
送信機と受信機に搭載されているAC07 LoRa Maryリーフには、Microchip社の暗号化チップATECC608Aが搭載されています。 このチップは楕円曲線DSA署名方式(ECDSA)を使用した署名をハードウェアの演算回路を使用して発行することができます。 ATECC608Aを使用した署名の発行と、データ通信の流れを図に表したものを下記に示します。 この図をもとに署名付き通信の流れを解説します。
1. キーペアを発行する
まず初めに、署名の発行を行うためにATECC608Aの初期化をする必要があります。 この初期化手順では、署名を行うためのキーペアをATECC608Aに発行してもらいます。 STM32リーフからI2CでATECC608Aにキーペア発行命令を送り、公開鍵と秘密鍵のキーペアを作成します。この時、公開鍵はI2C経由でSTM32リーフに伝えられ読み出すことができますが、秘密鍵はATECC608A内部のメモリーにのみ保存され、STM32側は読み出すことができない仕組みとなっています。
読み出した公開鍵は、署名の検証に使うため、あらかじめ受信機側が知っている必要があります。受信機側にはソースコードに記述するなどの何らかの方法で公開鍵を渡しておく必要があります。
2. 署名を発行してデータを送る
送信機側は「本日は晴天なり」というメッセージを送信したいとします。このメッセージを受信機に対して送る前にまず、ATECC608Aに送り、メッセージに対する署名を計算してもらいます。署名はメッセージと秘密鍵を用いて計算されます。この時、ATECC608Aの仕様により、メッセージは32バイトごとに分割し、それに対する署名はそれぞれ64バイトのサイズになります。
署名を発行し終えたら、メッセージと署名を合わせてLoRa(UARTなど別の通信方法でも良い)で送信し受信機に伝えます。
3. 受信機で署名を検証する
署名付きメッセージを受信した受信機は、あらかじめ持っていた送信機の公開鍵と、受信したメッセージ、署名データをATECC608Aに渡します。ATECC608Aはこれらのデータから署名がこの公開鍵に対応する秘密鍵によって発行されたものかを検証します。
4. 不正なデータが送られてきた
ここで、悪意を持った人が「本日は大荒れなり」というデータを送ってきたとします。これにはなんらかの署名がつけられていたとします。この不正なデータについた署名は、本来想定している送信機の秘密鍵を用いて作られた署名ではないため、受信機は公開鍵をもとに検証を行うと、キーペアの不一致によって検証結果は不正となります。
この仕組みを使うことで、悪意のあるデータを見抜くことができます。
サンプルコード
ATECC608Aを初期化しキーペアの発行する
ATECC608Aは出荷時キーペアが保存されていないため、以降すべてのサンプルを実行する際に必要となるキーペアをあらかじめ発行しておきます。このサンプルは必ず実施してください。
データに署名をつける
LoRaで通信を行う前に、まずは送信機単体でデータに署名をつけてみましょう。このサンプルはLoRa通信を行わず署名発行部分のみを抽出したシンプルなプロジェクトです。
署名がついたデータを検証する
LoRaで通信を行う前に、まずは送信機単体で署名の検証を行ってみましょう。自分自身が発行した署名を自分で検証できるかを確認してみます。署名検証を行うための最もシンプルなプロジェクトです。
署名付きデータをLoRaで送信する
実際にLoRaで送信するデータに署名をつけてみましょう。LoRaを使用した実用的なプロジェクトです。
署名付きデータをLoRaで受信して検証する
実際にLoRaで受信した署名付きデータを検証してみましょう。LoRaを使用した実用的なプロジェクトです。