Closed27

reTerminalが届いたので初期設定とかATECC608Aのシリアル取得してみる

shuntakashuntaka

マルツのGWセールで、re Terminalを購入した。税込¥21,998。

マルツ購入サイト

誤解を恐れず一言で言えば、液晶や各種センサーやセキュアチップつきラズパイみたいな理解でいいと思う

筐体はこんな感じ(↑から画像を拝借)

shuntakashuntaka

TypeC繋いだだけで、Raspberry Pi OSのトップ画面が!モニター繋がなくて済むの便利だなー。起動速度も速い。OKを押下。

shuntakashuntaka

言語設定はマウス使わず指でいける。そうre Terminalならね。

shuntakashuntaka

パスワード設定。もちろんソフトウェアキーボードはでないので、キーボード指して設定

shuntakashuntaka

アップデートするか聞かれる

Next押したら、アップデートが始まる。他の操作はブロックされない。

shuntakashuntaka

Macからsshする

$ ssh pi@192.168.xx.xxx
The authenticity of host '192.168.xx.xxx (192.168.xx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:v40ey28pAS9QobYY3TRbTx+G8sdvFUur+8gx8NioMbY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.xx.xxx' (ECDSA) to the list of known hosts.
pi@192.168.xx.xxx's password:
Linux raspberrypi 5.10.60-v7l+ #1449 SMP Wed Aug 25 15:00:44 BST 2021 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue May  3 10:37:46 2022
pi@raspberrypi:~ $ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Seeed_Python_ReTerminalQt5Examples  Templates  Videos
pi@raspberrypi:~ $
shuntakashuntaka

python3はもともと入っているのでこのままで

