フォト
無料ブログはココログ

MyList

« データ分析の力 <因果関係と相関関係は違う> | トップページ | 深く考える力 <「賢明なもう一人の自分」は暗黙知のことか?> »

2018年9月17日 (月)

Bus pirate(3) <SDカードをパスワード・ロックしてみる>

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

Sandisk_8g_sdhc

Buspirate36_sd

【初期化】
 初期化のコマンドは、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の例

Terminaldelay

【パスワードロック】
 パスワードロックに使うコマンドは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に認識させてみると。

Sdcarddiskmgr_setpwd

 この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に認識させてみると、

Sdcarddiskmgr_resetpwd1

 ちゃんと認識されている。 めでたしめでたし。

###

 ネットを探すと、AVRやPIC、Arduino、RaspberyPiで実装した例があるようだ。



最近の投稿】【最近のCPUボード】【2017の投稿】【2016の投稿】【2015の投稿

« データ分析の力 <因果関係と相関関係は違う> | トップページ | 深く考える力 <「賢明なもう一人の自分」は暗黙知のことか?> »

CPUボード」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Bus pirate(3) <SDカードをパスワード・ロックしてみる>:

« データ分析の力 <因果関係と相関関係は違う> | トップページ | 深く考える力 <「賢明なもう一人の自分」は暗黙知のことか?> »