1 // This file was extracted from the TCG Published 2 // Trusted Platform Module Library 3 // Part 4: Supporting Routines 4 // Family "2.0" 5 // Level 00 Revision 01.16 6 // October 30, 2014 7 8 #include "OsslCryptoEngine.h" 9 // 10 // 11 // Functions 12 // 13 // BnTo2B() 14 // 15 // This function is used to convert a BigNum() to a byte array of the specified size. If the number is too large 16 // to fit, then 0 is returned. Otherwise, the number is converted into the low-order bytes of the provided array 17 // and the upper bytes are set to zero. 18 // 19 // Return Value Meaning 20 // 21 // 0 failure (probably fatal) 22 // 1 conversion successful 23 // 24 BOOL 25 BnTo2B( 26 TPM2B *outVal, // OUT: place for the result 27 BIGNUM *inVal, // IN: number to convert 28 UINT16 size // IN: size of the output. 29 ) 30 { 31 BYTE *pb = outVal->buffer; 32 UINT16 unpaddedSize = (((UINT16) BN_num_bits(inVal) + 7) / 8); 33 outVal->size = size; 34 if(size < unpaddedSize) 35 return FALSE; 36 37 size -= unpaddedSize; 38 for(;size > 0; size--) 39 *pb++ = 0; 40 BN_bn2bin(inVal, pb); 41 return TRUE; 42 } 43 // 44 // 45 // Copy2B() 46 // 47 // This function copies a TPM2B structure. The compiler can't generate a copy of a TPM2B generic 48 // structure because the actual size is not known. This function performs the copy on any TPM2B pair. The 49 // size of the destination should have been checked before this call to make sure that it will hold the TPM2B 50 // being copied. 51 // This replicates the functionality in the MemoryLib.c. 52 // 53 void 54 Copy2B( 55 TPM2B *out, // OUT: The TPM2B to receive the copy 56 TPM2B *in // IN: the TPM2B to copy 57 ) 58 { 59 BYTE *pIn = in->buffer; 60 BYTE *pOut = out->buffer; 61 int count; 62 out->size = in->size; 63 for(count = in->size; count > 0; count--) 64 *pOut++ = *pIn++; 65 return; 66 } 67 // 68 // 69 // BnFrom2B() 70 // 71 // This function creates a BIGNUM from a TPM2B and fails if the conversion fails. 72 // 73 BIGNUM * 74 BnFrom2B( 75 BIGNUM *out, // OUT: The BIGNUM 76 const TPM2B *in // IN: the TPM2B to copy 77 ) 78 { 79 if(BN_bin2bn(in->buffer, in->size, out) == NULL) 80 FAIL(FATAL_ERROR_INTERNAL); 81 return out; 82 } 83