@ -18,7 +18,6 @@
/* Useful constants */
enum {
COMMAND_BUFFER_SIZE = 256 ,
TPM_PUBEK_SIZE = 256 ,
TPM_REQUEST_HEADER_LENGTH = 10 ,
TPM_RESPONSE_HEADER_LENGTH = 10 ,
PCR_DIGEST_LENGTH = 20 ,
@ -610,6 +609,56 @@ uint32_t tpm_get_capability(uint32_t cap_area, uint32_t sub_cap,
return 0 ;
}
uint32_t tpm_get_permanent_flags ( struct tpm_permanent_flags * pflags )
{
const uint8_t command [ 22 ] = {
0x0 , 0xc1 , /* TPM_TAG */
0x0 , 0x0 , 0x0 , 0x16 , /* parameter size */
0x0 , 0x0 , 0x0 , 0x65 , /* TPM_COMMAND_CODE */
0x0 , 0x0 , 0x0 , 0x4 , /* TPM_CAP_FLAG_PERM */
0x0 , 0x0 , 0x0 , 0x4 , /* subcap size */
0x0 , 0x0 , 0x1 , 0x8 , /* subcap value */
} ;
uint8_t response [ COMMAND_BUFFER_SIZE ] ;
size_t response_length = sizeof ( response ) ;
uint32_t err ;
err = tpm_sendrecv_command ( command , response , & response_length ) ;
if ( err )
return err ;
memcpy ( pflags , response + TPM_HEADER_SIZE , sizeof ( * pflags ) ) ;
return 0 ;
}
uint32_t tpm_get_permissions ( uint32_t index , uint32_t * perm )
{
const uint8_t command [ 22 ] = {
0x0 , 0xc1 , /* TPM_TAG */
0x0 , 0x0 , 0x0 , 0x16 , /* parameter size */
0x0 , 0x0 , 0x0 , 0x65 , /* TPM_COMMAND_CODE */
0x0 , 0x0 , 0x0 , 0x11 ,
0x0 , 0x0 , 0x0 , 0x4 ,
} ;
const size_t index_offset = 18 ;
const size_t perm_offset = 60 ;
uint8_t buf [ COMMAND_BUFFER_SIZE ] , response [ COMMAND_BUFFER_SIZE ] ;
size_t response_length = sizeof ( response ) ;
uint32_t err ;
if ( pack_byte_string ( buf , sizeof ( buf ) , " d " , 0 , command , sizeof ( command ) ,
index_offset , index ) )
return TPM_LIB_ERROR ;
err = tpm_sendrecv_command ( buf , response , & response_length ) ;
if ( err )
return err ;
if ( unpack_byte_string ( response , response_length , " d " ,
perm_offset , perm ) )
return TPM_LIB_ERROR ;
return 0 ;
}
# ifdef CONFIG_TPM_AUTH_SESSIONS
/**