RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [email protected]
  Module: rpm                              Date:   28-Jul-2010 15:56:22
  Branch: HEAD                             Handle: 2010072813562200

  Modified files:
    rpm/rpmio               ttpm.c

  Log:
    - tpm: WIP.

  Summary:
    Revision    Changes     Path
    2.6         +293 -79    rpm/rpmio/ttpm.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmio/ttpm.c
  ============================================================================
  $ cvs diff -u -r2.5 -r2.6 ttpm.c
  --- rpm/rpmio/ttpm.c  27 Jul 2010 23:28:16 -0000      2.5
  +++ rpm/rpmio/ttpm.c  28 Jul 2010 13:56:22 -0000      2.6
  @@ -223,6 +223,7 @@
   static const char *keypass;
   static const char *migpass;
   static const char *parpass;
  +static const char *datpass;
   
   enum {
       NONE,
  @@ -246,6 +247,8 @@
   static const char *lbl;
   
   static uint32_t bitmask;
  +static uint32_t bitname = 0xffffffff;
  +static uint32_t bitvalue;
   
   /*==============================================================*/
   
  @@ -1220,11 +1223,7 @@
            goto exit;
        }
   
  -     buffer = malloc(resp.used + TPM_NONCE_SIZE);
  -     if (NULL == buffer) {
  -         printf("Could not allocate buffer.\n");
  -         goto exit;
  -     }
  +     buffer = xmalloc(resp.used + TPM_NONCE_SIZE);
        memcpy(&buffer[0], resp.buffer, resp.used);
        memcpy(&buffer[resp.used], antiReplay, TPM_NONCE_SIZE);
   
  @@ -1320,7 +1319,7 @@
                    TSS_SetTPMBuffer(&tb, resp.buffer, resp.used);
                    ret = rpmtpmErr(tpm, "ReadSTClearFlags", ERR_MASK,
                                TPM_ReadSTClearFlags(&tb, 0, &sf));
  -                 if ((ret & ERR_MASK) != 0 || ret > resp.used) {
  +                 if ((ret & ERR_MASK) || ret > resp.used) {
                        printf("ret=%x, responselen=%d\n", ret, resp.used);
                        printf("Error parsing response!\n");
                        goto exit;
  @@ -1349,7 +1348,7 @@
                TSS_SetTPMBuffer(&tb, resp.buffer, resp.used);
                ret = rpmtpmErr(tpm, "ReadNVDataPublic", ERR_MASK,
                                TPM_ReadNVDataPublic(&tb, 0, &ndp));
  -             if ((ret & ERR_MASK) != 0) {
  +             if (ret & ERR_MASK) {
                    printf("Could not deserialize the TPM_NV_DATA_PUBLIC 
structure.\n");
                    goto exit;
                }
  @@ -1382,7 +1381,7 @@
                TSS_SetTPMBuffer(&tb, resp.buffer, resp.used);
                ret = rpmtpmErr(tpm, "ReadCapVersionInfo", ERR_MASK,
                                TPM_ReadCapVersionInfo(&tb, 0, &cvi));
  -             if ((ret & ERR_MASK) != 0) {
  +             if (ret & ERR_MASK) {
                    printf ("Could not read the version info structure.\n");
                    goto exit;
                }
  @@ -1588,8 +1587,8 @@
       int ec = -1;             /* assume failure */
   
       int ret;
  -    unsigned char *ownerpasshashptr = NULL;
  -    unsigned char ownerpasshash[TPM_HASH_SIZE];
  +    unsigned char *ownptr = NULL;
  +    unsigned char ownhash[TPM_HASH_SIZE];
       uint32_t capArea = 0;
       uint32_t subCap32 = -1;
       unsigned char serSubCap[4];
  @@ -1661,7 +1660,7 @@
        }
        ret = rpmtpmErr(tpm, "WritePCRSelection", ERR_MASK,
                TPM_WritePCRSelection(&serSetValue, &pcrsel));
  -     if ((ret & ERR_MASK)) {
  +     if (ret & ERR_MASK) {
            printf("Error '%s' while serializing "
                   "TPM_PCR_SELECTION.\n", TPM_GetErrMsg(ret));
            goto exit;
  @@ -1673,16 +1672,15 @@
        break;
       }
   
  -    if (NULL != ownerpass) {
  -     TSS_sha1(ownerpass, strlen(ownerpass), ownerpasshash);
  -     ownerpasshashptr = ownerpasshash;
  +    if (ownerpass) {
  +     TSS_sha1(ownerpass, strlen(ownerpass), ownhash);
  +     ownptr = ownhash;
       }
   
  -
       ret = rpmtpmErr(tpm, "SetCapability", 0,
                TPM_SetCapability(capArea,
                            serSubCap, serSubCapLen,
  -                         &serSetValue, ownerpasshashptr));
  +                         &serSetValue, ownptr));
   
       if (ret) {
        printf("Error %s from SetCapability.\n", TPM_GetErrMsg(ret));
  @@ -1774,6 +1772,8 @@
        N_("Specify TPM owner <password>"),     N_(" <password>") },
    { "pwdc", '\0', POPT_ARG_STRING|POPT_ARGFLAG_ONEDASH,       &ctrpass,       
0,
        N_("Specify counter <password>"),       N_(" <password>") },
  + { "pwdd", '\0', POPT_ARG_STRING|POPT_ARGFLAG_ONEDASH,       &datpass,       
0,
  +     N_("Specify data <password>"),  N_(" <password>") },
   
   /* XXX FIXME:  <pcrnum>:<digest> split */
    { "ix", '\0', POPT_ARG_INT|POPT_ARGFLAG_ONEDASH,    &ix, 0,
  @@ -1806,6 +1806,10 @@
        N_("Keep resource handle when loading"),        NULL },
    { "bm", '\0', POPT_ARG_INT|POPT_ARGFLAG_ONEDASH,    &bitmask, 0,
        N_("XXX CMK_SetRestrictions(<bitmask>)"),       N_(" <bitmask>") },
  + { "bn", '\0', POPT_ARG_INT|POPT_ARGFLAG_ONEDASH,    &bitname, 0,
  +     N_("XXX KeyControlOwner(<bitname>)"),   N_(" <bitname>") },
  + { "bv", '\0', POPT_ARG_INT|POPT_ARGFLAG_ONEDASH,    &bitname, 0,
  +     N_("XXX KeyControlOwner(<bitvalue>)"),  N_(" <bitvalue>") },
   
    { "ordinal", 'o', POPT_ARG_INT|POPT_ARGFLAG_ONEDASH,        &ix, 0,
        N_("Specify <ordinal> to audit"),       N_(" <ordinal>") },
  @@ -1893,11 +1897,11 @@
   /* --- chgtpmauth */
   /* --- clearown */
        if (!strcmp(av[0], "clearown")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
   assert(ownerpass);   /* XXX FIXME */
  -         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), passhash);
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
            ec = rpmtpmErr(tpm, "OwnerClear", 0,
  -                     TPM_OwnerClear(passhash));
  +                     TPM_OwnerClear(ownhash));
        } else
   /* --- cmk_approvema */
   /* --- cmk_createkey */
  @@ -1906,14 +1910,14 @@
   /* --- cmk_migrate */
   /* --- cmk_setrestrictions */
        if (!strcmp(av[0], "cmk_setrestrictions")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  -         unsigned char * passptr = NULL;
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
  +         unsigned char * ownptr = NULL;
            if (ownerpass) {
  -             TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), 
passhash);
  -             passptr = passhash;
  +             TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), 
