blsful 4.0.0

BLS signature implementation according to the IETF spec on the BLS12-381 curve.
Documentation
//! This crate implements BLS signatures according to the latest IETF draft for
//! the proof-of-possession cipher suite.
//!
//! Because BLS signatures can use either the G1 or G2 group, there are two types of
//! public keys and signatures.
#![deny(unsafe_code)]
#![warn(
    missing_docs,
    trivial_casts,
    trivial_numeric_casts,
    unused_import_braces,
    unused_qualifications
)]

#[cfg(all(not(feature = "rust"), not(feature = "blst")))]
compile_error!("At least `rust` or `blst` must be selected");

#[macro_use]
mod macros;
mod helpers;

use helpers::*;

mod aggregate_signature;
mod elgamal_ciphertext;
mod elgamal_decryption_share;
mod elgamal_proof;
mod error;
mod impls;
mod multi_public_key;
mod multi_signature;
mod proof_commitment;
mod proof_of_knowledge;
mod proof_of_possession;
mod public_key;
mod public_key_share;
mod secret_key;
mod secret_key_share;
mod sig_types;
mod sign_crypt_ciphertext;
mod sign_decryption_share;
mod signature;
mod signature_share;
mod time_crypt_ciphertext;
mod traits;

pub use error::*;
pub use impls::*;

pub use aggregate_signature::*;
pub use elgamal_ciphertext::*;
pub use elgamal_decryption_share::*;
pub use elgamal_proof::*;
pub use multi_public_key::*;
pub use multi_signature::*;
pub use proof_commitment::*;
pub use proof_of_knowledge::*;
pub use proof_of_possession::*;
pub use public_key::*;
pub use public_key_share::*;
pub use secret_key::*;
pub use secret_key_share::*;
pub use sig_types::*;
pub use sign_crypt_ciphertext::*;
pub use sign_decryption_share::*;
pub use signature::*;
pub use signature_share::*;
pub use time_crypt_ciphertext::*;
pub use traits::*;

pub use vsss_rs;

use inner_types::*;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::{
    fmt::{self, Display, Formatter, LowerHex, UpperHex},
    hash::Hash,
};
use subtle::Choice;
use vsss_rs::{GroupShare, IdentifierPrimeField, PrimeFieldShare, Share, ValueGroup};
use zeroize::DefaultIsZeroes;

impl_inner_point_share!(
    InnerPointShareG1,
    "for points in G1",
    G1Projective,
    G1Affine,
    [.identifier.0],
    [.value.0]
);

impl_inner_point_share!(
    InnerPointShareG2,
    "for points in G2",
    G2Projective,
    G2Affine,
    [.identifier],
    [.value]
);

impl DefaultIsZeroes for InnerPointShareG2 {}