Replace SignedMetadata::signed with an AsRef impl
This lets this method be used a little more generically.
diff --git a/src/client.rs b/src/client.rs
index 66ba630..b596472 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -259,7 +259,7 @@
config.min_bytes_per_second,
None,
)?;
- let latest_version = latest_root.signed().version();
+ let latest_version = latest_root.as_ref().version();
if latest_version < tuf.root().version() {
return Err(Error::VerificationFailure(format!(
@@ -536,7 +536,7 @@
current_depth + 1,
target,
snapshot,
- Some(meta.signed()),
+ Some(meta.as_ref()),
local,
remote,
);
diff --git a/src/metadata.rs b/src/metadata.rs
index c2b1edd..4854ba7 100644
--- a/src/metadata.rs
+++ b/src/metadata.rs
@@ -232,7 +232,8 @@
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SignedMetadata<D, M> {
signatures: Vec<Signature>,
- signed: M,
+ #[serde(rename="signed")]
+ metadata: M,
#[serde(skip_serializing, skip_deserializing)]
_interchage: PhantomData<D>,
}
@@ -274,7 +275,7 @@
let sig = private_key.sign(&bytes)?;
Ok(SignedMetadata {
signatures: vec![sig],
- signed: metadata,
+ metadata,
_interchage: PhantomData,
})
}
@@ -321,7 +322,7 @@
/// # }
/// ```
pub fn add_signature(&mut self, private_key: &PrivateKey) -> Result<()> {
- let raw = D::serialize(&self.signed)?;
+ let raw = D::serialize(&self.metadata)?;
let bytes = D::canonicalize(&raw)?;
let sig = private_key.sign(&bytes)?;
self.signatures
@@ -331,10 +332,10 @@
}
/// Merge the singatures from `other` into `self` if and only if
- /// `self.signed() == other.signed()`. If `self` and `other` contain signatures from the same
+ /// `self.as_ref() == other.as_ref()`. If `self` and `other` contain signatures from the same
/// key ID, then the signatures from `self` will replace the signatures from `other`.
pub fn merge_signatures(&mut self, other: &Self) -> Result<()> {
- if self.signed() != other.signed() {
+ if self.metadata != other.metadata {
return Err(Error::IllegalArgument(
"Attempted to merge unequal metadata".into(),
));
@@ -366,11 +367,6 @@
&mut self.signatures
}
- /// An immutable reference to the metadata.
- pub fn signed(&self) -> &M {
- &self.signed
- }
-
/// Verify this metadata.
///
/// ```
@@ -443,7 +439,7 @@
.map(|k| (k.key_id(), k))
.collect::<HashMap<&KeyId, &PublicKey>>();
- let canonical_bytes = D::canonicalize(&D::serialize(&self.signed)?)?;
+ let canonical_bytes = D::canonicalize(&D::serialize(&self.metadata)?)?;
let mut signatures_needed = threshold;
for sig in &self.signatures {
@@ -481,6 +477,12 @@
}
}
+impl<D, M> AsRef<M> for SignedMetadata<D, M> {
+ fn as_ref(&self) -> &M {
+ &self.metadata
+ }
+}
+
impl<D, M> Metadata for SignedMetadata<D, M>
where
D: Debug + PartialEq,
@@ -489,11 +491,11 @@
const ROLE: Role = M::ROLE;
fn version(&self) -> u32 {
- self.signed.version()
+ self.metadata.version()
}
fn expires(&self) -> &DateTime<Utc> {
- self.signed.expires()
+ self.metadata.expires()
}
}
diff --git a/src/tuf.rs b/src/tuf.rs
index cbd28c4..5a2cf68 100644
--- a/src/tuf.rs
+++ b/src/tuf.rs
@@ -48,7 +48,7 @@
/// the related method `from_root_pinned`.
pub fn from_root(signed_root: SignedMetadata<D, RootMetadata>) -> Result<Self> {
{
- let root = signed_root.signed();
+ let root = signed_root.as_ref();
signed_root.verify(
root.root().threshold(),
root.keys().iter().filter_map(|(k, v)| {
@@ -71,6 +71,31 @@
}
/// An immutable reference to the root metadata.
+ pub fn root(&self) -> &RootMetadata {
+ self.root.as_ref()
+ }
+
+ /// An immutable reference to the optional snapshot metadata.
+ pub fn snapshot(&self) -> Option<&SnapshotMetadata> {
+ self.snapshot.as_ref().map(|t| t.as_ref())
+ }
+
+ /// An immutable reference to the optional targets metadata.
+ pub fn targets(&self) -> Option<&TargetsMetadata> {
+ self.targets.as_ref().map(|t| t.as_ref())
+ }
+
+ /// An immutable reference to the optional timestamp metadata.
+ pub fn timestamp(&self) -> Option<&TimestampMetadata> {
+ self.timestamp.as_ref().map(|t| t.as_ref())
+ }
+
+ /// An immutable reference to the delegated metadata.
+ pub fn delegations(&self) -> &HashMap<MetadataPath, SignedMetadata<D, TargetsMetadata>> {
+ &self.delegations
+ }
+
+ /// An immutable reference to the root metadata.
pub fn signed_root(&self) -> &SignedMetadata<D, RootMetadata> {
&self.root
}
@@ -90,60 +115,35 @@
self.timestamp.as_ref()
}
- /// An immutable reference to the root metadata.
- pub fn root(&self) -> &RootMetadata {
- self.root.signed()
- }
-
- /// An immutable reference to the optional snapshot metadata.
- pub fn snapshot(&self) -> Option<&SnapshotMetadata> {
- self.snapshot.as_ref().map(|t| t.signed())
- }
-
- /// An immutable reference to the optional targets metadata.
- pub fn targets(&self) -> Option<&TargetsMetadata> {
- self.targets.as_ref().map(|t| t.signed())
- }
-
- /// An immutable reference to the optional timestamp metadata.
- pub fn timestamp(&self) -> Option<&TimestampMetadata> {
- self.timestamp.as_ref().map(|t| t.signed())
- }
-
- /// An immutable reference to the delegated metadata.
- pub fn delegations(&self) -> &HashMap<MetadataPath, SignedMetadata<D, TargetsMetadata>> {
- &self.delegations
- }
-
fn current_timestamp_version(&self) -> u32 {
self.timestamp.as_ref()
- .map(|t| t.signed().version())
+ .map(|t| t.as_ref().version())
.unwrap_or(0)
}
fn current_snapshot_version(&self) -> u32 {
self.snapshot.as_ref()
- .map(|t| t.signed().version())
+ .map(|t| t.as_ref().version())
.unwrap_or(0)
}
fn current_targets_version(&self) -> u32 {
self.targets.as_ref()
- .map(|t| t.signed().version())
+ .map(|t| t.as_ref().version())
.unwrap_or(0)
}
fn current_delegation_version(&self, role: &MetadataPath) -> u32 {
self.delegations.get(role)
- .map(|t| t.signed().version())
+ .map(|t| t.as_ref().version())
.unwrap_or(0)
}
/// Verify and update the root metadata.
pub fn update_root(&mut self, signed_root: SignedMetadata<D, RootMetadata>) -> Result<bool> {
{
- let old_root = self.root.signed();
- let new_root = signed_root.signed();
+ let old_root = self.root.as_ref();
+ let new_root = signed_root.as_ref();
// First, check that the new root was signed by the old root.
signed_root.verify(
@@ -197,8 +197,8 @@
signed_timestamp: SignedMetadata<D, TimestampMetadata>,
) -> Result<bool> {
{
- let root = self.root.signed();
- let timestamp = signed_timestamp.signed();
+ let root = self.root.as_ref();
+ let timestamp = signed_timestamp.as_ref();
// First, make sure the root signed the metadata.
signed_timestamp.verify(
@@ -261,7 +261,7 @@
signed_snapshot.verify(
root.snapshot().threshold(),
- self.root.signed().keys().iter().filter_map(|(k, v)| {
+ self.root.as_ref().keys().iter().filter_map(|(k, v)| {
if root.snapshot().key_ids().contains(k) {
Some(v)
} else {
@@ -270,7 +270,7 @@
}),
)?;
- let snapshot = signed_snapshot.signed();
+ let snapshot = signed_snapshot.as_ref();
if snapshot.version() != timestamp.snapshot().version() {
return Err(Error::VerificationFailure(format!(
@@ -285,8 +285,8 @@
// regardless so we can prevent rollback attacks againsts targets/delegations.
};
- if self.targets.as_ref().map(|s| s.signed().version()).unwrap_or(0)
- != signed_snapshot.signed()
+ if self.targets.as_ref().map(|s| s.as_ref().version()).unwrap_or(0)
+ != signed_snapshot.as_ref()
.meta()
.get(&MetadataPath::from_role(&Role::Targets))
.map(|m| m.version())
@@ -313,7 +313,7 @@
None => continue,
};
- if delegation.signed().version() > definition.version() {
+ if delegation.as_ref().version() > definition.version() {
let _ = purge.insert(role.clone());
continue;
}
@@ -367,7 +367,7 @@
}),
)?;
- let targets = signed_targets.signed();
+ let targets = signed_targets.as_ref();
if targets.version() != targets_description.version() {
return Err(Error::VerificationFailure(format!(
@@ -431,7 +431,7 @@
}
for delegated_targets in self.delegations.values() {
- let parent = match delegated_targets.signed().delegations() {
+ let parent = match delegated_targets.as_ref().delegations() {
Some(d) => d,
None => &targets_delegations,
};
@@ -453,7 +453,7 @@
)?;
}
- let delegation = signed_delegation.signed();
+ let delegation = signed_delegation.as_ref();
if delegation.version() != delegation_description.version() {
return Err(Error::VerificationFailure(format!(
"The snapshot metadata reported that the delegation {:?} should be at \
@@ -511,7 +511,7 @@
}
let targets = match tuf.delegations.get(delegation.role()) {
- Some(t) => t.signed(),
+ Some(t) => t.as_ref(),
None => return (delegation.terminating(), None),
};
@@ -564,7 +564,7 @@
}
fn safe_root_ref(&self) -> Result<&RootMetadata> {
- let root = self.root.signed();
+ let root = self.root.as_ref();
if root.expires() <= &Utc::now() {
return Err(Error::ExpiredMetadata(Role::Root));
}
@@ -574,7 +574,7 @@
fn safe_snapshot_ref(&self) -> Result<&SnapshotMetadata> {
match self.snapshot {
Some(ref snapshot) => {
- let snapshot = snapshot.signed();
+ let snapshot = snapshot.as_ref();
if snapshot.expires() <= &Utc::now() {
return Err(Error::ExpiredMetadata(Role::Snapshot));
}
@@ -587,7 +587,7 @@
fn safe_targets_ref(&self) -> Result<&TargetsMetadata> {
match self.targets {
Some(ref targets) => {
- let targets = targets.signed();
+ let targets = targets.as_ref();
if targets.expires() <= &Utc::now() {
return Err(Error::ExpiredMetadata(Role::Targets));
}
@@ -599,7 +599,7 @@
fn safe_timestamp_ref(&self) -> Result<&TimestampMetadata> {
match self.timestamp {
Some(ref timestamp) => {
- let timestamp = timestamp.signed();
+ let timestamp = timestamp.as_ref();
if timestamp.expires() <= &Utc::now() {
return Err(Error::ExpiredMetadata(Role::Timestamp));
}