libtpms/tests/object_size.c
Stefan Berger d4be04707e rev180: Add new function to generate RSA primes (StateFormatLevel 9)
Some time around rev169 a new function to generate RSA prime numbers was
introduced. Use this function for a 'new' SEED_COMPAT_LEVEL_LAST that now
gets value '2'.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-06-12 11:21:38 -04:00

102 lines
3.3 KiB
C

#include <assert.h>
#include <stdlib.h>
#include "Tpm.h"
int main(void)
{
/* This is supposed to be the OBJECT that requires the most bytes
* when it is marshalled: currently an RSA key
*/
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmissing-braces"
OBJECT object = {
.attributes = {
.occupied = SET,
},
.publicArea = {
.type = TPM_ALG_RSA,
.nameAlg = TPM_ALG_SHA512,
.objectAttributes = 0,
.authPolicy.t = {
.size = sizeof(object.publicArea.authPolicy.t.buffer),
},
.parameters.rsaDetail = {
.symmetric = {
.algorithm = TPM_ALG_AES,
.keyBits = 256,
.mode = TPM_ALG_ECB,
},
.scheme = TPM_ALG_RSAPSS,
.keyBits = MAX_RSA_KEY_BITS,
.exponent = 0x10001,
},
.unique.rsa.t = {
.size = sizeof(object.publicArea.unique.rsa.t.buffer),
},
},
.sensitive = {
.sensitiveType = TPM_ALG_RSA,
.authValue.t = {
.size = sizeof(object.sensitive.authValue.t.buffer),
},
.seedValue.t = {
.size = sizeof(object.sensitive.seedValue.t.buffer),
},
.sensitive.rsa.t = {
.size = sizeof(object.sensitive.sensitive.rsa.t.buffer),
},
},
.privateExponent = {
.Q = {
.size = CRYPT_WORDS(BITS_TO_BYTES(MAX_RSA_KEY_BITS / 2)),
},
.dP = {
.size = CRYPT_WORDS(BITS_TO_BYTES(MAX_RSA_KEY_BITS / 2)),
},
.dQ = {
.size = CRYPT_WORDS(BITS_TO_BYTES(MAX_RSA_KEY_BITS / 2)),
},
.qInv = {
.size = CRYPT_WORDS(BITS_TO_BYTES(MAX_RSA_KEY_BITS / 2)),
},
},
.qualifiedName.t = {
.size = sizeof(object.qualifiedName.t.name),
},
.evictHandle = 0x12345678,
.name.t = {
.size = sizeof(object.name.t.name),
},
.seedCompatLevel = 1,
};
#pragma GCC diagnostics pop
static const size_t exp_sizes[8] = {
0, 3284, 3284, 3284, 3284, 3284, 3288, 3288,
};
BYTE buffer[2 * MAX_MARSHALLED_OBJECT_SIZE];
UINT32 stateFormatLevel;
UINT32 written;
INT32 size;
BYTE *buf;
for (stateFormatLevel = 1; stateFormatLevel <= 6; stateFormatLevel++) {
/* this buffer must only be filled to <= MAX_MARSHALLED_OBJECT_SIZE bytes */
buf = buffer;
size = sizeof(buffer);
g_RuntimeProfile.stateFormatLevel = stateFormatLevel;
written = ANY_OBJECT_Marshal(&object, &buf, &size, &g_RuntimeProfile);
if (written != exp_sizes[stateFormatLevel]) {
fprintf(stderr,
"Expected flattened OBJECT to have %zu bytes, but it has %u.\n",
exp_sizes[stateFormatLevel], written);
return EXIT_FAILURE;
}
fprintf(stdout, " stateFormatLevel: %d written = %d < MAX_MARSHALLED_OBJECT_SIZE = %zu\n",
stateFormatLevel, written, MAX_MARSHALLED_OBJECT_SIZE);
}
return EXIT_SUCCESS;
}