greentic_types/
pack.rs

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