いずれ消え行く無駄な情報を、密やかに発信する装置。つまり日記。
PadLockはVIAのCPU(C3やC7)に搭載された暗号化支援デバイスです。機能としては、AESやSHA256の高速処理や、精度の高い乱数生成が可能となります。IPsecや、sshなどopensslを使うアプリケーションでPadLockを使うことが可能で、C3やC7などの遅いCPUでも暗号を使ったアプリケーションだけならば高速なCPUのマシンにも引けを取らない性能を出すことが出来るようになります。
まず、PadLockによってどの程度 暗号化処理が高速化されるかを測定してみました。使用したマシンはVIA EPIA LN10000EGとFreeBSD6.3 RC1です。FreeBSD6.3 RC1に標準で入っているOpenSSL 0.9.7e-p1は既にPadLockに対応しているので、特に何もすることも無くPadLockの支援を受けることが出来ます。以下に、素の状態のopenssl speedと、暗号処理エンジンにPadLockを指定したときの結果を示します。
まずは、PadLock未使用。
% openssl speed -elapsed -evp aes-128-cbc You have chosen to measure elapsed time instead of user CPU time. To get the most accurate results, try to run this program when this computer is idle. Doing aes-128-cbc for 3s on 16 size blocks: 1523204 aes-128-cbc's in 3.00s Doing aes-128-cbc for 3s on 64 size blocks: 404154 aes-128-cbc's in 3.00s Doing aes-128-cbc for 3s on 256 size blocks: 101286 aes-128-cbc's in 3.00s Doing aes-128-cbc for 3s on 1024 size blocks: 25692 aes-128-cbc's in 3.00s Doing aes-128-cbc for 3s on 8192 size blocks: 3228 aes-128-cbc's in 3.00s OpenSSL 0.9.7e-p1 25 Oct 2004 built on: Mon Nov 26 19:28:41 UTC 2007 options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) aes(partial) blowfish(idx) compiler: cc available timing options: USE_TOD HZ=128 [sysconf value] timing function used: gettimeofday The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes aes-128-cbc 8123.64k 8620.50k 8641.31k 8767.81k 8811.53k
次に、PadLock使用。
% openssl speed -elapsed -evp aes-128-cbc -engine padlock engine "padlock" set. You have chosen to measure elapsed time instead of user CPU time. To get the most accurate results, try to run this program when this computer is idle. Doing aes-128-cbc for 3s on 16 size blocks: 8898611 aes-128-cbc's in 3.00s Doing aes-128-cbc for 3s on 64 size blocks: 7551517 aes-128-cbc's in 3.00s Doing aes-128-cbc for 3s on 256 size blocks: 4447607 aes-128-cbc's in 3.00s Doing aes-128-cbc for 3s on 1024 size blocks: 1701517 aes-128-cbc's in 3.00s Doing aes-128-cbc for 3s on 8192 size blocks: 250687 aes-128-cbc's in 3.00s OpenSSL 0.9.7e-p1 25 Oct 2004 built on: Mon Nov 26 19:28:41 UTC 2007 options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) aes(partial) blowfish(idx) compiler: cc available timing options: USE_TOD HZ=128 [sysconf value] timing function used: gettimeofday The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes aes-128-cbc 47456.14k 161073.63k 379453.62k 580677.82k 684414.65k
PadLockを有効にするには、プログラムソースにデフォルトでOpenSSLの暗号化エンジンにPadLockを使うということを書いたパッチを当てるか、もしくはpadlockとcryptodevドライバを読み込むかの2通りの方法があります。パッチを当てる方はドライバを読み込むことなくOpenSSLがPadLockに対応さえしていれば使うことが出来ますが、はっきり言って面倒です。パッチはgoogleなどで、「openssl openssh padlock patch」等で検索すれば直ぐに見つかると思いますが、わざわざパッチをダウンロードしてコンパイルするメリットは殆どないと思われます。一方、ドライバを読み込む方法は、2行で済みます。
% kldload padlock % kldload cryptodev
これでPadLockが有効になります。cryptodevはユーザーアプリケーションからPadLock等の暗号化支援ハードウェアを使う為に必要なものです。cryptodevを読み込むことにより、/dev/cryptoが生えてきます。
scpで測定するのにあたって、LN10000EGのNIC(VT6103L)がどの程度の速度が出せるのかを測定しました。測定にはnetperfを使い、相手先はAthlon64X2 BE2350, CentOS5.1, NIC(VT6122)で、途中にハブ(PLANEX FXG-05IM)を経由しました。
% netperf -H 192.168.1.5 TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.1.5 (192.168.1.5) port 0 AF_INET Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 8192 32768 32768 10.00 85.84
まず、PadLockが無効の状態でscpした結果を示します。測定はdd if=/dev/random of=./500M bs=1M count=500で作成したダミーファイルを用いました。
% scp -c aes128-cbc 500M test@192.168.1.5:~/ramdisk/ test@192.168.1.5's password: 500M 100% 500MB 5.2MB/s 01:37
次に、PadLockを有効にした結果を示します。
% su Password: # kldload padlock # kldload cryptodev # exit % scp -c aes128-cbc 500M test@192.168.1.5:~/ramdisk/ test@192.168.1.5's password: 500M 100% 500MB 10.4MB/s 00:48
PadLockを使うことによって、転送速度が約2倍になりました。NICの転送速度が85.84Mbits/secで、PadLockを使った転送速度が10.4MB/sec * 8 = 83.2Mbits/secとなり、ほぼNICの転送速度の限界近くまで速度が出ていることになります。CPU負荷も抑えられており、まず満足すべき結果となりました。