AirPort Expressいらずのshairportヤバシ!

アップルコンピュータ AirMac Express ベースステーション with Air Tunes MB321J/A

アップルコンピュータ AirMac Express ベースステーション with Air Tunes MB321J/A

その昔、AirPort Express(日本名:AirMac Express)を持っていなかった私はこれをソフトウェアエミュレーションできないかと模索しました。当時大学4年生だった私はApple IDを作って、Bonjour SDKWindowsに入れて、JavaでServerSocketプログラム書いて、iTunesから送られてくる通信をダンプして、、、それとにらめっこをした思い出があります。

そこで気づいたのがiTunesとAirPort ExpressはRSAチャレンジレスポンス形式のデバイス認証を行っているということでした。RSAなので公開鍵はiTunesが持ち、seed(種)が通信の初期段階でデバイスに投げられ、デバイス側でそれを持っている秘密鍵を使ってごにょごにょして、その結果をiTunesに返すというものでした。もちろんごにょごにょ結果が不正であればiTunes側でエラーとしてその後の通信は取りやめになります。

その当時よりも前のバージョンのiTunesでは通信に公開鍵のアナウンスが含まれていたのですが、私が着手したときはそれすら暗黙的に行われる非常に閉ざされた状態の実装になっていました。その名はRemote Audio Output Protocol、略してRAOP。(参照:wikipedia)何度この文字でググったことか。

何よりこのデバイスをソフトウェアでエミュレートするにはこの認証問題をなんとかする必要があり、(今であればiTunes側のバイナリを書き換えるという手段思いつきますが、)結局秘密鍵をどうやって見つけるかという話になります。RSAの場合、公開鍵から秘密鍵を見つけるには巨大素数素因数分解(整数=素数素数B、整数からこの素数Aまたは素数Bを見つける)という数学的・時間制約的に難しい問題になります。

どれくらい難しいかというとThe RSA Challenge Numbersという暗号解析コンテストで同様の強度を持つ暗号解析に確か数十万ドルの懸賞金がかけられていたほどです。現在このコンテストは終了していますが、iTunesで使用していた鍵長は現在でも未踏とのことです。(参照:wikipedia

では表記のshairportはエミュレート機能実現のためにどうやって秘密鍵を得たか。。。それは多分デバイスをバイナリレベルで解析したんだと思います。(ここを参照

最近iPhoneを買ったので久々にMaciTunesライブラリを整理しながら、待ち時間に思い出したかのように昨今のRAOPの3rd Party実装の様子を確認したところ、、、マジでAmazing!

早速ちゃんと動くか使ってみようと思い、その結果がこのエントリです。思いのたけが強すぎて前置きが長くなりましたが、結論としてはちゃんと使えます、動きます。音がたまにプツプツいいますが、これは多分PC側の問題だと思います。基本的にはGitHubにあるインストール方法INSTALL.mdにそえば全然問題ありません。

環境:UbuntuベースのLinux Mint

administrator@CF-T4 ~ $ uname -a
Linux CF-T4 2.6.35-22-generic #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 i686 GNU/Linux

必要パッケージのインストール(git未導入だったらgit-coreも)

administrator@CF-T4 ~ $ sudo apt-get install libssl-dev libcrypt-openssl-rsa-perl libao-dev libio-socket-inet6-perl libwww-perl avahi-utils pkg-config

GitHubからクローン

administrator@CF-T4 ~ $ mkdir git
administrator@CF-T4 ~ $ cd git
administrator@CF-T4 ~/git $ git clone https://github.com/albertz/shairport.git

makeと実行

administrator@CF-T4 ~/git $ cd shairport/
administrator@CF-T4 ~/git/shairport $ make
administrator@CF-T4 ~/git/shairport $ ./shairport.pl

iTunes

これだけで同一LAN上のiTunesにはこのように認識されます。マジでヤバシ!