2007年05月18日

続 USBNIX Linux 版

USBNIX をバージョンアップした。 → usbnix-0.2.tar.gz

いくつか大きな改造をしたのでそれについて書こうと思う。

暗号化のキー(ランダムデータ)をどうやって生成するか

最初の版は、/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 以内は楽勝の見込み。
posted by すz at 20:29| Comment(0) | TrackBack(0) | USBNIX
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/30760389
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック