greentic_types/
pack.rs

1//! Pack reference metadata.
2
3use alloc::string::String;
4use alloc::vec::Vec;
5
6use semver::Version;
7
8#[cfg(feature = "schemars")]
9use schemars::JsonSchema;
10#[cfg(feature = "serde")]
11use serde::{Deserialize, Serialize};
12#[cfg(feature = "serde")]
13use serde_with::serde_as;
14
15/// Reference to a pack stored in an OCI registry.
16#[cfg_attr(feature = "serde", serde_as)]
17#[derive(Clone, Debug, PartialEq, Eq)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19#[cfg_attr(feature = "schemars", derive(JsonSchema))]
20pub struct PackRef {
21    /// OCI reference pointing to the pack.
22    pub oci_url: String,
23    /// Semantic version of the pack.
24    #[cfg_attr(
25        feature = "serde",
26        serde_as(as = "serde_with::formats::DisplayFromStr")
27    )]
28    #[cfg_attr(
29        feature = "schemars",
30        schemars(with = "String", description = "SemVer version")
31    )]
32    pub version: Version,
33    /// Content digest of the pack.
34    pub digest: String,
35    /// Optional detached signatures.
36    #[cfg_attr(
37        feature = "serde",
38        serde(default, skip_serializing_if = "Vec::is_empty")
39    )]
40    pub signatures: Vec<Signature>,
41}
42
43impl PackRef {
44    /// Creates a new pack reference.
45    pub fn new(oci_url: impl Into<String>, version: Version, digest: impl Into<String>) -> Self {
46        Self {
47            oci_url: oci_url.into(),
48            version,
49            digest: digest.into(),
50            signatures: Vec::new(),
51        }
52    }
53}
54
55/// Detached signature accompanying a [`PackRef`].
56#[cfg_attr(feature = "serde", serde_as)]
57#[derive(Clone, Debug, PartialEq, Eq)]
58#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
59#[cfg_attr(feature = "schemars", derive(JsonSchema))]
60pub struct Signature {
61    /// Identifier of the public key.
62    pub key_id: String,
63    /// Signature algorithm (for example `ed25519`).
64    pub algorithm: SignatureAlgorithm,
65    /// Raw signature bytes (base64 encoded when serialized).
66    #[cfg_attr(feature = "serde", serde_as(as = "serde_with::base64::Base64"))]
67    pub signature: Vec<u8>,
68}
69
70impl Signature {
71    /// Creates a new signature entry.
72    pub fn new(
73        key_id: impl Into<String>,
74        algorithm: SignatureAlgorithm,
75        signature: Vec<u8>,
76    ) -> Self {
77        Self {
78            key_id: key_id.into(),
79            algorithm,
80            signature,
81        }
82    }
83}
84
85/// Supported signature algorithms for packs.
86#[derive(Clone, Debug, PartialEq, Eq, Hash)]
87#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
88#[cfg_attr(feature = "schemars", derive(JsonSchema))]
89#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
90pub enum SignatureAlgorithm {
91    /// Ed25519 signatures.
92    Ed25519,
93    /// Other algorithms identified by name.
94    Other(String),
95}