TOTPキーボードをつくろう その2
ワンタイムパスワードをワンタッチで入力できる装置を作ってみる
プロトタイプ
ちょっと時間が空きましたが、ブレッドボード上にプロトタイプを作りました。
- キーは3個
- ディスプレイは 128x32 の OLED
- コイン電池でバックアップ
以下今回のハマりポイント
OLED
いつもの SSD1306 タイプの OLED なのですが、128x64 タイプと 128x32 タイプで微妙に仕様が違うので、 そのまま使うと1ラインごとに間引かれた画面が半分につぶれたように表示されます。
USB HID
今回は、CH32V203K8 でも使えるように USBD 側を使用しました。 ほぼ SDK の CompositeKM そのままです。 もともとキーボードとマウスの機能があったので、キーボードだけ使うように USB デスクプリタを改変しています。 基本的に、エンドポイントに USB スキャンコードをおいて、データ送信用の関数を呼んでるだけです。
キーの送信間隔はとりあえず 50ms を置いています。
最初はもっと短かったのですが、PCによっては取りこぼしが発生するので、遅くなっています。
シフトキーを押すと !
が入力されたり、
メインのキーボードの状態に左右されるのがちょっといまいちですね。
RTC
CH32V203 の RTC は、古いタイプの STM32 と同じく、ただの 32bit カウンタです。 SDK に RTC 関係の関数があるので、そのまま使っています。
起動時に、RTC が設定済みであるかどうかチェックして、未設定の時のみ時刻入力に進みます。 (未実装だけど…)
デフォルトでは 32768Hz のクリスタルをカウントしているだけなのですが、 開発ボード上のクリスタルをそのまま使うと24時間で 3秒くらい時刻が進むので、 時刻が重要なアプリケーションでは微調整は必須なようです。
誤差 20ppm 品だとすると、一日最大 1.7 秒ずれるところだと思うのだけど、ずれが大きすぎな気が… どうもコード書き込みするとずれが大きくなるきがします。
バッテリバックアップは STM32 の回路を参考に手持ちのショットキーバリアダイオード(1S10)をかませていますが、 CH32V203 でも必要なのかどうかは不明です。 (STM32 では VBAT に切り替わるときに、一瞬 VDD と VBAT が短絡状態になるという理由でダイオードが必要)
もっとも TOTP はサイトの方で時刻のずれを認識しているので、頻繁に使うなら多少のずれは気にしなくても良いと思います。 (分単位でずれが大きくなると再同期が必要になるかも?)
次回予告
UI の作りこみと、 RTC の初期化コードを書けばほぼ完了かな。