いくつか大きな改造をしたのでそれについて書こうと思う。
暗号化のキー(ランダムデータ)をどうやって生成するか
最初の版は、/dev/urandom から取ってくるという安直な方法を取った。これだと MinGW環境では使えないし、実機のデータを生成する環境も限られてしまう。
困ってしまったのだが、結局はストレートに実機で作るということにした。
そもそも、キーが変わるとファイルが読めなくなる..というより化け化けのデータが読めてしまう。i2crom の初期化もキーの変更に同期しなければならないのだが、キーを外部で用意することにすると、i2crom の初期データもロードしなければならなくなる。それはとっても面倒そうなので、実機でキーを作り、そのタイミングで i2crom も初期化することにした。
そのデータをどうやって作るかについて、いろいろ検討したのだが結局、キーを 64 回入力してもらって、受け取るタイミングで 16bit TIMER の値をとってくるということにした。12MHz/65536 = 183Hz なので、十分ランダムといえる値を生成することができそうだ。
ちなみに、i386 の場合は次のようにした。
uint16_t get_seed() {
uint16_t seed;
__asm__ __volatile__("rdtsc" : "=A" (seed));
return seed;
}
TSC という 64bit のタイマーがあって、CPU クロックでカウントアップされている。(キーが入力されたタイミングで)そのTSC の下位 16bit だけ取ってくる。Linux(いまどき Pentium III!) でしか確認していないが、Windows でもたぶん大丈夫だろう。
inode番号指定のオペレーション
TODO にも書いたが、文字化けしたファイル名のファイルができてしまったとき、どうやってファイルを読んだり、消したりするかという問題がある。これについては、ls -i というオプション(UNIX には昔からあるもの)をサポートして ファイルの ID(UNIX ではinode番号という) とファイル名を表示するようにして、rm と cat に -数字 というオプション(これは USBNIXオリジナル)を作り、inode番号指定で操作できるようにした。幸い avr-libc には、atoi() があったのでそれを利用することができた。ちなみに、ls -i での番号表示は、サイズとか見栄えの理由で、itoa や printf でなく自作のコードにしている。
エラーメッセージ
エラー処理をみなおして、できるだけちゃんとしたメッセージが出るようにした。ないファイルを指定すれば、(ディレクトリなんてないのだが)"No such file or directory" 32個を超えるファイルを作ろうとすれば、"No space left on device" ...なんて伝統的なメッセージが出る。
内部処理も Linux 流に -エラー番号 を使うようにした。
パスワード処理
前に、userとパスワードをつなげたものをパスワードとして扱うと書いたが、合計で 15バイトまでしか使えなったのを それぞれ 15 バイトに拡張した。こんな処理。
mc_setkey(user);
mc_encrypt(password);
for (i=0; i<128; i+=16) {
eeprom_read_block(line_buf, (const void *)i, 16);
mc_encrypt(line_buf);
}
メモリが使えないし、API がシンプルなので、こんな些細な改造でも、実は苦労した。...ところで今まで ターゲットの ATtiny861 の RAM が 256 バイトだと思い込んでいた。念のため確認したら 512バイトだった。stack が足りないんじゃないかと心配していたのだが、これで心配はなくなった。なんか得した気分。
TODOその2
5)login 時のメッセージ表示
UNIX では、(V7 のときから) login 時に /etc/motd の内容を表示するようになっている。その機能をなんとかしたい。ディレクトリがないので、motd というファイルがあったらそれを表示することにしよう。それに Welcome to ナントカカントカ と書いておけば、雰囲気が出るだろう。
ちなみに motd は、"message of the day" の略だそうだ。...実はいままで知らなかった。
おわりに
だいぶ満足のいくものになってきた。そろそろ実機で動かすことを考えたい。ソースコードはほとんど共通なのであまり苦労しないはず。ちなみにいまのプログラムサイズは、
text data bss dec hex filename
6562 12 200 6774 1a76 usbnix.elf
必要なコードはすべていれてのサイズ。デバックすれば多少大きくなるだろうが、8KB 以内は楽勝の見込み。