#private-key #public-key #aptos #enums #signature #hash #derive

aptos-crypto-derive-link

aptos-crypto 定制的 derive

1 个不稳定版本

0.0.3 2022年11月7日

#21#aptos


aptos-crypto-link 中使用

Apache-2.0

29KB
581

加密操作的 derive 宏

该crate包含四种类型的 derive 宏

  • SilentDebug 和 SilentDisplay 宏用于私有密钥类型,并省略其输入以保持机密性。
  • Deref 宏有助于为新类型派生规范实例。
  • derive 宏用于 aptos_crypto::traits,即 ValidCryptoMaterialPublicKeyPrivateKeyVerifyingKeySigningKeySignature,这些宏旨在派生于实现这些特质的简单类型组合。
  • derive 宏用于 aptos_crypto::hash::CryptoHasher,该宏定义了在 aptos_crypto::hash 中描述的域分离哈希结构(有关详细信息,请参阅那里)。此 derive 宏的唯一区别在于它会自动为您选择一个唯一的盐,使用 Serde 名称。对于容器 Foo,这通常等同于
    define_hasher! {
     (
          FooHasher,
          FOO_HASHER,
          b"Foo"
      )
    }
    

签名特质的联合体,详细说明

这些类型通常在您需要接受在运行时为多个签名和验证方案提供多个替代方案时发挥作用(例如,BLS 或 EdDSA,见下文)。在这种情况下,可以声明一个三元枚举类型,每个类型都描述了这些替代方案之一的“求和类型”(coproduct)。这实际上是一种签名方案(它具有规范签名、签名和验证密钥类型,并通过简单分派验证所有预期属性)。

以下宏在以下两个条件下让您可以轻松定义此类联合体

  • 枚举的变体标记具有相同的名称,即如果 SignatureUnion 的 BLS 变体为 SignatureUnion::BLS(BLS12381Signature),那么 PublicKeyUnion 的 BLS 变体也必须是 PublicKeyUnion::BLS
  • 您需要为三个联合体指定关联的类型 PrivateKeyTypeSignatureTypePublicKeyTypePrivateKeyTypeVerifyingKeyMaterialPublicKeyMaterial 相关类型提供值,PublicKeyTypeSigningKeyMaterialPrivateKeyMaterial 相关类型提供有效值,而 SignatureTypeSignatureMaterial 相关类型提供值。

示例

# #[macro_use] extern crate crypto-derive;
use aptos_crypto::{
    hash::HashValue,
    bls12381::{BLS12381PrivateKey, BLS12381PublicKey, BLS12381Signature},
    ed25519::{Ed25519PrivateKey, Ed25519PublicKey, Ed25519Signature},
};
use aptos_crypto_derive::{
    SilentDebug, PrivateKey, PublicKey, Signature, SigningKey, ValidCryptoMaterial, VerifyingKey,
};

/// Generic public key enum
#[derive(
    Debug, Clone, PartialEq, Eq, Hash, ValidCryptoMaterial, 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, ValidCryptoMaterial, 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),
}

依赖关系

~1.5MB
~34K SLoC