Implement TPMLIB_SetBufferSize() for setting the size of the I/O buffer

Implement TPMLIB_SetBufferSize() for setting the size of the I/O buffer
that the TPM may advertise. For TPM 1.2 the size remains fixed since the
TIS interface can handle the current 4096 bytes.

This function will be important for TPM 2 with a CRB interface that cannot
handle 4096 bytes.

Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
This commit is contained in:
Stefan Berger 2017-11-04 00:27:10 -04:00
parent 46727502fc
commit bc195a3452
8 changed files with 218 additions and 0 deletions

View File

@ -132,6 +132,8 @@ void TPMLIB_SetDebugFD(int fd);
void TPMLIB_SetDebugLevel(unsigned int level);
TPM_RESULT TPMLIB_SetDebugPrefix(const char *prefix);
uint32_t TPMLIB_SetBufferSize(uint32_t wanted_size);
#ifdef __cplusplus
}
#endif

View File

@ -132,6 +132,8 @@ void TPMLIB_SetDebugFD(int fd);
void TPMLIB_SetDebugLevel(unsigned int level);
TPM_RESULT TPMLIB_SetDebugPrefix(const char *prefix);
uint32_t TPMLIB_SetBufferSize(uint32_t wanted_size);
#ifdef __cplusplus
}
#endif

View File

@ -14,6 +14,7 @@ man3_PODS = \
TPMLIB_MainInit.pod \
TPMLIB_Process.pod \
TPMLIB_RegisterCallbacks.pod \
TPMLIB_SetBufferSize.pod \
TPMLIB_SetDebugFD.pod \
TPMLIB_VolatileAll_Store.pod \
TPM_Malloc.pod
@ -36,6 +37,7 @@ man3_MANS += \
TPMLIB_MainInit.3 \
TPMLIB_Process.3 \
TPMLIB_SetDebugFD.3 \
TPMLIB_SetBufferSize.3 \
TPMLIB_RegisterCallbacks.3 \
TPMLIB_VolatileAll_Store.3 \
TPM_Malloc.3

View File

@ -0,0 +1,166 @@
.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.31)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
. ds C`
. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
.nr rF 0
.if \n(.g .if rF .nr rF 1
.if (\n(rF:(\n(.g==0)) \{
. if \nF \{
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. if !\nF==2 \{
. nr % 0
. nr F 2
. \}
. \}
.\}
.rr rF
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "TPMLIB_SetBufferSize 3"
.TH TPMLIB_SetBufferSize 3 "2017-11-04" "libtpms" ""
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
TPMLIB_SetBufferSize \- Set the TPM's I/O buffer size
.SH "LIBRARY"
.IX Header "LIBRARY"
\&\s-1TPM\s0 library (libtpms, \-ltpms)
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
\&\fB#include <libtpms/tpm_library.h\fR>
.PP
\&\fBuint32_t TPMLIB_SetBufferSize(uint32_t);\fR
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
The \fB\f(BITPMLIB_SetBufferSize()\fB\fR function sets the size of the buffer
the \s-1TPM\s0 can use for input and output and that it advertises to users.
.PP
If 0 is given on input, the currently used buffer size is returned.
Any other number will try to change the buffer size. The returned
size may be smaller than the requested one, if the requested one was
above a maximum. The returned size may be larger than the requested
one, if the requested one was below a minimum.
.PP
This function must be called after \fB\f(BITPMLIB_ChooseTPMVersion()\fB\fR has
been called.
.SH "SEE ALSO"
.IX Header "SEE ALSO"
\&\fBTPMLIB_ChooseTPMVersion\fR(3)

View File

@ -0,0 +1,33 @@
=head1 NAME
TPMLIB_SetBufferSize - Set the TPM's I/O buffer size
=head1 LIBRARY
TPM library (libtpms, -ltpms)
=head1 SYNOPSIS
B<#include <libtpms/tpm_library.h>>
B<uint32_t TPMLIB_SetBufferSize(uint32_t);>
=head1 DESCRIPTION
The B<TPMLIB_SetBufferSize()> function sets the size of the buffer
the TPM can use for input and output and that it advertises to users.
If 0 is given on input, the currently used buffer size is returned.
Any other number will try to change the buffer size. The returned
size may be smaller than the requested one, if the requested one was
above a maximum. The returned size may be larger than the requested
one, if the requested one was below a minimum.
This function must be called after B<TPMLIB_ChooseTPMVersion()> has
been called.
=head1 SEE ALSO
B<TPMLIB_ChooseTPMVersion>(3)
=cut

View File

@ -164,6 +164,11 @@ TPM_RESULT TPM_IO_TpmEstablished_Get(TPM_BOOL *tpmEstablished)
return tpm_iface[0]->TpmEstablishedGet(tpmEstablished);
}
uint32_t TPMLIB_SetBufferSize(uint32_t wanted_size)
{
return tpm_iface[0]->SetBufferSize(wanted_size);
}
static struct libtpms_callbacks libtpms_cbs;
struct libtpms_callbacks *TPMLIB_GetCallbacks(void)

View File

@ -52,6 +52,7 @@ struct libtpms_callbacks *TPMLIB_GetCallbacks(void);
struct tpm_interface {
TPM_RESULT (*MainInit)(void);
void (*Terminate)(void);
uint32_t (*SetBufferSize)(uint32_t wanted_size);
TPM_RESULT (*Process)(unsigned char **respbuffer, uint32_t *resp_size,
uint32_t *respbufsize,
unsigned char *command, uint32_t command_size);

View File

@ -165,6 +165,12 @@ TPM_RESULT TPM12_GetTPMProperty(enum TPMLIB_TPMProperty prop,
return TPM_SUCCESS;
}
uint32_t TPM12_SetBufferSize(uint32_t wanted_size)
{
/* TPM 1.2 has a fixed buffer size; the TIS can handle that */
return TPM_BUFFER_MAX;
}
const struct tpm_interface TPM12Interface = {
.MainInit = TPM12_MainInit,
.Terminate = TPM12_Terminate,
@ -175,4 +181,5 @@ const struct tpm_interface TPM12Interface = {
.HashStart = TPM12_IO_Hash_Start,
.HashData = TPM12_IO_Hash_Data,
.HashEnd = TPM12_IO_Hash_End,
.SetBufferSize = TPM12_SetBufferSize,
};