KaitoKit(解凍Kit)
macOS 向け、純 Swift の書庫読み取りフレームワーク
Pure-Swift archive reading framework for macOS
KaitoKit(解凍Kit)は、macOS 向けに書いた純 Swift の書庫読み取りフレームワークです。tar、ZIP、7z、RAR、LHA、ARJ、StuffIt、MacBinary / AppleSingle / BinHex から ISO 9660 / UDF、Apple Disk Image(.dmg)、WIM、CHM、Compound File、cpio、ar、xar、CAB、RPM まで、そして gzip や bzip2、xz、zstd、lzip、brotli、pbzx のような単一ストリームの圧縮形式を、書庫の検出から列挙、ストリーミング読み取り、展開まで一つのパイプラインとして扱います。書庫の書き込みには、姉妹ライブラリの GyoshukuKit を組み合わせます。
もともとは cooViewer が使っていた XADMaster の置き換えとして設計したもので、既存の XADMaster 利用コードを少ない変更で移せる互換層 KaitoKitCompat を同梱しています。XADMaster / The Unarchiver のコードは実装へ取り込んでおらず、外部依存もありません。zlib や libbz2 など OS 同梱のライブラリだけで動きます。
攻撃者が制御できる長さやカウントは読んだ場所で検証し、entry サイズ・総展開量・辞書サイズ・巻数などの上限は ReadLimits にまとめて、利用側が扱う書庫と端末のメモリに合わせて設定できるようにしています。破損した書庫の救済モードは既定で無効で、有効にしたときだけ ZIP・tar・LHA・RAR5 から読める entry を取り出します。
特徴
- 対応形式: tar、ZIP / ZIP64、7z、RAR4 / RAR5、LHA / LZH、StuffIt classic / StuffIt 5 / StuffIt X、MacBinary / AppleSingle / BinHex、ISO 9660 / UDF(BIN/CUE の生 sector image を含む)、WIM、Compound File(MS-CFB / OLE2)、CHM、ARJ、Apple Disk Image(UDIF
.dmg+ HFS+)、cpio、ar(.debを含む)、xar(.pkgを含む)、CAB、RPM(rpm 6 が既定とする stripped cpio payload を含む)。単一ストリームの gzip、bzip2、xz、zstd、LZ4、LZMA、lzip、brotli、UNIX compress(.Z)、pbzx(flat package の Payload)と圧縮 tar / 圧縮 cpio も読めます - macOS 由来の書庫: ZIP / tar の AppleDouble sidecar(Finder / ditto の
__MACOSX/._name、macOS tar の._name)は既定で resource fork に統合します(ReaderOptions.appleDoublePolicy)。MacBinary / AppleSingle / BinHex の wrapper は data fork と resource fork の 1 file 書庫として、Apple Disk Image は UDIF.dmgと生の HFS+ image の catalog を読み、decmpfs(stored / zlib / LZVN / LZFSE)で圧縮されたファイルも読み取れます(一部の type は一覧のみ) - 暗号化書庫: ZipCrypto と WinZip AES-128/192/256、7zAES-256、RAR4 / RAR5 の AES(ヘッダ暗号化を含む)、StuffIt(classic / 5)の DES / RC4 と StuffIt X の AES / Blowfish / DES / RC4 に対応します
- 分割書庫:
.7z.001/.zip.001のバイト分割、.z01….zipの split ZIP(ZIP64、100 巻以上)、RAR の.r00/.partN.rarを URL から開けます。classic StuffIt の分割セットも、同じ directory の兄弟 part を番号順に連結して読みます - ファイル名の文字コード: 厳密な UTF-8 を最優先し、未宣言の名前は 39 言語・54 の legacy 候補を CLDR の文字集合と文字体系の規則で採点して、書庫全体で一つの文字コードを選びます
- 上限と救済モード:
ReadLimitsで entry サイズ・総展開量・辞書サイズ・巻数などを設定できます。破損書庫の救済はReaderOptions.recoverDamagedArchives = trueで明示的に有効化します - XADMaster 互換層:
KaitoKitCompatのKaitoArchive(XADArchivetypealias)で、既存の型名を残したまま移行できます。最小の変更は import の置換だけです。KaitoKitとKaitoKitCompatをまとめた動的ライブラリKaitoKitDynamicも用意しています - コマンドライン
kaito: 検出・一覧・展開・SHA-256・計測(detect / list / extract / sha / bench)と名前の文字コード診断を備え、shaは entry ごとの SHA-256 を出力して他の展開実装との差分テストに使えます - 検証: lhasa、RAR、7zz などの参照実装との差分テストと、ASan / UBSan ビルドでのミュータントテストで堅牢性を確かめ、性能・安定性の実測ログを
Documentation/verification/に残しています
対応環境と入手方法
実行環境は macOS 26 以降、Apple Silicon / Intel で、ビルドには Xcode 27 / Swift 6.4 以上が必要です。ライセンスは MIT で、ファイル名判定に使う CLDR 由来のデータは Unicode License v3 です(NOTICE)。リリースにバイナリの添付はなく、SwiftPM で導入します。
Swift Package Manager
Package.swift に依存を追加します。次の指定は同じマイナーバージョン内の更新を受け取ります。
dependencies: [
.package(
url: "https://github.com/shunnag/KaitoKit.git",
.upToNextMinor(from: "0.12.1")
)
],
targets: [
.target(name: "YourApp", dependencies: [
.product(name: "KaitoKit", package: "KaitoKit")
])
]
新規の Swift コードは KaitoKit を、XADMaster からの移行では KaitoKitCompat をリンクします(移行ガイド)。アプリ target からは Xcode の Package Dependencies で同じ URL を追加し、使用する product をリンクします。変更点は CHANGELOG を参照してください。
ソースからビルド
git clone https://github.com/shunnag/KaitoKit.git
cd KaitoKit
swift build
swift test
swift build -c release
Scripts/build-framework.sh は Apple Silicon / Intel 両対応のユニバーサル KaitoKit.framework を生成します。
コマンドライン
$ swift run kaito detect samples/book.tar
$ swift run kaito list samples/book.zip
$ swift run kaito list samples/book-encrypted.7z -p secret
$ swift run kaito extract samples/book.tar -o /tmp/book
$ swift run kaito sha samples/book.tar
$ swift run kaito bench samples/book.tar 5
sha と extract は entry ごとの失敗を報告して処理を続け、一件でも失敗すれば終了コード 1 を返します。