Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Updates on MLS on Ruby (and maybe more)

Avatar for sylph01 sylph01
August 30, 2025

Updates on MLS on Ruby (and maybe more)

Avatar for sylph01

sylph01

August 30, 2025
Tweet

More Decks by sylph01

Other Decks in Programming

Transcript

  1. Updates on MLS on Ruby (and maybe more) Ryo Kajiwara/

    梶原 龍 (sylph01) 2024/8/30 @ RubyKaigi 2025 Followup 1
  2. 7

  3. Hybrid Public Key Encryption (HPKE; RFC 9180) 2023 年にやってた、RubyConf Taiwan

    2023 でしゃべった https:/ /github.com/sylph01/hpke-rb 、 hpke gem としてリリースさ れている Messaging Layer Security などのビルディングブロック 9
  4. hpke gem の更新 e083625 HPKE#aead_encrypt , HPKE#aead_decrypt をpublic にした 8558f68

    (v0.3.1, 現行) OpenSSL の最低バージョンを設定 OpenSSL 3 系を前提に作っているので 10
  5. hpke gem v1.0 化? 動作実績を積み重ねられたと思うが、HPKE cipher suite のinstantiation の API

    を迷っている。 hpke = HPKE.new(:x25519, :sha256, :sha256, :aes_128_gcm) KEM のアルゴリズム( 最初の2 つ) は組み合わせが決まるのでRFC 9180 のAlgorithm Identifiers (をラッピングしてる定数)で直接指定 してしまっていいのでは? そうすると残りもAlgorithm Identifiers で指定したい? 決めの問題+ やるだけ。2025 中にやる。 11
  6. 12

  7. Messaging Layer Security RubyKaigi 2025 のネタ RubyConf Taiwan 2025 でも説明を多少改善した版をしゃべった

    メッセージングのエンドツーエンド暗号化のためのプロトコル グループ鍵共有の仕組み 13
  8. 2 人の場合は簡単 # 両者とも共通の秘密から始めて chain_key[0] = "some common secret" #

    HMAC は「鍵付きハッシュ」 # n 周期目のメッセージの鍵はn 周期目のchain_key から作る message_key[n] = hmac_sha256(chain_key[n], 0x02) # n+1 周期目のchain key はn 周期目のchain key から # メッセージの鍵とは違うHMAC 鍵を使って作る chain_key[n+1] = hmac_sha256(chain_key[n], 0x01) Double Ratchet algorithm の "symmetric key ratchet" と呼ばれる部分。要するにハッシュをチェーンしてる。 18
  9. 忙しい人のためのTreeKEM commit_secret 自体を全員の公 開鍵に対して暗号化して送っても 動作はするが、メンバー数に対し て O(n) (→右図の偶数node 全部) commit_secret

    をツリーのcopath node に沿って最低限の数だけ暗号 化することによって暗号化の数が O(log n) で済む(→緑色node ) 27
  10. 結局そのあと何をやった? あんまりやれてない。 終わった 開発用に使ってた不要メソッドの削除 deserialization で用いるバッファをstring 2 つ→StringIO に変更 進行中

    グループの状態をクラスにwrapping する クライアントインターフェース 私自身が松山に魂を取り残された哀れな人類だった 28
  11. バッファのStringIO 化 以前は Melos::Struct::Base.new_and_rest(buf) がパースした結果と 残りの文字列の2 要素の配列を返す、という形でやっていた。 結果 Melos::Struct::Base.new(buf) は「残りの文字列」を捨てるよ

    うにしかできなかった。そうすると場所によって new と new_and_rest を呼び分ける必要があった。 あと不必要に大量の String を生成していた。 29
  12. バッファのStringIO 化 C 言語でネットワークから得た値をデシリアライズするときはバッファ とポインタの組を使って、ポインタの位置を進めながら読んでいく。そ れのようなことができるのが StringIO 。 string.byteslice(0, n)

    → stream.read(n) など地道な書き換えを した。これを終えた状態が v0.0.2 。 最初のcommit が https:/ /github.com/sylph01/melos/commit/86f0bbd4a00a3903747f8d1bc9b2c65bd4637660 30
  13. クライアントインターフェース 鍵ペアの生成 グループにjoin する 0 人→1 人の場合は自身の鍵ペアをtree に登録してepoch 0 を初

    期化 n 人→n+1 人 (n>0) のときは KeyPackage を受け取りそこから鍵 を取り出してグループに追加、 Welcome メッセージを作る group ブランチ https:/ /github.com/sylph01/melos/commits/group でやってる 32
  14. クライアントインターフェース メッセージを作る FramedContent : application / proposal / commit を送信

    者の情報と合わせてラッピングする AuthenticatedContent : FramedContentTBS + FramedContentAuthData を使って FramedContent を署名し たもの PublicMessage : AuthenticatedContent に membership_tag というMAC を付加したもの RFC 9420, Section 6 33
  15. クライアントインターフェース 暗号化されたメッセージを作る FramedContent 、 AuthenticatedContent は同じ PrivateMessage : SenderData と

    PrivateMessageContent が暗号化されたもの。 PrivateMessageContent に AuthenticatedContent が含まれる 34
  16. 38

  17. その他 大統一暗号API 多少気持ちがある 先行事例: krypt (cf: RubyKaigi 2013 のトーク) がOpenSSL

    非依存 な統一暗号ライブラリを目指そうとしてたらしい。調査する この時代だとCRuby とJRuby の間の統一を目指していたように 見える。私はOpenSSL とwasm (Web Crypto) とPico (Mbed TLS) の bridging を目指している 39
  18. その他 OpenSSL gem そのもの OpenSSL に生えてるHPKE のAPI を使う版のHPKE: あんまり優先 度は高くない

    cipher suite 全体の情報を取るのがしんどく、プロトコルで 使うにはしんどそう Edwards Curve とそうでないEC の間に一貫性のあるAPI が欲しい OpenSSL に生えているわけではないのでOpenSSL gem でや るべきかという話はありそう PicoRuby: TCP server, etc... 40
  19. おまけ1: ローカルオーガナイザー業 来年の夏にJANOG が松山に来ます。 RubyKaigi と同じ会場 今年の松江で2500 人くらい(RubyKaigi より多い) 今年の懇親会が800

    人くらいで「足りなかった」という声が … まさかの公園リターンズ???(来年のJANOG ホストにこんなんやっ たよという話はしてある) 42
  20. おまけ2: DJ の出番 RubyMusicMixin 終わったあとも松山でいろいろやっています。 10/18( 土) 20:00 〜26:00 TBA

    あんまりハードじゃないダンスミュージックの新規イベント 私はProgressive House をシバきます 11/29( 土) 14:00 〜20:00 Rhythmic Rumble! (#R 乱) 音ゲー中心。メインで活動してるイベント 今回はポップンDJ (大嘘)の予定 どちらもnecco さん(Tw: @bar_necco )にて。配信あります 43