ownhash);
  +             ownptr = ownhash;
            }
            ec = rpmtpmErr(tpm, "CMK_SetRestrictions", 0,
  -                     TPM_CMK_SetRestrictions(bitmask, passptr));
  +                     TPM_CMK_SetRestrictions(bitmask, ownptr));
        } else
   /* --- counter_calc_incr */
        if (!strcmp(av[0], "counter_calc_incr")) {
  @@ -1974,7 +1978,7 @@
        } else
   /* --- counter_increment */
        if (!strcmp(av[0], "counter_increment")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ctrhash[TPM_DIGEST_SIZE];
            unsigned char ctrValue[TPM_COUNTER_VALUE_SIZE];
            int i;
   
  @@ -1983,9 +1987,9 @@
                goto exit;
            }
   
  -         TSS_sha1((unsigned char *)ctrpass, strlen(ctrpass), passhash);
  +         TSS_sha1((unsigned char *)ctrpass, strlen(ctrpass), ctrhash);
            ec = rpmtpmErr(tpm, "IncrementCounter", 0,
  -                     TPM_IncrementCounter(ix, passhash, ctrValue));
  +                     TPM_IncrementCounter(ix, ctrhash, ctrValue));
            if (ec)
                goto exit;
            printf("Value of counter[%d]: ", ix);
  @@ -2071,15 +2075,15 @@
        } else
   /* --- dirwrite */
        if (!strcmp(av[0], "dirwrite")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
            unsigned char msghash[TPM_DIGEST_SIZE];
   assert(ix >= 0);     /* XXX FIXME */
   assert(ownerpass);   /* XXX FIXME */
   assert(msg);         /* XXX FIXME */
  -         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), passhash);
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
            TSS_sha1((unsigned char *)msg, strlen(msg), msghash);
            ec = rpmtpmErr(tpm, "DirWriteAuth", 0,
  -                     TPM_DirWriteAuth(ix, msghash, passhash));
  +                     TPM_DirWriteAuth(ix, msghash, ownhash));
        } else
   /* --- disableforceclear */
        if (!strcmp(av[0], "disableforceclear")) {
  @@ -2088,32 +2092,32 @@
        } else
   /* --- disableownerclear */
        if (!strcmp(av[0], "disableownerclear")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
   assert(ownerpass);   /* XXX FIXME */
  -         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), passhash);
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
            ec = rpmtpmErr(tpm, "DisableOwnerClear", 0,
  -                     TPM_DisableOwnerClear(passhash));
  +                     TPM_DisableOwnerClear(ownhash));
        } else
   /* --- disablepubek */
        if (!strcmp(av[0], "disablepubek")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
   assert(ownerpass);   /* XXX FIXME */
  -         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), passhash);
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
            ec = rpmtpmErr(tpm, "DisablePubekRead", 0,
  -                     TPM_DisablePubekRead(passhash));
  +                     TPM_DisablePubekRead(ownhash));
        } else
   /* --- dumpkey */
        /* XXX -ifn and TPM_ReadFile? */
   /* --- enableaudit */
        if (!strcmp(av[0], "enableaudit")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
            if (ordinal < 0 || ownerpass == NULL) {
                printf("Missing mandatory parameter.\n");
                goto exit;
            }
  -         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), passhash);
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
            ec = rpmtpmErr(tpm, "SetOrdinalAuditStatus", 0,
  -                     TPM_SetOrdinalAuditStatus(ordinal, (disabled_audit ? 
FALSE : TRUE), passhash));
  +                     TPM_SetOrdinalAuditStatus(ordinal, (disabled_audit ? 
FALSE : TRUE), ownhash));
        } else
   /* --- evictkey */
        if (!strcmp(av[0], "evictkey")) {
  @@ -2215,7 +2219,7 @@
        } else
   /* --- getpubek */
        if (!strcmp(av[0], "getpubek")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
            pubkeydata pubek;
            RSA *rsa;                   /* OpenSSL format Public Key */
            FILE *fp;                   /* output file for public key */
  @@ -2224,9 +2228,9 @@
            int i;
   
            if (ownerpass) {
  -             TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), 
passhash);
  +             TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), 
