dpp/identity/identity_public_key/
mod.rs1#![allow(clippy::from_over_into)]
2
3use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0;
4use crate::identity::identity_public_key::v0::IdentityPublicKeyV0;
5#[cfg(feature = "value-conversion")]
6use crate::serialization::ValueConvertible;
7use bincode::{Decode, Encode};
8use derive_more::From;
9use serde::{Deserialize, Serialize};
10
11mod key_type;
12mod purpose;
13mod security_level;
14pub use key_type::KeyType;
15pub use purpose::Purpose;
16pub use security_level::SecurityLevel;
17pub mod accessors;
18pub mod conversion;
19pub mod fields;
20pub mod v0;
21use crate::version::PlatformVersion;
22use crate::ProtocolError;
23pub use fields::*;
24use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize};
25
26pub mod methods;
27pub use methods::*;
28pub mod contract_bounds;
29#[cfg(feature = "random-public-keys")]
30mod random;
31
32pub type KeyID = u32;
33pub type KeyCount = KeyID;
34pub type TimestampMillis = u64;
35
36#[derive(
37 Debug,
38 Clone,
39 Eq,
40 PartialEq,
41 Serialize,
42 Deserialize,
43 Encode,
44 Decode,
45 PlatformDeserialize,
46 PlatformSerialize,
47 From,
48 Hash,
49 Ord,
50 PartialOrd,
51)]
52#[platform_serialize(limit = 2000, unversioned)] #[cfg_attr(feature = "value-conversion", derive(ValueConvertible))]
54#[serde(tag = "$formatVersion")]
55pub enum IdentityPublicKey {
56 #[serde(rename = "0")]
57 V0(IdentityPublicKeyV0),
58}
59
60impl IdentityPublicKey {
61 pub fn is_master(&self) -> bool {
63 self.security_level() == SecurityLevel::MASTER
64 }
65
66 pub fn max_possible_size_key(
81 id: KeyID,
82 platform_version: &PlatformVersion,
83 ) -> Result<Self, ProtocolError> {
84 match platform_version
85 .dpp
86 .identity_versions
87 .identity_key_structure_version
88 {
89 0 => Ok(IdentityPublicKeyV0::max_possible_size_key(id).into()),
90 version => Err(ProtocolError::UnknownVersionMismatch {
91 method: "IdentityPublicKey::max_possible_size_key".to_string(),
92 known_versions: vec![0],
93 received: version,
94 }),
95 }
96 }
97
98 pub fn default_versioned(platform_version: &PlatformVersion) -> Result<Self, ProtocolError> {
99 match platform_version
100 .dpp
101 .identity_versions
102 .identity_key_structure_version
103 {
104 0 => Ok(IdentityPublicKeyV0::default().into()),
105 version => Err(ProtocolError::UnknownVersionMismatch {
106 method: "IdentityPublicKey::default_versioned".to_string(),
107 known_versions: vec![0],
108 received: version,
109 }),
110 }
111 }
112}
113
114#[cfg(test)]
115mod tests {
116 use crate::identity::identity_public_key::v0::IdentityPublicKeyV0;
117 use crate::identity::IdentityPublicKey;
118 use crate::serialization::{PlatformDeserializable, PlatformSerializable};
119 use platform_version::version::LATEST_PLATFORM_VERSION;
120 use rand::SeedableRng;
121
122 #[test]
123 fn test_identity_key_serialization_deserialization() {
124 let mut rng = rand::rngs::StdRng::from_entropy();
125 let key: IdentityPublicKey =
126 IdentityPublicKeyV0::random_ecdsa_master_authentication_key_with_rng(
127 1,
128 &mut rng,
129 LATEST_PLATFORM_VERSION,
130 )
131 .expect("expected a random key")
132 .0
133 .into();
134 let serialized = key.serialize_to_bytes().expect("expected to serialize key");
135 let unserialized: IdentityPublicKey =
136 PlatformDeserializable::deserialize_from_bytes(serialized.as_slice())
137 .expect("expected to deserialize key");
138 assert_eq!(key, unserialized)
139 }
140}