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 156 157 158
use crate::identifiers::cred_def::CredentialDefinitionId; use crate::identifiers::rev_reg::RevocationRegistryId; use crate::utils::Qualifiable; use crate::{invalid, ConversionError, Validatable, ValidationError}; pub const CL_ACCUM: &str = "CL_ACCUM"; pub const ISSUANCE_BY_DEFAULT: &str = "ISSUANCE_BY_DEFAULT"; pub const ISSUANCE_ON_DEMAND: &str = "ISSUANCE_ON_DEMAND"; #[allow(non_camel_case_types)] #[derive(Copy, Clone, Debug, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] pub enum IssuanceType { ISSUANCE_BY_DEFAULT, ISSUANCE_ON_DEMAND, } impl IssuanceType { pub fn from_str(value: &str) -> Result<Self, ConversionError> { match value { ISSUANCE_BY_DEFAULT => Ok(Self::ISSUANCE_BY_DEFAULT), ISSUANCE_ON_DEMAND => Ok(Self::ISSUANCE_ON_DEMAND), _ => Err(ConversionError::from_msg("Invalid issuance type")), } } pub fn to_bool(&self) -> bool { self.clone() == IssuanceType::ISSUANCE_BY_DEFAULT } pub fn to_str(&self) -> &'static str { match *self { Self::ISSUANCE_BY_DEFAULT => ISSUANCE_BY_DEFAULT, Self::ISSUANCE_ON_DEMAND => ISSUANCE_ON_DEMAND, } } } impl Default for IssuanceType { fn default() -> Self { Self::ISSUANCE_BY_DEFAULT } } #[allow(non_camel_case_types)] #[derive(Copy, Clone, Debug, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] pub enum RegistryType { CL_ACCUM, } impl RegistryType { pub fn from_str(value: &str) -> Result<Self, ConversionError> { match value { CL_ACCUM => Ok(Self::CL_ACCUM), _ => Err(ConversionError::from_msg("Invalid registry type")), } } pub fn to_str(&self) -> &'static str { match *self { Self::CL_ACCUM => CL_ACCUM, } } } #[derive(Clone, Debug)] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct RevocationRegistryDefinitionValue { pub issuance_type: IssuanceType, pub max_cred_num: u32, pub public_keys: RevocationRegistryDefinitionValuePublicKeys, pub tails_hash: String, pub tails_location: String, } #[derive(Clone, Debug)] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct RevocationRegistryDefinitionValuePublicKeys { pub accum_key: ursa_cl!(RevocationKeyPublic), } #[derive(Clone, Debug)] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] #[cfg_attr(feature = "serde", serde(tag = "ver"))] pub enum RevocationRegistryDefinition { #[cfg_attr(feature = "serde", serde(rename = "1.0"))] RevocationRegistryDefinitionV1(RevocationRegistryDefinitionV1), } impl RevocationRegistryDefinition { pub fn to_unqualified(self) -> RevocationRegistryDefinition { match self { RevocationRegistryDefinition::RevocationRegistryDefinitionV1(v1) => { RevocationRegistryDefinition::RevocationRegistryDefinitionV1( RevocationRegistryDefinitionV1 { id: v1.id.to_unqualified(), revoc_def_type: v1.revoc_def_type, tag: v1.tag, cred_def_id: v1.cred_def_id.to_unqualified(), value: v1.value, }, ) } } } } impl Validatable for RevocationRegistryDefinition { fn validate(&self) -> Result<(), ValidationError> { match self { RevocationRegistryDefinition::RevocationRegistryDefinitionV1(v1) => { v1.id.validate()?; } } Ok(()) } } #[derive(Clone, Debug)] #[cfg_attr( feature = "serde", derive(Deserialize, Serialize), serde(rename_all = "camelCase") )] pub struct RevocationRegistryDefinitionV1 { pub id: RevocationRegistryId, pub revoc_def_type: RegistryType, pub tag: String, pub cred_def_id: CredentialDefinitionId, pub value: RevocationRegistryDefinitionValue, } #[derive(Debug)] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] pub struct RevocationRegistryDefinitionPrivate { pub value: ursa_cl!(RevocationKeyPrivate), } #[derive(Deserialize, Debug, Serialize)] pub struct RevocationRegistryConfig { pub issuance_type: Option<IssuanceType>, pub max_cred_num: Option<u32>, } impl Validatable for RevocationRegistryConfig { fn validate(&self) -> Result<(), ValidationError> { if let Some(num_) = self.max_cred_num { if num_ == 0 { return Err(invalid!("RevocationRegistryConfig validation failed: `max_cred_num` must be greater than 0")); } } Ok(()) } }