自己主権型アイデンティティのウォレットaries-mobile-agent-xamarinを動かしてみた

この記事では自己主権型アイデンティティのウォレットであるaries-mobile-agent-xamarinと、aries-cloudagent-python(acapy)を連携させる方法について記載しました。

#目次
はじめに
確認したこと
利用モジュール
インストール、起動
基本処理の確認
おわりに

#はじめに
　最近、自己主権型アイデンティティの話題が増えてきました。
オープンソースでSSIを実装しているHyperledger Indy/Ariesに関する記事はよく目にしますが、実際に必要となるモバイルデバイス上で稼働するエージェント（モバイルエージェント）aries-mobile-agent-xamarinに関する記事が少ないようです。
そこで今回は自己主権型アイデンティティにおいて、Holderの役割をするモバイルエージェントaries-mobile-agent-xamarinと、Issuer/Verifierの役割をするエージェントaries-cloudagent-python(acapy)を連携させる方法について記載します。

#確認したこと
オープンソースのウォレットaries-mobile-agent-xamarinをローカル開発環境で動作させ、Hyperledger-Ariesにおける証明書の発行から検証までの基本的な処理を行い、その手順を確認しました。

＜基本処理＞

1. IssuerとHolderを接続する
1. IssuerからHolderへ証明書を発行する
1. Holderで証明書を受領し保有する
1. Verifierは証明書の提示を要求する
1. Holderは証明書の属性を提示する
1. Verifierは属性を検証する
![3者構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/abdbfbdb-5398-2b81-21b0-883c5714d82d.png)
<図1. 基本処理>

#利用モジュール
<dl>
  <dt>Issuer/Verifier</dt>
  <dd>aries-cloudagent-python(acapy) Ver. 0.5.6</dd>
  <dd>OS:　Ubuntu 18.04.4 LTS (Bionic Beaver)</dd>

  <dt>Holder</dt>
  <dd>aries-mobile-agent-xamarin(mobileagent) Ver. 0.1.0</dd>
  <dd>OS:　Android</dd>
</dl>
補足）
・aries-mobile-agent-xamarinはSSIのフレームワークHyperledger-Ariesベースのウォレットです。
・GitHubのaries-mobile-agent-xamarinのREDME.mdに記載されているDemoの解説動画では、Issuer/VerifierとしてStreetcredを利用しています。しかしオープンソースではないため、内部でどのような処理をしているのか分かりません。そこで今回はオープンソースであるaries-cloudagent-python(acapy)を使用します。
・aries-cloudagent-python(acapy)もHyperledger-Ariesベースのエージェント用モジュールです。
・aries-cloudagent-python(acapy)に関しては、執筆時点の最新版であるVer.0.6.0のデモアプリは証明書発行プロトコル2.0を使用していましたが、mobileagentは同じプロトコルを使用しておらず、連携できませんでした。そこでプロトコルのバージョンを合わせるために、ひとつ前のバージョンであるVer0.5.6を使用します。

#インストール、起動
###1. aries-cloudagent-python(acapy)　[Issuer/Verifier]
1.前処理としてngrokとjqコマンドをインストールしておきます。
2.GitHubからaries-cloudagent-pythonのコードを取得します。

 ```
git clone https://github.com/hyperledger/aries-cloudagent-python.git -b 0.5.6
 ```
3.台帳を指定して、acapyのfaberエージェント(Issuer/Verifier)が起動することを確認します。
エージェントが使用する台帳は、今回は自前で用意せず、インターネット上に公開しているものを利用します。


 ```
cd aries-cloudagent-python/demo
LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo faber
 ```
4.QRコードが表示されたら、正常に起動されたことが分かります。ブラウザでAPIの確認もできます。
　http\://ローカルのIPアドレス:8021
5.一端、faberエージェントを終了します。
6.ngrokを使用してローカル環境を外部に公開します。

 ```
ngrok http ローカルのIPアドレス:8020
 ```
7.再度acapyのfaberエージェントを起動します

 ```
LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo faber
 ```
⇒ngrokの公開URLに変換されたQRコードが表示されます
![server1-s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/7ec8e7fc-a799-943d-c247-34d9c7c3be98.png)
<図2:faberエージェント起動時>

