diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..c12059b --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,149 @@ +name: CI + +on: + push: + branches: + - main + tags: + - 'v*.*.*' + pull_request: + types: [ opened, synchronize, reopened ] + branches: + - main +env: + CARGO_TERM_COLOR: always + +jobs: + test: + name: test ${{ matrix.rust }} ${{ matrix.flags }} + runs-on: ubuntu-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + rust: [ "stable", "beta", "nightly", "1.65" ] # MSRV + flags: [ "--no-default-features", "", "--all-features" ] + exclude: + # Skip because some features have highest MSRV. + - rust: "1.65" # MSRV + flags: "--all-features" + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.rust }} + - uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + # Only run tests on the latest stable and above + - name: check + if: ${{ matrix.rust == '1.65' }} # MSRV + run: cargo check --workspace ${{ matrix.flags }} + - name: test + if: ${{ matrix.rust != '1.65' }} # MSRV + run: cargo test --workspace ${{ matrix.flags }} + + coverage: + name: Code Coverage + runs-on: ubuntu-latest + env: + LLVMCOV_VERSION: 0.5.14 + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + override: true + profile: minimal + components: clippy, rustfmt + + - name: Cache rust dependencies + uses: Swatinem/rust-cache@v2 + with: + shared-key: rust-cache-hyper-server-coverage-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}-${{ env.LLVMCOV_VERSION }} + + - name: Install cargo-llvm-cov + run: cargo install cargo-llvm-cov --version=${{ env.LLVMCOV_VERSION }} --locked + + - name: Generate code coverage + run: cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos + files: lcov.info + fail_ci_if_error: false + +# TODO(Miri presently has errors/detects undefined behavior in the codebase) +# We should fix this and then enable. +# miri: +# name: miri ${{ matrix.flags }} +# runs-on: ubuntu-latest +# timeout-minutes: 30 +# strategy: +# fail-fast: false +# matrix: +# flags: [ "--no-default-features", "", "--all-features" ] +# env: +# MIRIFLAGS: -Zmiri-strict-provenance +# steps: +# - uses: actions/checkout@v3 +# - uses: dtolnay/rust-toolchain@miri +# - uses: Swatinem/rust-cache@v2 +# with: +# cache-on-failure: true +# - run: cargo miri setup ${{ matrix.flags }} +# - run: cargo miri test ${{ matrix.flags }} + + feature-checks: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@stable + - uses: taiki-e/install-action@cargo-hack + - uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + - name: cargo hack + run: cargo hack check --feature-powerset --depth 2 + + clippy: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@clippy + - uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + - run: cargo clippy --workspace --all-targets --all-features + env: + RUSTFLAGS: -Dwarnings + + docs: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@nightly + - uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + - run: cargo doc --workspace --all-features --no-deps --document-private-items + env: + RUSTDOCFLAGS: "--cfg docsrs -D warnings" + + fmt: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@nightly + with: + components: rustfmt + - run: cargo fmt --all --check \ No newline at end of file diff --git a/.github/workflows/audit-on-push.yml b/.github/workflows/audit-on-push.yml new file mode 100644 index 0000000..e46bb3c --- /dev/null +++ b/.github/workflows/audit-on-push.yml @@ -0,0 +1,14 @@ +name: Security audit +on: + push: + paths: + - '**/Cargo.toml' + - '**/Cargo.lock' +jobs: + security_audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions-rs/audit-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/scheduled-audit.yml b/.github/workflows/scheduled-audit.yml new file mode 100644 index 0000000..d7ec872 --- /dev/null +++ b/.github/workflows/scheduled-audit.yml @@ -0,0 +1,12 @@ +name: Security audit +on: + schedule: + - cron: '0 0 * * *' +jobs: + security_audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions-rs/audit-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index e13d444..efc085d 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,7 @@ Cargo.lock *.pdb # Development jupyter notebook business -notebooks/.ipynb_checkpoints \ No newline at end of file +notebooks/.ipynb_checkpoints + +# RustRover +/.idea diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..4843ee6 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,20 @@ +[package] +authors = ["Tristan Britt ", "0xAlcibiades "] +categories = ["cryptography", "mathematics"] +description = "Implementation of the BLS signature scheme using the alt-bn128 curve." +homepage = "https://github.com/warlock-labs/alt-bn128-bls" +keywords = ["alt-bn128", "bls", "cryptography", "elliptic-curve", "pairing"] +license = "MIT" +readme = "README.md" +repository = "https://github.com/warlock-labs/alt-bn128-bls.git" +name = "alt-bn128-bls" +version = "0.0.1" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +[lib] + +[dev-dependencies] \ No newline at end of file diff --git a/LICENSE b/LICENSE index f4eac49..9be723e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Warlock +Copyright 2024 Warlock Labs Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 6a47c01..10b0078 100644 --- a/README.md +++ b/README.md @@ -1 +1,77 @@ -# alt-bn128-bls \ No newline at end of file +# alt-bn128-bls + +[![License](https://img.shields.io/crates/l/alt-bn128-bls)](https://choosealicense.com/licenses/mit/) +[![Crates.io](https://img.shields.io/crates/v/alt-bn128-bls)](https://crates.io/crates/alt-bn128-bls) +[![Docs](https://img.shields.io/crates/v/alt-bn128-bls?color=blue&label=docs)](https://docs.rs/alt-bn128-bls/) +![CI](https://github.com/warlock-labs/alt-bn128-bls/actions/workflows/CI.yml/badge.svg) + +alt-bn128-bls is a Rust library implementing the BLS (Boneh-Lynn-Shacham) signature scheme using the alt-bn128 (BN254) elliptic curve. It provides threshold signing capabilities and associated utilities, initially developed for use in the Warlock Chaos product. + +## Features + +- Implementation of BLS signatures on the alt-bn128 (BN254) curve +- Support for threshold signatures +- Efficient pairing operations leveraging the alt-bn128 curve's properties +- Utilities for key generation, signing, and verification +- Compatibility with Ethereum's precompiled contracts for alt-bn128 operations + +## Usage + +Add this to your `Cargo.toml`: + +```toml +[dependencies] +alt-bn128-bls = "0.0.1" +``` + +Here's a basic example of generating a key pair, signing a message, and verifying the signature: + +```rust +use alt_bn128_bls::{KeyPair, sign, verify}; + +fn main() { + let key_pair = KeyPair::generate(); + let message = b"Hello, World!"; + + let signature = sign(&key_pair.secret_key, message); + assert!(verify(&key_pair.public_key, message, &signature)); +} +``` + +For more examples and usage details, see the [API documentation](https://docs.rs/alt-bn128-bls). + +## Core Concepts + +- **BLS Signatures**: A signature scheme allowing for signature aggregation and threshold signing. +- **alt-bn128 (BN254) Curve**: An elliptic curve with efficient pairing operations, widely used in zkSNARKs and supported by Ethereum precompiles. +- **Threshold Signatures**: A cryptographic primitive allowing a subset of parties to collaboratively sign messages. + +## Performance + +The alt-bn128 curve is chosen for its efficiency and widespread support, particularly in Ethereum and other EVM-compatible blockchains. The library aims to provide optimal performance for BLS operations on this curve. + +## Roadmap + +The following features and improvements are planned for future releases: + +- [ ] Basic BLS signature implementation +- [ ] Key generation utilities +- [ ] Signature aggregation +- [ ] Threshold signature scheme +- [ ] Optimizations for common operations +- [ ] Extended test suite and benchmarks +- [ ] Support for serialization formats used in blockchain contexts + +## Contributing + +Contributions are welcome! Please feel free to submit issues, feature requests, or pull requests on the [GitHub repository](https://github.com/warlock-labs/alt-bn128-bls). + +## License + +This project is licensed under the [MIT License](https://choosealicense.com/licenses/mit/). + +## Contact + +Warlock Labs - [https://github.com/warlock-labs](https://github.com/warlock-labs) + +Project Link: [https://github.com/warlock-labs/alt-bn128-bls](https://github.com/warlock-labs/alt-bn128-bls) \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ +