Slide 1

Slide 1 text

Updates on PicoRuby Networking, HPKE (and maybe more) Ryo Kajiwara/梶原 龍 (sylph01) 2024/8/31 @ RubyKaigi 2024 Followup 1

Slide 2

Slide 2 text

だれ / なに 2

Slide 3

Slide 3 text

おまけ: RubyKaigi 2025の話 Local Organizerをしています(あってるはず) 近況 7/11に道後温泉本館の改修工事が終了、全館営業開始 9/29にJR松山駅がリニューアルオープン お酒とジュースを持ってきています 台風で物理参加取りやめまし たので残念ながらありません>< ふるさと納税よろしくねよろしくね 3

Slide 4

Slide 4 text

さらにおまけ: 宣伝 『n月刊ラムダノート』にて 「SMTP、どう してこうなった」 という記事を寄稿しまし た。よろしくねよろしくね なお今日の発表とは全く関係がない。 4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

Part 1: PicoRubyのWiFi機能 6

Slide 7

Slide 7 text

PicoRubyのWiFi機能 いい加減pull requestを出しました picoruby/picoruby#174 picoruby/R2P2#12 update 8/26: 入りました picoruby/picoruby @ 2a229de picoruby/R2P2 @ 8744982 割と巨大なpull requestですが実質的にはほぼRubyKaigiの発表通り 7

Slide 8

Slide 8 text

R2P2のビルドオプションの追加 今まで: BOARD=pico_w rake 今回の変更後: Pico Wについては必要な機能を選んでビルドする WIFI=yes BOARD=pico_w rake BLE=yes BOARD=pico_w rake WIFI=yes BLE=yes BOARD=pico_w rake BOARD=pico_w なら WIFI / BLE 両方オフはエラー これによってWiFiを使わない場合はちゃんとRAMが194KB使える 8

Slide 9

Slide 9 text

今後このへんやる人向けメモ Cコンパイラのプリプロセッサオプションを渡す: 以下の両方をする build_config ファイル内の conf.cc.defines に追加 CMakeLists.txt の中で add_definitions 9

Slide 10

Slide 10 text

WiFiを使わなくてもBLEがcyw43-arch を必要とする if(DEFINED ENV{PICO_W_WIFI}) # these are used only in WiFi build target_link_libraries(${PROJECT_NAME} PRIVATE pico_cyw43_arch_lwip_threadsafe_background (...) ) (...) else() # Even the BLE build needs a pico_cyw43_arch, only in a different flavor target_link_libraries(${PROJECT_NAME} PRIVATE pico_cyw43_arch_none ) endif() 10

Slide 11

Slide 11 text

WiFi向けビルドで なぜかSHA256が SHA-1になる問題 ヒント: SHA-1の出力は 160bit(20byte) 11

Slide 12

Slide 12 text

Mbed TLSのバージョンの話 Pico SDKに入っているバージョンは2.28.1相当 実はpico-sdk 1.5.1の指しているsubmoduleのコミットはもっと 中途半端な位置 picoruby-mbedtls mrbgemが指していたバージョンは3.4.1 12

Slide 13

Slide 13 text

Mbed TLS 2系での定義 typedef enum { MBEDTLS_MD_NONE=0, /**< None. */ MBEDTLS_MD_MD2, /**< The MD2 message digest. */ MBEDTLS_MD_MD4, /**< The MD4 message digest. */ MBEDTLS_MD_MD5, /**< The MD5 message digest. */ MBEDTLS_MD_SHA1, /**< The SHA-1 message digest. */ MBEDTLS_MD_SHA224, /**< The SHA-224 message digest. */ MBEDTLS_MD_SHA256, /**< The SHA-256 message digest. */ MBEDTLS_MD_SHA384, /**< The SHA-384 message digest. */ MBEDTLS_MD_SHA512, /**< The SHA-512 message digest. */ MBEDTLS_MD_RIPEMD160, /**< The RIPEMD-160 message digest. */ } mbedtls_md_type_t; 13

Slide 14

Slide 14 text