###2. aries-mobile-agent-xamarin(mobileagent)　[Holder]
(Android版)
1.前処理としてngrokとdotnetコマンドをインストールしておきます。
2.indy-sdkをインストールします
　まず、indy-sdkをダウンロードします。Windows版のURLは以下の通りです
　　https://repo.sovrin.org/windows/{library}/{release-channel}
　今回はlibindy_1.9.0.zipをダウンロードします
　　https://repo.sovrin.org/windows/libindy/rc/1.9.0-69/
　次にローカルに配置し、環境変数のPATHに指定します。
　　<指定フォルダ>\libindy_1.9.0\lib

3.GitHubからaries-mobile-agent-xamarinのコードを取得します。

```
git clone https://github.com/hyperledger/aries-mobile-agent-xamarin.git -b 0.1.0
```
4.iOSおよびAndroidプロジェクトに必要な静的ライブラリをlibsフォルダーにダウンロードして配置します。
　まずaries-mobile-agent-xamarin/libsにおいて、ReadmeのDownloadリンクをクリックして、ライブラリをダウンロードします。
　　indy-xamarin-libs.zip
　展開してaries-mobile-agent-xamarin\libs 以下に配置します
　注意）2021/6/4時点では、ライブラリがダウンロードできました。

5.mediatorをngrokの公開URLで起動します。
　まずコンソールでmediatorの起動を確認します。

```
cd aries-mobile-agent-xamarin\mediator
dotnet run
```
　起動の確認が出来たら、mediatorを一端終了します
　ngrokを使用してローカルの環境を外部に公開します
 
```
ngrok http 5000
 ```
ngrokの公開URLが表示されます。
mediaotorにおいて、ngrokの公開URLを指定します

```mediator/startup.cs
  //org options.EndpointUri = "http://localhost:5000";
  options.EndpointUri = "ngrokの公開URL(http://～)";
```
　再度mediatorを起動します。これで外部にmediatorが公開されました。

```
dotnet run
```

6.VisualStudioでプロジェクトファイルaries-max-app.slnを開き、ビルドします。
　まず、プロジェクトの設定ファイルにngrokの公開URLを指定します。

```aries-mobile-agent-xamarin\src\Osma.Mobile.App\App.xaml.cs
  //org options.EndpointUri = "http://localhost:5000";
  options.EndpointUri = "ngrokの公開URL(http://～)";
```
　次に台帳を指定します。
・今回は標準で用意されている台帳ではなく、インターネット上の台帳であるgreenlightを使用します。
・pool_greenlight_genesisは、予めgreenlightのサイトからダウンロードして、
 aries-mobile-agent-xamarin\src\Osma.Mobile.App.Android\Assets　に配置しておきます。
・VisualStudioのソリューションエクスプローラーにおいて、Osma.Mobile.App.Android のAssetsフォルダを選択し、[追加]-[既存項目]でpool_greenlight_genesisを追加して下さい。
・今回はファイル名をpool_greenlight_genesisにしましたが、任意のファイル名で良いです。

```aries-mobile-agent-xamarin\src\Osma.Mobile.App\Services\PoolConfigurator.cs
{ "bcovrin-test", "pool_transactions_bcovrin_test_genesis" },
{ "greenlight_genesis", "pool_greenlight_genesis" } ←追加
```

```aries-mobile-agent-xamarin\src\Osma.Mobile.App\App.xaml.cs
  //options.PoolName = "sovrin-staging";
  options.PoolName = "greenlight_genesis";
```


7.ビルドしたアプリケーションをAndroidにインストールして実行します。
　カメラへのアクセスが尋ねられるので許可します。
　「CREATE WALLET」ボタンが表示されますので、タップしてウォレットを作成します。
　![Screenshot_20210712-112836-s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/cf5ca076-50a9-b41f-e9d9-e7310c705230.png)
　＜図3:mobileagent 起動画面＞

　注意）正常に動作しない場合は、GitHubのaries-mobile-agent-xamarinのREDME.mdに記載されているように、.indy_client\walletのフォルダを削除して再実行すると、正常に動作する場合があります。

