Bus pirateでSDカードが読めたので、SDカードをパスワード・ロックしてみる。
実験に使ったSDカードはSanDiskの8GB SDHC。


【初期化】
初期化のコマンドは、CMD0→CMD8→ACMD41(CMD55、CMD41)。 このカードはACD41(CMD55+CMD41)を2回送ると初期化できるようだ。 2回で初期化が完了しない場合はR1レスポンスが00hになるまでACMD41を送る。
SDHC_InitCmd.txt
m 5 1 1 2 1 2 2 Wv
]r:10[0x40 0x00 0x00 0x00 0x00 0x95 r:8] [0x48 0x00 0x00 0x01 0xAA 0x86 0x87 r:8] [0x77 0x00 0x00 0x00 0x01 0xff r:8] [0x69 0x40 0x00 0x00 0x01 0xff r:8] [0x77 0x00 0x00 0x00 0x01 0xff r:8] [0x69 0x40 0x00 0x00 0x01 0xff r:8] [0x4D 0x00 0x00 0x00 0x00 0xff r:8]
|
↑このようなファイルを作っておいてターミナルから送信すると入力が楽。 Bus pirateでの処理時間が必要なので、1行送信したら100ms~1000ms待つ。
↓Teratermの例

【パスワードロック】
パスワードロックに使うコマンドはCMD16, CMD42, CMD13。
SD Host |
dir |
SD Card |
|
SC(Lo) |
→ |
|
Select |
CMD16(0x00 0x00 0x02 0x00 0xFF) |
→ |
|
BLOCK_LEN=512 |
|
← |
R1 response |
0x00=NoError |
SC(Hi) |
→ |
|
|
|
SC(Lo) |
→ |
|
Select |
CMD42(0x00 0x00 0x00 0x00 0xFF) |
→ |
|
|
|
← |
R1 response |
0x00=NoError |
0xFE LockCardStructure 0xFFx(512-PWD_LEN) 0xFF 0xFF |
→ |
|
Data Packet |
|
← |
Data response |
R1+busy, busy=0x00 |
SC(Hi) |
→ |
|
|
SC(Lo) |
→ |
|
Select |
CMD13(0x00 0x00 0x02 0x00 0xFF) |
→ |
|
|
|
← |
Data response |
R2(R1+Status) |
SC(Hi) |
→ |
|
|
【CMD42】
CMD42のデータパケットで送るデータ
Lock Card Data Structure
Byte# |
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
0 |
Reserved (shall be set to 0) |
ERASE |
LOCK_UNLOCK |
CLR_PWD |
SET_PWD |
1 |
PWDS_LEN |
2 |
password data |
・・・ |
PWDS_LEN+1 |
- Byte#0:
- パスワード・設定(0x01)
パスワード長とパスワード・データが設定される。
この設定だけではまだロックされていない。電源をOFFにするか、LOCK_UNLOCK(0x04)でロックする。
- パスワード・変更(0x01)
既に設定されているパスワードを変更する場合は、パスワード長(PWDS_LEN)に新しいパスワード長を加算した値をセットし、パスワード・データには現在設定されているパスワードに続けて変更するパスワードを設定する。
- パスワード・クリア(0x02)
パスワード長とパスワード・データをクリアする。ロックは解除される。
- パスワード・ロック(0x04)
SDカードがロックされデータにアクセスできなくなる。
- パスワード・ロック解除(0x00)
パスワード・ロックが解除されデータにアクセスできるようになる。
電源を再投入するとロック状態に戻る。
- 消去(0x08)
パスワードが分からない場合でも設定されているパスワードを消去することができる。 ただし、データもすべて消去される。
- Byte#1 : パスワード長。
- Byte#2~: パスワードデータを設定する。 バイナリデータも設定できる
パスワードは16byte以内。
【パスワード設定】
SPI>[0x50 0x00 0x00 0x02 0x00 0xFF r:8] ←CMD16:SET_BLOCK_LEN len=512 /CS ENABLED WRITE: 0x50 WRITE: 0x00 WRITE: 0x00 WRITE: 0x02 WRITE: 0x00 WRITE: 0xFF READ: 0xFF 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF /CS DISABLED
SPI>[0x6A 0x00 0x00 0x00 0x00 0xFF r:8 ←CMD42:LOCK_UNLOCK /CS ENABLED WRITE: 0x6A WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0xFF READ: 0xFF 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
SPI>0xFE 0x01 6 "abc123" 0xFF:506 0xFF 0xFF r:24] ←SET_PWD WRITE: 0xFE ←Data token WRITE: 0x01 ←PWD_SET WRITE: 0x06 ←PWDS_LEN WRITE: "abc123" ←passowrd data WRITE: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF ( 506=512-6のFFh ) 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF WRITE: 0xFF ←CRC(dummy) WRITE: 0xFF ←CRC(dummy) READ: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x0F 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF /CS DISABLED 電源OFF(カードを抜く)
SPI>[0x4d 0x00 0x00 0x00 0x00 0xff r:8] ←CMD13 SEND_STATUS /CS ENABLED WRITE: 0x4D WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0xFF READ: 0xFF 0x00 0x01 0xFF 0xFF 0xFF 0xFF 0xFF ←R2:0x01="Card is locked" /CS DISABLED
|
PCに認識させてみると。

