in TPM Parser/Tpm2Lib/Tpm2.cs [358:544]
private void UpdateHandleData(TpmCc ordinal, TpmStructureBase inParms, TpmHandle[] inHandles, TpmStructureBase outParms)
{
switch (ordinal)
{
case TpmCc.Create:
{
var req = (Tpm2CreateRequest)inParms;
var resp = (Tpm2CreateResponse)outParms;
TpmHash priv = TpmHash.FromData(PrivHashAlg, resp.outPrivate.buffer);
AuthValues[priv] = Globs.CopyData(req.inSensitive.userAuth);
break;
}
case TpmCc.CreatePrimary:
{
var req = (Tpm2CreatePrimaryRequest)inParms;
var resp = (Tpm2CreatePrimaryResponse)outParms;
resp.objectHandle.Auth = req.inSensitive.userAuth;
ProcessName(resp.objectHandle, resp.name, resp.outPublic);
break;
}
case TpmCc.Load:
{
var req = (Tpm2LoadRequest)inParms;
var resp = (Tpm2LoadResponse)outParms;
TpmHash priv = TpmHash.FromData(PrivHashAlg, req.inPrivate.buffer);
if (AuthValues.ContainsKey(priv))
resp.objectHandle.Auth = AuthValues[priv];
ProcessName(resp.objectHandle, resp.name, req.inPublic);
break;
}
case TpmCc.LoadExternal:
{
var req = (Tpm2LoadExternalRequest)inParms;
if (req.inPublic.nameAlg != TpmAlgId.Null)
{
var resp = (Tpm2LoadExternalResponse)outParms;
byte[] name = req.inPublic.GetName();
ProcessName(resp.objectHandle, resp.name, req.inPublic);
}
break;
}
case TpmCc.StartAuthSession:
{
var req = (Tpm2StartAuthSessionRequest)inParms;
var resp = (Tpm2StartAuthSessionResponse)outParms;
SessionParams[resp.sessionHandle] =
new AuthSession(req.sessionType, req.tpmKey, req.bind,
req.nonceCaller, resp.nonceTPM,
req.symmetric, req.authHash);
break;
}
case TpmCc.HmacStart:
{
var req = (Tpm2HmacStartRequest)inParms;
var resp = (Tpm2HmacStartResponse)outParms;
resp.sequenceHandle.Auth = req.auth;
resp.sequenceHandle.Name = null;
break;
}
case TpmCc.NvDefineSpace:
{
var req = (Tpm2NvDefineSpaceRequest)inParms;
req.publicInfo.nvIndex.Auth = req.auth;
req.publicInfo.nvIndex.Name = null;
break;
}
case TpmCc.NvChangeAuth:
{
var req = (Tpm2NvChangeAuthRequest)inParms;
req.nvIndex.Auth = req.newAuth;
break;
}
case TpmCc.ObjectChangeAuth:
{
var req = (Tpm2ObjectChangeAuthRequest)inParms;
var resp = (Tpm2ObjectChangeAuthResponse)outParms;
TpmHash priv = TpmHash.FromData(PrivHashAlg, resp.outPrivate.buffer);
AuthValues[priv] = Globs.CopyData(req.newAuth);
break;
}
case TpmCc.HierarchyChangeAuth:
{
var req = (Tpm2HierarchyChangeAuthRequest)inParms;
AuthValue auth = Globs.CopyData(req.newAuth);
switch (req.authHandle.handle)
{
case (uint)TpmRh.Owner: OwnerAuth = auth; break;
case (uint)TpmRh.Endorsement: EndorsementAuth = auth; break;
case (uint)TpmRh.Platform: PlatformAuth = auth; break;
case (uint)TpmRh.Lockout: LockoutAuth = auth; break;
}
req.authHandle.Auth = auth;
break;
}
case TpmCc.PcrSetAuthValue:
{
var req = (Tpm2PcrSetAuthValueRequest)inParms;
req.pcrHandle.Auth = req.auth;
if (PcrHandles == null)
{
PcrHandles = new TpmHandle[24];
}
int pcrId = (int)req.pcrHandle.GetOffset();
Debug.Assert(pcrId < PcrHandles.Length);
PcrHandles[pcrId] = req.pcrHandle;
break;
}
case TpmCc.EvictControl:
{
var req = (Tpm2EvictControlRequest)inParms;
var resp = (Tpm2EvictControlResponse)outParms;
if (req.objectHandle.GetType() != Ht.Persistent)
{
req.persistentHandle.Auth = req.objectHandle.Auth;
req.persistentHandle.Name = req.objectHandle.Name;
}
break;
}
case TpmCc.Clear:
{
OwnerAuth = new AuthValue();
EndorsementAuth = new AuthValue();
LockoutAuth = new AuthValue();
break;
}
case TpmCc.NvWrite:
{
var req = (Tpm2NvWriteRequest)inParms;
// Force name recalculation before next use
req.nvIndex.Name = null;
break;
}
case TpmCc.NvWriteLock:
{
var req = (Tpm2NvWriteLockRequest)inParms;
// Force name recalculation before next use
req.nvIndex.Name = null;
break;
}
case TpmCc.NvReadLock:
{
var req = (Tpm2NvReadLockRequest)inParms;
// Force name recalculation before next use
req.nvIndex.Name = null;
break;
}
case TpmCc.HashSequenceStart:
{
var req = (Tpm2HashSequenceStartRequest)inParms;
var resp = (Tpm2HashSequenceStartResponse)outParms;
resp.sequenceHandle.Auth = req.auth;
break;
}
case TpmCc.Startup:
{
var req = (Tpm2StartupRequest)inParms;
if (req.startupType == Su.Clear)
{
PlatformAuth = new AuthValue();
}
break;
}
case TpmCc.ContextSave:
{
var req = (Tpm2ContextSaveRequest)inParms;
var resp = (Tpm2ContextSaveResponse)outParms;
resp.context.savedHandle.Auth = req.saveHandle.Auth;
resp.context.savedHandle.Name = req.saveHandle.Name;
break;
}
case TpmCc.ContextLoad:
{
var req = (Tpm2ContextLoadRequest)inParms;
var resp = (Tpm2ContextLoadResponse)outParms;
resp.loadedHandle.Auth = req.context.savedHandle.Auth;
resp.loadedHandle.Name = req.context.savedHandle.Name;
break;
}
case TpmCc.NvUndefineSpaceSpecial:
{
var req = (Tpm2NvUndefineSpaceSpecialRequest)inParms;
req.nvIndex.Auth = null;
break;
}
}
} // UpdateHandleData()