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
BnTo2B(TPM2B * outVal,BIGNUM * inVal,UINT16 size)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 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 //
51 void
Copy2B(TPM2B * out,TPM2B * in)52 Copy2B(
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 //
71 BIGNUM *
BnFrom2B(BIGNUM * out,const TPM2B * in)72 BnFrom2B(
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