1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
use crate::Seed; use iota_ternary_preview::{ TritBuf, Trits, }; // TODO: documentation pub trait PrivateKeyGenerator { type Seed: Seed; /// The type of the generated private keys type PrivateKey: PrivateKey; type Error; /// Deterministically generates and returns a private key /// /// # Arguments /// /// * `seed` A seed to deterministically derive a private key from /// * `index` An index to deterministically derive a private key from /// /// # Example /// /// ``` /// use iota_crypto_preview::Kerl; /// use iota_signing_preview::{ /// IotaSeed, /// PrivateKeyGenerator, /// Seed, /// WotsPrivateKeyGeneratorBuilder, /// WotsSecurityLevel, /// }; /// /// let seed = IotaSeed::<Kerl>::new(); /// let private_key_generator = WotsPrivateKeyGeneratorBuilder::<Kerl>::default() /// .security_level(WotsSecurityLevel::Medium) /// .build() /// .unwrap(); /// let private_key = private_key_generator.generate(&seed, 0); /// ``` fn generate(&self, seed: &Self::Seed, index: u64) -> Result<Self::PrivateKey, Self::Error>; } // TODO: documentation pub trait PrivateKey { /// The type of the matching public key type PublicKey: PublicKey; /// The type of the generated signatures type Signature: Signature; type Error; /// Returns the public counterpart of a private key /// /// # Example /// /// ``` /// # use iota_crypto_preview::Kerl; /// # use iota_signing_preview::{ /// IotaSeed, /// PrivateKeyGenerator, /// Seed, /// WotsPrivateKeyGeneratorBuilder, /// WotsSecurityLevel, /// }; /// use iota_signing_preview::PrivateKey; /// /// # let seed = IotaSeed::<Kerl>::new(); /// # let private_key_generator = WotsPrivateKeyGeneratorBuilder::<Kerl>::default() /// .security_level(WotsSecurityLevel::Medium) /// .build() /// .unwrap(); /// # let private_key = private_key_generator.generate(&seed, 0).unwrap(); /// let public_key = private_key.generate_public_key(); /// ``` fn generate_public_key(&self) -> Result<Self::PublicKey, Self::Error>; /// Generates and returns a signature for a given message /// /// # Arguments /// /// * `message` A slice that holds a message to be signed /// /// # Example /// /// ``` /// # use iota_crypto_preview::Kerl; /// # use iota_signing_preview::{ /// IotaSeed, /// PrivateKeyGenerator, /// Seed, /// WotsPrivateKeyGeneratorBuilder, /// WotsSecurityLevel, /// }; /// use iota_signing_preview::PrivateKey; /// use iota_ternary_preview::{ /// T1B1Buf, /// TryteBuf, /// }; /// /// # let seed = IotaSeed::<Kerl>::new(); /// # let private_key_generator = WotsPrivateKeyGeneratorBuilder::<Kerl>::default() /// .security_level(WotsSecurityLevel::Medium) /// .build() /// .unwrap(); /// # let mut private_key = private_key_generator.generate(&seed, 0).unwrap(); /// let message = "CHXHLHQLOPYP9NSUXTMWWABIBSBLUFXFRNWOZXJPVJPBCIDI99YBSCFYILCHPXHTSEYSYWIGQFERCRVDD"; /// let message_trits = TryteBuf::try_from_str(message).unwrap().as_trits().encode::<T1B1Buf>(); /// let signature = private_key.sign(&message_trits.as_i8_slice()); /// ``` fn sign(&mut self, message: &[i8]) -> Result<Self::Signature, Self::Error>; } // TODO: documentation pub trait PublicKey { // TODO: documentation type Signature: Signature; type Error; // TODO: documentation fn verify(&self, message: &[i8], signature: &Self::Signature) -> Result<bool, Self::Error>; // TODO: documentation fn from_buf(buf: TritBuf) -> Self; // TODO: documentation // TODO: Rename to as_i8_slice? fn as_bytes(&self) -> &[i8]; fn trits(&self) -> &Trits; } // TODO: documentation pub trait Signature { // TODO: documentation fn size(&self) -> usize; // TODO: documentation fn from_buf(buf: TritBuf) -> Self; // TODO: documentation // TODO: Rename to as_i8_slice? fn as_bytes(&self) -> &[i8]; fn trits(&self) -> &Trits; } // TODO: documentation pub trait RecoverableSignature: Signature { // TODO: documentation type PublicKey: PublicKey; type Error; // TODO: documentation fn recover_public_key(&self, message: &[i8]) -> Result<Self::PublicKey, Self::Error>; }