ARTiGO A1000 のハードウェア乱数生成器


ちょっと前に購入した、手のひらベアボーンARTiGO A1000がTRNG(ハードウェアの乱数生成器)を持ってたのでテスト。

# modprobe via-rng
# ls -l /dev/hwrng
crw-rw—- 1 root root 10, 183 2009-03-15 00:15 /dev/hwrng
# head -c 16 /dev/hwrng | hexdump
0000000 e06d 5079 c2ae e9b5 8cc2 8781 fa6d 9497
0000010

乱数の生成速度と、品質を確かめてみる。 フェアじゃないけど疑似乱数の /dev/urandom と、eToken Pro が持っている乱数生成機(これは TRNGらしい)と比べてみる。 それぞれの乱数生成機で1M分の乱数を生成してみた。

  • /dev/urandom(PRNG)
# dd if=/dev/urandom of=/dev/null bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 1.60021 s, 655 kB/s
  • /dev/hwrng(TRNG)
# dd if=/dev/hwrng of=/dev/null bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 3.02498 s, 347 kB/s
  • eToken(TRNG)
# time echo -ne “engine -t dynamic -pre SO_PATH:/usr/local/engine_pkcs11-0.1.5/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/lib/opensc/opensc-pkcs11.so\nrand -engine pkcs11 1048576 -out /dev/null” | openssl
OpenSSL> (dynamic) Dynamic engine loading support
[Success] : SO_PATH:/usr/local/engine_pkcs11-0.1.5/lib/engines/engine_pkcs11.so
[Success] : ID:pkcs11
[Success] : LIST_ADD:1
[Success] : LOAD
[Success] : MODULE_PATH:/usr/lib/opensc/opensc-pkcs11.so
Loaded: (pkcs11) pkcs11 engine
[ available ]
OpenSSL> engine “pkcs11″ set.
OpenSSL>
0m6.439s
0m0.332s
0m0.008ssysuserreal

まとめ。VIA の /dev/hwrng は /dev/urandom より半分くらい遅い。

そもそも PRNG と比べるのがナンセンスなので TRNGとしては十分なスピードが出ているように思う。eToken Pro は 1M 生成するのに6秒もかかってしまう、これは eToken Pro の乱数生成器の目的が秘密鍵の生成を目的としているのでそんなものでしょう。

次は品質。乱数の品質といえば、NSA が FIPS 140-2 で規定している 4つの乱数検定。

簡単な乱数検定だったので以前ちょこっと実装したのがあるんだけど、debian の rng-tools というパッケージにこの FIPS 140-2 の乱数検定を行うプログラムが付属していた。

こんな感じで /dev/urandom の検定ができる。

% dd if=/dev/urandom bs=1024 count=1024 | ./rngtest
rngtest 2-unofficial-mt.12
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests…
rngtest: entropy source exhausted!
rngtest: bits received from input: 8388608
rngtest: FIPS 140-2 successes: 419
rngtest: FIPS 140-2 failures: 0
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 0
rngtest: FIPS 140-2(2001-10-10) Long run: 0
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=1.881; avg=5.000; max=4768.372)Mibits/s
rngtest: FIPS tests speed: (min=23.606; avg=24.818; max=25.064)Mibits/s
rngtest: Program run time: 1923705 microseconds

テストが5つに増えてるけど気にしない。この結果が意味するところは、20000 bit の乱数を入力として5種のテストを各 419 回ずつ行った所すべてのテストで1度も失敗し無かった、という結果。

失敗しないと面白くないので、もっとたくさんやってみる。

% dd if=/dev/urandom bs=1M count=100 | ./rngtest
rngtest 2-unofficial-mt.12
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests…
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 191.716 s, 547 kB/s
rngtest: entropy source exhausted!
rngtest: bits received from input: 838860800
rngtest: FIPS 140-2 successes: 41911
rngtest: FIPS 140-2 failures: 32
rngtest: FIPS 140-2(2001-10-10) Monobit: 5
rngtest: FIPS 140-2(2001-10-10) Poker: 4
rngtest: FIPS 140-2(2001-10-10) Runs: 9
rngtest: FIPS 140-2(2001-10-10) Long run: 14
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=12.590; avg=5254.638; max=6510416.667)Kibits/s
rngtest: FIPS tests speed: (min=1.142; avg=23.456; max=25.163)Mibits/s
rngtest: Program run time: 191722267 microseconds
% dd if=/dev/hwrng bs=1M count=100 | ./rngtest
rngtest 2-unofficial-mt.12
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests…
rngtest: entropy source exhausted!
rngtest: bits received from input: 838860800
rngtest: FIPS 140-2 successes: 41891
rngtest: FIPS 140-2 failures: 52
rngtest: FIPS 140-2(2001-10-10) Monobit: 9
rngtest: FIPS 140-2(2001-10-10) Poker: 3
rngtest: FIPS 140-2(2001-10-10) Runs: 15
rngtest: FIPS 140-2(2001-10-10) Long run: 25
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=6.484; avg=2748.736; max=6510416.667)Kibits/s
rngtest: FIPS tests speed: (min=937.425; avg=23785.710; max=25766.821)Kibits/s
rngtest: Program run time: 335642185 microseconds

/dev/hwrng の方が若干失敗が多いという謎の結果。