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