pi@raspberrypi:~/work/20220503 $ python
-bash: python: コマンドが見つかりません
pi@raspberrypi:~/work/20220503 $ pip
-bash: pip: コマンドが見つかりません
pi@raspberrypi:~ $ python3
Python 3.7.3 (default, Jan 22 2021, 20:04:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
shuntakashuntaka

gitを入れる

sudo apt install git

.netrcでGitHubの認証情報を設定

~/.netrc
machine github.com
login shuntaka9576
password xxx
shuntakashuntaka

poetryを入れる。公式のインストールコマンドのパイプ部分をpython3に変更。

-curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
+curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3 -

poetryインストール時に、~/.profileexport PATH="$HOME/.poetry/bin:$PATH"が自動追加されます。再度bash起動し直しで、パスのpoetryが読み込まれます。

$ exit
$ ssh pi@192.168.xx.xxx                                                                                                                                                                                                                                                                                                                        
$ poetry
Poetry version 1.1.13
shuntakashuntaka

ATECC608Aの公開鍵を取得したいので、PythonプロジェクトのGitHubテンプレートを使い、reterminal-sampleを作成。クローンする。
このPythonのテンプレートの解説は、拙著のPythonプロジェクトを快適にするために導入したツールとその設定を参考に。簡単に言えばテストツールなどオールインワンで導入した薄いPoetryプロジェクトテンプレートです。

$ git clone https://github.com/shuntaka9576/reterminal-sample
  1. このテンプレートは、Pythonのバージョンが^3.8対応なので、^3.7に変更
  2. poetryはtomlを変更すると、lock側でtomlのハッシュ値を持っているため不整合が生じるのでlockは削除
  3. make install-devでプロジェクト初期化
$ git diff
diff --git a/pyproject.toml b/pyproject.toml
index 775f8cb..298bda7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -5,7 +5,7 @@ description = ""
 authors = ["hoge <hoge@example.com>"]

 [tool.poetry.dependencies]
-python = "^3.8"
+python = "^3.7"
 python-dotenv = {extras = ["cli"], version = "^0.19.0"}

 [tool.poetry.dev-dependencies]
$ rm poetry.lock
$ make install-dev
shuntakashuntaka

ここまで来たら、コードを書く必要がでるのでVSCodeから前述のプロジェクトをssh経由参照する

shuntakashuntaka

ATECC608を取得するためのライブラリを追加

# 以下のコマンドは、前述のリポジトリルートでコマンドを実行する
# 1. --- cryptographyのインストール ---
$ sudo apt install libffi-dev # cryptographyがcffiと依存、cffiインストールに必要なライブラリ
$ sudo apt install libssl-dev # cryptographyのビルドに必要
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # cryptographyのビルドに必要
# 対話型で1を選択
# cargoのパスが通っていないので、bashの再起動が必要
$ poetry add cryptography
# 2. --- cryptoauthlibのインストール ---
$ sudo apt install cmake
$ export CRYPTOAUTHLIB_NOUSB=True
$ poetry add cryptoauthlib

コミット
コミット

shuntakashuntaka

reTerminalのハードウェアセキュリティ - 概要&プロビジョニング -から、バスとI2Cのアドレス(3, 0xC0)が分かります(公式に知るにはどこを見ればいんだろう...)

以下のPythonコードでシリアルが取れることを確認した
cryptoauthlibの使い方は、github.com/MicrochipTech/cryptoauthtoolsを見ると幸せになれる

from cryptoauthlib import (
    atcab_info,
    atcab_init,
    atcab_random,
    atcab_read_config_zone,
    atcab_read_serial_number,
    atcab_read_zone,
    atcab_write_zone,
    cfg_ateccx08a_i2c_default,
)
from cryptoauthlib.library import load_cryptoauthlib

ATCA_SUCCESS = 0x00
BLOCK_SIZE = 32

class Ecc608:
    def __init__(self):
        ECC608_I2C_ADDRESS = 0xC0
        RPI_I2C_BUS = 3

        load_cryptoauthlib()

        cfg = cfg_ateccx08a_i2c_default()
        cfg.cfg.atcai2c.slave_address = ECC608_I2C_ADDRESS
        cfg.cfg.atcai2c.bus = RPI_I2C_BUS

        init_result = atcab_init(cfg)

        if not init_result == ATCA_SUCCESS:
            raise Exception("init config exception")

        # get info
        info = bytearray(4)
        get_info_result = atcab_info(info)

        if get_info_result == ATCA_SUCCESS and info is not None:
            self.__info = info
        else:
            raise Exception("init info exception")

        # get serial number
        serial_number = bytearray(9)
        get_read_serial_number_result = atcab_read_serial_number(serial_number)

        if get_read_serial_number_result == ATCA_SUCCESS and serial_number is not None:
            self.__serial_number = serial_number
        else:
            raise Exception("init serial number exception")

        # get config zone
        config_zone = bytearray(128)
        get_read_config_zone_result = atcab_read_config_zone(config_zone)

        if get_read_config_zone_result == ATCA_SUCCESS and config_zone is not None:
            self.config_zone = config_zone

        else:

            raise Exception("get config zone exception")

    def get_serial_number(self):
        return self.convert_to_string_from_bytearray(self.__serial_number)
    
    def convert_to_string_from_bytearray(self, a):
        lines = []
        for x in range(0, len(a)):
            lines.append("{:02X}".format(a[x]))

        return "".join(lines)


def main():
    ecc608 = Ecc608()
    print(f"serial_number: {ecc608.get_serial_number()}")



if __name__ == "__main__":
    main()
実行結果
$ poetry run python src/main.py
serial_number: XXXXXXXXXXXXXXXXXX
shuntakashuntaka

ここまで出来ると証明書なしで認証できるので、薄い実装でIoTができそう。とりあえず最初確認することはこれくらいなので、Close。

shuntakashuntaka

Goの環境を追加するよ

$ pwd
/home/pi/work/20220503
$ wget https://golang.org/dl/go1.18.1.linux-armv6l.tar.gz
$ sudo tar -C /usr/local -xzf go1.18.1.linux-armv6l.tar.gz
~/.profileに追記
+export PATH=$PATH:/usr/local/go/bin # goエコシステムツール
+export PATH=$PATH:$HOME/go/bin # go installで入るツール
shuntakashuntaka

I2Cコマンドメモ

接続された I2C デバイス一覧およびそれらのアドレス
sudo i2cdetect -y 1
shuntakashuntaka

PKCS#11の動作確認のため、p11toolコマンドをインストール

sudo apt install gnutls-bin

cmake-guiのインストール

sudo apt install cmake-qt-gui
shuntakashuntaka

(もはやRaspberry Pi OSの環境構築スクラップになりつつある)
adbコマンドのインストール

sudo apt-get install -y android-tools-adb android-tools-fastboot
# この手順はpoetry配下にできないので没
sudo apt-get install libatlas-base-dev
pip3 uninstall numpy
sudo apt install python3-numpy
numpyが3.8じゃないときついので、python 3.8以上にする
wget https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tgz
tar xf Python-3.10.4.tgz
cd Python-3.10.4/
make
sudo make install
pip3 install --upgrade pip
shuntakashuntaka

pythonのアプリでHTTPリクエストでPKCS#11するために、M2Crypto必要っぽいので導入する

sudo apt-get install build-essential python3-dev openssl libssl-dev swig
poetry add M2Crypto

M2Crypto難しい。。py-curlを試す

sudo apt install libcurl4-openssl-dev libssl-dev
poetry add pycurl

py-curlで、PKCS#11のHTTPリクエストを送ることができた。嬉しい。

shuntakashuntaka

出先からreTerminalを弄りたいので、Tailscaleを導入する
参考

sudo apt install apt-transport-https
curl -fsSL https://pkgs.tailscale.com/stable/raspbian/buster.gpg | sudo apt-key add -
curl -fsSL https://pkgs.tailscale.com/stable/raspbian/buster.list | sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt update
sudo apt install tailscale
sudo tailscale up
tailscale ip -4 # IP v4アドレス確認
shuntakashuntaka

SQLiteはデフォルトで入っている(依存ではいったのかも)

$ sqlite3 --version
3.27.2 2019-02-25 16:06:06 bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0alt1

shuntakashuntaka

流行りのLitestremを導入する
Download & install参照
↑だと、ARMじゃないので注意。

$ wget https://github.com/benbjohnson/litestream/releases/download/v0.3.8/litestream-v0.3.8-linux-arm7.deb
$ sudo dpkg -i litestream-v0.3.8-linux-arm7.deb 
# これでインストール完了。`dpkg`便利!
$ litestream version
v0.3.8
このスクラップは2022/06/11にクローズされました