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