$30 off During Our Annual Pro Sale. View Details »

Introduction to mcl-wasm

herumi
September 15, 2023

Introduction to mcl-wasm

herumi

September 15, 2023
Tweet

More Decks by herumi

Other Decks in Technology

Transcript

  1. 暗号プリミティブライブラリ
    mcl-wasmの紹介
    2023/9/15
    WebAssembly night #11
    光成滋生

    View Slide

  2. @herumi
    • サイボウズ・ラボで暗号と最適化の研究・OSS開発
    • ペアリング/BLS署名ライブラリmcl/bls
    • https://github.com/herumi/mcl
    • Go/Java/C#/Rust binding
    • Node.js/Wasm用パッケージ(今回紹介)
    • x64用JITアセンブラXbyak
    • https://github.com/herumi/xbyak
    • Intelの深層学習フレームワークoneDNNのエンジン
    • スーパーコンピュータ富岳版Xbyak_aarch64も関わる
    • RISC-V版も開発中
    2 / 8

    View Slide

  3. mcl/-wasm
    • 様々な暗号技術の基本パーツを提供
    https://www.npmjs.com/package/mcl-wasm
    • IDベース暗号・準同型暗号
    • BLS署名・集約署名
    • ゼロ知識証明・秘密分散など
    • Ethereum Foundationや
    Optimismのgrantを受ける
    • アクセス数
    • GitHubのDependency graph : 15万 Repositories
    • 2021/4/1からの総download数 : 1200万over
    • https://npm-stat.com/charts.html?package=mcl-wasm&from=2021-04-01
    3 / 8
    600K
    2021/Apr 2023/Sep
    月間ダウンロード数
    400K
    200K

    View Slide

  4. BLS署名
    • nodeでの実行例
    • bls-eth-wasmなどの専用packageも提供
    const mcl = require('mcl-wasm')
    mcl.init().then(() => {
    const P = new mcl.G1()
    P.setStr('1 -1 1') // 初期設定
    const s = new mcl.Fr()
    s.setByCSPRNG() // 署名鍵(秘密鍵)の作成
    const Q = mcl.mul(P, s) // 検証鍵(公開鍵)の作成
    const H = mcl.hashAndMapToG2('abc') // 検証文字列のハッシュ
    const sig = mcl.mul(H, s) // ハッシュに対する署名
    const ok = mcl.pairing(Q,H).isEqual(mcl.pairing(P,sig))//署名の検証
    // 注意 : もっと効率のよい方法はある
    })
    4 / 8

    View Slide

  5. • JavaScriptのBigIntによる有限体Frの演算実装
    • 加減乗算の後に素数rで割った余りを求める操作
    • 性能評価
    • 単位:usec
    • あれ, add/subはBigIntの方が速い???
    mcl-wasmの多倍長演算とBigIntとの比較
    const g_r = BigInt(254ビットの素数)
    function FrAdd (x, y) {
    const z = x + y
    return z >= g_r ? (z - g_r) : z
    }
    function FrMul (x, y) {
    return (x * y) % g_r
    }
    BigInt mcl-wasm
    add 0.113 0.437
    sub 0.099 0.444
    mul 0.681 0.572
    5 / 8

    View Slide

  6. • JavaScriptはdestructorが無い(GCがある)言語
    • mcl-wasmは関数呼び出しをメモリ操作処理でラップしてる
    • WasmにGCが正式サポートされればまた変わるかも
    • JS側でメモリ管理を自分でするなら速い
    • 1回当たり約0.4usecの変換コスト(@Xeon 8280 2.8GHz)
    WAMの呼び出し変換コスト
    add(x : Fp, y : Fp) => Fp {
    const z = new Fp()
    const stack = mod.stackSave() // 現在のWasmのSPを取得
    const xPos = x._sallocAndCopy() // スタックに確保して状態をコピー
    const yPos = y._sallocAndCopy() // スタックに確保して状態をコピー
    const zPos = z._salloc() // スタックに確保
    mod._mclBnFpAdd(zPos, xPos, yPos) // Wasm関数呼び出し
    z._save(zPos) // 結果をzにコピー
    // スタックを元に戻す
    mod.stackRestore(stack)
    return z
    }
    BigInt mcl-wasm direct call
    add 0.113 0.437 0.035
    sub 0.099 0.444 0.035
    mul 0.681 0.572 0.130
    6 / 8

    View Slide

  7. • 楕円曲線の加算のベンチマーク
    • 変換コストは相対的に無視できる
    • ペアリングなどの複雑な演算処理はもっと差が開く
    重たい計算はmcl-wasmが速い
    BigInt mcl-wasm direct
    G1::add 21.609 7.9
    7 / 8

    View Slide

  8. • 暗号ライブラリmcl/mcl-wasmの紹介
    • 軽い関数呼び出しはWasm側が不利になることがある
    • 暗号や実装の解説記事を書いてます
    • https://zenn.dev/herumi
    まとめ
    8 / 8

    View Slide