非rootなAndroidでSesame miniの鍵を取得した時のメモ

root化済みのAndroidがなかったので、非rootの環境でSesameの鍵をぶっこ抜いてみました。
（既出ならすみません）
セサミアプリのバージョンは1.3.9にて確認

## 前提条件
・Android Studio（adb/jre/jarsigner/keytoolを利用）がインストールしてあること
・USBデバッグが有効にしてあること
・SESAMEの設定が済んでいること
・<font color="Red">SESAMEにGoogleで登録した場合はパスワードを設定してあること（メールアドレスでログインします）</font>

## 準備
・以下よりapktool<font color="Red"> 2.3.4 (2.4系不可) </font>をダウンロード
　https://bitbucket.org/iBotPeaches/apktool/downloads/
・AirDroid等でセサミアプリをぶっこ抜く

## アプリの書き換え

以下のコマンドにてセサミアプリのdecompileを行います。
カレントディレクトリにapkファイル名のディレクトリが作成されsmaliファイル等が出力されます。

`java -jar apktool_2.3.4.jar d 「apkファイルのパス」`

展開されたsmaliファイルを読んでいくとˈ\$2\$1.smaliに以下のような、それっぽい箇所があることが分かります。

``` ruby
    .line 2063
    :cond_2
    :try_start_0
    new-instance v1, Ljavax/crypto/spec/SecretKeySpec;

    iget-object v3, p2, Lo/ｲ;->ॱˎ:[B

    const-string v4, "HmacSHA256"

    invoke-direct {v1, v3, v4}, Ljavax/crypto/spec/SecretKeySpec;-><init>([BLjava/lang/String;)V

    .line 2064
    invoke-interface {v1}, Ljava/security/Key;->getAlgorithm()Ljava/lang/String;

    move-result-object v3

```

v3に格納されたbyte arrayの要素全てを"%02X"でフォーマットし結合した後、Log.dに流し込めば良いので、以下のコードを
`iget-object v3, p2, Lo/ｲ;->ॱˎ:[B`
と
`const-string v4, "HmacSHA256"`
の間に挿入します。

```  ruby
    new-instance v8, Ljava/lang/StringBuilder;
    invoke-direct {v8}, Ljava/lang/StringBuilder;-><init>()V
    const/4 v10, 0x0

    :cond_start_for
    array-length v9, v3
    if-ge v10, v9, :cond_end_for

    aget-byte v7, v3, v10
    const/4 v9, 0x1
    new-array v9, v9, [Ljava/lang/Object;
    invoke-static {v7}, Ljava/lang/Byte;->valueOf(B)Ljava/lang/Byte;
    move-result-object v7
    const/4 v4, 0x0
    aput-object v7, v9, v4
    const-string v4, "%02X"
    invoke-static {v4, v9}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
    move-result-object v7
    invoke-virtual {v8, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    add-int/lit8 v10, v10, 0x1
    goto :cond_start_for

    :cond_end_for
    invoke-virtual {v8}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    move-result-object v8
    const-string v10, "###sesame password###"
    invoke-static {v8, v10}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
```

smali書き換え後、アプリが展開されたディレクトリにて以下を実行しcompileします。
(Warningが出ますが無視で大丈夫でした)

`java -jar apktool_2.3.4.jar b`

compileが完了すると、distディレクトリに（未署名の）apkが生成されていますので、keytoolで適当なキーストアファイルを生成し、jarsignerで署名します。(これでインストールできるようになります)

## アプリの実行 ・ 鍵取得
1. 書き換え前のアプリがインストールされている場合はアンインストールを行い、先程生成したapkをAirDroid/adbなどでインストールします
2. 以下のような感じでlogcatを表示させておきます<br>`adb logcat | grep password`
3. アプリを起動させるとログイン画面が出るので、メールアドレスで/ログインに進み、メールアドレス・パスワードでログインして下さい
4. ログインに成功すると、登録されているSesameのコントロール画面になるので、ロック・アンロック操作を行うと以下のようなログが取得できると思います<br>
`04-26 23:10:40.146 25423 25574 D FFFFFF...（256bit長の鍵）: ###sesame password###`
5. 上記ログより鍵のメモを取り完了です

## @odetarou 様のESP32用Arduinoコード

### ・ 設定例

``` c++
// config block start
const std::string userId = "dukemon@shinjuku.tokyo"; //登録したメールアドレス
const std::string password = "FFFFFF..."; //取得した256bit長の鍵
const uint16_t lockMinAngle = 10;
const uint16_t lockMaxAngle = 270;

// 下記はoption。指定したほうがscanがskipできるため早くなる。
const std::string address = "00:11:22:AA:BB:CC"; //BD_Address
const unsigned char manufacturerDataMacData[] = {0x00,0x00,...}; //manufacturerData
// config block end
```

manufacturerDataMacDataについては、address、manufacturerDataMacDataに以下を設定すると検索して自動で接続してくれ、シリアルコンソールにmanufacturerDataが表示されるのでその値をコピペしました。
（LightBlue等での取得方法がいまいちよく分からなかったので・・・）

``` c++
const std::string address = ""; 
const unsigned char manufacturerDataMacData[] = {}; 
```

### ・ 操作
シリアルコンソールで、115200bpsで接続
connectコマンドを送信後すぐに
lockコマンド・unlockコマンドを送信する。