blob: e809dce30041c46003cf3690e7f3f12e46a90d27 [file] [log] [blame]
Vadim Bendebury56797522015-05-20 10:32:25 -07001// 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}