OpenSKでセキュリティーキーを作ろうというハナシ

どうも、僕です。クラウドってやつ、難しいですね。 最近は tailscale 試したりしています。なかなかリーベンです。

今回は先日やっと頼んでいたボードが届いたので自分でセキュリティーキーを作るハナシをしたいと思います。

先に言っておくと本家の手順よりも簡単に OpenSK でセキュリティーキーを作れます。

OpenSK

2020 年 1 月の終わりぐらいでしょうか、Google がセキュリティーキーのオープンソース実装である OpenSK を公開して話題となりました。 このプロジェクト、現時点では PoC、研究開発段階ですが FIDO U2F と FIDO2 を実装しています。

(消費者向けではありません。実装しているが PoC なので正式な FIDO の認定は受けていません)

このセキュリティーキーが話題となった大きな理由は TockOS 上のアプリケーションとして実装されている点です。 軽く説明すると TockOS とは次世代の組み込み OS として開発されている OS で、Rust で開発されています。 アプリケーションとして実装されている分、ハードウェア部は多少抽象化されており、コードとしては見通しがよくなっています。

(timer や syscall など TockOS で抽象化されてる部分は libtock として提供されています。コード読むと楽しいかも知れませんね)

そして OpenSK は独自のセキュリティキーの開発基盤としての役割もあり、今後の開発が期待されているプロジェクトです。

余談ですが、オープンソースのセキュリティーキーは他にも存在しています。 U2F Zero、その後継である Solo Key です。 こちらは実用レベルに達しており、OpenPGP のサポートもついています。

Flash のしきいが高い問題

さて、紹介文などを読んでいると作りたくなるのがエンジニアでしょう。 それでは作成にあたりサポートしているハードウェアを確認しましょう。 README を確認すると以下のハードウェアでテストしているようです。

どうせなら nRF52840 の dongle タイプを試したいものです。 リンクをたどって価格を確認すると$10 とお手頃感があります。

(実際購入するとなると送料があるのでもっと高くなると思います)

ここで慌ててはいけません。ボードだけあればいいと思っていませんか? まずは Installation guide までしっかり読んでから考えましょう。

見ると Flash するのには J-Link を使うようです。また Pad をあてて止めておく Clip も使っているようです。 または OpenOCD では何か問題があるらしく JLinkExe 経由で書き込むようです。 用意するものがいくつかあり、詳しくないユーザーにはなかなかハードルが高いように思えます。

(SWDIO とか SWCLK とか言われても普通の人はよくわかりませんよね…)

最初に書いた通り消費者向きではないので誰でも書き込めてすぐ使える状態ではないのです。 とはいえなんとかならないものでしょうか?

Makerdiary nRF52840-MDK

TockOS は nRF52 ファミリーをサポートしています。なので簡単に書き込めて、TockOS が動くボードがあればなんとかなりそうな気がしますね。 調べてみると nRF52 ファミリーがのったボードは幾つか存在するようです。

その中の一つに Makerdary のボードがあります。

Makerdiary も nRF52840 のボード nRF52840-MDK を売っているようです。 スペックを Nordic のモノと比べてみるとチップなどほぼ同じのようです。

(ボードは黒で、サイズは少し小さくなっています)

また、単体の価格を見ると MDK の方が少し高いのですが、送料を含めると MDK の方が安く上がりそうです。 こちらのボードに OpenSK が書き込めれば良さそうです。

UF2 bootloader で簡単に Flash する

実は、nRF52840-MDK の GitHub リポジトリの issue でも OpenSK が公開された後にこの話題が出ていました。 ハードウェア的には条件を満たしており動作しそうということで OpenSK を動作させるために動き出します。 その後、現時点では OpenSK をドライバーなしで簡単に Flash する方法まで公開されています。 Makerdiary の方で prebuild したものを用意してくれてるのでそれを使うのが最速の手順になりそうです。 簡単に言うと UF2 をサポートした Bootloader に変更に UF2 形式に変換した OpenSK を Flash するという方法です。

ちょっとだけ補足説明しておくと UF2 は USB Flashing Format の略です。 これは Microsoft が PXT 用に開発したファイルフォーマットで Flash drive を介してプログラムを Flash するためのモノです。 これらも OSS として公開されています。

それでは最短の手順です。

  1. nrfutil をインストール

nrfutil は Bootloader の書き換えに使います。nrfutil はその名の通り、Nordic のチップを操作する際のユーティリティツールで Python 製です。 これは pypi に登録されているので pip でインストールします。

$ pip3 install --user nrfutil
  1. Bootloader の書き換え

次にボードの Bootloader を UF2 Bootloader にします。 出荷時のボードの Bootloader は Open Bootloader なので DFU mode で Bootloader を書き換えます。 UF2 Bootloader は ここ にあります。

まずボードを挿してシリアルポート名がどうなっているか確認しておきましょう。Linux であれば /dev/ttyACM0 になっているはずです。

その次に Bootloader を書き込みます。ボードを挿している人は一度抜いて下さい。 ボード上面にあるリセットボタンを押しながら USB ポートに挿し込むと DFU mode で起動します。

(LED が激しく点灯するのが目印です)

その後、nrfutil で UF2 Bootloader を書き込みます。

$ nrfutil dfu usb-serial -pkg uf2_bootloader-0.2.13-44-gb2b4284-nosd_signed.zip -p /dev/ttyACM0

これで完了です。ボード抜いて、再度リセットボタンを押し込みながら挿し込みなおすと Flash Drive として認識されるようになっているはずです。

  1. 1 バイナリにされた UF2 フォーマット化された OpenSK を書き込む

上記でも触れましたが OpenSK は TockOS 上で動作するので通常は TockOS, OpenSK app を書き込むことになります。 ですが hex merge して 1 バイナリにすることもできます。 Makerdiary はさらにそれを UF2 フォーマットにしたものを公開してくれています。 Flash Drive として見えるボードに UF2 形式のファイルをコピーすることで Flash が完了します。

  1. テスト

WebAuthn などセキュリティキーを登録できるサービスにて登録、動作確認します。

作業は以上です。

どうでしょうか?いろいろな機器に配線しなくとも書き込めるのでとても楽だと思います。

最後に

OpenSK のように OSS になっているからといってエンジニアなら簡単に使用できるか?というとそうではありません。

もちろん公開されているから故、簡単に使用するような改良を行うことができるのですがそれにはそれ相応の知識や設備が必要です。 実際にやってみると思い通りにならないことがあるということを覚えておきましょう。 あと組み込みなど Maker 方面に関してはやはり中国のサイトの方が情報があるということです。

あと今回紹介した MDK のボードのサポートについては OpenSK 本体に PR が出されています。

今後も OpenSK には注目していきたいと思います。


参考:

nRF52840 DK:

https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-DK

nRF52840 Dongle:

https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-Dongle

TockOS:

https://www.tockos.org/

nRF52840 MDK USB Dongle:

https://store.makerdiary.com/collections/frontpage/products/nrf52840-mdk-usb-dongle

nrf52840-mdk bootloader:

https://github.com/makerdiary/nrf52840-mdk-usb-dongle/tree/master/firmware/open_bootloader

nrf52840-mdk OpenSK:

https://wiki.makerdiary.com/nrf52840-mdk-usb-dongle/opensk/

How to build OpenSK:

https://wiki.makerdiary.com/nrf52840-mdk-usb-dongle/opensk/building/

OpenSK for MDK prebuild version:

https://github.com/makerdiary/nrf52840-mdk-usb-dongle/tree/master/firmware/OpenSK