このPCはSDカードスロットがあって内部的にはUSBに繋がっているようだ。 パスワード・ロックされているSDカードは「メディアなし」と表示されている。
【パスワード・ロック解除】
SPI>[0x50 0x00 0x00 0x02 0x00 0xFF r:8] ←CMD16 SET_BLOCK_LEN /CS ENABLED WRITE: 0x50 WRITE: 0x00 WRITE: 0x00 WRITE: 0x02 WRITE: 0x00 WRITE: 0xFF READ: 0xFF 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF /CS DISABLED
SPI>[0x6A 0x00 0x00 0x00 0x00 0xFF r:8 ←CMD42 LOCK_UNLOCK /CS ENABLED WRITE: 0x6A WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0xFF READ: 0xFF 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
SPI>0xFE 0x00 6 "abc123" 0xFF:506 0xFF 0xFF r:24] ←UNLOCK 0x00 WRITE: 0xFE WRITE: 0x00 WRITE: 0x06 WRITE: "abc123" ←passowrd data WRITE: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF ( 506=512-6のFFh ) 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF WRITE: 0xFF ←CRC(dummy) WRITE: 0xFF ←CRC(dummy) READ: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x0F 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF /CS DISABLED
SPI>[0x4d 0x00 0x00 0x00 0x00 0xff r:8] ←CMD13 SEND_STATUS /CS ENABLED WRITE: 0x4D WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0xFF READ: 0xFF 0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF ←R2 ロック解除 /CS DISABLE
|
この状態で、データにアクセスできるようになる。
パスワードは設定されているので、電源OFF(抜く)とパスワード・ロック状態になる。
【パスワード・クリア】
SPI>[0x4D 0x00 0x00 0x00 0x00 0xff r:8] ←CMD13 SEND_STATUS /CS ENABLED WRITE: 0x4D WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0xFF READ: 0xFF 0x00 0x01 0xFF 0xFF 0xFF 0xFF 0xFF ←R2:0x01=Card is locked /CS DISABLED
SPI>[0x50 0x00 0x00 0x02 0x00 0xFF r:8] ←CMD16:SET_BLOCK_LEN /CS ENABLED WRITE: 0x50 WRITE: 0x00 WRITE: 0x00 WRITE: 0x02 WRITE: 0x00 WRITE: 0xFF READ: 0xFF 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF /CS DISABLED
SPI>[0x6A 0x00 0x00 0x00 0x00 0xFF r:8 ←CMD42:LOCK_UNLOCK /CS ENABLED WRITE: 0x6A WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0xFF READ: 0xFF 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
SPI>0xFE 0x02 6 "abc123" 0xFF:506 0xFF 0xFF r:24] ←0x02: CLR_PWD WRITE: 0xFE WRITE: 0x02 WRITE: 0x06 WRITE: "abc123" ←passowrd data WRITE: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF ( 506=512-6のFFh ) 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF WRITE: 0xFF ←CRC(dummy) WRITE: 0xFF ←CRC(dummy) READ: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 0xFF 0xFF /CS DISABLED
SPI>[0x4D 0x00 0x00 0x00 0x00 0xFF r:8] ←CMD13 SEND_STATUS /CS ENABLED WRITE: 0x4D WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0x00 WRITE: 0xFF READ: 0xFF 0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF ←R2:ロック解除 /CS DISABLED
|
ステータスを読むとロック解除になっている。 ロック解除(UNLOCK)と違うのはパスワードデータがクリアされているので電源をOFFにしてもロック解除されたままになる。
PCに認識させてみると、

ちゃんと認識されている。 めでたしめでたし。
###
ネットを探すと、AVRやPIC、Arduino、RaspberyPiで実装した例があるようだ。
【最近の投稿】【最近のCPUボード】【2017の投稿】【2016の投稿】【2015の投稿】
コメント