aboutsummaryrefslogblamecommitdiffstats
path: root/ffi/cs/readme-ja.md
blob: f0fa114efdefef817008d9670ba04a6e588f3bbc (plain) (tree)



















                                                                     
                                     






                                                                 

































































































                                                                                         



















































                                                              







                                                
# BLS署名のC#バインディング

# 必要環境

* Visual Studio 2017(x64) or later
* C# 7.2 or later
* .NET Framework 4.5.2 or later

# DLLのビルド方法

Visual Studio 201764bit用コマンドプロンプトを開いて
```
md work
cd work
git clone https://github.com/herumi/cybozulib_ext
git clone https://github.com/herumi/mcl
git clone https://github.com/herumi/bls
cd bls
mklib dll
```
`bls/bin/*.dll`が作成される。

# サンプルのビルド方法

bls/ffi/cs/bls.slnを開いて実行する。

* 注意 bls256.slnは古いため使わないでください。

# クラスとAPI

## API

* `Init(int curveType = BN254);`
    * ライブラリを曲線curveTypeで初期化する。
    * curveType = BN254 or BLS12_381
* `SecretKey ShareSecretKey(in SecretKey[] msk, in Id id);`
    * マスター秘密鍵の列mskに対するidの秘密鍵を生成(共有)する。
* `SecretKey RecoverSecretKey(in SecretKey[] secVec, in Id[] idVec);`
    * 秘密鍵secVecとID idVecのペアから秘密鍵を復元する。
* `PublicKey SharePublicKey(in PublicKey[] mpk, in Id id);`
    * マスター公開鍵の列mpkに対するidの公開鍵を生成(共有)する。
* `PublicKey RecoverPublicKey(in PublicKey[] pubVec, in Id[] idVec);`
    * 公開鍵pubVecとID idVecのペアから公開鍵を復元する。
* `Signature RecoverSign(in Signature[] sigVec, in Id[] idVec);`
    * 署名sigVecとID idVecのペアから署名を復元する。

## Id

識別子クラス

* `byte[] Serialize();`
    * Idをシリアライズする。
* `void Deserialize(byte[] buf);`
    * バイト列bufからIdをデシリアライズする。
* `bool IsEqual(in Id rhs);`
    * 同値判定。
* `void SetDecStr(string s);`
    * 10進数文字列を設定する。
* `void SetHexStr(string s);`
    * 16進数文字列を設定する。
* `void SetInt(int x);`
    * 整数xを設定する。
* `string GetDecStr();`
    * 10進数表記を取得する。
* `string GetHexStr();`
    * 16進数表記を取得する。

## SecretKey

* `byte[] Serialize();`
    * Idをシリアライズする。
* `void Deserialize(byte[] buf);`
    * バイト列bufからSecretKeyをデシリアライズする。
* `bool IsEqual(in SecretKey rhs);`
    * 同値判定。
* `void SetHexStr(string s);`
    * 16進数文字列を設定する。
* `string GetHexStr();`
    * 16進数表記を取得する。
* `void Add(in SecretKey rhs);`
    * 秘密鍵rhsを加算する。
* `void SetByCSPRNG();`
    * 暗号学的乱数で設定する。
* `void SetHashOf(string s);`
    * 文字列sのハッシュ値を設定する。
* `PublicKey GetPublicKey();`
    * 対応する公開鍵を取得する。
* `Signature Sign(string m);`
    * 文字列mの署名を生成する。
* `Signature GetPop();`
    * 自身の秘密鍵による署名(Proof Of Posession)を生成する。

## PublicKey

* `byte[] Serialize();`
    * PublicKeyをシリアライズする。
* `void Deserialize(byte[] buf);`
    * バイト列bufからPublicKeyをデシリアライズする。
* `bool IsEqual(in PublicKey rhs);`
    * 同値判定。
* `void Add(in PublicKey rhs);`
    * 公開鍵rhsを加算する。
* `void SetHexStr(string s);`
    * 16進数文字列を設定する。
* `string GetHexStr();`
    * 16進数表記を取得する。
* `bool Verify(in Signature sig, string m);`
    * 文字列mに対する署名sigの正当性を確認する。
* `bool VerifyPop(in Signature pop);`
    * PoPの正当性を確認する。

## Signature

* `byte[] Serialize();`
    * Signatureをシリアライズする。
* `void Deserialize(byte[] buf);`
    * バイト列bufからSignatureをデシリアライズする。
* `bool IsEqual(in Signature rhs);`
    * 同値判定。
* `void Add(in Signature rhs);`
    * 署名rhsを加算する。
* `void SetHexStr(string s);`
    * 16進数文字列を設定する。
* `string GetHexStr();`
    * 16進数表記を取得する。

## 使い方

### 最小サンプル

```
using static BLS;

Init(BN254); // ライブラリ初期化
SecretKey sec;
sec.SetByCSPRNG(); // 秘密鍵の初期化
PublicKey pub = sec.GetPublicKey(); // 公開鍵の取得
string m = "abc";
Signature sig = sec.Sign(m); // 署名の作成
if (pub.Verify(sig, m))) {
  // 署名の確認
}
```

### 集約署名
```
Init(BN254); // ライブラリ初期化
const int n = 10;
const string m = "abc";
SecretKey[] secVec = new SecretKey[n];
PublicKey[] pubVec = new PublicKey[n];
Signature[] popVec = new Signature[n];
Signature[] sigVec = new Signature[n];

for (int i = 0; i < n; i++) {
  secVec[i].SetByCSPRNG(); // 秘密鍵の初期化
  pubVec[i] = secVec[i].GetPublicKey(); // 公開鍵の取得
  popVec[i] = secVec[i].GetPop(); // 所有(PoP)の証明
  sigVec[i] = secVec[i].Sign(m); // 署名
}

SecretKey secAgg;
PublicKey pubAgg;
Signature sigAgg;
for (int i = 0; i < n; i++) {
  // PoPの確認
  if (pubVec[i].VerifyPop(popVec[i]))) {
    // エラー
    return;
  }
  pubAgg.Add(pubVec[i]); // 公開鍵の集約
  sigAgg.Add(sigVec[i]); // 署名の集約
}
if (pubAgg.Verify(sigAgg, m)) {
  // 署名の確認
}
```

# ライセンス

modified new BSD License
http://opensource.org/licenses/BSD-3-Clause

# 著者

光成滋生 MITSUNARI Shigeo(herumi@nifty.com)