From d33801a3f13c80491151ab03d9230728fa94e3d1 Mon Sep 17 00:00:00 2001 From: Jamie Date: Thu, 26 Sep 2024 14:10:04 +0800 Subject: [PATCH] repo-sync-2024-09-26T11:38:23+0800 (#391) * repo-sync-2024-09-26T11:38:23+0800 * Update .licenserc.yaml * Update .licenserc.yaml * Update continue-config.yml --- .circleci/continue-config.yml | 2 +- .licenserc.yaml | 2 + ALGORITHMS.md | 70 ++++------ CHANGELOG.md | 21 ++- GETTING_STARTED.md | 85 ++++++------ README.md | 2 +- WORKSPACE | 11 ++ bazel/repositories.bzl | 38 ++++++ docs/Makefile | 34 +++++ docs/_static/css/custom.css | 26 ++++ docs/_static/favicon.ico | Bin 0 -> 15406 bytes docs/_static/logo-dark.png | Bin 0 -> 50278 bytes docs/_static/logo.png | Bin 0 -> 60489 bytes docs/conf.py | 118 ++++++++++++++++ docs/imgs/ecdh_psi_1.png | Bin 0 -> 57821 bytes docs/imgs/ecdh_psi_2.png | Bin 0 -> 110821 bytes docs/index.rst | 29 ++++ docs/requirements.txt | 14 ++ docs/src/algorithms.rst | 2 + docs/src/changelog.rst | 2 + docs/src/develop/example_psi.rst | 96 +++++++++++++ docs/src/develop/example_psi_java.rst | 22 +++ docs/src/develop/example_psi_python.rst | 25 ++++ docs/src/develop/index.rst | 62 +++++++++ docs/src/getting_started.rst | 2 + docs/src/research/index.rst | 51 +++++++ docs/src/security.rst | 2 + examples/psi/BUILD.bazel | 25 +--- examples/psi/cpp/BUILD.bazel | 52 ++++++++ examples/psi/cpp/ecdh_psi.cc | 73 ++++++++++ examples/psi/{ => cpp}/ecdh_psi.h | 34 +++-- examples/psi/cpp/ecdh_psi_main.cc | 163 +++++++++++++++++++++++ examples/psi/{ => cpp}/ecdh_psi_test.cc | 71 ++++++++-- examples/psi/cpp/main_utils.h | 73 ++++++++++ examples/psi/data/data_a.csv | 11 ++ examples/psi/data/data_b.csv | 9 ++ examples/psi/ecdh_psi.cc | 44 ------ examples/psi/java/BUILD.bazel | 66 +++++++++ examples/psi/java/EcdhPsi.java | 61 +++++++++ examples/psi/java/EcdhPsiTest.java | 72 ++++++++++ examples/psi/java/ecdh_psi_jni.cc | 101 ++++++++++++++ examples/psi/java/jni_wrappers.h | 81 +++++++++++ examples/psi/python/BUILD.bazel | 66 +++++++++ examples/psi/python/ecdh_psi.py | 26 ++++ examples/psi/python/ecdh_psi_pybind.cc | 42 ++++++ examples/psi/python/ecdh_psi_pybind.h | 85 ++++++++++++ examples/psi/python/ecdh_psi_test.py | 46 +++++++ examples/psi/python/exported_symbols.lds | 1 + examples/psi/python/version_script.lds | 9 ++ yacl/io/circuit/BUILD.bazel | 2 +- yacl/io/rw/csv_reader.h | 2 + yacl/link/transport/BUILD.bazel | 3 +- yacl/utils/spi/BUILD.bazel | 2 +- yacl/utils/spi/argument/BUILD.bazel | 2 +- 54 files changed, 1748 insertions(+), 190 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/_static/css/custom.css create mode 100644 docs/_static/favicon.ico create mode 100644 docs/_static/logo-dark.png create mode 100644 docs/_static/logo.png create mode 100644 docs/conf.py create mode 100644 docs/imgs/ecdh_psi_1.png create mode 100644 docs/imgs/ecdh_psi_2.png create mode 100644 docs/index.rst create mode 100644 docs/requirements.txt create mode 100644 docs/src/algorithms.rst create mode 100644 docs/src/changelog.rst create mode 100644 docs/src/develop/example_psi.rst create mode 100644 docs/src/develop/example_psi_java.rst create mode 100644 docs/src/develop/example_psi_python.rst create mode 100644 docs/src/develop/index.rst create mode 100644 docs/src/getting_started.rst create mode 100644 docs/src/research/index.rst create mode 100644 docs/src/security.rst create mode 100644 examples/psi/cpp/BUILD.bazel create mode 100644 examples/psi/cpp/ecdh_psi.cc rename examples/psi/{ => cpp}/ecdh_psi.h (54%) create mode 100644 examples/psi/cpp/ecdh_psi_main.cc rename examples/psi/{ => cpp}/ecdh_psi_test.cc (55%) create mode 100644 examples/psi/cpp/main_utils.h create mode 100644 examples/psi/data/data_a.csv create mode 100644 examples/psi/data/data_b.csv delete mode 100644 examples/psi/ecdh_psi.cc create mode 100644 examples/psi/java/BUILD.bazel create mode 100644 examples/psi/java/EcdhPsi.java create mode 100644 examples/psi/java/EcdhPsiTest.java create mode 100644 examples/psi/java/ecdh_psi_jni.cc create mode 100644 examples/psi/java/jni_wrappers.h create mode 100644 examples/psi/python/BUILD.bazel create mode 100644 examples/psi/python/ecdh_psi.py create mode 100644 examples/psi/python/ecdh_psi_pybind.cc create mode 100644 examples/psi/python/ecdh_psi_pybind.h create mode 100644 examples/psi/python/ecdh_psi_test.py create mode 100644 examples/psi/python/exported_symbols.lds create mode 100644 examples/psi/python/version_script.lds diff --git a/.circleci/continue-config.yml b/.circleci/continue-config.yml index cbe48fc..466d9d8 100644 --- a/.circleci/continue-config.yml +++ b/.circleci/continue-config.yml @@ -49,7 +49,7 @@ commands: command: | set +e declare -i test_status - bazel test //... -c opt --ui_event_filters=-info,-debug,-warning --test_output=errors --jobs 16 | tee test_result.log; test_status=${PIPESTATUS[0]} + bazel test //yacl/... -c opt --ui_event_filters=-info,-debug,-warning --test_output=errors --jobs 16 | tee test_result.log; test_status=${PIPESTATUS[0]} git clone https://github.com/secretflow/devtools.git sh devtools/rename-junit-xml.sh diff --git a/.licenserc.yaml b/.licenserc.yaml index ff33b61..b816d0b 100644 --- a/.licenserc.yaml +++ b/.licenserc.yaml @@ -31,6 +31,7 @@ header: # <1> - '**/*.patch' - '**/*.lds' - '**/*.csv' + - '**/*.rst' - 'LICENSE' - 'NOTICE' - '.bazelversion' @@ -43,6 +44,7 @@ header: # <1> - 'yacl/crypto/aes/aes_intrinsics.h' - 'yacl/crypto/aes/aes_opt.h' - 'yacl/io/circuit/data/**.txt' + - 'docs/requirements.txt' comment: never # <9> diff --git a/ALGORITHMS.md b/ALGORITHMS.md index 02f7d38..3f427d2 100644 --- a/ALGORITHMS.md +++ b/ALGORITHMS.md @@ -1,105 +1,91 @@ -# Supported Advanced Crypto Algorithms +# Algorithm List -## Oblivious Transfer and Extensions +In this part, we provide a comprehensive list of the algorithms that yacl implements. + +**Oblivious Transfer and Extensions** - The Simplest Protocol for Oblivious Transfer\ *Tung Chou, Claudio Orlandi*\ - LatinCrypt 2015, [eprint](https://eprint.iacr.org/2015/267), CO15 + LatinCrypt 2015, [CO15](https://eprint.iacr.org/2015/267) - Extending Oblivious Transfers Efficiently\ *Yuval Ishai, Joe Kilian, Kobbi Nissim, Erez Petrank*\ - Crypto 2003, [eprint](https://www.iacr.org/archive/crypto2003/27290145/27290145.pdf), IKNP03 + Crypto 2003, [IKNP03](https://www.iacr.org/archive/crypto2003/27290145/27290145.pdf) - Actively Secure OT Extension with Optimal Overhead\ *Marcel Keller, Emmanuela Orsini, Peter Scholl*\ - Crypto 2015, [eprint](https://eprint.iacr.org/2015/546), KOS15 + Crypto 2015, [KOS15](https://eprint.iacr.org/2015/546) - Efficient Batched Oblivious PRF with Applications to Private Set Intersection\ *Vladimir Kolesnikov, Ranjit Kumaresan, Mike Rosulek, Ni Trieu*\ - CCS 2016, [eprint](https://eprint.iacr.org/2016/799), KKRT16 + CCS 2016, [KKRT16](https://eprint.iacr.org/2016/799) - Distributed vector-OLE: Improved constructions and implementation\ *Phillipp Schoppmann, Adrià Gascón, Leonie Reichert, Mariana Raykova*\ - CCS 2019, [eprint](https://eprint.iacr.org/2019/1084), SGRR19 + CCS 2019, [SGRR19](https://eprint.iacr.org/2019/1084) - Half-Tree: Halving the Cost of Tree Expansion in COT and DPF\ *Xiaojie Guo, Kang Yang, Xiao Wang, Wenhao Zhang, Xiang Xie, Jiang Zhang, Zheli Liu*\ - EUROCRYPT 2023, [eprint](https://eprint.iacr.org/2022/1431), GYWZ+23 + EUROCRYPT 2023, [GYWZ+23](https://eprint.iacr.org/2022/1431) - Ferret: Fast Extension for coRRElated oT with small communication\ *Kang Yang, Chenkai Weng, Xiao Lan, Jiang Zhang, Xiao Wang*\ - CCS'20, [eprint](https://eprint.iacr.org/2020/924), YWLZ+20 + CCS'20, [YWLZ+20](https://eprint.iacr.org/2020/924) - SoftSpokenOT: Quieter OT Extension from Small-Field Silent VOLE in the Minicrypt Model\ *Lawrence Roy*\ - Crypto 2022, [publisher](https://www.iacr.org/cryptodb//data/paper.php?pubkey=32258), Roy22 - -## Vector Oblivious Linear Evaluation (over Field 2k) + Crypto 2022, [Roy22](https://www.iacr.org/cryptodb//data/paper.php?pubkey=32258) -Base VOLE: +**Vector Oblivious Linear Evaluation (over Field 2k)** - MASCOT: Faster Malicious Arithmetic Secure Computation with Oblivious Transfer\ *Marcel Keller, Emmanuela Orsini*\ - CCS 2016, [eprint](https://eprint.iacr.org/2016/505), KO16 - -Silent VOLE: + CCS 2016, [KO16](https://eprint.iacr.org/2016/505) - Efficient Two-Round OT Extension and Silent Non-Interactive Secure Computation\ *Elette Boyle, Geoffroy Couteau, Niv Gilboa, Yuval Ishai, Lisa Kohl, Peter Rindal, Peter Scholl*\ - CCS 2019, [eprint](https://eprint.iacr.org/2019/1159), BCGI+19 (with Peter Rindal) + CCS 2019, [BCGI+19 (with Peter Rindal)](https://eprint.iacr.org/2019/1159) - Efficient Two-Round OT Extension and Silent Non-Interactive Secure Computation\ *Elette Boyle, Geoffroy Couteau, Niv Gilboa, Yuval Ishai, Lisa Kohl, Peter Rindal, Peter Scholl*\ - CCS 2019, [eprint](https://eprint.iacr.org/2019/1159), BCGI+19 + CCS 2019, [BCGI+19](https://eprint.iacr.org/2019/1159) - Correlated Pseudorandomness from Expand-Accumulate Codes\ *Elette Boyle, Geoffroy Couteau, Niv Gilboa, Yuval Ishai, Lisa Kohl, Nicolas Resch, Peter Scholl*\ - Crypto 2022, [eprint](https://eprint.iacr.org/2022/1014), BCG+22 - -Subfield VOLE: + Crypto 2022, [BCG+22](https://eprint.iacr.org/2022/1014) - Wolverine: Fast, Scalable, and Communication-Efficient Zero-Knowledge Proofs for Boolean and Arithmetic Circuits\ *Chenkai Weng, Kang Yang, Jonathan Katz, Xiao Wang* - SP, 2021, [eprint](https://eprint.iacr.org/2020/925), WYKW21 - -## Codes + SP, 2021, [WYKW21](https://eprint.iacr.org/2020/925) -Local Linear Code +**Codes** - Ferret: Fast Extension for coRRElated oT with small communication\ *Kang Yang, Chenkai Weng, Xiao Lan, Jiang Zhang, Xiao Wang*\ - CCS'20, [eprint](https://eprint.iacr.org/2020/924), YWLZ+20 - -Low Density Parity Check Code (Silver Code) + CCS'20, [YWLZ+20](https://eprint.iacr.org/2020/924) - Silver: Silent VOLE and Oblivious Transfer from Hardness of Decoding Structured LDPC Codes\ *Geoffroy Couteau, Peter Rindal, Srinivasan Raghuraman*\ - Crypto 2021, [eprint](https://eprint.iacr.org/2021/1150), CRR21 - -Expanding Accumulation Code + Crypto 2021, [CRR21](https://eprint.iacr.org/2021/1150) - Correlated Pseudorandomness from Expand-Accumulate Codes\ *Elette Boyle, Geoffroy Couteau, Niv Gilboa, Yuval Ishai, Lisa Kohl, Nicolas Resch, Peter Scholl*\ - Crypto 2022, [eprint](https://eprint.iacr.org/2022/1014), BCG+22 - + Crypto 2022, [BCG+22](https://eprint.iacr.org/2022/1014) -## Distributed Point Functions +**Distributed Point Functions** - Function secret sharing: improvements and extensions\ *Elette Boyle, Niv Gilboa, Yuval Ishai*\ - CCS 2016, [eprint](https://eprint.iacr.org/2018/707), BGI16 + CCS 2016, [BGI16](https://eprint.iacr.org/2018/707) -## Theoretical Tools - -Correlation-Robust Hash (CrHash) +**Correlation-Robust Hash (CrHash)** - Efficient and Secure Multiparty Computation from Fixed-Key Block Ciphers\ *Chun Guo, Jonathan Katz, Xiao Wang, Yu Yu*\ - Preprint 2019, [eprint](https://eprint.iacr.org/2019/074), GKWY19 + Preprint 2019, [GKWY19](https://eprint.iacr.org/2019/074) -Circular Correlation-Robust Hash (CCR Hash) +**Circular Correlation-Robust Hash (CCR Hash)** - Efficient and Secure Multiparty Computation from Fixed-Key Block Ciphers\ *Chun Guo, Jonathan Katz, Xiao Wang, Yu Yu*\ - Preprint 2019, [eprint](https://eprint.iacr.org/2019/074), GKWY19 - + Preprint 2019, [GKWY19](https://eprint.iacr.org/2019/074) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6568c80..61ca286 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ -# CHANGELOG +# Changelog All notable changes to this project will be documented in this file. -## 2024-05-15 +**2024-05-15** - [Tag] release/0.4.5b0 - [Feature] Re-organize repo layout, add kernel folder for crypto protocols with links - [Feature] Add ECC lib25519 implementation @@ -10,26 +10,25 @@ All notable changes to this project will be documented in this file. - [Feature] Unify f2k implementaion - [Bugifx] Fix RandBits implementation -## 2024-02-01 +**2024-02-01** - [Tag] release/0.4.3 - [Feature] Add Silent Vole (malicious version) - [Bugifx] Multiple bugfixes -## 2024-01-09 +**2024-01-09** - [YACL] v0.4.2 - [Dependency] Bump: Openssl 3.0.12 (experimental) - [Feature] Add Softspoken OTe (malicious version) - [API] Refactor entropy source, drbg, and rand; Refine traditional crypto APIs - [Bugifx] Multiple bugfixes - -## 2023-11-16 +**2023-11-16** - [YACL] v0.4.1.1 - [Feature] Init Global Security Parameters for Yacl [WIP: apply security parameter to all algorithms] - [Feature] Add Softspoken OTe (semi-honest version) - [Feature] Add Silent Vole [WIP: optimize MpVole and DualEncode] -## 2023-10-20 +**2023-10-20** - [YACL] v0.4.1 - [Feature] Add Sigma-type ZKP Protocols (An unified implementation) - [Feature] Add ECC Pairing SPI and support to libmcl(ecc, pairing) @@ -37,20 +36,20 @@ All notable changes to this project will be documented in this file. - [Bugfix] fix KOS OTe security flaws - [Feature] Add AVX2 Matrix Transpose -## 2023-05-25 +**2023-05-25** - [YACL] v0.3.3 - [Feature] Add Ferret OTe - [Feature] Add Gywz OTe (Correlated GGM Tree) - [Feature] Add KOS OTe (warning: KOS still has potential security flaws) -## 2023-02-02 +**2023-02-02** - [YACL] v0.3.1 - [Feature] Add `dynamic_bitset` for manipulating bit vectors - [API] RO now can accept multiple inputs - [API] Add iknp cot api, improve iknp performance - [Bugfix] Fix Several m1 related bugs -## 2022-12-08 +**2022-12-08** - [YACL] v0.3.0 - [Feature] Add random permutation and correlation-robust hash function - [Feature] Add OT/OTe benchmark @@ -58,7 +57,7 @@ All notable changes to this project will be documented in this file. - [API] Re-organize repo layout - [Bugfix] Fix Random Oralce Usage -## 2022-12-01 +**2022-12-01** - [YACL] v0.2.0 - [API] Rename YASL to YACL - [API] Re-organize repo layout diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md index ddb06e2..63c6275 100644 --- a/GETTING_STARTED.md +++ b/GETTING_STARTED.md @@ -1,40 +1,33 @@ -# Getting Started Guide +# Getting Started This document includes guidelines. -## Table of Contents - -- [Prerequisites](#prerequisites) -- [Download and Build](#download-and-build) - - [Ubuntu](#ubuntu) - - [MacOS](#macos) -- [Setup Compilation Database for your lsp](#setup-compilation-database-for-your-lsp) -- [(Optional) Setup Vscode](#optional-setup-vscode) - ## Prerequisites To build Yacl from source, you will need the following tools: -- **bazel**: We recommend to use the official [bazelisk](https://github.com/bazelbuild/bazelisk?tab=readme-ov-file#installation) to manage bazel version. -- **gcc >= 10.3** -- **[cmake](https://cmake.org/getting-started/)** -- **[ninja/ninja-build](https://ninja-build.org/)** +- [bazel](https://bazel.build/): We recommend to use the official [bazelisk](https://github.com/bazelbuild/bazelisk?tab=readme-ov-file#installation) to manage bazel version. +- [gcc >= 10.3](https://gcc.gnu.org/) +- [cmake](https://cmake.org/) +- [ninja/ninja-build](https://ninja-build.org/) - **Perl 5 with core modules** (Required by [OpenSSL](https://github.com/openssl/openssl/blob/master/INSTALL.md#prerequisites)) -## Download and Build +## Download and build -Please make sure you already have `git` installed on your system, then clone Yacl +Please make sure you already have `git` installed on your system, then clone Yacl via the github link, ```sh -git clone https://github.com/secretflow/yacl +$ git clone https://github.com/secretflow/yacl.git ``` +The building process of YACL is as following. + ### Ubuntu Download the dependencies ```sh -sudo apt install gcc wget cmake ninja-build nasm automake libtool +$ sudo apt install gcc wget cmake ninja-build nasm automake libtool libomp-dev ``` We recommend to use `bazelisk` to manage different versions of `bazel`. On Linux, You can download Bazelisk binary on our Releases page and add it to your PATH manually, which also works on macOS and Windows. You can download the newest `bazelisk` binary from its official [github release page](https://github.com/bazelbuild/bazelisk/releases). @@ -43,29 +36,29 @@ The following is an example of downloading and setting up bazelisk v1.20.0, you ```sh # If you use a x86 architecture cpu -wget https://github.com/bazelbuild/bazelisk/releases/download/v1.20.0/bazelisk-linux-amd64 -mv bazelisk-linux-amd64 bazel && chmod +x bazel -sudo mv bazel /usr/local/bin # you need sudo to do this +$ wget https://github.com/bazelbuild/bazelisk/releases/download/v1.20.0/bazelisk-linux-amd64 +$ mv bazelisk-linux-amd64 bazel && chmod +x bazel +$ sudo mv bazel /usr/local/bin # you need sudo to do this # If you use an arm architecture cpu -wget https://github.com/bazelbuild/bazelisk/releases/download/v1.20.0/bazelisk-linux-arm64 -mv bazelisk-linux-arm64 bazel && chmod +x bazel -sudo mv bazel /usr/local/bin # you need sudo to do this +$ wget https://github.com/bazelbuild/bazelisk/releases/download/v1.20.0/bazelisk-linux-arm64 +$ mv bazelisk-linux-arm64 bazel && chmod +x bazel +$ sudo mv bazel /usr/local/bin # you need sudo to do this ``` To build Yacl, at yacl's root directory, run the following ```sh -bazel build //... -bazel build //... -c opt # build as optimized mode -bazel build //... -c dbg # build as debug mode -bazel build //... --config gm # build with gm mode +$ bazel build //... +$ bazel build //... -c opt # build as optimized mode +$ bazel build //... -c dbg # build as debug mode +$ bazel build //... --config gm # build with gm mode ``` To test Yacl ```sh -bazel test //... +$ bazel test //... ``` ### MacOS @@ -74,47 +67,47 @@ First you need to download XCode and [homebrew](https://brew.sh/), ```sh # Install Xcode -https://apps.apple.com/us/app/xcode/id497799835?mt=12 +$ https://apps.apple.com/us/app/xcode/id497799835?mt=12 # Select Xcode toolchain version -sudo xcode-select -s /Applications/Xcode.app/Contents/Developer +$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer ``` Then download the dependencies, -``` +```sh # Install dependencies -brew install bazelisk cmake ninja nasm automake libtool +$ brew install bazelisk cmake ninja nasm automake libtool libomp ``` To build Yacl, at yacl's root directory, run the following ```sh -bazel build //... -bazel build //... -c opt # build as optimized mode -bazel build //... -c dbg # build as debug mode +$ bazel build //... +$ bazel build //... -c opt # build as optimized mode +$ bazel build //... -c dbg # build as debug mode +$ bazel build //... --config gm # build with gm mode ``` To test Yacl ```sh -bazel test //... +$ bazel test //... ``` -## Setup Compilation Database for your lsp +## Setup compilation database for your lsp Language servers accept a `compile_commands.json` file input to help it with linting, jumping to definitions/references, and other functions. This file consists of an array of “command objects”, where each command object specifies one way a translation unit is compiled in the project. A lot of modern C/C++ build system can generate this file with simple steps, it's the same for bazel. ```sh -sudo apt install curl -cd /path/to/yacl/ # change to yacl path -bash <(curl -s https://raw.githubusercontent.com/secretflow/devtools/9efb0bc93068a122864fdb661946695badacbe24/refresh_compile_commands.sh) +$ sudo apt install curl +$ cd /path/to/yacl/ # change to yacl path +$ bash <(curl -s https://raw.githubusercontent.com/secretflow/devtools/9efb0bc93068a122864fdb661946695badacbe24/refresh_compile_commands.sh) ``` -## (Optional) Setup Vscode +## (Optional) Recommended vscode extensions We recommend to use the following extensions for vscode users: -- Clang-Format: Use Clang-Format in Visual Studio Code -- cpplint: code style check tool extension for cpplint -- Bazel: Bazel BUILD integration -- clangd: C/C++ completion, navigation, and insights +- [Bazel](https://marketplace.visualstudio.com/items?itemName=BazelBuild.vscode-bazel): Bazel BUILD integration +- [clangd](https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd): C/C++ completion, navigation, and insights +- [cpplint](https://marketplace.visualstudio.com/items?itemName=mine.cpplint): code style check tool extension for cpplint (requires `cpplint` binary) diff --git a/README.md b/README.md index 4c6e041..09d286d 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Supported platforms: - [base](yacl/base/): some basic types and utils in yacl. - [crypto](yacl/crypto/): **crypto algorithms** without [link](yacl/link/). -- [kernel](yacl/kernel/): **crypto kernel** that includes [link](yacl/link/) with multi-thread support, i.e. OT, DPF. +- [kernel](yacl/kernel/): **crypto kernel** that includes [link](yacl/link/) with (WIP) multi-thread support, i.e. OT, DPF. - [io](yacl/io/): a simple streaming-based io library. - [link](yacl/link/): a simple rpc-based MPI framework, providing the [SPMD](https://en.wikipedia.org/wiki/SPMD) parallel programming capability. diff --git a/WORKSPACE b/WORKSPACE index 1b248e6..458228a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -22,6 +22,13 @@ load("@rules_python//python:repositories.bzl", "py_repositories") py_repositories() +load("@pybind11_bazel//:python_configure.bzl", "python_configure") + +python_configure( + name = "local_config_python", + python_version = "3", +) + load( "@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies", @@ -40,3 +47,7 @@ bazel_features_deps() load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") protobuf_deps() + +load("@rules_jni//jni:repositories.bzl", "rules_jni_dependencies") + +rules_jni_dependencies() diff --git a/bazel/repositories.bzl b/bazel/repositories.bzl index 9303e38..46da786 100644 --- a/bazel/repositories.bzl +++ b/bazel/repositories.bzl @@ -19,6 +19,7 @@ def yacl_deps(): _rule_proto() _rule_python() _rules_foreign_cc() + _rules_jni() _com_github_madler_zlib() _com_google_protobuf() _com_github_gflags_gflags() @@ -34,6 +35,9 @@ def yacl_deps(): _com_github_msgpack_msgpack() _com_github_greendow_hash_drbg() + _com_github_pybind11_bazel() + _com_github_pybind11() + # ssl _com_github_tongsuo_tongsuo() _com_github_openssl_openssl() @@ -84,6 +88,29 @@ def _org_interconnection(): path = "/opt/homebrew/opt/libomp/", ) +def _com_github_pybind11_bazel(): + maybe( + http_archive, + name = "pybind11_bazel", + sha256 = "dc4882b23a617575d0fd822aba88aa4a14133c3d428b5a8fb83d81d03444a475", + strip_prefix = "pybind11_bazel-8889d39b2b925b2a47519ae09402a96f00ccf2b4", + urls = [ + "https://github.com/pybind/pybind11_bazel/archive/8889d39b2b925b2a47519ae09402a96f00ccf2b4.zip", + ], + ) + +def _com_github_pybind11(): + maybe( + http_archive, + name = "pybind11", + build_file = "@pybind11_bazel//:pybind11.BUILD", + sha256 = "bf8f242abd1abcd375d516a7067490fb71abd79519a282d22b6e4d19282185a7", + strip_prefix = "pybind11-2.12.0", + urls = [ + "https://github.com/pybind/pybind11/archive/refs/tags/v2.12.0.tar.gz", + ], + ) + def _com_github_brpc_brpc(): maybe( http_archive, @@ -287,6 +314,17 @@ def _rules_foreign_cc(): url = "https://github.com/bazelbuild/rules_foreign_cc/releases/download/0.12.0/rules_foreign_cc-0.12.0.tar.gz", ) +def _rules_jni(): + maybe( + http_archive, + name = "rules_jni", + sha256 = "a84863992f425220e1b5e7dfd4663ef1f7c69d63aff6e09a154880744ce0bab0", + strip_prefix = "rules_jni-0.10.1", + urls = [ + "https://github.com/fmeum/rules_jni/archive/refs/tags/v0.10.1.tar.gz", + ], + ) + def _com_github_libsodium(): maybe( http_archive, diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..1e392a1 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,34 @@ +# Copyright 2024 Ant Group Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css new file mode 100644 index 0000000..be5205c --- /dev/null +++ b/docs/_static/css/custom.css @@ -0,0 +1,26 @@ +/** + * Copyright 2024 Ant Group Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +html[data-theme="light"] { + --pst-color-primary: rgb(22 119 255); + --pst-color-secondary: rgb(22 255 201); +} + +html[data-theme="dark"] { + --pst-color-primary: rgb(22 119 255); + --pst-color-secondary: rgb(22 255 201); + --pst-color-background: rgb(56, 56, 56); +} diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..58c2592b8480f90e088e68d54dd9ef2deb1a0602 GIT binary patch literal 15406 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 Y1Q7@#5Jcc-j{vU+1)m@SKN^950Jx%N_5c6? literal 0 HcmV?d00001 diff --git a/docs/_static/logo-dark.png b/docs/_static/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e77d48738000116fadc31e5961300db5275a6934 GIT binary patch literal 50278 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.-H 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

BjuR3Cq7iB` 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 literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..a1d99dc --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,29 @@ +YACL Documentation +=============================== + +YACL (Yet Another Common Cryptography Library) is a sub-project of `SecretFlow `_, it is a C++ library that provides cryptography, network and io modules for other SecretFlow repositories. Yacl is designed to be a **low-level** library that could be either integrated into a big **secure system**, or used in a standalone way for a **quick POC** (see: `Develop `_), or even help with your **security/cryptography research** (see: `Research `_). + +- **About Cryptography Modules:** The crypto modules in Yacl implement many state-of-art secure computation protocols, including primitives like OT, VOLE, TPRE, and tools like PRG, RO. Check the full list of Yacl's `supported algorithms list `_. +- **About Network ("link") Modules:** The network ("link") module in Yacl uses `BRPC `_ to handle network. And we also provide a "mocked" in-memory link. +- **About IO Modules:** Yacl also provides many io modules for kv storage, file io, `bristol circuits `_, and so on. + +The following parts describes the top-level folders of Yacl repository. + +- `yacl/base/ `_: some basic types and utils in yacl. +- `yacl/crypto/ `_: crypto algorithm without link. +- `yacl/kernel/ `_: crypto kernel that includes link with (WIP) multi-thread support, i.e. OT, DPF. +- `yacl/io/ `_: a simple streaming-based io library. +- `yacl/link/ `_: a simple rpc-based MPI framework, providing the `SPMD `_ parallel programming capability. + +.. toctree:: + :maxdepth: 2 + :caption: Contents + :numbered: 1 + :titlesonly: + + src/getting_started + src/develop/index + src/research/index + src/security + src/algorithms + src/changelog diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..284bc1e --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,14 @@ +sphinx +sphinx-intl +sphinx-copybutton +sphinx-togglebutton +sphinx-inline-tabs +sphinxcontrib-htmlhelp +sphinxcontrib-applehelp + +# HACK see: https://github.com/CrossNox/m2r2/issues/68#issuecomment-2145795360 +docutils>=0.18.1,<0.21 +myst-parser==4.0.0 + +# theme +pydata-sphinx-theme diff --git a/docs/src/algorithms.rst b/docs/src/algorithms.rst new file mode 100644 index 0000000..0e45632 --- /dev/null +++ b/docs/src/algorithms.rst @@ -0,0 +1,2 @@ +.. include:: ../../ALGORITHMS.md + :parser: myst_parser.sphinx_ diff --git a/docs/src/changelog.rst b/docs/src/changelog.rst new file mode 100644 index 0000000..9f448a2 --- /dev/null +++ b/docs/src/changelog.rst @@ -0,0 +1,2 @@ +.. include:: ../../CHANGELOG.md + :parser: myst_parser.sphinx_ diff --git a/docs/src/develop/example_psi.rst b/docs/src/develop/example_psi.rst new file mode 100644 index 0000000..b225271 --- /dev/null +++ b/docs/src/develop/example_psi.rst @@ -0,0 +1,96 @@ +Example: Build a PSI Protocol +============================= + +This is an example of how to use Yacl's ECC api and link to build up a `PSI (Private Set Intersection) `_ protocol. The code of this example is avaliable at `link `_. + +.. warning:: + This example is merely designed for demonstration only, please do not use this example in production. + +Step 1: Understand ECDH-PSI +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Before we start, the ECDH-PSI protocols are formally designed as the following, where lambda indicates the computational security parameter, and H() indicates a cryptographically secure (collision-free) hash function. + +.. image:: ../../imgs/ecdh_psi_1.png + :width: 300 + :alt: Alternative text + +.. image:: ../../imgs/ecdh_psi_2.png + :width: 300 + :alt: Alternative text + +Step 2: Implement Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We provide the implementation in the following codes. Note that it's almost always a good idea to separate the definitions and implementations into ``*.h`` and ``*.cc`` files. + +.. literalinclude:: ../../../examples/psi/cpp/ecdh_psi.h + :language: cpp + +.. literalinclude:: ../../../examples/psi/cpp/ecdh_psi.cc + :language: cpp + +Besides the two files, you also need to write a `BUILD.bazel` file to tell `bazel` how to compile your files together. + +.. code:: + + load("//bazel:yacl.bzl", "yacl_cc_binary", "yacl_cc_library", "yacl_cc_test") + + package(default_visibility = ["//visibility:public"]) + + yacl_cc_library( + name = "ecdh_psi", + srcs = [ + "ecdh_psi.cc", + ], + hdrs = [ + "ecdh_psi.h", + ], + deps = [ + "//yacl/crypto/ecc", + "//yacl/link", + ], + ) + + yacl_cc_test( + name = "ecdh_psi_test", + srcs = ["ecdh_psi_test.cc"], + deps = [":ecdh_psi"], + ) + +Step 2: Write and Run Tests +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Also, we recommend all users to write unit tests for implementations. In oder to run the following tests, you can ``bazel test //examples/psi/ecdh_psi_test``. + +.. literalinclude:: ../../../examples/psi/cpp/ecdh_psi_test.cc + :language: cpp + +Step 3: Generate Executables and Run with CSV files +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Also, alternatively you can build an executable for two users to actually run the PSI protocols with their private data. We show an example ``main.cc`` file in the below. + +.. literalinclude:: ../../../examples/psi/cpp/ecdh_psi_main.cc + :language: cpp + +In order to compile, run ``bazel build //examples/psi/ecdh_psi_main -c opt``. The ``-c opt`` flag tells the bazel build system to build a release (or, optimized) version of the executable. + +To run the exeutable, open two terminals in the same machine. + +.. note:: + + Please make sure your machine's 10086 and 10087 ports are avaliable. + +In the first terminal, at yacl's project root, run + +.. code:: bash + + ./bazel-bin/examples/psi/ecdh_psi_main --rank=0 + + +Then in the second terminal, at yacl's project root, run + +.. code:: bash + + ./bazel-bin/examples/psi/ecdh_psi_main --rank=1 diff --git a/docs/src/develop/example_psi_java.rst b/docs/src/develop/example_psi_java.rst new file mode 100644 index 0000000..c076d8e --- /dev/null +++ b/docs/src/develop/example_psi_java.rst @@ -0,0 +1,22 @@ +Example: Bind PSI to Java +========================= + +This is an example of how to use Yacl's ECC api and link to build up a `PSI (Private Set Intersection) `_ protocol, and provide a java language binding using JNI. The code of this example is avaliable on `Github `_. + +.. warning:: + This example is merely designed for demonstration only, please do not use this example in production. + +Step 1: Implement +^^^^^^^^^^^^^^^^^ + +.. literalinclude:: ../../../examples/psi/java/ecdh_psi_jni.cc + :language: cpp + +.. literalinclude:: ../../../examples/psi/java/EcdhPsi.java + :language: java + +Step 2: Build and Test +^^^^^^^^^^^^^^^^^^^^^^ + +.. literalinclude:: ../../../examples/psi/java/EcdhPsiTest.java + :language: java diff --git a/docs/src/develop/example_psi_python.rst b/docs/src/develop/example_psi_python.rst new file mode 100644 index 0000000..38da0df --- /dev/null +++ b/docs/src/develop/example_psi_python.rst @@ -0,0 +1,25 @@ +Example: Bind PSI to Python +=========================== + +This is an example of how to use Yacl's ECC api and link to build up a `PSI (Private Set Intersection) `_ protocol, and provide a python language binding using `pybind11 `_. The code of this example is avaliable on `Github `_. + +.. warning:: + This example is merely designed for demonstration only, please do not use this example in production. + +Step 1: Implement +^^^^^^^^^^^^^^^^^ + +.. literalinclude:: ../../../examples/psi/python/ecdh_psi_pybind.h + :language: cpp + +.. literalinclude:: ../../../examples/psi/python/ecdh_psi_pybind.cc + :language: cpp + +.. literalinclude:: ../../../examples/psi/python/ecdh_psi.py + :language: python + +Step 2: Build and Test +^^^^^^^^^^^^^^^^^^^^^^ + +.. literalinclude:: ../../../examples/psi/python/ecdh_psi_test.py + :language: python diff --git a/docs/src/develop/index.rst b/docs/src/develop/index.rst new file mode 100644 index 0000000..89341ce --- /dev/null +++ b/docs/src/develop/index.rst @@ -0,0 +1,62 @@ +Develop +======= + +**For Traditioanl PKI:** Since there are so many existing time-proof, efficient, and standardized implementation of PKI algorithms, Yacl **does not re-implement** those algorithms. Instead, Yacl only provides a light-weighted and "easy-to-use" wrapper for the most popular industrial libraries (e.g. `OpenSSL `_, `TongSuo `_, `LibSodium `_, etc.) + +**For ECC (Elliptic-Curve Cryptography):** Yacl integrates many curve implementation from OpenSSL, you may use the code in the following to use any curve as you like. For more information about all supported curve names, see: `yacl/crypto/ecc/curve_meta.cc `_ + +.. code-block:: cpp + + #include "yacl/crypto/ecc/ecc_spi.h" + + auto ec = yacl::crypto::EcGroupFactory::Instance().Create( + /*** curve name */ "FourQ"); + + auto order = ec->GetOrder(); + auto g = ec->GetGenerator(); + auto p = ec->GetField(); + + // You can also: + // ec->Add(/* first point */, /* second point */); + // ec->Mul(/* first point */, /* second scalar */); + // ... for more see: yacl/crypto/ecc/ecc_spi.h + +**For Randomness** Yacl has also provide some easy-to-use randomness generation functions. Random functions usually start with **Secure** or **Fast**, secure random implementation uses the standardized ctr-drbg, and fast uses hash-drbg. It is always recommended to use **Secure**-Random functions. + +.. code-block:: cpp + + #include "yacl/crypto/rand/rand.h" + + auto rand_u64 = yacl::crypto::SecureRandU64(); + auto rand_u128 = yacl::crypto::SecureRandU128(); + + std::vector rand_bytes = yacl::crypto::SecureRandBytes(10); + + // ... for more see: yacl/crypto/rand/rand.h + +**For Secure Computation Protocols:** Yacl provides many secure computation primitives, such as OT, VOLE and so on. It is recommended to use the `yacl/kernel/...` api for general usage. For more advanced users, please use `yacl/algorithms/...`. + +.. code-block:: cpp + + #include "yacl/kernel/ot_kernel.h" + + // ... setup link as lctx ..., at sender side + OtSendStore ot_send(num_ot, OtStoreType::Compact); // placeholder + OtKernel kernel_send(OtKernel::Role::Sender, OtKernel::ExtAlgorithm::Ferret); + kernel_send.init(lctx); // base ot + kernel_send.eval_cot_random_choice(lctx, /* number of ot */, &ot_send); + + // ... setup link as lctx ..., at receiver side + OtRecvStore ot_recv(num_ot, OtStoreType::Compact); // placeholder + OtKernel kernel_recv(OtKernel::Role::Receiver, OtKernel::ExtAlgorithm::Ferret); + kernel_recv.init(lctx); // base ot + kernel_recv.eval_cot_random_choice(lctx, /* number of ot */, &ot_recv); + +**ECDH-PSI Example:** We also provide a step-to-step demo to demonstrate how to build an ECDH-PSI protocol from the tools that Yacl provides, and then bind the protocol implementation to JAVA and Python. See the following link for more detail. + +.. toctree:: + :maxdepth: 1 + + example_psi + example_psi_java + example_psi_python diff --git a/docs/src/getting_started.rst b/docs/src/getting_started.rst new file mode 100644 index 0000000..be138a8 --- /dev/null +++ b/docs/src/getting_started.rst @@ -0,0 +1,2 @@ +.. include:: ../../GETTING_STARTED.md + :parser: myst_parser.sphinx_ diff --git a/docs/src/research/index.rst b/docs/src/research/index.rst new file mode 100644 index 0000000..100023d --- /dev/null +++ b/docs/src/research/index.rst @@ -0,0 +1,51 @@ +Research +======== + +Yacl is also designed for cryptography researchers. We notice that junior (or early-career) cryptography researchers have been constantly finding it difficult to demonstrate their new ideas, or run emperical benchmarks. + +Desite the **ECC, Random, and Secure Computation** introduced in `Develop Section <../develop/index.html>`_. Yacl has provided the following tools for cryptographic researchers. + +.. note:: + + Yacl has dedicated to long-term support for cryptography research, please do not hesitation to contact us for security issues, bugs, pull requests, or requiring new features . + +**yacl/math:** Yacl provides ``MPInt`` type for big number operations. + +.. code-block:: cpp + + #include "yacl/math/mpint/mp_int.h" + + auto kOne = 1_mp; // same as MPInt(1); + auto kTwo = 2_mp; // same as MPInt(2); + auto kZero = 0_mp; // same as MPInt(0); + + MPInt::Add( ... ); + MPInt::AddMod( ... ); + MPInt::Mul( ... ); + MPInt::MulMod( ... ); + + MPInt::RandPrimeOver( ... ); + MPInt::RandomLtN( ... ) + + // ... for more see: yacl/math/mpint/mp_int.h + +**yacl/crypto/tools:** Yacl also provides some theoretical tools such as Random Oralce, Random Permutation, etc. + +.. code-block:: cpp + + #include "yacl/crypto/tools/ro.h" + #include "yacl/crypto/tools/rp.h" + #include "yacl/crypto/tools/prg.h" + + const auto& RO = RandomOracle::GetDefault(); + auto out = RO.Gen(SecureRandBytes(param)); + + const auto& RP = RP::GetDefault(); + auto out = RP.Gen(SecureRandU128()); + + Prg prg(SecureRandSeed()); + auto out = prg(); + + // ... for more see: yacl/crypto/tools + +**yacl/crypto/experimental:** Yacl puts experimental cryptography algorithms here. diff --git a/docs/src/security.rst b/docs/src/security.rst new file mode 100644 index 0000000..18aeb18 --- /dev/null +++ b/docs/src/security.rst @@ -0,0 +1,2 @@ +.. include:: ../../SECURITY.md + :parser: myst_parser.sphinx_ diff --git a/examples/psi/BUILD.bazel b/examples/psi/BUILD.bazel index b1474ce..67173a7 100644 --- a/examples/psi/BUILD.bazel +++ b/examples/psi/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright 2024 zhangwfjh +# Copyright 2024 Ant Group Co., Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,26 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("//bazel:yacl.bzl", "AES_COPT_FLAGS", "yacl_cc_library", "yacl_cc_test") - package(default_visibility = ["//visibility:public"]) -yacl_cc_library( - name = "ecdh_psi", - srcs = [ - "ecdh_psi.cc", - ], - hdrs = [ - "ecdh_psi.h", - ], - deps = [ - "//yacl/crypto/ecc", - "//yacl/link", - ], -) - -yacl_cc_test( - name = "ecdh_psi_test", - srcs = ["ecdh_psi_test.cc"], - deps = [":ecdh_psi"], +filegroup( + name = "psi_data", + srcs = glob(["data/*"]), ) diff --git a/examples/psi/cpp/BUILD.bazel b/examples/psi/cpp/BUILD.bazel new file mode 100644 index 0000000..4b5566a --- /dev/null +++ b/examples/psi/cpp/BUILD.bazel @@ -0,0 +1,52 @@ +# Copyright 2024 Ant Group Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:yacl.bzl", "yacl_cc_binary", "yacl_cc_library", "yacl_cc_test") + +package(default_visibility = ["//visibility:public"]) + +yacl_cc_library( + name = "ecdh_psi", + srcs = [ + "ecdh_psi.cc", + ], + hdrs = [ + "ecdh_psi.h", + ], + deps = [ + "//yacl/crypto/ecc", + "//yacl/link", + ], +) + +yacl_cc_test( + name = "ecdh_psi_test", + srcs = ["ecdh_psi_test.cc"], + deps = [":ecdh_psi"], +) + +yacl_cc_binary( + name = "ecdh_psi_main", + srcs = [ + "ecdh_psi_main.cc", + "main_utils.h", + ], + data = [ + "//examples/psi:psi_data", + ], + deps = [ + ":ecdh_psi", + "//yacl/io/rw:csv_reader", + ], +) diff --git a/examples/psi/cpp/ecdh_psi.cc b/examples/psi/cpp/ecdh_psi.cc new file mode 100644 index 0000000..d52192c --- /dev/null +++ b/examples/psi/cpp/ecdh_psi.cc @@ -0,0 +1,73 @@ +// Copyright 2023 Ant Group Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "examples/psi/cpp/ecdh_psi.h" + +#include +#include + +#include "yacl/crypto/ecc/ec_point.h" +#include "yacl/crypto/ecc/ecc_spi.h" +#include "yacl/crypto/hash/hash_utils.h" +#include "yacl/link/link.h" +#include "yacl/secparam.h" + +namespace yc = yacl::crypto; + +namespace examples::psi { + +void EcdhPsi::MaskStrings(absl::Span in, + absl::Span out) const { + YACL_ENFORCE(!in.empty()); + YACL_ENFORCE(in.size() == out.size()); + for (size_t i = 0; i < in.size(); ++i) { + out[i] = ec_->HashToCurve(yc::HashToCurveStrategy::Autonomous, in[i]); + ec_->MulInplace(&out[i], sk_); + } +} + +void EcdhPsi::MaskEcPointsAndHashToU128(absl::Span in, + absl::Span out) const { + YACL_ENFORCE(!in.empty()); + YACL_ENFORCE(in.size() == out.size()); + for (size_t i = 0; i < in.size(); ++i) { + out[i] = yc::Blake3_128(ec_->SerializePoint(ec_->Mul(in[i], sk_))); + } +} + +// Mask input strings with secret key, and outputs the EcPoint results +std::vector EcdhPsi::MaskStringsEx( + std::vector in) const { + YACL_ENFORCE(!in.empty()); + std::vector out(in.size()); + for (size_t i = 0; i < in.size(); ++i) { + auto temp = ec_->HashToCurve(yc::HashToCurveStrategy::Autonomous, in[i]); + ec_->MulInplace(&temp, sk_); + out[i] = ec_->SerializePoint(temp); + } + return out; +} + +// Mask input strings with secret key, and outputs the EcPoint results +std::vector EcdhPsi::MaskEcPointsAndHashToU128Ex( + std::vector in) const { + YACL_ENFORCE(!in.empty()); + std::vector out(in.size()); + for (size_t i = 0; i < in.size(); ++i) { + auto temp = ec_->DeserializePoint(in[i]); + out[i] = yc::Blake3_128(ec_->SerializePoint(ec_->Mul(temp, sk_))); + } + return out; +} +} // namespace examples::psi diff --git a/examples/psi/ecdh_psi.h b/examples/psi/cpp/ecdh_psi.h similarity index 54% rename from examples/psi/ecdh_psi.h rename to examples/psi/cpp/ecdh_psi.h index d2bb0ab..41c61ec 100644 --- a/examples/psi/ecdh_psi.h +++ b/examples/psi/cpp/ecdh_psi.h @@ -19,13 +19,9 @@ #include "yacl/crypto/ecc/ec_point.h" #include "yacl/crypto/ecc/ecc_spi.h" -#include "yacl/link/link.h" -#include "yacl/secparam.h" namespace examples::psi { -namespace yc = yacl::crypto; - // An example of PSI protocol // // NOTE: this PSI protocol is designed solely for demonstation and is not ready, @@ -37,22 +33,40 @@ class EcdhPsi { public: EcdhPsi() { // Use FourQ curve - ec_ = yc::EcGroupFactory::Instance().Create(/* curve name */ "FourQ"); + ec_ = yacl::crypto::EcGroupFactory::Instance().Create( + /* curve name */ "FourQ"); // Generate random key - yc::MPInt::RandomLtN(ec_->GetOrder(), &sk_); + yacl::crypto::MPInt::RandomLtN(ec_->GetOrder(), &sk_); } + explicit EcdhPsi(const yacl::crypto::MPInt& sk) { sk_ = sk; } + // Mask input strings with secret key, and outputs the EcPoint results - void MaskStrings(absl::Span in, absl::Span out); + void MaskStrings(absl::Span in, + absl::Span out) const; // Mask input EcPoints with secret key, and outputs the serialized // EcPoint strings - void MaskEcPoints(absl::Span in, absl::Span out); + void MaskEcPointsAndHashToU128(absl::Span in, + absl::Span out) const; + + // ---------------------------- + // Extra functions (for Python) + // ---------------------------- + + // Mask input strings with secret key, and outputs the EcPoint results + std::vector MaskStringsEx(std::vector in) const; + + // Mask input strings with secret key, and outputs the EcPoint results + std::vector MaskEcPointsAndHashToU128Ex( + std::vector in) const; + + std::shared_ptr GetGroup() const { return ec_; } private: - yc::MPInt sk_; // secret key - std::shared_ptr ec_; // ec group + yacl::crypto::MPInt sk_; // secret key + std::shared_ptr ec_; // ec group }; } // namespace examples::psi diff --git a/examples/psi/cpp/ecdh_psi_main.cc b/examples/psi/cpp/ecdh_psi_main.cc new file mode 100644 index 0000000..b0b55af --- /dev/null +++ b/examples/psi/cpp/ecdh_psi_main.cc @@ -0,0 +1,163 @@ +// Copyright 2024 Ant Group Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include "examples/psi/cpp/ecdh_psi.h" +#include "examples/psi/cpp/main_utils.h" +#include "gflags/gflags.h" + +#include "yacl/link/context.h" +#include "yacl/utils/serialize.h" + +DEFINE_int32(rank, -1, "rank of the party: 0/1"); +DEFINE_string(path, "", "path to the input csv file"); + +// Declare alias +namespace yc = yacl::crypto; +using LCTX = std::unique_ptr; + +std::vector ProcessPeerData(const LCTX& lctx, + const examples::psi::EcdhPsi& protocol, + size_t peer_size) { + std::vector peer_points(peer_size); + std::vector peer_final(peer_size); + + // Receiving all peer's data + size_t recv_count = 0; + while (recv_count < peer_size) { + auto buf = lctx->Recv( + lctx->NextRank(), + fmt::format("[{}]: Recving peer masked values", lctx->Rank())); + peer_points[recv_count] = protocol.GetGroup()->DeserializePoint(buf); + recv_count++; + } + + YACL_ENFORCE_EQ(recv_count, peer_size); + + // Mask all peer's points + protocol.MaskEcPointsAndHashToU128(absl::MakeSpan(peer_points), + absl::MakeSpan(peer_final)); + + // Send back all informations + for (const auto& u128 : peer_final) { + lctx->Send( + lctx->NextRank(), yacl::SerializeUint128(u128), + fmt::format("[{}]: Sending peer double-masked values", lctx->Rank())); + } + + return peer_final; +} + +std::vector ProcessSelfData(const LCTX& lctx, + const examples::psi::EcdhPsi& protocol, + absl::Span self_data) { + size_t self_size = self_data.size(); + std::vector self_points(self_size); + std::vector self_final(self_size); + + // Mask self data + protocol.MaskStrings(absl::MakeSpan(self_data), absl::MakeSpan(self_points)); + + // Send masked self data + for (const auto& point : self_points) { + lctx->Send(lctx->NextRank(), protocol.GetGroup()->SerializePoint(point), + fmt::format("[{}]: Sending self masked values", lctx->Rank())); + } + + // Receiving double-masked self-data + size_t recv_count = 0; + while (recv_count < self_size) { + auto buf = lctx->Recv( + lctx->NextRank(), + fmt::format("[{}]: Recving peer masked values", lctx->Rank())); + self_final[recv_count] = yacl::DeserializeUint128(buf); + recv_count++; + } + YACL_ENFORCE_EQ(recv_count, self_size); + + return self_final; +} + +void StartPsi(int rank, const std::string& file_path) { + YACL_ENFORCE(rank == 0 || rank == 1, "Invalid Arguemnts: rank"); + YACL_ENFORCE(!file_path.empty()); + auto data_str = LoadCsv(file_path); + + // NOTE link::Context is not thread-safe + auto lctx = SetupLink(rank); + auto self_lctx = lctx->Spawn(fmt::format("{}", lctx->Rank())); + auto peer_lctx = lctx->Spawn(fmt::format("{}", lctx->NextRank())); + SPDLOG_INFO("Phase 0: Setup network, data, and everything else ... done"); + + // Phase 0.5: Exchange metadata + SPDLOG_INFO("Phase 0.5: Exchange metadata ... "); + lctx->SendAsync(lctx->NextRank(), yacl::SerializeUint128(data_str.size()), + fmt::format("[{}]: Data num = {}", rank, data_str.size())); + + auto peer_size = yacl::DeserializeInt128( + lctx->Recv(lctx->NextRank(), + fmt::format("[{}]: Data num = {}", rank, data_str.size()))); + SPDLOG_INFO("Phase 0.5: Exchange metadata ... done, got self={}, peer={}", + data_str.size(), peer_size); + + // Phase 1: Init protocol and start self and peer process (async) + SPDLOG_INFO("Phase 1: Init protocol and start peer process (async) ..."); + examples::psi::EcdhPsi protocol; + + auto peer_data_process = std::async( + [&]() { return ProcessPeerData(peer_lctx, protocol, peer_size); }); + + auto self_final = + ProcessSelfData(self_lctx, protocol, absl::MakeSpan(data_str)); + + auto peer_final = peer_data_process.get(); + + SPDLOG_INFO( + "Phase 1: Init protocol and start peer process (async) ... " + "done"); + + // Phase 2: Final comparison + SPDLOG_INFO("Phase 2: Trying to calculate the intersection locally ... "); + std::vector out; + std::set_intersection(self_final.begin(), self_final.end(), + peer_final.begin(), peer_final.end(), + std::back_inserter(out)); + SPDLOG_INFO( + "Phase 2: Trying to calculate the intersection locally ... done, got " + "intersection size = {}", + out.size()); + + lctx->WaitLinkTaskFinish(); + + SPDLOG_INFO("ECDH-PSI finished"); +} + +int main(int argc, char* argv[]) { + google::ParseCommandLineFlags(&argc, &argv, true); + + // Phase 0: Setup network, data, and everything else + SPDLOG_INFO("Phase 0: Setup network, data, and everything else ..."); + YACL_ENFORCE(FLAGS_rank == 0 || FLAGS_rank == 1, "Invalid Arguemnts: rank"); + + std::string file_path = + FLAGS_path.empty() ? fmt::format("{}/examples/psi/data_{}.csv", + std::filesystem::current_path().string(), + FLAGS_rank == 0 ? "a" : "b") + : FLAGS_path; + StartPsi(FLAGS_rank, file_path); + + return 0; +} diff --git a/examples/psi/ecdh_psi_test.cc b/examples/psi/cpp/ecdh_psi_test.cc similarity index 55% rename from examples/psi/ecdh_psi_test.cc rename to examples/psi/cpp/ecdh_psi_test.cc index 5f9a78d..a1421f0 100644 --- a/examples/psi/ecdh_psi_test.cc +++ b/examples/psi/cpp/ecdh_psi_test.cc @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "examples/psi/ecdh_psi.h" +#include "examples/psi/cpp/ecdh_psi.h" #include @@ -20,6 +20,8 @@ #include "yacl/crypto/hash/hash_utils.h" +namespace yc = yacl::crypto; + namespace examples::psi { namespace { @@ -30,9 +32,11 @@ std::vector CreateRangeItems(size_t begin, size_t size) { } return ret; } -inline std::vector GetIntersectionIdx( - const std::vector &x, const std::vector &y) { - std::set set(x.begin(), x.end()); + +template +inline std::vector GetIntersectionIdx(const std::vector &x, + const std::vector &y) { + std::set set(x.begin(), x.end()); std::vector ret; for (size_t i = 0; i < y.size(); ++i) { if (set.count(y[i]) != 0) { @@ -82,17 +86,19 @@ TEST(PsiTest, Works) { // ------------------- // Step 3 // ------------------- - std::vector y_str(n); + std::vector y_final(n); // y_str = y_points ^ {alice_sk} - alice.MaskEcPoints(absl::MakeSpan(y_points), absl::MakeSpan(y_str)); + alice.MaskEcPointsAndHashToU128(absl::MakeSpan(y_points), + absl::MakeSpan(y_final)); - std::vector x_str(n); + std::vector x_final(n); // x_str = x_points ^ {bob_sk} - bob.MaskEcPoints(absl::MakeSpan(x_points), absl::MakeSpan(x_str)); + bob.MaskEcPointsAndHashToU128(absl::MakeSpan(x_points), + absl::MakeSpan(x_final)); /* check results */ auto compare = GetIntersectionIdx(x, y); // result - auto z = GetIntersectionIdx(x_str, y_str); + auto z = GetIntersectionIdx(x_final, y_final); EXPECT_EQ(compare.size(), z.size()); @@ -101,4 +107,51 @@ TEST(PsiTest, Works) { } } +TEST(PsiExTest, Works) { + size_t n = 4; + auto x = CreateRangeItems(0, n); + auto y = CreateRangeItems(3, n); + + EcdhPsi alice; + EcdhPsi bob; + + // ------------------- + // Step 1 + // ------------------- + std::vector x_points = alice.MaskStringsEx(x); + std::vector y_points = bob.MaskStringsEx(y); + + // ------------------- + // Step 2 + // ------------------- + // + // Alice send x_points to bob, and bob send y_points to alice + // + // ... code here (omitted) ... + // + // You may mannually send the EcPoints through yacl::link::Context, which + // handles an RPC channel, see: yacl/link/context.h. You may also use any + // method that you like to let Alice talk to Bob. Remember the communication + // channel needs to be a secure P2P channel. + // + // Since most of communication methods only accept strings or bytes, you may + // serialize EcPoints by calling ec_->SerializePoint(/* ec points here */). + // see: yacl/ecc/ecc_spi.h for more details. + + // ------------------- + // Step 3 + // ------------------- + std::vector y_final = alice.MaskEcPointsAndHashToU128Ex(y_points); + std::vector x_final = bob.MaskEcPointsAndHashToU128Ex(x_points); + + /* check results */ + auto compare = GetIntersectionIdx(x, y); // result + auto z = GetIntersectionIdx(x_final, y_final); + + EXPECT_EQ(compare.size(), z.size()); + + for (size_t i = 0; i < z.size(); ++i) { + EXPECT_EQ(compare[i], z[i]); + } +} } // namespace examples::psi diff --git a/examples/psi/cpp/main_utils.h b/examples/psi/cpp/main_utils.h new file mode 100644 index 0000000..6253a48 --- /dev/null +++ b/examples/psi/cpp/main_utils.h @@ -0,0 +1,73 @@ +// Copyright 2024 Ant Group Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include + +#include "yacl/base/exception.h" +#include "yacl/io/rw/csv_reader.h" +#include "yacl/io/rw/schema.h" +#include "yacl/io/stream/file_io.h" +#include "yacl/io/stream/interface.h" +#include "yacl/link/context.h" +#include "yacl/link/factory.h" + +inline std::vector LoadCsv(const std::string& file_path) { + // File input stream + auto in = std::unique_ptr( + new yacl::io::FileInputStream(file_path)); + + // Read csv file + yacl::io::ReaderOptions reader_ops; + + // We only want to read the "ID" column + reader_ops.file_schema = {{/* target colum type */ yacl::io::Schema::STRING}, + {/* target column */ "ID"}}; + auto csv_reader = yacl::io::CsvReader(reader_ops, std::move(in)); + csv_reader.Init(); + + // Read in batch + std::vector out; + yacl::io::ColumnVectorBatch col_batch; + while (csv_reader.Next(&col_batch)) { + auto target_column = col_batch.Pop(0); + out.insert(out.end(), target_column.begin(), target_column.end()); + } + col_batch.Clear(); + + return out; +} +inline std::vector LoadCsv(int rank) { + YACL_ENFORCE(rank == 0 || rank == 1); + std::string file_path = fmt::format("{}/examples/psi/data_{}.csv", + std::filesystem::current_path().string(), + rank == 0 ? "a" : "b"); + return LoadCsv(file_path); +} + +inline std::shared_ptr SetupLink(int my_rank) { + size_t world_size = 2; + yacl::link::ContextDesc ctx_desc; + + for (size_t rank = 0; rank < world_size; rank++) { + const auto id = fmt::format("id-{}", rank); + const auto host = fmt::format("127.0.0.1:{}", 10086 + rank); + ctx_desc.parties.emplace_back(id, host); + } + auto lctx = yacl::link::FactoryBrpc().CreateContext(ctx_desc, my_rank); + lctx->ConnectToMesh(); + + return lctx; +} diff --git a/examples/psi/data/data_a.csv b/examples/psi/data/data_a.csv new file mode 100644 index 0000000..705cd1f --- /dev/null +++ b/examples/psi/data/data_a.csv @@ -0,0 +1,11 @@ +ID, VALUE +1, meaningless-values +2, meaningless-values +3, meaningless-values +4, meaningless-values +5, meaningless-values +6, meaningless-values +7, meaningless-values +8, meaningless-values +9, meaningless-values +10, meaningless-values diff --git a/examples/psi/data/data_b.csv b/examples/psi/data/data_b.csv new file mode 100644 index 0000000..1f6137b --- /dev/null +++ b/examples/psi/data/data_b.csv @@ -0,0 +1,9 @@ +ID, VALUE +6, meaningless-values +7, meaningless-values +8, meaningless-values +9, meaningless-values +10, meaningless-values +11, meaningless-values +12, meaningless-values +13, meaningless-values diff --git a/examples/psi/ecdh_psi.cc b/examples/psi/ecdh_psi.cc deleted file mode 100644 index ee21926..0000000 --- a/examples/psi/ecdh_psi.cc +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2023 Ant Group Co., Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "examples/psi/ecdh_psi.h" - -#include -#include - -#include "yacl/crypto/ecc/ec_point.h" -#include "yacl/crypto/ecc/ecc_spi.h" -#include "yacl/link/link.h" -#include "yacl/secparam.h" - -namespace examples::psi { - -void EcdhPsi::MaskStrings(absl::Span in, - absl::Span out) { - YACL_ENFORCE(in.size() == out.size()); - for (size_t i = 0; i < in.size(); ++i) { - out[i] = ec_->HashToCurve(yc::HashToCurveStrategy::Autonomous, in[i]); - ec_->MulInplace(&out[i], sk_); - } -} - -void EcdhPsi::MaskEcPoints(absl::Span in, - absl::Span out) { - YACL_ENFORCE(in.size() == out.size()); - for (size_t i = 0; i < in.size(); ++i) { - out[i] = ec_->SerializePoint(ec_->Mul(in[i], sk_)); - } -} - -} // namespace examples::psi diff --git a/examples/psi/java/BUILD.bazel b/examples/psi/java/BUILD.bazel new file mode 100644 index 0000000..7746627 --- /dev/null +++ b/examples/psi/java/BUILD.bazel @@ -0,0 +1,66 @@ +# Copyright 2023 Ant Group Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# +# NOTE Before running the following examples, please make sure you have +# correctly setup java developement environment. +# +# Example: +# export JAVA_HOME="$(dirname $(dirname $(realpath $(which javac))))" +# + +load("@rules_jni//jni:cc_jni_library.bzl", "cc_jni_library") +load("@rules_jni//jni:java_jni_library.bzl", "java_jni_library") + +package(default_visibility = ["//visibility:public"]) + +java_jni_library( + name = "EcdhPsi", + srcs = [ + "EcdhPsi.java", + ], + native_libs = [":ecdh_psi_jni"], +) + +java_test( + name = "EcdhPsiTest", + srcs = [ + "EcdhPsiTest.java", + ], + deps = [":EcdhPsi"], +) + +cc_library( + name = "jni_wrappers", + hdrs = ["jni_wrappers.h"], + deps = [ + "//yacl/base:exception", + "//yacl/base:int128", + "//yacl/crypto/hash:hash_utils", + "//yacl/math/mpint", + ], +) + +cc_jni_library( + name = "ecdh_psi_jni", + srcs = [ + "ecdh_psi_jni.cc", + ], + deps = [ + ":EcdhPsi.hdrs", # the generated headers + ":jni_wrappers", + "//examples/psi/cpp:ecdh_psi", + "//yacl/utils:serialize", + ], +) diff --git a/examples/psi/java/EcdhPsi.java b/examples/psi/java/EcdhPsi.java new file mode 100644 index 0000000..957cf9d --- /dev/null +++ b/examples/psi/java/EcdhPsi.java @@ -0,0 +1,61 @@ +// Copyright 2024 Ant Group Co., Ltd. # +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import com.github.fmeum.rules_jni.RulesJni; +import java.lang.annotation.Native; + +public class EcdhPsi { + static { + RulesJni.loadLibrary("ecdh_psi_jni", EcdhPsi.class); + } + + // Constructor + EcdhPsi() { + ec_key_ = jni_ecc_keygen(); + inited_ = true; + } + + public byte[][] MaskStrings(String[] in) { + if (!this.inited_) { + throw new IllegalArgumentException("EcdhPsi instance has not been inited"); + } + return jni_mask_strings(in, this.GetEcKey()); + } + + public byte[][] MaskEcPointAndHashTo128(byte[][] in) { + if (!this.inited_) { + throw new IllegalArgumentException("EcdhPsi instance has not been inited"); + } + return jni_mask_ec_point_and_hash_to_u128(in, this.GetEcKey()); + } + + byte[] GetEcKey() { + return ec_key_; + } + + private byte[] ec_key_; + private boolean inited_ = false; + + // ---------------------------- + // Native Functions Declaration + // ---------------------------- + // + // NOTE the gerenated c header (*.h) file could be found at + // bazel-bin/examples/psi/java/EcdhPsi.hdrs.h/EcdhPsi.h + + public static native byte[] jni_ecc_keygen(); + + public static native byte[][] jni_mask_strings(String[] in, byte[] ec_key); + + public static native byte[][] jni_mask_ec_point_and_hash_to_u128(byte[][] in, byte[] ec_key); +} diff --git a/examples/psi/java/EcdhPsiTest.java b/examples/psi/java/EcdhPsiTest.java new file mode 100644 index 0000000..f0ca784 --- /dev/null +++ b/examples/psi/java/EcdhPsiTest.java @@ -0,0 +1,72 @@ +// Copyright 2023 Ant Group Co., Ltd. # +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import static org.junit.Assert.*; + +import java.util.Arrays; +import org.junit.Test; + +public class EcdhPsiTest { + @Test + public void load_test() { + new EcdhPsi(); // should not throw any error + } + + @Test + public void ecdh_psi_test() { + EcdhPsi alice = new EcdhPsi(); + EcdhPsi bob = new EcdhPsi(); + + // the generated ec keys by two difference instances should not be the same + assertEquals(alice.GetEcKey().length, bob.GetEcKey().length); + assertFalse(Arrays.equals(alice.GetEcKey(), bob.GetEcKey())); + + int n = 4; + assertTrue(n > 3); // at least one intersection + String[] x = create_range_items(0, n); // alice's data + String[] y = create_range_items(3, n); // bob's data + + // ------------------- + // Protocol execution + // ------------------- + byte[][] x_mask = alice.MaskStrings(x); // x_points = H(x) ^ {alice_sk} + byte[][] y_mask = bob.MaskStrings(y); // y_points = H(y) ^ {bob_sk} + + byte[][] x_final = bob.MaskEcPointAndHashTo128(x_mask); + byte[][] y_final = alice.MaskEcPointAndHashTo128(y_mask); + + // ------------------- + // Check + // ------------------- + for (int i = 0; i < n - 3; ++i) { + assertTrue(bytes_to_hex_string(x_final[3 + i]).equals(bytes_to_hex_string(y_final[i]))); + } + } + + private String bytes_to_hex_string(byte[] in) { + StringBuilder sb = new StringBuilder(); + for (byte b : in) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } + + private String[] create_range_items(int begin, int size) { + String[] ret = new String[size]; + + for (int i = 0; i < size; i++) { + ret[i] = Integer.toString(begin + i); + } + return ret; + } +} diff --git a/examples/psi/java/ecdh_psi_jni.cc b/examples/psi/java/ecdh_psi_jni.cc new file mode 100644 index 0000000..a5c2b72 --- /dev/null +++ b/examples/psi/java/ecdh_psi_jni.cc @@ -0,0 +1,101 @@ +// Copyright 2024 Ant Group Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "examples/psi/cpp/ecdh_psi.h" +#include "examples/psi/java/EcdhPsi.hdrs.h/EcdhPsi.h" +#include "examples/psi/java/jni_wrappers.h" + +#include "yacl/math/mpint/mp_int.h" +#include "yacl/utils/serialize.h" + +namespace yc = yacl::crypto; + +/* + * Class: EcdhPsi + * Method: jni_ecc_keygen + * Signature: ()[B + */ +JNIEXPORT jbyteArray JNICALL Java_EcdhPsi_jni_1ecc_1keygen(JNIEnv *env, + jclass java_class) { + yacl::math::MPInt sk; + auto ec = yc::EcGroupFactory::Instance().Create("FourQ"); + yc::MPInt::RandomLtN(ec->GetOrder(), &sk); + auto buf = sk.Serialize(); + return jni::buffer_to_jbyteArrary(env, sk.Serialize()); +} + +/* + * Class: EcdhPsi + * Method: jni_mask_strings + * Signature: ([Ljava/lang/String;[B)[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL +Java_EcdhPsi_jni_1mask_1strings(JNIEnv *env, jclass java_class, + jobjectArray in_bytes, jbyteArray sk_bytes) { + // Setup + int len = env->GetArrayLength(in_bytes); + auto ec = yc::EcGroupFactory::Instance().Create("FourQ"); + yacl::math::MPInt sk; + sk.Deserialize(jni::jbyteArray_to_bytes(env, sk_bytes)); + + // Declare the output jobjectArray + jclass bytearray_class = env->FindClass("[B"); + jobjectArray out = env->NewObjectArray(len, bytearray_class, NULL); + + // For each input jstring, hash to curve and mul + for (int i = 0; i < len; i++) { + auto temp_in = jni::jstring_to_string( + env, (jstring)env->GetObjectArrayElement(in_bytes, i)); + auto temp_out = + ec->HashToCurve(yc::HashToCurveStrategy::Autonomous, temp_in); + ec->MulInplace(&temp_out, sk); + auto buffer = ec->SerializePoint(temp_out); + env->SetObjectArrayElement(out, i, jni::buffer_to_jbyteArrary(env, buffer)); + } + return out; +} + +/* + * Class: EcdhPsi + * Method: jni_mask_ec_point_and_hash_to_u128 + * Signature: ([Ljava/lang/String;[B)[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL +Java_EcdhPsi_jni_1mask_1ec_1point_1and_1hash_1to_1u128(JNIEnv *env, + jclass java_class, + jobjectArray in_bytes, + jbyteArray sk_bytes) { + // Setup + int len = env->GetArrayLength(in_bytes); + auto ec = yc::EcGroupFactory::Instance().Create("FourQ"); + yacl::math::MPInt sk; + sk.Deserialize(jni::jbyteArray_to_bytes(env, sk_bytes)); + + // Declare the output jobjectArray + jclass bytearray_class = env->FindClass("[B"); + jobjectArray out = env->NewObjectArray(len, bytearray_class, NULL); + + // For each input jstring, hash to curve and mul + for (int i = 0; i < len; i++) { + auto temp_in = ec->DeserializePoint(jni::jbyteArray_to_bytes( + env, (jbyteArray)env->GetObjectArrayElement(in_bytes, i))); + auto temp_out = + yacl::crypto::Blake3_128(ec->SerializePoint(ec->Mul(temp_in, sk))); + + yacl::Buffer buf(sizeof(uint128_t)); + memcpy(buf.data(), &temp_out, buf.size()); + env->SetObjectArrayElement(out, i, jni::buffer_to_jbyteArrary(env, buf)); + } + return out; +} diff --git a/examples/psi/java/jni_wrappers.h b/examples/psi/java/jni_wrappers.h new file mode 100644 index 0000000..4ad447a --- /dev/null +++ b/examples/psi/java/jni_wrappers.h @@ -0,0 +1,81 @@ +// Copyright 2023 Ant Group Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +#include + +#include "yacl/base/byte_container_view.h" +#include "yacl/base/exception.h" +#include "yacl/base/int128.h" +#include "yacl/crypto/hash/hash_utils.h" +#include "yacl/math/mpint/mp_int.h" + +namespace jni { + +inline jbyteArray buffer_to_jbyteArrary(JNIEnv *env, + yacl::ByteContainerView in) { + const auto *by = reinterpret_cast(in.data()); + jbyteArray ret = env->NewByteArray(in.size()); + env->SetByteArrayRegion(ret, 0, in.size(), by); + return ret; +} + +inline std::vector jbyteArray_to_bytes(JNIEnv *env, jbyteArray in) { + jbyte *in_ptr = env->GetByteArrayElements(in, nullptr); + uint64_t in_len = (uint64_t)env->GetArrayLength(in); + std::vector ret(in_len); + std::memcpy(ret.data(), in_ptr, in_len); + env->ReleaseByteArrayElements(in, in_ptr, 0); + return ret; +} + +inline uint128_t jbyteArray_to_uint128(JNIEnv *env, jbyteArray in) { + jbyte *in_ptr = env->GetByteArrayElements(in, nullptr); + size_t in_len = env->GetArrayLength(in); + YACL_ENFORCE(in_len >= 16); + + uint128_t ret = 0; + for (int i = 0; i < 16; i++) { + // Shifting previous value 8 bits to right and + // add it with next value + char b = *(in_ptr + i); + ret = (ret << 8) + (b & 255); + } + env->ReleaseByteArrayElements(in, in_ptr, 0); + return ret; +} + +inline std::vector jlongArray_to_longs(JNIEnv *env, jlongArray in) { + jlong *in_ptr = env->GetLongArrayElements(in, nullptr); + uint64_t in_len = (uint64_t)env->GetArrayLength(in); + std::vector ret; + for (uint64_t i = 0; i < in_len; i++) { + ret.emplace_back(static_cast(in_ptr[i])); + } + env->ReleaseLongArrayElements(in, in_ptr, 0); + return ret; +} + +inline std::string jstring_to_string(JNIEnv *env, jstring in) { + jboolean isCopy; + const char *convertedValue = (env)->GetStringUTFChars(in, &isCopy); + std::string ret = convertedValue; + env->ReleaseStringUTFChars(in, convertedValue); + return ret; +} + +} // namespace jni \ No newline at end of file diff --git a/examples/psi/python/BUILD.bazel b/examples/psi/python/BUILD.bazel new file mode 100644 index 0000000..35756d5 --- /dev/null +++ b/examples/psi/python/BUILD.bazel @@ -0,0 +1,66 @@ +# Copyright 2021 Ant Group Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@pybind11_bazel//:build_defs.bzl", "pybind_extension") +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files( + [ + "exported_symbols.lds", + "version_script.lds", + ], + visibility = ["//visibility:private"], +) + +pybind_extension( + name = "ecdh_psi_pybind", + srcs = [ + "ecdh_psi_pybind.cc", + "ecdh_psi_pybind.h", + ], + linkopts = select({ + "@bazel_tools//src/conditions:darwin": [ + "-Wl,-exported_symbols_list,$(location //examples/psi/python:exported_symbols.lds)", + ], + "//conditions:default": [ + "-Wl,--version-script,$(location //examples/psi/python:version_script.lds)", + ], + }), + deps = [ + ":exported_symbols.lds", + ":version_script.lds", + "//yacl/crypto/ecc", + "//yacl/crypto/hash:hash_utils", + ], +) + +py_library( + name = "ecdh_psi", + srcs = [ + "ecdh_psi.py", + ], + data = [":ecdh_psi_pybind.so"], + imports = ["."], # see: https://stackoverflow.com/questions/62372725/bazel-test-importerror-relative-import +) + +py_test( + name = "ecdh_psi_test", + srcs = [ + "ecdh_psi_test.py", + ], + imports = ["."], # see: https://stackoverflow.com/questions/62372725/bazel-test-importerror-relative-import + deps = [":ecdh_psi"], +) diff --git a/examples/psi/python/ecdh_psi.py b/examples/psi/python/ecdh_psi.py new file mode 100644 index 0000000..079031a --- /dev/null +++ b/examples/psi/python/ecdh_psi.py @@ -0,0 +1,26 @@ +# Copyright 2024 Ant Group Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ecdh_psi_pybind.libs import EcdhPsiCC + +class EcdhPsi: + + def __init__(self): + self.cc_impl = EcdhPsiCC() + + def mask_strs(self, x): + return self.cc_impl.MaskStrings(x); + + def mask_ec_points_and_hash_to_u128(self, x): + return self.cc_impl.MaskEcPointsAndHashToU128(x); diff --git a/examples/psi/python/ecdh_psi_pybind.cc b/examples/psi/python/ecdh_psi_pybind.cc new file mode 100644 index 0000000..c38bc5b --- /dev/null +++ b/examples/psi/python/ecdh_psi_pybind.cc @@ -0,0 +1,42 @@ +// Copyright 2024 Ant Group Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "examples/psi/python/ecdh_psi_pybind.h" + +#include "pybind11/complex.h" +#include "pybind11/functional.h" +#include "pybind11/pybind11.h" +#include "pybind11/stl.h" + +#define NO_GIL py::call_guard() + +namespace examples::psi { + +void BindLibs(py::module& m) { + // see: + // https://pybind11.readthedocs.io/en/stable/advanced/cast/strings.html#returning-c-strings-to-python + // NOTE When a C++ function returns a std::string or char* to a Python caller, + // pybind11 will assume that the string is valid UTF-8 + py::class_(m, "EcdhPsiCC", "The ECDH PSI protocol class") + .def(py::init<>()) + .def("MaskStrings", &EcdhPsiPy::MaskStrings) + .def("MaskEcPointsAndHashToU128", &EcdhPsiPy::MaskEcPointsAndHashToU128); +} + +PYBIND11_MODULE(ecdh_psi_pybind, m) { + py::module libs_m = m.def_submodule("libs"); + BindLibs(libs_m); +} + +} // namespace examples::psi diff --git a/examples/psi/python/ecdh_psi_pybind.h b/examples/psi/python/ecdh_psi_pybind.h new file mode 100644 index 0000000..b812512 --- /dev/null +++ b/examples/psi/python/ecdh_psi_pybind.h @@ -0,0 +1,85 @@ +// Copyright 2024 Ant Group Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include + +#include "pybind11/complex.h" +#include "pybind11/functional.h" +#include "pybind11/pybind11.h" +#include "pybind11/stl.h" +#include "pybind11/typing.h" + +#include "yacl/crypto/ecc/ec_point.h" +#include "yacl/crypto/ecc/ecc_spi.h" +#include "yacl/crypto/hash/hash_utils.h" + +namespace py = pybind11; +namespace yc = yacl::crypto; + +namespace examples::psi { + +// An example of PSI protocol +// +// NOTE: this PSI protocol is designed solely for demonstation and is not +// ready, or designed for production use, please do not use this in +// production. +// +// NOTE: we recommend user to use https://github.com/secretflow/psi +// +class EcdhPsiPy { + public: + EcdhPsiPy() { + // Use FourQ curve + ec_ = yacl::crypto::EcGroupFactory::Instance().Create( + /* curve name */ "FourQ"); + + // Generate random key + yacl::crypto::MPInt::RandomLtN(ec_->GetOrder(), &sk_); + } + + explicit EcdhPsiPy(const yacl::crypto::MPInt& sk) { sk_ = sk; } + + // Mask input strings with secret key, and outputs the EcPoint results + std::vector MaskStrings(std::vector in) const { + YACL_ENFORCE(!in.empty()); + std::vector out(in.size()); + for (size_t i = 0; i < in.size(); ++i) { + auto temp = ec_->HashToCurve(yc::HashToCurveStrategy::Autonomous, in[i]); + ec_->MulInplace(&temp, sk_); + out[i] = py::bytes(std::string(ec_->SerializePoint(temp))); + } + return out; + } + + // Mask input strings with secret key, and outputs the EcPoint results + std::vector MaskEcPointsAndHashToU128( + std::vector in) const { + YACL_ENFORCE(!in.empty()); + std::vector out(in.size()); + for (size_t i = 0; i < in.size(); ++i) { + auto temp = ec_->DeserializePoint(in[i]); + out[i] = yc::Blake3_128(ec_->SerializePoint(ec_->Mul(temp, sk_))); + } + return out; + } + + private: + yacl::crypto::MPInt sk_; // secret key + std::shared_ptr ec_; // ec group +}; + +} // namespace examples::psi diff --git a/examples/psi/python/ecdh_psi_test.py b/examples/psi/python/ecdh_psi_test.py new file mode 100644 index 0000000..f5b86e3 --- /dev/null +++ b/examples/psi/python/ecdh_psi_test.py @@ -0,0 +1,46 @@ +# Copyright 2024 Ant Group Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ecdh_psi import EcdhPsi +import unittest + +def intersection_idx(lst1, lst2): + ret_list = [] + for item in list(set(lst1) & set(lst2)): + ret_list.append(lst1.index(item)) + return ret_list + +class EcdhTest(unittest.TestCase): + + def test_full(self): + alice = EcdhPsi() + bob = EcdhPsi() + + alice_data = [str(i) for i in range(0, 4)] + bob_data = [str(i) for i in range(3, 7)] + + alice_masked_data = alice.mask_strs(alice_data) + bob_masked_data = bob.mask_strs(bob_data) + + bob_final_data = alice.mask_ec_points_and_hash_to_u128(bob_masked_data) + alice_final_data = bob.mask_ec_points_and_hash_to_u128(alice_masked_data) + + check = intersection_idx(alice_data, bob_data) + result = intersection_idx(alice_final_data, bob_final_data) + + for i in range(len(check)): + self.assertTrue(check[i] == result[i]) + +if __name__ == "__main__": + unittest.main() diff --git a/examples/psi/python/exported_symbols.lds b/examples/psi/python/exported_symbols.lds new file mode 100644 index 0000000..2637585 --- /dev/null +++ b/examples/psi/python/exported_symbols.lds @@ -0,0 +1 @@ +_PyInit_* \ No newline at end of file diff --git a/examples/psi/python/version_script.lds b/examples/psi/python/version_script.lds new file mode 100644 index 0000000..a7e3bc0 --- /dev/null +++ b/examples/psi/python/version_script.lds @@ -0,0 +1,9 @@ +VERS_1.0 { + # Export symbols in pybind. + global: + PyInit_*; + + # Hide everything else. + local: + *; +}; diff --git a/yacl/io/circuit/BUILD.bazel b/yacl/io/circuit/BUILD.bazel index 34458be..707f93c 100644 --- a/yacl/io/circuit/BUILD.bazel +++ b/yacl/io/circuit/BUILD.bazel @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("//bazel:yacl.bzl", "yacl_cc_binary", "yacl_cc_library", "yacl_cc_test") +load("//bazel:yacl.bzl", "yacl_cc_library", "yacl_cc_test") package(default_visibility = ["//visibility:public"]) diff --git a/yacl/io/rw/csv_reader.h b/yacl/io/rw/csv_reader.h index 3848971..07d116c 100644 --- a/yacl/io/rw/csv_reader.h +++ b/yacl/io/rw/csv_reader.h @@ -38,6 +38,8 @@ class CsvReader : public Reader { }; public: + // NOTE You need to setup each item in the options before calling the + // constructor of CsvReader. CsvReader(ReaderOptions options, std::unique_ptr in, char field_delimiter = ',', char line_delimiter = '\n'); diff --git a/yacl/link/transport/BUILD.bazel b/yacl/link/transport/BUILD.bazel index cba845e..05efbe4 100644 --- a/yacl/link/transport/BUILD.bazel +++ b/yacl/link/transport/BUILD.bazel @@ -13,8 +13,7 @@ # limitations under the License. load("@rules_cc//cc:defs.bzl", "cc_proto_library") -load("@rules_proto//proto:defs.bzl", "proto_library") -load("//bazel:yacl.bzl", "yacl_cc_binary", "yacl_cc_library", "yacl_cc_test") +load("//bazel:yacl.bzl", "yacl_cc_library", "yacl_cc_test") package(default_visibility = ["//visibility:public"]) diff --git a/yacl/utils/spi/BUILD.bazel b/yacl/utils/spi/BUILD.bazel index 855a78a..5a57235 100644 --- a/yacl/utils/spi/BUILD.bazel +++ b/yacl/utils/spi/BUILD.bazel @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("//bazel:yacl.bzl", "yacl_cc_binary", "yacl_cc_library", "yacl_cc_test") +load("//bazel:yacl.bzl", "yacl_cc_library", "yacl_cc_test") package(default_visibility = ["//visibility:public"]) diff --git a/yacl/utils/spi/argument/BUILD.bazel b/yacl/utils/spi/argument/BUILD.bazel index 527aeba..06b8e37 100644 --- a/yacl/utils/spi/argument/BUILD.bazel +++ b/yacl/utils/spi/argument/BUILD.bazel @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("//bazel:yacl.bzl", "yacl_cc_binary", "yacl_cc_library", "yacl_cc_test") +load("//bazel:yacl.bzl", "yacl_cc_library", "yacl_cc_test") package(default_visibility = ["//visibility:public"])

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 CTQbQ2 literal 0 HcmV?d00001 diff --git a/docs/imgs/ecdh_psi_2.png b/docs/imgs/ecdh_psi_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4061091f48ecb27a7aaa4dd6e8892b57b218ce GIT binary patch literal 110821 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