11use crate :: prelude:: * ;
22use crate :: serde_base64;
33use crate :: Error ;
4+ use crate :: ReportData ;
45use lcp_types:: Time ;
56use serde:: { Deserialize , Serialize } ;
67
78#[ derive( Debug , Serialize , Deserialize ) ]
89pub struct DCAPQuote {
910 #[ serde( with = "serde_base64" ) ]
1011 pub raw : Vec < u8 > ,
12+ pub tcb_status : TcbStatus ,
13+ pub advisory_ids : Option < Vec < String > > ,
1114 pub attested_at : Time ,
1215}
1316
17+ #[ derive( Debug , Clone , PartialEq , Serialize , Deserialize ) ]
18+ pub enum TcbStatus {
19+ OK ,
20+ TcbSwHardeningNeeded ,
21+ TcbConfigurationAndSwHardeningNeeded ,
22+ TcbConfigurationNeeded ,
23+ TcbOutOfDate ,
24+ TcbOutOfDateConfigurationNeeded ,
25+ TcbRevoked ,
26+ TcbUnrecognized ,
27+ }
28+
29+ impl TcbStatus {
30+ pub fn from_str ( s : & str ) -> Self {
31+ return match s {
32+ "UpToDate" => TcbStatus :: OK ,
33+ "SWHardeningNeeded" => TcbStatus :: TcbSwHardeningNeeded ,
34+ "ConfigurationAndSWHardeningNeeded" => TcbStatus :: TcbConfigurationAndSwHardeningNeeded ,
35+ "ConfigurationNeeded" => TcbStatus :: TcbConfigurationNeeded ,
36+ "OutOfDate" => TcbStatus :: TcbOutOfDate ,
37+ "OutOfDateConfigurationNeeded" => TcbStatus :: TcbOutOfDateConfigurationNeeded ,
38+ "Revoked" => TcbStatus :: TcbRevoked ,
39+ _ => TcbStatus :: TcbUnrecognized ,
40+ } ;
41+ }
42+ }
43+
44+ impl ToString for TcbStatus {
45+ fn to_string ( & self ) -> String {
46+ return match self {
47+ TcbStatus :: OK => "UpToDate" . to_string ( ) ,
48+ TcbStatus :: TcbSwHardeningNeeded => "SWHardeningNeeded" . to_string ( ) ,
49+ TcbStatus :: TcbConfigurationAndSwHardeningNeeded => {
50+ "ConfigurationAndSWHardeningNeeded" . to_string ( )
51+ }
52+ TcbStatus :: TcbConfigurationNeeded => "ConfigurationNeeded" . to_string ( ) ,
53+ TcbStatus :: TcbOutOfDate => "OutOfDate" . to_string ( ) ,
54+ TcbStatus :: TcbOutOfDateConfigurationNeeded => {
55+ "OutOfDateConfigurationNeeded" . to_string ( )
56+ }
57+ TcbStatus :: TcbRevoked => "Revoked" . to_string ( ) ,
58+ TcbStatus :: TcbUnrecognized => "Unrecognized" . to_string ( ) ,
59+ } ;
60+ }
61+ }
62+
1463impl DCAPQuote {
15- pub fn new ( raw_quote : Vec < u8 > , attested_at : Time ) -> Self {
64+ pub fn new (
65+ raw_quote : Vec < u8 > ,
66+ tcb_status : String ,
67+ advisory_ids : Option < Vec < String > > ,
68+ attested_at : Time ,
69+ ) -> Self {
1670 DCAPQuote {
1771 raw : raw_quote,
72+ tcb_status : TcbStatus :: from_str ( & tcb_status) ,
73+ advisory_ids,
1874 attested_at,
1975 }
2076 }
@@ -26,4 +82,11 @@ impl DCAPQuote {
2682 pub fn from_json ( json : & str ) -> Result < Self , Error > {
2783 serde_json:: from_str ( json) . map_err ( Error :: serde_json)
2884 }
85+
86+ #[ cfg( feature = "std" ) ]
87+ pub fn report_data ( & self ) -> ReportData {
88+ use dcap_rs:: types:: quotes:: version_3:: QuoteV3 ;
89+ let quote = QuoteV3 :: from_bytes ( & self . raw ) ;
90+ ReportData ( quote. isv_enclave_report . report_data )
91+ }
2992}
0 commit comments