| 
2 | 2 | // SPDX-License-Identifier: Apache-2.0  | 
3 | 3 | use crate::{  | 
4 | 4 |     attributes::{SessionAttributes, SessionAttributesMask},  | 
 | 5 | +    ffi::take_from_esys,  | 
5 | 6 |     handles::SessionHandle,  | 
6 | 7 |     interface_types::session_handles::AuthSession,  | 
7 |  | -    tss2_esys::{Esys_TRSess_GetAttributes, Esys_TRSess_SetAttributes},  | 
 | 8 | +    structures::Nonce,  | 
 | 9 | +    tss2_esys::{Esys_TRSess_GetAttributes, Esys_TRSess_GetNonceTPM, Esys_TRSess_SetAttributes},  | 
8 | 10 |     Context, Result, ReturnCode,  | 
9 | 11 | };  | 
10 | 12 | use log::error;  | 
@@ -51,5 +53,63 @@ impl Context {  | 
51 | 53 |         Ok(SessionAttributes(flags))  | 
52 | 54 |     }  | 
53 | 55 | 
 
  | 
54 |  | -    // Missing function: Esys_TRSess_GetNonceTPM  | 
 | 56 | +    /// Get the TPM nonce from a session.  | 
 | 57 | +    ///  | 
 | 58 | +    /// # Arguments  | 
 | 59 | +    /// * `session` - An [AuthSession] handle to the authentication session from which to retrieve  | 
 | 60 | +    ///   the TPM nonce.  | 
 | 61 | +    ///  | 
 | 62 | +    /// # Returns  | 
 | 63 | +    /// The TPM nonce as a [Nonce] struct on success.  | 
 | 64 | +    ///  | 
 | 65 | +    /// # Details  | 
 | 66 | +    /// This function retrieves the nonceTPM value from an authentication session.  | 
 | 67 | +    ///  | 
 | 68 | +    /// Extracted nonceTPM can be useful in some scenarios. For example, a TPM object protected by a  | 
 | 69 | +    /// PolicySigned policy requires the nonceTPM value to be extracted and included in the signed  | 
 | 70 | +    /// digest to satisfy the policy.  | 
 | 71 | +    ///  | 
 | 72 | +    /// # Example  | 
 | 73 | +    /// ```rust  | 
 | 74 | +    /// # use tss_esapi::{Context, TctiNameConf};  | 
 | 75 | +    /// # use tss_esapi::constants::SessionType;  | 
 | 76 | +    /// # use tss_esapi::interface_types::algorithm::HashingAlgorithm;  | 
 | 77 | +    /// # use tss_esapi::structures::SymmetricDefinition;  | 
 | 78 | +    ///  | 
 | 79 | +    /// let mut context = Context::new(  | 
 | 80 | +    ///     TctiNameConf::from_environment_variable().expect("Failed to get TCTI"),  | 
 | 81 | +    /// ).expect("Failed to create context");  | 
 | 82 | +    ///  | 
 | 83 | +    /// let session = context  | 
 | 84 | +    ///     .start_auth_session(  | 
 | 85 | +    ///         None,  | 
 | 86 | +    ///         None,  | 
 | 87 | +    ///         None,  | 
 | 88 | +    ///         SessionType::Policy,  | 
 | 89 | +    ///         SymmetricDefinition::AES_256_CFB,  | 
 | 90 | +    ///         HashingAlgorithm::Sha256,  | 
 | 91 | +    ///     )  | 
 | 92 | +    ///     .expect("Failed to create session")  | 
 | 93 | +    ///     .expect("Received invalid handle");  | 
 | 94 | +    /// let nonce_tpm = context.tr_sess_get_nonce_tpm(session).expect("Failed to get nonceTPM");  | 
 | 95 | +    /// // Use the nonce_tpm value as needed  | 
 | 96 | +    /// ```  | 
 | 97 | +    pub fn tr_sess_get_nonce_tpm(&mut self, session: AuthSession) -> Result<Nonce> {  | 
 | 98 | +        let mut nonce_ptr = std::ptr::null_mut();  | 
 | 99 | +        ReturnCode::ensure_success(  | 
 | 100 | +            unsafe {  | 
 | 101 | +                Esys_TRSess_GetNonceTPM(  | 
 | 102 | +                    self.mut_context(),  | 
 | 103 | +                    SessionHandle::from(session).into(),  | 
 | 104 | +                    &mut nonce_ptr,  | 
 | 105 | +                )  | 
 | 106 | +            },  | 
 | 107 | +            |ret| {  | 
 | 108 | +                error!("Error when getting session nonceTPM: {:#010X}", ret);  | 
 | 109 | +            },  | 
 | 110 | +        )?;  | 
 | 111 | + | 
 | 112 | +        let nonce_tpm = unsafe { take_from_esys(nonce_ptr)? };  | 
 | 113 | +        nonce_tpm.try_into()  | 
 | 114 | +    }  | 
55 | 115 | }  | 
0 commit comments