ひょんなことから探偵!ナイトスクープに出演することなっていました。人生長く生きていると、何が起こるか分からないものです。
どうして出演することになったのかとか、他の出演者がどうやって決まったのかなどの話はともかく、Java Ringですよ。
実際の撮影は1日がかりだったのですが、放送はたった10分。削られた部分が多くあるので、その部分を補っていくというのが、このエントリーです。
依頼者の山﨑さんも顛末をブログに書いているので、そちらもぜひご覧になってください。
Java Ring
Java Ringは1998年にサンフランシスコで開催されたJavaOne 98で、Sun Microsystemsが参加者に配布したガジェットです。その後、日本など世界各地のJavaのカンファレンスやイベントで参加者に配布されています。
櫻庭はJavaOne 98でもらったもの以外に、日本の2つのイベントでも取得したので3つあったのですが、1つは行方不明😰
イベントで配布されたものはプロトタイプで、その後実際に販売されたようですが、製品版は見たことがないです。
Java Card
さて、この当時、Javaに複数のエディションを作成すると発表されていました。Java SE (Standard Edition)、Java EE (Enterprise Edition)、Java ME (Micro Edition)の3種類です。今もOpenJDKで開発が進められているのが、Java SEですね(SEとは言わなくなってしまいましたが...)。そして、Jakarta EEがJava EEの後継です。
残念ながら組み込み向けのJava MEはなくなってしまいましたが、Java MEよりもさらにリソースが限られたデバイス向けのJavaがあります。
それがJava Cardです。
Cardという名前であることから分かるとは思いますが、クレジットカードがメインのターゲットです。その他にもSIMカードなどにJava Cardは使われていました。
クレジットカードを見れば分かる通り、バッテリーはありません。つまり、カードを親機に接続したときに供給される電力だけで動作します。
また、計算リソースも極端に限定されており、浮動小数点数はおろか、整数でも4バイト幅のintは使用できません。
このため、Javaといっても、Java SEとはかなり違うものです。
Java CardではCardletというアプリケーションが動作します。このCardletのクラス名がAppletなのが誤解を生んでいました。
Java CardのAppletはjavacard.framework.Appletクラスで、いわゆるアプレットはjava.applet.Appletクラス。できることも違えば、メソッドも異なりますし、動作も全然違います。
Cardletでは、ほんとに限定的なことしかできないのです。まぁ、クレジットカード上で動作すると考えれば妥当ですね。
Java Ringとは
さて、Java Ringです。
Java Ringは、Java Cardに準拠したデバイスです。
もともとはiButtonというボタン型のデバイスがありました。そこにJava CardのVMであるCardVMをのせ、指輪状に加工したのがJava Ringです。
通常のJava Cardとは違って、バッテリーが内蔵されており、メモリもクレジットカードに比較すれば多く使用できました。このため、複数のCardletを使用できるようになっています。ただし、複数のCardletを同時に動かすことはできません。
1998年のJavaOneでは、山﨑さんがナイトスクープで言及してたコーヒーの好みを記憶させておくCardletや、マンデルブロー集合の各ピクセルを計算させてJavaOne参加者でマンデルブロー集合の図を表示させるCardletが使用できるようになっていました。とはいえ、コーヒーの好みを記憶させておくだけで、Java Ringを接続するとコーヒーを淹れてくれるというのはなかったんですけどね。
このようなJava Ringですが、バッテリーを搭載しているために、逆にバッテリーがなくなってしまうと動作しなくなってしまいます。そこで、山﨑さんがバッテリーを交換したいとナイトスクープに駆け込んだわけです。
Java Ringの構造
ソフトウェアの構造でもハードウェアでもなく、物理的な構造です。
Java Ringは、iButtonを指輪状に加工したものです。ベースになるのはiButtonが収まるサイズの穴がある指輪です。
その穴に樹脂を流し込んで、その後にiButtonを埋め込み、さらに隙間に樹脂を流し込んで、iButtonを固定してあります。
Java Ringの穴の裏側には空気抜きのための小さな穴が開いています。
iButtonは筐体全体が接点になっており、側面および底面がグランド、トップの部分が信号ラインとなっています。これをアダプターに接続して親機と通信できるようになっています(この通信方法は1-Wireと呼ばれています)。
このため、Java Ringでもアダプターに接続できるように、トップの部分が露出した形状になっています。
さて、このような構造のJava Ringですが、バッテリーを交換するにはiButtonを開封しなければいけません。
ナイトスクープではJavaの専門家たちに集まっていただきましたが、さすがにソフト屋には手も足も出ません。
そこで、登場していただいたのがプロモデラーのまつおーじさんです。
今回、Java Ringが復活できたのも、ほんとにまつおーじさんのおかげです。
まつおーじさんが行ったのが、iButtonの周りの樹脂の部分をタガネで掘っていくというものです。下の図にJava Ringの輪切りにした図ですが、この黒い樹脂の部分を削っていったわけです。
番組ではあっという間に掘り終わったように見えますが、実際にはこれだけで2時間近くかかっています。
上から金属が見えるところまで掘り進み、その後裏側の小さい穴も掘り進めていきます。これで下図のような状態になりました。
この後、小さい万力を利用して、下の穴から力をかけて押していきました(上手の矢印の部分)。この結果、iButtonがスポッと取り出せたのでした。
これも番組では簡単に取り出せたように見えますけど、これもなかなか引っかかりがなくて時間がかかっています。
次は、取り出したiButtonを切断してバッテリーを取り出すわけですが、これもそんなに簡単にできるものではありません。
もともとiButtonはバッテリーを交換するようにはできていません。バッテリーを取り出すには、何らかの方法でiButtonを切断しなくてはなりません。
山﨑さんも紹介しているiButtonの電池交換レポートでは、グラインダーを使って切り進んでいますが、これは中の基盤などを壊してしまう可能性も高いです。
iButtonの形状を図式化したのが下図です。
ここで、まつおーじさんが注目したのが、iButtonの底部にあるフリンジです。下の図はiButtonを水平に見た時の図ですが、フリンジは赤丸の部分ですね。
このフリンジは、iButtonを他のデバイスなどに装着しやすくするための出っ張りです。ですが、iButton自体をかしめるにもこの形状が都合がよかったのだと思います。
このフリンジの部分をペンチで繰り返し曲げ伸ばしすることで、金属疲労によりちぎりとっていったわけです。
最終的には缶詰を開けた時のように、一周ぐるりとフリンジを取り除き、底部をパカッと開けることができたのでした。
そして、バッテリーは底部にあったので、無事に交換ができたのでした!!
ちなみに、下の写真はバッテリーを抜いた後です。
と、ここまでが物理的な話。番組だとかなりはしょられてはいましたけど、こちらがメインでしたね。
まぁ、ソフトは何かやっていても絵にならないからしかたないです。
Java Ringのソフトウェア構成
さて、ここからがソフトウェアの話です。
Java Ringのソフトウェアの構成を示したのが下の図です。
ベースの部分にファームウェアがあり、その上にJava CardのVMであるCardVMが動作しています。リソースが限られているため、OSに相当する部分はありません。
また、ファームはバッテリーがなくても、1-Wireからの給電で最低限の動作は可能です。
山﨑さんのblogエントリーの 【Java Ring】05. CRC エラー! で、バッテリーがなくても通信ができているのはこのためです。しかし、バッテリーが切れてしまったため、CardVMは動作しません。このため、CRCエラーが発生してしまっています。
そして、CardVM上でCardletが動作するという構成になっています。
また、Master PINなどの秘密情報を保持している領域も用意されています。
このような構成になっているわけですが、当然のことながらそれぞれの構成要素がメモリーのどこかに保持されています。
問題はどこまでがバッテリーがなくてもメモリー内容を保持できるかどうかということです。
メモリーには電源が供給されないと内容を保持できない揮発性メモリーと、バッテリーがなくても大丈夫な不揮発性メモリーがあります。
不揮発性メモリーにも、長期的に安定しているものと、長期的には内容を保持できないものがあります。
前者にはEPROM、後者にはフラッシュメモリーなどがあります。前者は一般的にROM、後者はNVRAMと呼ばれることがあります。
iButtonでも、EPROMとNVRAMが使われています。
問題はどこまでがROMに保存されているかということです。
もう1つ考えなくてはならないのが、耐タンパー性です。
耐タンパー性とは外部からの攻撃を受けた時の耐性を示しています。攻撃に対する対応にはいろいろありますが、漏洩してはならない情報を消去するという手法もあります。
Java Ringはパーソナルなガジェットなので、分解しようとすると暗号鍵などの秘密情報は耐タンパー性により消去されてしまうのではないかということです。
事前に大山さん、石原さんと話していたのは秘密情報は、まず消去されるでしょうということ。また、Cardletもバッテリーがなくなれば保持できないであろうということです。
で、議論になったのが、CardVMです。
製品版のJava Ringならともかく、プロトタイプでイベント用に配布するために作られたJava RingでCardVMをわざわざROMに焼くかということです。
3人の意見は、多分ダメだろうと。
ところが、バッテリーを交換してビックリ、CardVMが生きていたのでした!!
とはいえ、秘密情報は消去されてしまったので、初期化されてしまった状態です。収録の時には、Cardletをロードするところでエラーになってしまいました。事前に工場出荷時のMaster PINの候補はいくつか探していたのですが、いずれも失敗。
結局、残念ながら時間切れ。
その後、山﨑さんが自宅で設定をいろいろと見直すことでCardletのロードに成功したのでした。どうやら、工場出荷時にはMaster PINが設定されていなかったようです。
その後、Cardletの実行までできたのは彼のblogにある通りです。
ということで、Java Ringが復活したのでした!!







0 件のコメント:
コメントを投稿