やってみた系です。深く考えずにやっているので間違っているところもあるかもしれません。
nRF52840-DKとは
nRF52840っていうSoCがありまして、チップ1個でUSB,BLE,NFCの機能を持っている優れものです。そのチップを乗っけて、電源、LED、ボタン、USBポートなどをくっつけた開発用キット(基盤)がnRF52840-DKです。これ1枚あればパソコンに接続して開発できるというオモチャです。
**nRF52840-DK**似たようなものにnRF52840-dongleというものがありまして、USB FIODキーというとこっちの方がしっくりくるのですがこちらは開発用キットみたいな便利なものではなくファーム書き換えが大変みたいなので今回は使いません。
**nRF52840-dongle**OpenSKとは
FIDOキーの中のソフトウェアをGoogleが開発してオープンソースで公開したものです。こちらのサイトをみるとわかりやすいです。
OSにTock、開発言語にRustを使っているという点で注目されています。
OpenSKはGitHubで公開されていて誰でも使うことができます。このソースをビルドしてnRF52840-DKとかnRF52840-dongleに書き込めば、FIDOキーになります。
環境
CTAPcsで動かさないのであればWindowsは不要です。基盤とホストPCを接続するのにマイクロUSBケーブルが必要です。
- nRF52840-DK (基盤)
- Mac OS X Catalina 10.15.4
- Windows 10 Pro 1909
もくじ
1.nRF52840-DKを入手する
買う
NORDICのサイトから買うことができます。購入先がいくつかあります。私はDigi-Keyから購入しました。
Digi-Keyでは¥5,654で送料は¥2,000だけど¥6,000以上買えば送料無料だということなので、nRF52840-dongle(¥1,154)も一緒に購入しました。1週間ほどでモノが届きました。(2020/6/14時点)
- nRF52840-DK + nRF52840-dongle = ¥6,808(送料無料)
動作確認
買ってきたばかりの基盤にはサンプルプログラムが入っています。基盤のLEDが光るだけのシンプルなものです。それでも正常に動くことを確認するには十分ですね。
Getting startedをみて動かしてみます。ホストPCは入りません。
-
J2 Port
(micro usb)を電源に接続します。 -
SW9
をVDD
にします。 -
SW8
をON
にします。 - 基盤に火が入り
LED1
がゆっくり点滅します。 -
Button
を押すと、対応するLED
が光ります。
2.OpenSKをセットアップする
Installation guideを参考にします。
The scripts provided in this project have been tested under Linux and OS X. We haven't tested them on Windows and other platforms.
ということなんで、Macでやります。
2-1.Macに必要なソフトをインストールする
先にいれとかないといけないものがあり。
Rust
Macのターミナルから以下のコマンドでRustをインストールします。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
途中インストールの方法を聞かれますが、1)Proceed with installation (default)
で良いかと思います。
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
info: downloading installer
Welcome to Rust!
This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.
...
stable installed - rustc 1.44.0 (49cae5576 2020-06-01)
Rust is installed now. Great!
To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done
automatically.
To configure your current shell run source $HOME/.cargo/env
To configure your current shell run source $HOME/.cargo/env
ってことで、環境変数を更新する必要があるのでPCを再起動します。
念のためバージョンを確認しときます。
$ rustc --version
rustc 1.44.0 (49cae5576 2020-06-01)
$ rustup --version
rustup 1.21.1 (7832b2ebe 2019-12-20)
$ cargo --version
cargo 1.44.0 (05d080faa 2020-05-06)
python3
python3はMac OS Xの場合、最初から入っているかと思います。
$ python3 --version
Python 3.7.3
OpenSSL
-
Homebrewを入れるとこからやらないといけないみたいです。
- Homebrewのサイトでインストールコマンドが書いてあるので、それをそのままターミナルで打ち込みます。これでbrewコマンドが使えるようになります。
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
- OpenSSLをインストール
$ brew install openssl
J-Link Software
SEGGERのサイトからJ-Link Software and Documentation pack for macOS
をダウンロードしてインストールします。
J-Link Software and Documentation pack for macOS v6.80b([2020-06-05])
2-2.OpenSKを書き込む
GitHubからソースをClone
$ git clone https://github.com/google/OpenSK
セットアップ
CloneしたOpenSKにあるsetup.shを実行します。
$ cd OpenSK
$ ./setup.sh
色々実行して、正常すると、crypto_data
フォルダに秘密鍵とか証明書ができます。多分これを基盤に書き込むんでしょう。
crypto_data $ ls
opensk.key opensk_ca.key opensk_ca.srl opensk_cert.pem
opensk_ca.csr opensk_ca.pem opensk_cert.csr
Flashing a firmware
nRF52840-DKにOpenSKを書き込みます。
nRF52840-DKのJ2 port
とMacを接続して、nRF52840-DKの電源をONにします。
その状態でターミナルから以下のコマンドを実行します。
./deploy.py --board=nrf52840dk --opensk
しばらく時間がかかって基盤がピカピカしてYou're all set!
となれば書き込み完了!
$ ./deploy.py --board=nrf52840dk --opensk
info: Updating rust toolchain to nightly-2020-02-03
info: syncing channel updates for 'nightly-2020-02-03-x86_64-apple-darwin'
info: checking for self-updates
info: component 'rust-std' for target 'thumbv7em-none-eabi' is up to date
info: Rust toolchain up-to-date
info: Building Tock OS for board nrf52840dk
Finished release [optimized + debuginfo] target(s) in 0.04s
info: Building OpenSK application
Compiling openssl-sys v0.9.58
Compiling openssl v0.10.29
Compiling ctap2 v0.1.0 (/Users/suzuki/openskwk/OpenSK)
Finished release [optimized] target(s) in 19.50s
info: Generating Tock TAB file for application/example ctap2
info: Erasing all installed applications
All apps have been erased.
info: Flashing file third_party/tock/target/thumbv7em-none-eabi/release/nrf52840dk.bin.
info: Flashing padding application
info: Installing Tock application ctap2
info: You're all set!
これでこのごつい基盤がFIDOセキュリティキーになりました。なったはずです。早速使ってみましょう。
FIDOキーとして利用する場合は、基盤のUSB port
とPCをマイクロUSBケーブルで接続します。J2 port
ではないので注意しましょう。
3.FIDOデモサイトで動かしてみる
YubiOnのFIDO2 体験デモサイトでテストしてみました。
User Presenceの際はLEDがピカピカ光るので、Button1あたりを押しましょう。
環境 | Authenticator Type | Resident Key | 動作状況 |
---|---|---|---|
Mac OS X Catalina 10.15.4 Chrome 83.0.4103.97 |
Cross-Platform | Off | OK |
On | OK | ||
Windows 10 Pro 1909 Chrome 83.0.4103.97 |
Cross-Platform | Off | *NG (1) |
On | OK | ||
Windows 10 Pro 1909 Edge 44.18362.449.0 |
Cross-Platform | Off | *NG (1) |
On | OK |
*1
なんかダメなんですよねぇ。登録は成功するのですが、認証の途中で固まってしまいます。
具体的には「セキュリティキーにタッチしてください」のメッセージでLEDがピカピカ光ってButtonを押すところまでは正常なんですが、Buttonを押してもブラウザ側が反応せず、先にすすみません。
CTAPcsでは動くのでOpenSKの問題ではなく、Windows側のハンドリングの問題(ChromeとEdgeで同じ現象なので共通のAPIレイヤがあるんかな)ではないかと思います。
4.CTAPcsで動かしてみる
CTAPcsっていうWindowsネイティブアプリ用のFIDOキーDLLがあるんですが、それでの動作確認してみました。examplesのHIDTest01.exe
を動かします。
ちゃんと動きます!(というか動くように修正しました)
画面のボタン | CTAPコマンド | 動作状況 | 備考 |
---|---|---|---|
GetInfo | authenticatorGetInfo | OK | |
MakeCredential | authenticatorMakeCredential | OK | ResidentKey On/Off 両方OK |
GetAssertion | authenticatorGetAssertion | OK | ResidentKey On/Off 両方OK |
setPIN | authenticatorClientPIN setPIN |
OK | |
changePIN | authenticatorClientPIN changePIN |
OK | |
ClientPINgetRetries | authenticatorClientPIN getRetries |
OK | |
IsConnected | OK | ||
Wink | CTAPHID_WINK | OK | |
List HID | OK | ||
Reset | authenticatorReset | OK | - 普通に実行してもリセットできない. - 基盤のButton1-4のどれかを押したままUSBに接続 --> コマンド送信 --> LED光る --> Buttonを押す -->リセット完了. |
おつかれさまでした
意外と簡単です。
nRF52840-dongle使ってみたいんだよなぁ。