ownhash);
                ec = rpmtpmErr(tpm, "OwnerReadPubek", 0,
  -                     TPM_OwnerReadPubek(passhash, &pubek));
  +                     TPM_OwnerReadPubek(ownhash, &pubek));
            } else {
                ec = rpmtpmErr(tpm, "ReadPubek", 0,
                        TPM_ReadPubek(&pubek));
  @@ -2292,13 +2296,36 @@
        } else
   /* --- identity */
   /* --- keycontrol */
  +     if (!strcmp(av[0], "keycontrol")) {
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
  +         unsigned char keyhash[TPM_DIGEST_SIZE];
  +         unsigned char * keyptr = NULL;
  +         keydata key;
  +
  +         if (ownerpass == NULL || hkhandle == 0xffffffff || bitname == 
0xffffffff) {
  +             printf("Missing argument\n");
  +             goto exit;
  +         }
  +
  +         if (keypass) {
  +             TSS_sha1((unsigned char *)keypass, strlen(keypass), keyhash);
  +             keyptr = keyhash;
  +         }
  +         ec = rpmtpmErr(tpm, "GetPubKey", 0,
  +                     TPM_GetPubKey(hkhandle, keyptr, &key.pub));
  +         if (ec)
  +             goto exit;
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
  +         ec = rpmtpmErr(tpm, "KeyControlOwner", 0,
  +                     TPM_KeyControlOwner(ownhash, hkhandle, &key, bitname, 
(bitvalue ? TRUE : FALSE)));
  +     } else
   /* --- killmaintenancefeature */
        if (!strcmp(av[0], "killmaintenancefeature")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
   assert(ownerpass);   /* XXX FIXME */
  -         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), passhash);
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
            ec = rpmtpmErr(tpm, "KillMaintenanceFeature", 0,
  -                     TPM_KillMaintenanceFeature(passhash));
  +                     TPM_KillMaintenanceFeature(ownhash));
        } else
   /* --- libtpm-config */
   /* --- listkeys */
  @@ -2385,7 +2412,7 @@
   /* --- nv_writevalue */
   /* --- ownerreadinternalpub */
        if (!strcmp(av[0], "ownerreadinternalpub")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
            STACK_TPM_BUFFER(keybuf);
            keydata k = {};
            FILE * fp = NULL;
  @@ -2394,9 +2421,9 @@
                printf("Missing argument\n");
                goto exit;
            }
  -         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), passhash);
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
            ec = rpmtpmErr(tpm, "OwnerReadInternalPub", 0,
  -                     TPM_OwnerReadInternalPub(hkhandle, passhash, &k.pub));
  +                     TPM_OwnerReadInternalPub(hkhandle, ownhash, &k.pub));
            if (ec)
                goto exit;
            ec = rpmtpmErr(tpm, "WriteKeyPub", 0,
  @@ -2410,11 +2437,11 @@
        } else
   /* --- ownersetdisable */
        if (!strcmp(av[0], "ownersetdisable")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
   assert(ownerpass);   /* XXX FIXME */
  -         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), passhash);
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
            ec = rpmtpmErr(tpm, "OwnerSetDisable", 0,
  -                     TPM_OwnerSetDisable(passhash,
  +                     TPM_OwnerSetDisable(ownhash,
                                        (disabled_state ? FALSE : TRUE)));
        } else
   /* --- pcrread */
  @@ -2474,9 +2501,9 @@
   /* --- physicalsetdeactivated */
   /* --- quote */
        if (!strcmp(av[0], "quote")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char keyhash[TPM_DIGEST_SIZE];
            unsigned char nonce[TPM_NONCE_SIZE];
  -         unsigned char * passptr = NULL;
  +         unsigned char * keyptr = NULL;
            uint32_t pcrs = 0;
            uint16_t sigscheme = TPM_SS_RSASSAPKCS1v15_SHA1;
            STACK_TPM_BUFFER(signature);
  @@ -2491,10 +2518,10 @@
            }
   
            if (keypass) {
  -             TSS_sha1((unsigned char *)keypass, strlen(keypass), passhash);
  +             TSS_sha1((unsigned char *)keypass, strlen(keypass), keyhash);
                /* for testing, use the password hash as the test nonce */
  -             memcpy(nonce, passhash, sizeof(nonce));
  -             passptr = passhash;
  +             memcpy(nonce, keyhash, sizeof(nonce));
  +             keyptr = keyhash;
            } else
                memset(nonce, 0, sizeof(nonce));
   
  @@ -2513,12 +2540,12 @@
            }
   
            ec = rpmtpmErr(tpm, "Quote", 0,
  -                     TPM_Quote(hkhandle, passptr, nonce, &tps, &tpc, 
&signature));
  +                     TPM_Quote(hkhandle, keyptr, nonce, &tps, &tpc, 
&signature));
            if (ec)
                goto exit;
   
            ec = rpmtpmErr(tpm, "GetPubKey", 0,
  -                     TPM_GetPubKey(hkhandle, passptr, &pubkey));
  +                     TPM_GetPubKey(hkhandle, keyptr, &pubkey));
            if (ec)
                goto exit;
   
  @@ -2530,9 +2557,9 @@
        } else
   /* --- quote2 */
        if (!strcmp(av[0], "quote2")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char keyhash[TPM_DIGEST_SIZE];
            unsigned char nonce[TPM_NONCE_SIZE];
  -         unsigned char * passptr = NULL;
  +         unsigned char * keyptr = NULL;
            uint32_t pcrs = 0;
            uint16_t sigscheme = TPM_SS_RSASSAPKCS1v15_SHA1;
            STACK_TPM_BUFFER(signature);
  @@ -2551,10 +2578,10 @@
            }
   
            if (keypass) {
  -             TSS_sha1((unsigned char *)keypass, strlen(keypass), passhash);
  +             TSS_sha1((unsigned char *)keypass, strlen(keypass), keyhash);
                /* for testing, use the password hash as the test nonce */
  -             memcpy(nonce, passhash, sizeof(nonce));
  -             passptr = passhash;
  +             memcpy(nonce, keyhash, sizeof(nonce));
  +             keyptr = keyhash;
            } else
                memset(nonce, 0, sizeof(nonce));
   
  @@ -2573,12 +2600,12 @@
            }
   
            ec = rpmtpmErr(tpm, "Quote2", 0,
  -                     TPM_Quote2(hkhandle, &selection, (add_version ? TRUE : 
FALSE), passptr, nonce, &s1, &versionblob, &signature));
  +                     TPM_Quote2(hkhandle, &selection, (add_version ? TRUE : 
FALSE), keyptr, nonce, &s1, &versionblob, &signature));
            if (ec)
                goto exit;
   
            ec = rpmtpmErr(tpm, "GetPubKey", 0,
  -                     TPM_GetPubKey(hkhandle, passptr, &pubkey));
  +                     TPM_GetPubKey(hkhandle, keyptr, &pubkey));
            if (ec)
                goto exit;
            rsa = TSS_convpubkey(&pubkey);
  @@ -2659,19 +2686,19 @@
        } else
   /* --- resetlockvalue */
        if (!strcmp(av[0], "resetlockvalue")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
   assert(ownerpass);   /* XXX FIXME */
  -         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), passhash);
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
            ec = rpmtpmErr(tpm, "ResetLockValue", 0,
  -                     TPM_ResetLockValue(passhash));
  +                     TPM_ResetLockValue(ownhash));
        } else
   /* --- revtrust */
        if (!strcmp(av[0], "revtrust")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
   assert(keypass);     /* XXX FIXME */
  -         TSS_sha1((unsigned char *)keypass, strlen(keypass), passhash);
  +         TSS_sha1((unsigned char *)keypass, strlen(keypass), ownhash);
            ec = rpmtpmErr(tpm, "RevokeTrust", 0,
  -                     TPM_RevokeTrust(passhash));
  +                     TPM_RevokeTrust(ownhash));
        } else
   /* --- saveauthcontext */
        if (!strcmp(av[0], "saveauthcontext")) {
  @@ -2743,6 +2770,69 @@
        } else
   /* --- sealfile2 */
   /* --- sealfile */
  +     if (!strcmp(av[0], "sealfile")) {
  +         unsigned char keyhash[TPM_DIGEST_SIZE];
  +         unsigned char * keyptr = NULL;
  +         unsigned char dathash[TPM_DIGEST_SIZE];
  +         unsigned char * datptr = NULL;
  +         struct stat sb;
  +         unsigned char blob[4096];
  +         size_t bloblen = sizeof(blob);
  +         unsigned char data[256];
  +         uint32_t  datalen = 0;
  +
  +         FILE * fp = NULL;
  +
  +         if (hkhandle == 0xffffffff || ofn == NULL || ifn == NULL) {
  +             printf("Missing argument\n");
  +             goto exit;
  +         }
  +         if (keypass) {
  +             TSS_sha1((unsigned char *)keypass, strlen(keypass), keyhash);
  +             keyptr = keyhash;
  +         }
  +         if (datpass) {
  +             TSS_sha1((unsigned char *)datpass, strlen(datpass), dathash);
  +             datptr = dathash;
  +         }
  +
  +         if (stat(ifn, &sb) == 0)
  +             datalen = sb.st_size;
  +         if (datalen >= sizeof(data)) {
  +             printf("Data file too large for seal operation\n");
  +             ec = -3;
  +             goto exit;
  +         }
  +         if ((fp = fopen(ifn, "rb")) == NULL) {
  +             printf("Unable to open input file '%s'\n", ifn);
  +             ec = -4;
  +             goto exit;
  +         }
  +         if (datalen == 0 || datalen != fread(data, 1, datalen, fp)) {
  +             (void) fclose(fp);
  +             printf("I/O Error while reading input file '%s'\n", ifn);
  +             ec = -5;
  +             goto exit;
  +         }
  +         (void) fclose(fp);
  +
  +         ec = rpmtpmErr(tpm, "SealCurrPCR", 0,
  +                     TPM_SealCurrPCR(hkhandle, 0x7f, keyptr, datptr, data, 
datalen, blob, &bloblen));
  +         if (ec)
  +             goto exit;
  +         if ((fp = fopen(ofn, "wb")) == NULL) {
  +             printf("Unable to open output file '%s'\n", ofn);
  +             ec = -7;
  +             goto exit;
  +         }
  +         if (bloblen != fwrite(blob, 1, bloblen, fp)) {
  +             (void) fclose(fp);
  +             printf("I/O Error while writing output file '%s'\n", ofn);
  +             ec = -8;
  +             goto exit;
  +         }
  +         (void) fclose(fp);
  +     } else
   /* --- sealxfile */
   /* --- selftest */
        if (!strcmp(av[0], "selftest")) {
  @@ -2777,11 +2867,11 @@
        else
   /* --- setoperatorauth */
        if (!strcmp(av[0], "setoperatorauth")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
   assert(ownerpass);   /* XXX FIXME */
  -         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), passhash);
  +         TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), ownhash);
            ec = rpmtpmErr(tpm, "SetOperatorAuth", 0,
  -                     TPM_SetOperatorAuth(passhash));
  +                     TPM_SetOperatorAuth(ownhash));
        } else
   /* --- setownerinstall */
        if (!strcmp(av[0], "setownerinstall")) {
  @@ -2791,14 +2881,14 @@
   /* --- setownerpointer */
   /* --- settempdeactivated */
        if (!strcmp(av[0], "settempdeactivated")) {
  -         unsigned char passhash[TPM_DIGEST_SIZE];
  -         unsigned char * passptr = NULL;
  +         unsigned char ownhash[TPM_DIGEST_SIZE];
  +         unsigned char * ownptr = NULL;
            if (ownerpass) {
  -             TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), 
passhash);
  -             passptr = passhash;
  +             TSS_sha1((unsigned char *)ownerpass, strlen(ownerpass), 
ownhash);
  +             ownptr = ownhash;
            }
            ec = rpmtpmErr(tpm, "SetTempDeactivated", 0,
  -                     TPM_SetOperatorAuth(passptr));
  +                     TPM_SetOperatorAuth(ownptr));
        } else
   /* --- sha */
   /* --- signfile */
  @@ -2822,7 +2912,131 @@
   /* --- unbindfile */
   /* --- unixiotest */
   /* --- unsealfile */
  +     if (!strcmp(av[0], "unsealfile")) {
  +         unsigned char keyhash[TPM_DIGEST_SIZE];
  +         unsigned char * keyptr = NULL;
  +         unsigned char dathash[TPM_DIGEST_SIZE];
  +         unsigned char * datptr = NULL;
  +         struct stat sb;
  +         unsigned char * blob = NULL;
  +         size_t bloblen = 0;
  +         unsigned char data[256];
  +         uint32_t datalen = sizeof(data);
  +
  +         FILE * fp = NULL;
  +
  +         if (hkhandle == 0xffffffff || ofn == NULL || ifn == NULL) {
  +             printf("Missing argument\n");
  +             goto exit;
  +         }
  +         if (keypass) {
  +             TSS_sha1((unsigned char *)keypass, strlen(keypass), keyhash);
  +             keyptr = keyhash;
  +         }
  +         if (datpass) {
  +             TSS_sha1((unsigned char *)datpass, strlen(datpass), dathash);
  +             datptr = dathash;
  +         }
  +
  +         if (stat(ifn, &sb) == 0) {
  +             bloblen = sb.st_size;
  +             blob = xmalloc(bloblen);
  +         }
  +         if ((fp = fopen(ifn, "rb")) == NULL) {
  +             printf("Unable to open input file '%s'\n", ifn);
  +             ec = -4;
  +             goto exit;
  +         }
  +         if (blob == NULL || bloblen != fread(blob, 1, bloblen, fp)) {
  +             (void) fclose(fp);
  +             blob = _free(blob);
  +             printf("I/O Error while reading input file '%s'\n", ifn);
  +             ec = -5;
  +             goto exit;
  +         }
  +         (void) fclose(fp);
  +
  +         ec = rpmtpmErr(tpm, "Unseal", 0,
  +                     TPM_Unseal(hkhandle, keyptr, datptr, blob, bloblen, 
data, &datalen));
  +         blob = _free(blob);
  +         if (ec)
  +             goto exit;
  +         if ((fp = fopen(ofn, "wb")) == NULL) {
  +             printf("Unable to open output file '%s'\n", ofn);
  +             ec = -7;
  +             goto exit;
  +         }
  +         if (datalen != fwrite(data, 1, datalen, fp)) {
  +             (void) fclose(fp);
  +             printf("I/O Error while writing output file '%s'\n", ofn);
  +             ec = -8;
  +             goto exit;
  +         }
  +         (void) fclose(fp);
  +     } else
   /* --- unsealxfile */
  +     if (!strcmp(av[0], "unsealxfile")) {
  +         unsigned char keyhash[TPM_DIGEST_SIZE];
  +         unsigned char * keyptr = NULL;
  +         unsigned char dathash[TPM_DIGEST_SIZE];
  +         unsigned char * datptr = NULL;
  +         struct stat sb;
  +         unsigned char * blob = NULL;
  +         size_t bloblen = 0;
  +         unsigned char data[256];
  +         uint32_t  datalen = sizeof(data);
  +
  +         FILE * fp = NULL;
  +
  +         if (hkhandle == 0xffffffff || ofn == NULL || ifn == NULL) {
  +             printf("Missing argument\n");
  +             goto exit;
  +         }
  +         if (keypass) {
  +             TSS_sha1((unsigned char *)keypass, strlen(keypass), keyhash);
  +             keyptr = keyhash;
  +         }
  +         if (datpass) {
  +             TSS_sha1((unsigned char *)datpass, strlen(datpass), dathash);
  +             datptr = dathash;
  +         }
  +
  +         if (stat(ifn, &sb) == 0) {
  +             bloblen = sb.st_size;
  +             blob = xmalloc(bloblen);
  +         }
  +         if ((fp = fopen(ifn, "rb")) == NULL) {
  +             printf("Unable to open input file '%s'\n", ifn);
  +             ec = -4;
  +             goto exit;
  +         }
  +         if (blob == NULL || bloblen != fread(blob, 1, bloblen, fp)) {
  +             (void) fclose(fp);
  +             blob = _free(blob);
  +             printf("I/O Error while reading input file '%s'\n", ifn);
  +             ec = -5;
  +             goto exit;
  +         }
  +         (void) fclose(fp);
  +
  +         ec = rpmtpmErr(tpm, "Unsealx", 0,
  +                     TPM_Unsealx(hkhandle, keyptr, datptr, blob, bloblen, 
data, &datalen));
  +         blob = _free(blob);
  +         if (ec)
  +             goto exit;
  +         if ((fp = fopen(ofn, "wb")) == NULL) {
  +             printf("Unable to open output file '%s'\n", ofn);
  +             ec = -7;
  +             goto exit;
  +         }
  +         if (datalen != fwrite(data, 1, datalen, fp)) {
  +             (void) fclose(fp);
  +             printf("I/O Error while writing output file '%s'\n", ofn);
  +             ec = -8;
  +             goto exit;
  +         }
  +         (void) fclose(fp);
  +     } else
   /* --- updateverification */
   /* --- verifydelegation */
        /* XXX -ifn and TPM_ReadFile? */
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to