/
githubmirror
/
libtpms
Обзор
Документация
Войти
/
githubmirror
/
libtpms
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
tests/object_size.c
111 строк
4 KB
Stefan Berger
tests: Extend object_size test to marshal an RSA key OBJECT up to SFL 8
05 мар 2026, 19:50
05 мар 2026, 19:50
2c2d6bd
Код
Авторство
О чём код?
#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 = { .scheme = TPM_ALG_RSAPSS, .details = { .rsapss = { .hashAlg = TPM_ALG_SHA256, }, }, }, .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[9] = { /* SFL: 0 .. 5 */ 0 , 3284, 3284, 3284, 3284, 3284, /* SFL: 6 .. 8 */ 3288, 3288, 3288, }; BYTE buffer[2 * MAX_MARSHALLED_OBJECT_SIZE]; UINT32 stateFormatLevel; UINT32 written; INT32 size; BYTE *buf; for (stateFormatLevel = 1; stateFormatLevel < ARRAY_SIZE(exp_sizes); 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; }