@@ -92,15 +92,19 @@ int TPM2_LINUX_SendCommand(TPM2_CTX* ctx, TPM2_Packet* packet)
9292#include <string.h>
9393
9494/* TPM Device Path Configuration:
95- * - /dev/tpm0: TPM raw device (default)
96- * - /dev/tpmrm0: TPM resource manager (requires kernel 5.12+)
97- * Enabled with WOLFTPM_USE_TPMRM
95+ * - /dev/tpmrm0: TPM resource manager (requires kernel 5.12+), preferred as it
96+ * isolates and flushes per-connection transient objects/sessions
97+ * - /dev/tpm0: TPM raw device, no in-kernel resource management
98+ * The default prefers the resource manager and falls back to the raw device
99+ * when it is unavailable. Define WOLFTPM_USE_TPMRM for resource manager only,
100+ * or set TPM2_LINUX_DEV to pin a specific device.
98101 */
99102#ifndef TPM2_LINUX_DEV
100103#ifdef WOLFTPM_USE_TPMRM
101104 #define TPM2_LINUX_DEV "/dev/tpmrm0"
102105#else
103- #define TPM2_LINUX_DEV "/dev/tpm0"
106+ #define TPM2_LINUX_DEV "/dev/tpmrm0"
107+ #define TPM2_LINUX_DEV_FALLBACK "/dev/tpm0"
104108#endif
105109#endif
106110
@@ -121,14 +125,23 @@ int TPM2_LINUX_SendCommand(TPM2_CTX* ctx, TPM2_Packet* packet)
121125 int rc_poll , nfds = 1 ; /* Polling single TPM dev file */
122126 struct pollfd fds ;
123127 int rspSz = 0 ;
128+ const char * devName = TPM2_LINUX_DEV ;
124129
125130#ifdef WOLFTPM_DEBUG_VERBOSE
126131 printf ("Command size: %d\n" , packet -> pos );
127132 TPM2_PrintBin (packet -> buf , packet -> pos );
128133#endif
129134
130- if (ctx -> fd < 0 )
135+ if (ctx -> fd < 0 ) {
131136 ctx -> fd = open (TPM2_LINUX_DEV , O_RDWR | O_NONBLOCK );
137+ #ifdef TPM2_LINUX_DEV_FALLBACK
138+ if (ctx -> fd < 0 ) {
139+ ctx -> fd = open (TPM2_LINUX_DEV_FALLBACK , O_RDWR | O_NONBLOCK );
140+ if (ctx -> fd >= 0 )
141+ devName = TPM2_LINUX_DEV_FALLBACK ;
142+ }
143+ #endif
144+ }
132145 if (ctx -> fd >= 0 ) {
133146 /* Send the TPM command */
134147 if (write (ctx -> fd , packet -> buf , packet -> pos ) == packet -> pos ) {
@@ -147,11 +160,11 @@ int TPM2_LINUX_SendCommand(TPM2_CTX* ctx, TPM2_Packet* packet)
147160 else {
148161 #ifdef DEBUG_WOLFTPM
149162 if (ret == 0 ) {
150- printf ("Received EOF from %s\n" , TPM2_LINUX_DEV );
163+ printf ("Received EOF from %s\n" , devName );
151164 }
152165 else {
153166 printf ("Failed to read from %s (ret %zd):"
154- " errno %d = %s\n" , TPM2_LINUX_DEV , ret ,
167+ " errno %d = %s\n" , devName , ret ,
155168 errno , strerror (errno ));
156169 }
157170 #endif
@@ -161,27 +174,27 @@ int TPM2_LINUX_SendCommand(TPM2_CTX* ctx, TPM2_Packet* packet)
161174 else {
162175 #ifdef DEBUG_WOLFTPM
163176 printf ("Failed poll on %s: errno %d = %s\n" ,
164- TPM2_LINUX_DEV , errno , strerror (errno ));
177+ devName , errno , strerror (errno ));
165178 #endif
166179 rc = TPM_RC_FAILURE ;
167180 }
168181 }
169182 else {
170183 #ifdef DEBUG_WOLFTPM
171184 printf ("Failed write to %s: errno %d = %s\n" ,
172- TPM2_LINUX_DEV , errno , strerror (errno ));
185+ devName , errno , strerror (errno ));
173186 #endif
174187 rc = TPM_RC_FAILURE ;
175188 }
176189 }
177190 else if (ctx -> fd == -1 && errno == EACCES ) {
178191 printf ("Permission denied on %s\n"
179- "Use sudo or add tss group to user.\n" , TPM2_LINUX_DEV );
192+ "Use sudo or add tss group to user.\n" , devName );
180193 }
181194 else {
182195 #ifdef DEBUG_WOLFTPM
183196 printf ("Failed to open %s: errno %d = %s\n" ,
184- TPM2_LINUX_DEV , errno , strerror (errno ));
197+ devName , errno , strerror (errno ));
185198 #endif
186199 }
187200
0 commit comments