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// 24BOOL 25BnTo2B( 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 outVal->size = size; 33 size = size - (((UINT16) BN_num_bits(inVal) + 7) / 8); 34 if(size < 0) 35 return FALSE; 36 for(;size > 0; size--) 37 *pb++ = 0; 38 BN_bn2bin(inVal, pb); 39 return TRUE; 40} 41// 42// 43// Copy2B() 44// 45// This function copies a TPM2B structure. The compiler can't generate a copy of a TPM2B generic 46// structure because the actual size is not known. This function performs the copy on any TPM2B pair. The 47// size of the destination should have been checked before this call to make sure that it will hold the TPM2B 48// being copied. 49// This replicates the functionality in the MemoryLib.c. 50// 51void 52Copy2B( 53 TPM2B *out, // OUT: The TPM2B to receive the copy 54 TPM2B *in // IN: the TPM2B to copy 55 ) 56{ 57 BYTE *pIn = in->buffer; 58 BYTE *pOut = out->buffer; 59 int count; 60 out->size = in->size; 61 for(count = in->size; count > 0; count--) 62 *pOut++ = *pIn++; 63 return; 64} 65// 66// 67// BnFrom2B() 68// 69// This function creates a BIGNUM from a TPM2B and fails if the conversion fails. 70// 71BIGNUM * 72BnFrom2B( 73 BIGNUM *out, // OUT: The BIGNUM 74 const TPM2B *in // IN: the TPM2B to copy 75 ) 76{ 77 if(BN_bin2bn(in->buffer, in->size, out) == NULL) 78 FAIL(FATAL_ERROR_INTERNAL); 79 return out; 80} 81