// This file was extracted from the TCG Published // Trusted Platform Module Library // Part 4: Supporting Routines // Family "2.0" // Level 00 Revision 01.16 // October 30, 2014 #include "OsslCryptoEngine.h" // // // Functions // // BnTo2B() // // This function is used to convert a BigNum() to a byte array of the specified size. If the number is too large // to fit, then 0 is returned. Otherwise, the number is converted into the low-order bytes of the provided array // and the upper bytes are set to zero. // // Return Value Meaning // // 0 failure (probably fatal) // 1 conversion successful // BOOL BnTo2B( TPM2B *outVal, // OUT: place for the result BIGNUM *inVal, // IN: number to convert UINT16 size // IN: size of the output. ) { BYTE *pb = outVal->buffer; UINT16 unpaddedSize = (((UINT16) BN_num_bits(inVal) + 7) / 8); outVal->size = size; if(size < unpaddedSize) return FALSE; size -= unpaddedSize; for(;size > 0; size--) *pb++ = 0; BN_bn2bin(inVal, pb); return TRUE; } // // // Copy2B() // // This function copies a TPM2B structure. The compiler can't generate a copy of a TPM2B generic // structure because the actual size is not known. This function performs the copy on any TPM2B pair. The // size of the destination should have been checked before this call to make sure that it will hold the TPM2B // being copied. // This replicates the functionality in the MemoryLib.c. // void Copy2B( TPM2B *out, // OUT: The TPM2B to receive the copy TPM2B *in // IN: the TPM2B to copy ) { BYTE *pIn = in->buffer; BYTE *pOut = out->buffer; int count; out->size = in->size; for(count = in->size; count > 0; count--) *pOut++ = *pIn++; return; } // // // BnFrom2B() // // This function creates a BIGNUM from a TPM2B and fails if the conversion fails. // BIGNUM * BnFrom2B( BIGNUM *out, // OUT: The BIGNUM const TPM2B *in // IN: the TPM2B to copy ) { if(BN_bin2bn(in->buffer, in->size, out) == NULL) FAIL(FATAL_ERROR_INTERNAL); return out; }