On Thu, Jan 17, 2013 at 12:59 PM, Kent Yoder <[email protected]> wrote:
>> I'm interested to know what you see in your testcase after applying
>> these patches.  I get a 0x22 (invalid auth handle) return code from
>> Tspi_Context_CloseSignTransport, which I can't yet explain. I'm on an
>> STM TPM here.
>
>   Ok, I see what's happening now. The code sets up an exclusive
> transport session, which means that while its open, any TPM command
> that executes outside the TS will force a close of the TS.  This
> includes commands sent down by the tcsd during normal operations, for
> things like asking the TPM which keys it has loaded.  This is what
> happens in this case, the tcsd asks the TPM which keys it has loaded
> during key management, terminating the session before close.  Because
> there's a signing key involved in closing and signing the session
> hash, this might *always* happen. :-(

  Got a fix for you. :-)  Please test the attached patch.  Also make
sure you've set

enforce_exclusive_transport = 1

in /etc/tcsd.conf, so that it doesn't ignore the fact that you want an
exclusive session.

Thanks,
Kent

>   I've opened a defect against the tcsd [1] to look into better support for 
> ETS.
>
> Kent
>
> [1] 
> https://sourceforge.net/tracker/?func=detail&aid=3601290&group_id=126012&atid=704358
>
>
>> Kent
>>
>>> fairly sure, that the key I am using (which is an AIK) has been loaded
>>> correctly, and that I correctly initialized the validation structure as
>>> well as the context, because I can quote within the same context using
>>> the same code for initializing them.
>>>
>>> I am using:
>>>
>>> Ubuntu 11.04 (have to for compatibility reasons with other software)
>>> trousers0.3.5-2_i386.deb (haven't seen anything on the update logs, that
>>> would possibly fix this in future versions)
>>> Atmel TPM v1.2 (capabilities include one transport session)
>>> gcc 4.5.2
>>>
>>> I will attach a piece of code to the bottom, which produces the error
>>> with my system setup. I cleaned it from any unrelated code and at the
>>> moment it is not executing anything within the transport. However the
>>> same problem occurs, when executing TPM-commands during the transport.
>>>
>>> Calling
>>>
>>> gcc -ltspi -Wall -o ttest cleanTransportCall.c
>>>
>>> on my source file should give no warning, or at least I do not get any.
>>>
>>> Best regards,
>>>
>>> Michael Dorner
>>>
>>>
>>>
>>> ########### Code for cleanTransportCall.c:##############################
>>>
>>> /*
>>>  * cleanTransportCall.c
>>>  *
>>>  *  Created on: Jan 7, 2013
>>>  *      Author: michaeldorner
>>>  *      Purpose: Bugreport CloseSignTransport
>>>  *
>>>  */
>>> #include <stdio.h>
>>> #include <string.h>
>>> #include <stdlib.h>
>>> #include <sys/types.h>
>>> #include <tss/platform.h>
>>> #include <tss/tspi.h>
>>> #include <trousers/trousers.h>
>>> //challener debug macro (from tutorial)
>>> #define DBG(message,tResult)printf("(Line%d, %s)%s returned 0x%08x. %s
>>> \n", __LINE__,__func__,message, tResult,
>>> (char*)Trspi_Error_String(tResult))
>>>
>>> //declarations, supporting only plaintext secrets here
>>> TSS_RESULT context_init(TSS_HCONTEXT *phContext);
>>> TSS_RESULT srk_tpm_init(TSS_HCONTEXT *phContext, TSS_HKEY *phSRK,
>>>                 char* srk_auth, TSS_HTPM *phTPM, char* owner_auth);
>>> TSS_RESULT load_aik(TSS_HCONTEXT *hContext, TSS_HKEY *srk, TSS_HKEY
>>> *hAIK,
>>>                 TSS_UUID aik_uuid, char* aik_auth);
>>> int main(int argc, char **agrv) {
>>>         printf("entered main\n");
>>>         TSS_HCONTEXT hContext;
>>>         TSS_HTPM hTPM;
>>>         TSS_HKEY hSRK, hAIKey;
>>>         TSS_VALIDATION vData;
>>>         TSS_RESULT result;
>>>         BYTE nonce[20];
>>>         int size = 20;
>>>         //modify this code to select own aik
>>>         TSS_UUID aik_uuid = { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 12 } };
>>>         if ((result = context_init(&hContext)) != TSS_SUCCESS) {
>>>                 exit(result);
>>>         }
>>>         if ((result = srk_tpm_init(&hContext, &hSRK, "password", &hTPM,
>>> "password"))
>>>                         != TSS_SUCCESS) {
>>>                 exit(result);
>>>         }
>>>         vData.ulExternalDataLength = size;
>>>         vData.rgbExternalData = nonce;
>>>         if ((result = load_aik(&hContext, &hSRK, &hAIKey, aik_uuid, NULL ))
>>>                         != TSS_SUCCESS) {
>>>                 exit(result);
>>>         }
>>>         //set the nonce as external data
>>>         printf("starting transport session\n");
>>>         if ((result = Tspi_SetAttribUint32(hContext,
>>>                         TSS_TSPATTRIB_CONTEXT_TRANSPORT, 
>>> TSS_TSPATTRIB_CONTEXTTRANS_CONTROL,
>>>                         TSS_TSPATTRIB_ENABLE_TRANSPORT)) != TSS_SUCCESS) {
>>>                 exit(result);
>>>         }
>>>         if ((result = Tspi_SetAttribUint32(hContext,
>>>                         TSS_TSPATTRIB_CONTEXT_TRANSPORT, 
>>> TSS_TSPATTRIB_CONTEXTTRANS_MODE,
>>>                         TSS_TSPATTRIB_TRANSPORT_NO_DEFAULT_ENCRYPTION)) != 
>>> TSS_SUCCESS) {
>>>                 exit(result);
>>>         }
>>>         if ((result = Tspi_SetAttribUint32(hContext,
>>>                         TSS_TSPATTRIB_CONTEXT_TRANSPORT, 
>>> TSS_TSPATTRIB_CONTEXTTRANS_MODE,
>>>                         TSS_TSPATTRIB_TRANSPORT_EXCLUSIVE)) != TSS_SUCCESS) 
>>> {
>>>                 exit(result);
>>>         }
>>>         if ((result = Tspi_SetAttribUint32(hContext,
>>>                                 TSS_TSPATTRIB_CONTEXT_TRANSPORT, 
>>> TSS_TSPATTRIB_CONTEXTTRANS_MODE,
>>>                                 TSS_TSPATTRIB_TRANSPORT_AUTHENTIC_CHANNEL)) 
>>> != TSS_SUCCESS) {
>>>                         exit(result);
>>>                 }
>>>         //encapsulated commands start
>>>
>>>
>>>
>>>         //encapsulated commands end
>>>         printf("calling closeSignTransport\n");
>>>         if ((result = Tspi_Context_CloseSignTransport(hContext, hAIKey,
>>> &vData))
>>>                         != TSS_SUCCESS) {
>>>                 DBG("closing transport", result);
>>>                 exit(result);
>>>         }
>>>         Tspi_Context_FreeMemory(hContext, NULL);
>>>         Tspi_Context_Close(hContext);
>>>         DBG("leaving main", result);
>>>         exit(result);
>>> }
>>>
>>> //helpers
>>> /*
>>>  * this function takes an uninitalized tpmobject, srk and context and
>>> initializes/loads it
>>>  */
>>> TSS_RESULT context_init(TSS_HCONTEXT *phContext) {
>>>         printf("entered context_init\n");
>>>         TSS_RESULT result;
>>>         //create context and connect to it
>>>         if ((result = Tspi_Context_Create(phContext)) != TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>         if ((result = Tspi_Context_Connect(*phContext, NULL )) != 
>>> TSS_SUCCESS)
>>> {
>>>                 return (result);
>>>         }
>>>         DBG("leaving context_init", result);
>>>         return result;
>>> }
>>>
>>> TSS_RESULT srk_tpm_init(TSS_HCONTEXT *phContext, TSS_HKEY *phSRK,
>>>                 char* srk_auth, TSS_HTPM *phTPM, char* owner_auth) {
>>>         TSS_RESULT result;
>>>         TSS_HPOLICY hSRKPolicy, hTPMPolicy;
>>>         TSS_UUID UUID_SRK = TSS_UUID_SRK;
>>>         if ((result = Tspi_Context_LoadKeyByUUID(*phContext,
>>> TSS_PS_TYPE_SYSTEM,
>>>                         UUID_SRK, phSRK)) != TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>         //create policy object for the SRK and assign it
>>>         if ((result = Tspi_Context_CreateObject(*phContext,
>>> TSS_OBJECT_TYPE_POLICY,
>>>                         TSS_POLICY_USAGE, &hSRKPolicy)) != TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>         if ((result = Tspi_Policy_SetSecret(hSRKPolicy, 
>>> TSS_SECRET_MODE_PLAIN,
>>>                         strlen(srk_auth), (BYTE *) srk_auth)) != 
>>> TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>         if ((result = Tspi_Policy_AssignToObject(hSRKPolicy, *phSRK)) !=
>>> TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>
>>>         if ((result = Tspi_Context_GetTpmObject(*phContext, phTPM)) !=
>>> TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>         if ((result = Tspi_Context_CreateObject(*phContext,
>>> TSS_OBJECT_TYPE_POLICY,
>>>                         TSS_POLICY_USAGE, &hTPMPolicy)) != TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>         if ((result = Tspi_Policy_SetSecret(hTPMPolicy, 
>>> TSS_SECRET_MODE_PLAIN,
>>>                         strlen(owner_auth), (BYTE *) owner_auth)) != 
>>> TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>         if ((result = Tspi_Policy_AssignToObject(hTPMPolicy, *phTPM)) !=
>>> TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>         return result;
>>> }
>>>
>>> /*
>>>  * load an attestation key by its UUID, the context has to be connected
>>> and the srk has to be loaded
>>>  */
>>> TSS_RESULT load_aik(TSS_HCONTEXT *hContext, TSS_HKEY *srk, TSS_HKEY
>>> *hAIK,
>>>                 TSS_UUID aik_uuid, char *aik_auth) {
>>>         printf("entered load_aik_by_uuid\n");
>>>         TSS_RESULT result;
>>>         TSS_HPOLICY hAIKPolicy;
>>>         if ((result = Tspi_Context_LoadKeyByUUID(*hContext, 
>>> TSS_PS_TYPE_SYSTEM,
>>>                         aik_uuid, hAIK)) != TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>         if ((result = Tspi_GetPolicyObject(*hAIK, TSS_POLICY_USAGE,
>>> &hAIKPolicy))
>>>                         != TSS_SUCCESS) {
>>>                 return (result);
>>>         }
>>>         //if using an AIK generated from the privacyCA.com code, it has 
>>> NULL as
>>> plain secret
>>>         if (aik_auth != NULL ) {
>>>                 if ((result = Tspi_Policy_SetSecret(hAIKPolicy, 
>>> TSS_SECRET_MODE_PLAIN,
>>>                                 strlen(aik_auth), (BYTE*) aik_auth)) != 
>>> TSS_SUCCESS) {
>>>                         return (result);
>>>                 }
>>>         } else {
>>>                 if ((result = Tspi_Policy_SetSecret(hAIKPolicy, 
>>> TSS_SECRET_MODE_PLAIN,
>>>                                 0, NULL )) != TSS_SUCCESS) {
>>>                         return (result);
>>>                 }
>>>         }
>>>         DBG("leaving load_aik_by_uuid", result);
>>>         return (result);
>>> }
>>>
>>>
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> Master HTML5, CSS3, ASP.NET, MVC, AJAX, Knockout.js, Web API and
>>> much more. Get web development skills now with LearnDevNow -
>>> 350+ hours of step-by-step video tutorials by Microsoft MVPs and experts.
>>> SALE $99.99 this month only -- learn more at:
>>> http://p.sf.net/sfu/learnmore_122812
>>> _______________________________________________
>>> TrouSerS-users mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/trousers-users

Attachment: 011713-avoid_using_tpm_while_closing_signed_transport_session.patch
Description: Binary data

------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. ON SALE this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122712
_______________________________________________
TrouSerS-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/trousers-users

Reply via email to