bulletproofs_bls/
lib.rs

1#![cfg_attr(not(feature = "std"), no_std)]
2#![cfg_attr(feature = "docs", feature(external_doc))]
3#![cfg_attr(feature = "docs", deny(missing_docs))]
4#![cfg_attr(feature = "docs", doc(include = "../README.md"))]
5#![cfg_attr(
6    feature = "docs",
7    doc(html_root_url = "https://docs.rs/bulletproofs/4.0.0")
8)]
9
10extern crate alloc;
11
12#[cfg(all(not(feature = "rust"), not(feature = "blst")))]
13compile_error!("At least `rust` or `blst` must be selected");
14
15pub mod inner_types {
16    #[cfg(not(feature = "blst"))]
17    pub use bls12_381_plus::{
18        elliptic_curve::hash2curve::{ExpandMsgXof, ExpandMsgXmd},
19        ff::{Field, PrimeField},
20        group::{Curve, Group, GroupEncoding},
21        *,
22    };
23
24    #[cfg(feature = "blst")]
25    pub use blstrs_plus::{
26        elliptic_curve::hash2curve::{ExpandMsgXof, ExpandMsgXmd},
27        ff::{Field, PrimeField},
28        group::{Curve, Group, GroupEncoding},
29        pairing_lib::{MillerLoopResult, MultiMillerLoop},
30        *,
31    };
32}
33
34mod util;
35
36#[cfg_attr(feature = "docs", doc(include = "../docs/notes-intro.md"))]
37mod notes {
38    #[cfg_attr(feature = "docs", doc(include = "../docs/notes-ipp.md"))]
39    mod inner_product_proof {}
40    #[cfg_attr(feature = "docs", doc(include = "../docs/notes-rp.md"))]
41    mod range_proof {}
42    #[cfg_attr(feature = "docs", doc(include = "../docs/notes-r1cs.md"))]
43    mod r1cs_proof {}
44}
45
46mod errors;
47mod generators;
48mod inner_product_proof;
49mod linear_proof;
50mod range_proof;
51mod transcript;
52
53pub use crate::errors::ProofError;
54pub use crate::generators::{BulletproofGens, BulletproofGensShare, PedersenGens};
55pub use crate::linear_proof::LinearProof;
56pub use crate::range_proof::RangeProof;
57use subtle::Choice;
58
59const HASH_DST: &[u8] = b"BLS12381G1_XOF:SHAKE-256_SSWU_RO_";
60
61trait CtOptionOps<T> {
62    fn ok_or<E>(self, err: E) -> Result<T, E>;
63}
64
65impl<T> CtOptionOps<T> for subtle::CtOption<T> {
66    fn ok_or<E>(self, err: E) -> Result<T, E> {
67        if self.is_some().unwrap_u8() == 1u8 {
68            Ok(self.unwrap())
69        } else {
70            Err(err)
71        }
72    }
73}
74
75impl CtOptionOps<()> for Choice {
76    fn ok_or<E>(self, err: E) -> Result<(), E> {
77        if self.unwrap_u8() == 1u8 {
78            Ok(())
79        } else {
80            Err(err)
81        }
82    }
83}
84
85#[cfg_attr(feature = "docs", doc(include = "../docs/aggregation-api.md"))]
86pub mod range_proof_mpc {
87    pub use crate::errors::MPCError;
88    pub use crate::range_proof::dealer;
89    pub use crate::range_proof::messages;
90    pub use crate::range_proof::party;
91}
92
93#[cfg(feature = "yoloproofs")]
94#[cfg(feature = "std")]
95pub mod r1cs;