use regex::Regex;
use serde::{Deserialize, Serialize};
use crate::model::ODataId;
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct ComponentIntegrities {
pub members: Vec<ComponentIntegrity>,
pub name: String,
#[serde(rename = "Members@odata.count")]
pub count: i16,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct ComponentIntegrity {
pub component_integrity_enabled: bool,
pub component_integrity_type: String,
pub component_integrity_type_version: String,
pub id: String,
pub name: String,
pub target_component_uri: Option<String>,
pub spdm: Option<SPDMData>,
pub actions: Option<SPDMActions>,
pub links: Option<ComponentsProtectedLinks>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct ComponentsProtectedLinks {
pub components_protected: Vec<ODataId>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct SPDMData {
pub identity_authentication: ResponderAuthentication,
pub requester: ODataId,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct ResponderAuthentication {
pub component_certificate: ODataId,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct SPDMActions {
#[serde(rename = "#ComponentIntegrity.SPDMGetSignedMeasurements")]
pub get_signed_measurements: Option<SPDMGetSignedMeasurements>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct SPDMGetSignedMeasurements {
#[serde(rename = "@Redfish.ActionInfo")]
pub action_info: String,
pub target: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct CaCertificate {
pub certificate_string: String,
pub certificate_type: String,
pub certificate_usage_types: Vec<String>,
pub id: String,
pub name: String,
#[serde(rename = "SPDM")]
pub spdm: SlotInfo,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct SlotInfo {
pub slot_id: u16,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct Evidence {
pub hashing_algorithm: String,
pub signed_measurements: String,
pub signing_algorithm: String,
pub version: String,
}
pub struct RegexToFirmwareIdOptions {
pub pattern: Regex,
pub id_prefix: &'static str,
}
#[cfg(test)]
mod tests {
use crate::model::component_integrity::CaCertificate;
#[test]
fn test_ca_certificate_serialization_deserialization() {
let ca_certificate = r#"{
"@odata.id": "/redfish/v1/Chassis/HGX_IRoT_GPU_0/Certificates/CertChain",
"@odata.type": " #Certificate.v1_5_0.Certificate",
"CertificateString": "-----BEGIN CERTIFICATE-----\nMIIDdDCCAvqgAwZ0UBCk+3B6JuSijznMdCaX+lwxJ0Eq7V\nSFpkQATVveySG/Qo8NreDDAfu5dAcVBr\n-----END CERTIFICATE-----\n",
"CertificateType": "PEMchain",
"CertificateUsageTypes": [
"Device"
],
"Id": "CertChain",
"Name": "HGX_IRoT_GPU_0 Certificate Chain",
"SPDM": {
"SlotId": 0
}
}"#;
let parsed_certificate: CaCertificate = serde_json::from_str(ca_certificate).unwrap();
assert_eq!(parsed_certificate.id, "CertChain");
assert_eq!(parsed_certificate.spdm.slot_id, 0);
assert_eq!(parsed_certificate.certificate_usage_types.len(), 1);
serde_json::to_string(&parsed_certificate).unwrap();
}
}