2026-06-07

週次オープンソース:Pure-Rust の ICU、そして rsurl が curl パリティへ

先週、Pure-Rust で C なしのスタックが公開された——暗号、圧縮、 SSH、curl。今週はそこに新しい柱が生えた:国際化だ。intl は ICU をゼロから作り直したアナログで、no_std かつ Pure-Rust、 公式の Unicode 適合性スイートが 100% 通る。その横に no_std の 日時クレートが二つ着地した。そしてスタックは固まった: rsurl が機能的 curl パリティに到達し、puressh は現行の purecrypto へ移った。

intl:Pure-Rust の ICU

intl——「Pure-Rust、 #![no_std] の国際化プリミティブ、ICU の Pure-Rust アナログ」 ——が見出しだ。Unicode 17.0.0 を対象とし、コアアルゴリズムは 公式適合性スイートが 100% 通る状態で出荷される:Normalization、 Collation、Grapheme/Word/Sentence と Line の分割、Bidi。設計は 良い意味で変わっている:Unicode Character Database をオフライン ジェネレータが Rust の match ディスパッチに直接コンパイルする ので、あらゆるプロパティ参照が何も確保せず、ランタイム初期化も 要らない const fn になる——起動時にパースするのではなく、 テーブルをコードにする。全体が no_std で、アロケータなしでも 使え、組み込み/カーネル/WASM 向けに features でコードポイント 範囲を選べる。

今週は v0.1.3 から v0.3.1 へ、広げてから締めた:

  • Collation — 公式 CLDR ルールからのデータ駆動テイラリング、 アルファベット索引(index_labels / index_bucket)、 primary 強度の文字列検索(find / contains)。
  • 字訳(Transliteration) — transform エンジンの集合量化子と マッチ参照、加えてアルメニア語とグルジア語のローマ字化。
  • 数の読み上げ — RBNF の序数読み上げ(spell_ordinal)、 敵対的入力でのスタックオーバーフロー修正付き。
  • IDNA — 完全な IDNA2008 妥当性(CheckBidi / ContextJ / Hyphens / V1 / V5 / V6)、VerifyDnsLength、正直な適合性基準。
  • スプーフ検出 — UTS #39 の confusable スケルトンと、 Script_Extensions による single-script 解決。

そして専用のセキュリティパスが、適合性作業で浮かんだ一連の サービス妨害(DoS)の穴を塞いだ:collation と Bidi の二次スキャン を線形/O(1) 化、文分割の先読みをメモ化、Punycode のデコード爆弾 とドメイン長の上限、MessageFormat の再帰深さ上限、そして POSIX TZ オフセットのパースと GMT オフセットの整形における チェック付き演算(いくつもの潜在的 i32 オーバーフロー panic)。

timezone-data + strtotime

同じファミリーの小さな no_std クレートが二つ着地した。いずれも 既存の Go ライブラリの移植だ:

timezone-datagotz の移植)は、多くの ライブラリが秘匿する IANA タイムゾーンデータを露出する——遷移、 ゾーン型、POSIX TZ ルール、うるう秒。598 ゾーンすべてが ビルド時に静的 Rust オブジェクトへ事前パースされ埋め込まれるので、 ランタイムのパースもビルドスクリプトもホスト tzdata 依存もなく、 外部クレートはゼロ:参照は &'static データ上の二分探索で、 確保なし。

strtotime (PHP の strtotime() を写した strtotime の移植)は、 PHP 形式の日時表現を確保なしで Unix タイムスタンプにパースする ——トークンは入力のスライスを借り、作業集合はスタックに乗る。 実 PHP から取った 669 ケースのコーパスに対して検証し、すべてに 一致する——DST に依存する結果、DST ギャップでの fall-forward、 極端な年の int64 オーバーフローを含めて。DST 対応は timezone-data 由来で、マイクロ秒の小数秒も入った。

rsurl:curl パリティに到達

rsurl——purecrypto + compcol の上の Pure-Rust curl——は今週、機能パリティのロード マップを閉じ、no-C 不変条件のもとで機能的 curl パリティ完了を 宣言した(v0.0.4v0.0.6)。着地は、おおよそロードマップ順に:

  • プロトコル — SMTP/SMTPS 送信と最小の TELNET クライアント、 先週の 14 種の上に。
  • 認証 — HTTP Digest、AWS SigV4 のリクエスト署名 (--aws-sigv4)、--oauth2-bearer
  • TLS — mTLS クライアント証明書、公開鍵ピンニング、 --capath / --crlfile(CRL 失効)、--tlsv1.x / --tls-max のバージョンピンニング、両方の TLS バックエンドで。
  • 転送 — HTTP/1.1・HTTP/2・HTTP/3・FTP/FTPS のダウンロードを sink へストリーム(本体が丸ごとメモリに乗らない)、ストリーム 解凍、-Z/--parallel の並行転送、URL グロビング({a,b}[1-100] レンジ)、--unix-socket--connect-to、リダイレクト 制御、リトライ一式。
  • CLI 表面-w のフェーズタイマーと %header{} 補間、 --json、低速アボート(-y/-Y)、-K 設定ファイル、 --next マルチオペレーション、加えて C ABI 越しの libcurl 形の オプション十種と man/rsurl.1 ページ。

puressh:ext-info とさらなる zeroize

puresshv0.0.4)は RFC 8308 の拡張ネゴシエーションを追加した——KEXINIT の ext-info-c / ext-info-s マーカー、SSH_MSG_EXT_INFO を プロトコル上の正しいタイミングで送受信、公開鍵認証でサーバが 広告する server-sig-algs を優先。セキュリティの地道な作業も 続いた:ChaCha20-Poly1305 の K_1/K_2 と Poly1305 ワンタイム鍵の ゼロ化、DH/ECDH 共有秘密のスクラッチの拭き取り、pcssh_sftp_read のコピーを呼び出し側の上限にクランプ、raw モードガードでの シグナル安全な termios 復元。暗号の床も現行に上げた:purecrypto 0.20.6.1

OxideAV:レンダラが合流、そして簡潔化スイープ

oxideav-render が 新顔——フレームワーク向けの Pure-Rust な 3D シーン → ラスター 画像/動画レンダラ。週のうちにフェーズで立ち上がった:Renderer トレイト+バックエンドスタブ、make_renderer(Scanline) の裏の スキャンラインバックエンド、名前付きバックエンドの RenderRegistry、そしてレンダリングしたシーンが transcode パイプラインにソースとして挿さる RenderSource: FrameSource ブリッジ(レイキャスタはまだ保留)。ワークスペースには cli-convert + mesh3d の下で配線された。

週次のマルチエージェントコーデックスイープは続き(ラウンド → 253)、ワークスペースの README は「フルテーブル簡潔化スイープ」を 受けた——多くのクレートが飽和した今、ラウンドごとの変更履歴の 連なりを剥がし、100% 完了の行をまとめた。

来週

intl は Unicode コアの上で ICU の表面を埋め続ける。timezone-data と strtotime は API を固める。rsurl はパリティに到達したので、 堅牢化と互換 no-op の長い尾へ向かう。puressh はスキャフォールドの 先で状態機械を埋め続ける。oxideav-render はスキャンライン経路の 裏でレイキャスタに着手する。