LoginSignup
8
4

More than 3 years have passed since last update.

nRF52840-DKにOpenSKを入れてUSB FIDOキーにしてみた

Last updated at Posted at 2020-06-14

やってみた系です。深く考えずにやっているので間違っているところもあるかもしれません。

nRF52840-DKとは

nRF52840っていうSoCがありまして、チップ1個でUSB,BLE,NFCの機能を持っている優れものです。そのチップを乗っけて、電源、LED、ボタン、USBポートなどをくっつけた開発用キット(基盤)がnRF52840-DKです。これ1枚あればパソコンに接続して開発できるというオモチャです。

nRF52840-DK.png
nRF52840-DK

似たようなものにnRF52840-dongleというものがありまして、USB FIODキーというとこっちの方がしっくりくるのですがこちらは開発用キットみたいな便利なものではなくファーム書き換えが大変みたいなので今回は使いません。

nrf52840-dongle.png
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)を電源に接続します。
  • SW9VDDにします。
  • SW8ONにします。
  • 基盤に火が入りLED1がゆっくり点滅します。
  • Buttonを押すと、対応するLEDが光ります。

nRF52840-DK_port.png

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を動かします。

ちゃんと動きます!(というか動くように修正しました)

HIDTest01.PNG

画面のボタン 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使ってみたいんだよなぁ。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4