週次オープンソース:Linux に追いつく TCP、新しい言語、GUI なしの基板 CAD
今週の作業の大半は、二つの場所に向かった。既存のネットワーク層と 暗号層がさらに深まった。pktkit-rs の仮想 TCP は現代の Linux が走らせる アルゴリズムの大半を手に入れ、purecrypto は一週間かけて他の TLS 実装 相手に自分を試験した。そして新しいリポジトリが四つ現れた: latticefoundry でコンパイルされるシステム言語 Lode、ヘッドレスな 電子 CAD cadlab、cadlab が必要とする厳密な多角形幾何 polyclip、 DNS メッセージライブラリ dnsbox。生まれて二週間のハードウェア コンパイラ reticle は、FPGA を OS から USB シリアルポートとして 見えるようにした。
pktkit-rs:Linux に追いつく仮想 TCP
pktkit-rs は仮想
ネットワークトポロジのためのゼロコピー L2/L3/L4 ツールキットだ
(スイッチ、NAT、ユーザ空間 TCP/IP、WireGuard、OpenVPN)。今週は
180 コミットで、v0.1.8 から v0.1.11 まで四つのリリースが出た。
作業の大半は TCP エンジン vtcp に向かい、いまの Linux スタックが持つものの多くが
揃った:
- 輻輳制御 — HyStart++(RFC 9406)付きの CUBIC(RFC 9438)が 新しいデフォルト、配送レート推定の上の BBR (draft-ietf-ccwg-bbr)、ペーシング送信はデフォルトで有効。
- 損失回復 — RACK-TLP(RFC 8985)、Proportional Rate Reduction (RFC 6937)、D-SACK(RFC 2883)、誤った損失応答の取り消し (RFC 3708、3522、5682、4015)。
- ECN — 古典的 ECN(RFC 3168)と Accurate ECN(RFC 9768)。NAT と フラグメント再構成を通しても保たれる。劣化シミュレーション層は これを試すためにパケットへ CE を付けられるようになった。
- 経路と接続確立 — ブラックホール検出付きの PLPMTUD(RFC 4821)、 TCP Fast Open(RFC 7413)、デフォルトでのタイムスタンプ、Linux 流の 遅延 ACK とクイック ACK、Linux と同じやり方で自動調整される 送受信バッファ。
- 観測性 —
TcpInfo。接続内部のスナップショットで、 ハンドシェイクで合意した内容も含む。
どれも鵜呑みにはしていない:相互運用スイートが vtcp を QEMU 内の 本物の Linux TCP と対向させ、CI では KVM の上で走る。AccECN が Linux の間引かれた ACK をすべて CE と読み違える、といった細部が見つかり、 修正された。週の残りは他のモジュールの堅牢化に充てられた。NAT は 偽装された送信元を落とし(RFC 2827/3704)、内側の一つの名前空間が 抱えられる量に上限を設けた。L2 ハブはポートセキュリティを得て、 二重タグのフレームによる VLAN ホッピングを止めた。OpenVPN は鍵交換の 秘密を使用後に消去し、WireGuard はセッション状態をピアごとに制限する。 安定 API に向けて、いくつかのモジュールの内部は非公開になった。
purecrypto:8 つの TLS 実装との相互運用マトリクス
スタックの暗号と TLS/DTLS/QUIC の土台である Pure-Rust の
purecrypto は
v0.9.5 から v0.9.9 までをリリースした(225 コミットで、今週最も多い)。週は
二つに分かれた。
前半は相互運用性。TLS 1.3 の試験マトリクスの枠組みに OpenSSL、 BoringSSL、wolfSSL、Mbed TLS、GnuTLS、LibreSSL のアダプタが揃った。 CI ジョブは macOS の Apple Network.framework と Windows SChannel 相手にもこれを回す。QUIC v1 は quic-go と OpenSSL 相手に両方の役割で、 Encrypted Client Hello は BoringSSL 相手に試験される。その過程で 入った機能:DTLS 1.3 のクライアント証明書、セッション再開と 0-RTT、 DTLS コネクション ID(RFC 9146)、QUIC のバージョン交渉と QUIC v2 (RFC 9368/9369)、外部 PSK、圧縮クライアント証明書(RFC 8879、 brotli と zstd)、secp521r1 と RFC 10024 の NIST 曲線 ML-KEM ハイブリッドグループ。
後半は性能で、ライブラリ全体にわたって 80 を超える perf: コミットが
入った。P-256 と secp256k1 には safegcd による定数時間スカラー逆元が
入り、AES はビットスライスの Boyar–Peralta S-box を得た。GCM-SIV は
ハードウェア POLYVAL で動くようになり、Ed448 は固定ウィンドウの
スカラー倍算を持ち、QUIC はパケットごとではなく鍵ごとに一度だけ
AEAD に鍵を入れる。入った変更はそれぞれ Valgrind の定数時間ハーネスで
検査し直され、見つかった三件はその日のうちに修正された。
Lode:latticefoundry でコンパイルされる新しい言語
Lode(火曜に新規、109 コミット)は「Rust、Zig、Go のそれぞれ最良の部分を、それぞれ限界まで 押し進めたシステムプログラミング言語」だ。README の設計目標は、 ライフタイム注釈なしでのコンパイル時のメモリ安全とデータ競合の不在、 安全なコードに未定義動作がないこと、ランタイムなし、ジェネリクスと フォーマットのためのコンパイル時評価、そしてオプトインのグリーン スレッドとチャネル。コンパイラのバックエンドは latticefoundry で、crates.io のリリース版だけを使う。
すでに言語の部分集合を静的な x86-64 Linux 実行ファイルへコンパイル
でき、その部分集合は広がり続けている。今週のログは言語が埋まって
いく様子そのものだ:インデックスが範囲内であることを証明する
(実行時チェックなし)配列とスライス、値セマンティクスの構造体、
網羅的な match を持つ列挙型、throws/try/defer/errdefer に
よるエラー、inout/sink の引数規約を持つメソッド、never 型、
ジェネリクス、ユーザ定義トレイトと impl ブロック、comptime 評価、
コンパイル時に検査されるフォーマット文字列。標準ライブラリは
std/os の syscall まで Lode で書かれている。hello world は
1,049 バイトから 841、655、577 バイトへと縮んだ。README によれば、
システムコールはちょうど二つ、write と exit だけだ。
latticefoundry 自身(162 コミット)は RISC-V RV64GC、AVR5、wasm32 の
バックエンド、Win64 呼び出し規約、秘密値のための定数時間検証器、
Thumb-2 と WebAssembly の逆アセンブラを得た。アセンブラとリンカも
スタック自前の rsasm と
qld に切り替えた。C ドライバ
lf-cc は Lua、SQLite、gzip、bzip2 を本物の glibc ヘッダに対して
ビルドするマイルストーンに達し、ドキュメントには GNU coreutils の
ビルドも記録されている。
cadlab と polyclip:GUI なしの電子 CAD
cadlab(土曜に新規、 100 コミット)は「プログラムと AI エージェントから操作されるよう 設計された、Rust 製のヘッドレス電子 CAD」だ。部品と BOM から ネットリスト、基板レイアウト、自動配線、DRC、製造出力までを扱う。 README によれば、目指すのは今日の KiCad と freerouting が担うことを、 対話的な UI 抜きでこなすこと。Rust ライブラリ、CLI、MCP サーバの 背後には同じ型付きコマンドレジストリがあり、エージェントにもシェルと 同じコマンドと同じ検証が使える。原則は、ネットリストが唯一の正、 座標は整数ナノメートル、出力はルータも含めてバイト単位で決定的。
ログは二日で M0 から M9 まで進む。DigiKey、Mouser、Nexar の プロバイダを使った部品調査。ERC と回路図の自動レイアウト。ゾーン、 DRC、Gerber X2/X3・ドリル・部品実装データ・IPC-D-356A 出力を持つ 基板モデル。JLCPCB や PCBWay から OSH Park、Aisler までの製造業者 プロファイル。交渉型の混雑解消を使うグリッド自動配線器と、それに 続く押し退け配線、グリッドレス探索、差動ペア、等長ミアンダ。KiCad、 Specctra DSN/SES、IPC-2581C、STEP、IDF の入出力。KiCad は検証用の オラクルとしてだけ使われ、コードの出どころには決してならない。3D モデルの取り込みは oxideav-mesh3d を通り、新しい STEP リーダー oxideav-step と並ぶ。
polyclip(同じ日に
新規、93 コミット、v0.0.1 → v0.0.5)がその下の幾何だ。整数座標で
厳密な 2D 多角形のブーリアン演算、オフセット、円弧近似、距離クエリ、
フラクチャ、三角形分割を行う。i64 座標と厳密な i128 述語を使い、
スナップ丸めでも有効な出力が保証され、結果は正規形でプラットフォーム
間でビット単位に一致する。cadlab のゾーン塗りと DRC のために作られた
もので、今週はインクリメンタルな ZoneFill 再塗り、円弧を保つ
ブーリアン、繰り返しの DRC クエリ向けの Prepared 幾何、並列の
ノーディングとスイープが加わった。二回の敵対的レビューでもバグが
見つかり、修正された。
reticle:シリアルポートとして認識される FPGA
ゼロから書かれた VHDL/Verilog ツールチェーン
reticle は 117
コミットで続き、具体的な目標を得た。CDC ACM の USB シリアルポート IP
——「OS 自身のドライバが bind する」——が、reticle 自身の ECP5 フローで
Cynthion ボードに配置配線された。いまは 64 バイトのパケットを運び、
SERIAL_STATE も送る。6502 のモニタの例は、これをコンソールとして
使う。その下では、ECP5 モデルが分散 RAM スライスとダイの縁の記述を
増やし、ULPI トランシーバ越しの USB フルスピードホストが入り、
合成はマップ後のネットリストがマップ元と等価であることを証明できる
ようになった。コミットの多くは、ドキュメント自身の主張を実測に
合わせて正している。
dnsbox:ゼロコピーの DNS メッセージ
dnsbox(日曜に新規、
77 コミット)はゼロコピーの DNS メッセージ解析・構築ライブラリで、
no_std かつ #![forbid(unsafe_code)]。EDNS(0)、不在証明と信頼の
連鎖を含む DNSSEC 検証、ZONEMD、SVCB/HTTPS、TSIG、SIG(0)、UPDATE、
ゾーン転送、ゾーンファイル、そしてレコード型のロングテールまでを
扱う。今週は API レビュー、信頼判断のための fuzz ターゲットを伴う
セキュリティ監査、BIND・ldns・dnspython・実サーバのキャプチャから
集めた相互運用コーパス、そして Knot DNS 3.5 と Unbound 1.19 相手の
CI ジョブも入った。
今週のその他
- catcard — Coldcard
ファームウェアでの閾値署名。土台は
tsslib-rs で、こちらは
コンパクトなバイナリエンコーディングと署名ラウンドの一回削減を
伴って
v0.2.11〜v0.2.14をリリースした。ファームウェアは 読み込み可能なアプリも得た:Flappy Cat、Block Mine、Block Cutter。 - nixvm — システムコール レベルの Linux サンドボックスの x86 インタプリタが x86-64-v3 (AVX、AVX2、FMA、BMI、XSAVE)に達し、Linux と同じシグナル フレームと、ちゃんと動く制御端末を得た。
- rsemu — 新しいマシン
alphard-navi:R-Car H1 の上のトヨタ・アルファードのナビ コンピュータで、四つの Cortex-A9 を走らせ、SD カードから osloader のスプラッシュ画面まで起動する。 - kataan — JavaScript エンジンがエンジン一つになった。ツリーウォーカーの AST 実行器は 削除され、VM が拒否した場合はフォールバックせずエラーになる。
- qld(
v0.1.1、いまは 「アルファ」)、rsasm、 そして Go→Rust コンパイラの rustygo。後者は Go 標準ライブラリ自身のテストを走らせ、リフレクション経由で関数を 呼べるようになった。 - fullrust は
cargo-fullrust/purestdの経路を引退させ、tokio の "full" (プロセス、シグナル、Unix ソケット)に対応した。 - oxideav-render-vulkan — oxideav の新しい wgpu ベースの GPU レンダラで、CPU レンダラと 突き合わせて検査されるコンピュート・パストレーサを持つ。
- odock — オープン ハードウェアの USB-C ドック(まず 10 Gbps、後に USB4、RP2350 搭載)。配置と配線はスクリプトとして書かれている。
来週
Lode は latticefoundry の上で次のマイルストーンへ進む。cadlab と polyclip は要件をやり取りし続ける:ゾーン塗りのコーパスはすでに ベンチマークになっている。dnsbox は 1.0 へ、reticle は ECP5 と USB の さらに先へ向かう。pktkit-rs と purecrypto は、今週始めた堅牢化と 相互運用の作業を続ける。