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; } |