|
From: Jan V. <jan...@ka...> - 2011-08-25 08:24:23
|
Dear All,
I am working on a project which involves making a Java implementation of
DAA.
I am using the jTSS framework to access the TPM functionality.
However, when I send the first command for the DAA Join (stage 0) I
receive an 'INVALID_AUTHHANDLE' error code.
Does anyone have an idea what I am doing wrong (code sample below)?
Thanks,
Jan
public void test(){
try{
tcs_ = new TcTcsBindingLocal();
Object[] ret = tcs_.TcsiOpenContext();
if(!new Long(TcTcsErrors.TCS_SUCCESS).equals((Long)ret[0]))
System.out.println("Unable to open context");
hContext_ = (Long) ret[1];
TcTcsAuth auth = TspOIAP();
auth.setNonceOdd(TcCrypto.createTcgNonce());
auth.setContAuthSession(true);
TcTpmSecret oiapSecret = new
TcTpmSecret(TcBlobData.newByteArray(Base64.decode("G9HrogY4LoZC6RIxR8YqMCj3ZgM=")));
Long handle = 0L;
short stage = 0;
TcBlobData input0 = TcBlobData.newUINT32(1L);
TcBlobData input1 = TcBlobData.newByteArray(new byte[]{});
TcBlobData[] blob1H = { // 1H
TcBlobData.newUINT32(TcTpmOrdinals.TPM_ORD_DAA_Join), // 1S
TcBlobData.newBYTE(stage), // 2S
TcBlobData.newUINT32(input0.getLengthAsLong()), // 3S
input0, // 4S
TcBlobData.newUINT32(input1.getLengthAsLong()), // 5S
input1 // 6S
};
TcBlobData authDataH1 = computeAuthData( //
blob1H, // 1H1
auth.getNonceEven().getEncoded(), // 2H1
auth.getNonceOdd().getEncoded(), // 3H1
TcBlobData.newBOOL(auth.getContAuthSession()),// 4H1
oiapSecret.getEncoded()); // HMAC key
auth.setHmac(new TcTpmAuthdata(authDataH1));
//Stage 1 DAA Join
tcs_.TcsipDaaJoin(hContext_, handle, stage, input0, input1,
auth);
}catch(Exception e){
e.printStackTrace();
}
}
private TcBlobData computeAuthData(final TcBlobData[] blob1H, final
TcBlobData blob2H,
final TcBlobData blob3H, final TcBlobData blob4H, final
TcBlobData authHash)
{
TcBlobData combinedBlob1H = TcBlobData.newBlobData(blob1H[0]);
for (int i = 1; i < blob1H.length; i++) {
combinedBlob1H.append(blob1H[i]);
}
TcBlobData authData = combinedBlob1H.sha1();
authData.append(blob2H);
authData.append(blob3H);
authData.append(blob4H);
TcBlobData retVal = authData.hmacSha1(authHash);
return retVal;
}
private TcTcsAuth TspOIAP() throws TcTddlException, TcTpmException,
TcTcsException
{
Object[] outDataTpm = tcs_.TcsipOIAP(hContext_);
// get return values
Long authHandle = (Long) outDataTpm[1];
TcTpmNonce nonceEven = (TcTpmNonce) outDataTpm[2];
TcTcsAuth auth = new TcTcsAuth();
auth.setAuthHandle(authHandle.longValue());
auth.setNonceEven(nonceEven);
return auth;
}
|