/********************************************************************************/ /* */ /* policymaker */ /* Written by Ken Goldman */ /* IBM Thomas J. Watson Research Center */ /* */ /* (c) Copyright IBM Corporation 2015 - 2019 */ /* */ /* All rights reserved. */ /* */ /* Redistribution and use in source and binary forms, with or without */ /* modification, are permitted provided that the following conditions are */ /* met: */ /* */ /* Redistributions of source code must retain the above copyright notice, */ /* this list of conditions and the following disclaimer. */ /* */ /* Redistributions in binary form must reproduce the above copyright */ /* notice, this list of conditions and the following disclaimer in the */ /* documentation and/or other materials provided with the distribution. */ /* */ /* Neither the names of the IBM Corporation nor the names of its */ /* contributors may be used to endorse or promote products derived from */ /* this software without specific prior written permission. */ /* */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ /* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR */ /* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ /* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */ /* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */ /* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY */ /* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */ /* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE */ /* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /********************************************************************************/ /* policymaker calculates a TPM2 policy hash Inputs are: a hash algorithm a file with lines in hexascii, to be extended into the policy digest, big endian NOTE: Empty lines (lines with just a newline character) are permitted and cause a double hash. This is useful for e.g. TPM2_PolicySigned when the policyRef is empty. Outputs are: if specified, a file with a binary digest if specified, a print of the hash Example input: policy command code with a command code of NV write 0000016c00000137 TPM2_PolicyCounterTimer is handled as a special case, where there is a double hash. */ #include #include #include #include #include #include #include #include #include static void printUsage(void); static int Format_FromHexascii(unsigned char *binary, const char *string, size_t length); static int Format_ByteFromHexascii(unsigned char *byte, const char *string); extern int tssUtilsVerbose; int main(int argc, char *argv[]) { TPM_RC rc = 0; int i; /* argc iterator */ char *prc = NULL; /* pointer return code */ const char *inFilename = NULL; const char *outFilename = NULL; int pr = FALSE; int nz = FALSE; int noSpace = FALSE; TPMT_HA digest; /* initialized to suppress false gcc -O3 warning */ uint32_t sizeInBytes = 0; /* hash algorithm mapped to size */ uint32_t startSizeInBytes = 0; /* starting buffer for extend */ FILE *inFile = NULL; FILE *outFile = NULL; setvbuf(stdout, 0, _IONBF, 0); /* output may be going through pipe to log file */ TSS_SetProperty(NULL, TPM_TRACE_LEVEL, "1"); tssUtilsVerbose = FALSE; /* command line defaults */ digest.hashAlg = TPM_ALG_SHA256; for (i=1 ; (i= '0') && (c <= '9')) { *byte += c - '0'; } else if ((c >= 'a') && (c <= 'f')) { *byte += c + 10 - 'a'; } else if ((c >= 'A') && (c <= 'F')) { *byte += c + 10 - 'A'; } else { printf("Format_ByteFromHexascii: " "Error: Line has non hex ascii character: %02x %c\n", c, c); rc = EXIT_FAILURE; } } return rc; } static void printUsage(void) { printf("\n"); printf("policymaker\n"); printf("\n"); printf("\t[-halg\thash algorithm (sha1 sha256 sha384 sha512) (default sha256)]\n"); printf("\t[-nz\tdo not extend starting with zeros, just hash the last line]\n"); printf("\t-if\tinput policy statements in hex ascii\n"); printf("\t[-of\toutput file - policy hash in binary]\n"); printf("\t[-pr\tstdout - policy hash in hex ascii]\n"); printf("\t[-ns\tadditionally print policy hash in hex ascii on one line]\n"); printf("\t\tUseful to paste into policy OR\n"); printf("\n"); exit(1); }