4 releases
0.0.1-sol5 | May 1, 2020 |
---|---|
0.0.1-sol4 | Oct 25, 2019 |
0.0.0 | Aug 6, 2019 |
0.0.0-sol9 |
|
0.0.0-sol15 | Jul 27, 2019 |
#32 in #libra
130 downloads per month
Used in 23 crates
(2 directly)
19KB
367 lines
This crate contains three types of derive macros:
- the
SilentDebug
and SilentDisplay macros are meant to be used on private key types, and elide their input for confidentiality. - the
Deref
macro helps derive the canonical instances on new types. - the derive macros for
solana_libra_crypto::traits
, namelyValidKey
,PublicKey
,PrivateKey
,VerifyingKey
,SigningKey
andSignature
are meant to be derived on simple unions of types implementing these traits.
Unions of Signing Traits, in detail
Those types typically come into play when you need to accept several alternatives at runtime for several signature and verification schemes (ex: BLS or EdDSA, see below). In this case, it is possible to declare a triplet of enum types that each describe a 'sum type' (coproduct) of these alternatives. This happens to be a signing scheme itself (it has canonical signature, signing & verifying key types, and verifies all expected properties by trivial dispatch).
The macros below let you define this type of union trivially under two conditions:
- that the variant tags for the enum have the same name, i.e. if the BLS variant for the
SignatureUnion
isSignatureUnion::BLS(BLS12381Signature)
, then the variant of thePublicKeyUnion
for BLS must also bePublicKeyUnion::BLS
, - that you specify the associated types
PrivateKeyType
,SignatureType
andPublicKeyType
for each of the three unions.PrivateKeyType
provides the value for theVerifyingKeyMaterial
andPublicKeyMaterial
associated types,PublicKeyType
provides the valid for theSigningKeyMaterial
andPrivateKeyMaterial
associated types andSignatureType
provides the value for theSignatureMaterial
associated type.
Example
# #[macro_use] extern crate solana_libra_crypto_derive;
use solana_libra_crypto::{
hash::HashValue,
bls12381::{BLS12381PrivateKey, BLS12381PublicKey, BLS12381Signature},
ed25519::{Ed25519PrivateKey, Ed25519PublicKey, Ed25519Signature},
};
use solana_libra_crypto_derive::{
SilentDebug, PrivateKey, PublicKey, Signature, SigningKey, ValidKey, VerifyingKey,
};
# fn main() {
/// Generic public key enum
#[derive(
Debug, Clone, PartialEq, Eq, Hash, ValidKey, PublicKey, VerifyingKey,
)]
#[PrivateKeyType = "GenericPrivateKey"]
#[SignatureType = "GenericSignature"]
pub enum GenericPublicKey {
/// Ed25519 public key
Ed(Ed25519PublicKey),
/// BLS12-381 public key
BLS(BLS12381PublicKey),
}
/// Generic private key enum
#[derive(SilentDebug, ValidKey, PrivateKey, SigningKey)]
#[PublicKeyType = "GenericPublicKey"]
#[SignatureType = "GenericSignature"]
pub enum GenericPrivateKey {
/// Ed25519 private key
Ed(Ed25519PrivateKey),
/// BLS12-381 private key
BLS(BLS12381PrivateKey),
}
/// Generic signature enum
#[allow(clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq, Eq, Hash, Signature)]
#[PrivateKeyType = "GenericPrivateKey"]
#[PublicKeyType = "GenericPublicKey"]
pub enum GenericSignature {
/// Ed25519 signature
Ed(Ed25519Signature),
/// BLS12-381 signature
BLS(BLS12381Signature),
}
# }
Dependencies
~1.5MB
~35K SLoC