#基本処理の確認
###1. IssuerとHolderを接続する
1. acapyのfaber(Issuer)を起動すると、コンソール上に接続に必要な招待用QRコードが表示されます。
1. mobileagent(Holder)において右上の[CONNECT]をタップするとカメラが起動しますので、QRコードを読み込みます
1. mobileagentにおいて接続確認画面が表示されますので、faberとの接続を許可します
1. しばらくすると接続状態がNegotiatingからConnetedになり、faberとmobileagentの接続が完了します

###2. IssuerからHolderへ証明書を発行する
1. acapyのfaberにおいて、コンソール上で (1) Issue Credential を入力し、証明書（学位証書）を発行します。

```
Faber      | Connected
    (1) Issue Credential
    (2) Send Proof Request
    (3) Send Message
    (T) Toggle tracing on credential/proof exchange
    (X) Exit?                                                                                                  
[1/2/3/T/X] 1  ←入力
```

###3. Holderで証明書を受領し保有する
1. mobileagentにおいて、[Credentials]タブをタップした後、画面を再表示すると、[New]ラベルのついた証明書が表示されます
1. 受け入れるか確認し、[ACCEPT]をタップします
1. 証明書が受け入れられます。

 ![Screenshot_20210712-121220-s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/5a4f4e3a-6a05-1f44-a16c-ba21e36110c2.png)
<図4：mobileagent 証明書受け入れ確認画面>

###4. Verifierは証明書の提示を要求する
1. acapyのfaberにおいて、コンソール上で(2) Send Proof Request を入力し、証明書の提示を要求します。
1. このときにコンソールには[Presentation: state = request_sent]とステータスが表示されます。

```
    (1) Issue Credential
    (2) Send Proof Request
    (3) Send Message
    (T) Toggle tracing on credential/proof exchange
    (X) Exit?                                                                                                  
[1/2/3/T/X] 2 ←入力                                                                                              

#20 Request proof of degree from alice
Faber      | Presentation: state = request_sent , presentation_exchange_id = 3eb57cf1-748e-4fbe-bd79-XXXXX
```

###5. Holderは証明書の属性を提示する
1. mobileagentにおいて、[Proof Requests]タブをタップし、画面を再表示すると、証明書の提示要求が表示されます
1. 要求に従って、属性を提示するかどうか確認します
1. 全ての属性について確認します
1. [PRESENT PROOF]をタップし、証明書の属性を提示します
![Screenshot_20210712-121250-s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221946/75761a12-b4b9-5717-4e07-83328d4e0ba9.png)

<図5：mobileagent 証明書提示確認画面>

###6. Verifierは属性を検証する
1. mobileagentから証明書の属性が送られてきたら、コンソールに[ Presentation: state = presentation_received]とステータスが表示されます
1. コンソールに[Proof=false]と表示されるのは、ゼロ知識証明の検証が失敗した為ですが、今回は無視します。
faberエージェントではゼロ知識証明が必要となる年齢情報の提示を求めています。しかしmobileagentが対応していないため、この部分で検証が失敗します。faberエージェントを修正して年齢検証の部分を削除すれば、[Proof=true]になる事は確認済です。

1. [Presentation: state = verified]と表示され、検証が終了したことが分かります。

```
Faber      | Presentation: state = presentation_received , presentation_exchange_id = 3eb57cf1-748e-4fbe-bd79-XXXXX

#27 Process the proof provided by X

#28 Check if proof is valid
Faber      | Proof = false
Faber      | Presentation: state = verified , presentation_exchange_id = cdf79a99-9eb4-4e8e-8baf-XXXX
```

#おわりに
今回は自己主権型アイデンティティのウォレットでありHolderの役割をするaries-mobile-agent-xamarinと、Issuer/Verifierの役割をするaries-cloudagent-python(acapy)を連携させる方法について記載しました。
ウォレットにおいて提示する項目を選択できる部分が、自己主権型の特徴が出ており、面白いと感じました。
SSI関連のソフトウェアは他にもありますので、今後も機会があれば紹介していきたいと思います。

#参考情報
aries-mobile-agent-xamarin： https://github.com/hyperledger/aries-mobile-agent-xamarin
aries-cloudagent-python： https://github.com/hyperledger/aries-cloudagent-python