Mbed TLS 3系での定義 typedef enum { MBEDTLS_MD_NONE=0, /**< None. */ MBEDTLS_MD_MD5, /**< The MD5 message digest. */ MBEDTLS_MD_SHA1, /**< The SHA-1 message digest. */ MBEDTLS_MD_SHA224, /**< The SHA-224 message digest. */ MBEDTLS_MD_SHA256, /**< The SHA-256 message digest. */ MBEDTLS_MD_SHA384, /**< The SHA-384 message digest. */ MBEDTLS_MD_SHA512, /**< The SHA-512 message digest. */ MBEDTLS_MD_RIPEMD160, /**< The RIPEMD-160 message digest. */ } mbedtls_md_type_t; 14

Slide 15

Slide 15 text

0x04 = (Mbed TLS 2では) SHA1 (Mbed TLS 3では) SHA256 15

Slide 16

Slide 16 text

Mbed TLS 3系でコンパイルされて Mbed TLS 2系を利用したらこうなる 16

Slide 17

Slide 17 text

直した mrbgem側のMbed TLSのバージョン を2系にrevert Mbed TLS 3系依存のコードを微修正 ビルドキャッシュに悩まされた 17

Slide 18

Slide 18 text

そのうちgenerally availableになるの で masterに入ったのでみんな使って ください 18

Slide 19

Slide 19 text

TCPClientはあるけどTCPServerは? TCPClientの場合ブロッキングIOしか実装してないのでC言語のコー ルバックの中で受け取ったデータからStringを作って返せばいい TCPServerの場合はデータを受け取ったときにRubyのコールバック を呼びたい mrbc_funcall (だったと思う)はC言語の関数しか呼べない BLEが別の方法でコールバックを実装してると聞いたのでやれ るかも? 19

Slide 20

Slide 20 text

Raspberry Pi Pico 2ですってよ 石がRP2350という新しいのになっている Arm Cortex-M33 Arm TrustZone搭載 $5で買えるTEE(Trusted Execution Environment) RISC-Vにも切り替え可能(!?) SRAMが倍(520KB)になった 本当の意味でAdding Security できてしまう…のか…? 20

Slide 21

Slide 21 text

21

Slide 22

Slide 22 text

Part 2: Hybrid Public Key Encryption 22

Slide 23

Slide 23 text

HPKE is 何 私が解説するまでもなく『HPKEとは何か | blog.jxck.io』 が日本語におけ る決定版。 雑にいうなら、 公開鍵暗号で鍵を交換して 共通鍵暗号で通信本体を行う っていうやつを汎用化したもの 23

Slide 24

Slide 24 text

どこまでやった 今のところ ruby/opensslに依存するgem ruby/opensslのフォーク の2つのフレーバーがある。(これは去年の12月時点でそう) 24

Slide 25

Slide 25 text

今後どうする ruby/openssl、というかOpenSSLのHPKE機能のAPIが割としっかり 決まっているのでgem側のAPIをそっちに寄せてgem側を1.0とする ruby/opensslにpull requestする 止まってるのが「OpenSSLにHPKEがないバージョンで無効化 する/テストも除外する」という部分 特にタイムリミット決めてはないけど年内あたりに入るといいなあ 25

Slide 26

Slide 26 text

26

Slide 27

Slide 27 text

Part 3: 始めてすらいない話 27

Slide 28

Slide 28 text

ブラウザRubyアツいけど 暗号できんの? 28

Slide 29

Slide 29 text

大統一暗号API? 「普段のRuby」はだいたいOpenSSL使ってる PicoRubyほか組み込み向けRubyの場合はMbed TLS ブラウザはWebCrypto API経由で使う これらのAPI wrapperを作ると全環境向けのgemが書けるのでは? 29

Slide 30

Slide 30 text

まだ考えてるだけなのでフィードバッ クほしい 大統一暗号APIもそうだけどHPKEもPicoRubyのネットワークも 近くこのへんのイベントに物理で出没します PIXIV DEV MEETUP 2024 (9/20) Kaigi on Rails (10/25-26) RubyWorld Conference (12/5-6) もちろんオンラインでも いい加減Ehime.rbの定例会を再開したい 30