Skip to content

Commit ce22962

Browse files
committed
Fix for wolfTPM2_SignHash to return padded r/s. Improves handling of ECDSA with P521. Adds tests for ECDSA with crypto callbacks. ZD20777
1 parent 1c61ff6 commit ce22962

File tree

4 files changed

+99
-46
lines changed

4 files changed

+99
-46
lines changed

src/tpm2.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6111,6 +6111,12 @@ const char* TPM2_GetAlgName(TPM_ALG_ID alg)
61116111
return "SHA384";
61126112
case TPM_ALG_SHA512:
61136113
return "SHA512";
6114+
case TPM_ALG_SHA3_256:
6115+
return "SHA3_256";
6116+
case TPM_ALG_SHA3_384:
6117+
return "SHA3_384";
6118+
case TPM_ALG_SHA3_512:
6119+
return "SHA3_512";
61146120
case TPM_ALG_NULL:
61156121
return "NULL";
61166122
case TPM_ALG_SM3_256:

src/tpm2_cryptocb.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,6 @@ int wolfTPM2_CryptoDevCb(int devId, wc_CryptoInfo* info, void* ctx)
328328
rLen = sLen = rsLen / 2;
329329
r = &sigRS[0];
330330
s = &sigRS[rLen];
331-
r = TPM2_ASN_TrimZeros(r, &rLen);
332-
s = TPM2_ASN_TrimZeros(s, &sLen);
333331

334332
/* Encode ECDSA Header */
335333
rc = wc_ecc_rs_raw_to_sig(r, rLen, s, sLen,

src/tpm2_wrap.c

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4080,32 +4080,35 @@ int wolfTPM2_SignHashScheme(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
40804080
}
40814081

40824082
if (key->pub.publicArea.type == TPM_ALG_ECC) {
4083+
TPMS_SIGNATURE_ECDSA* ecdsa = &signOut.signature.signature.ecdsa;
4084+
40834085
/* Assemble R and S into signature (R then S) */
4084-
sigOutSz = signOut.signature.signature.ecdsa.signatureR.size +
4085-
signOut.signature.signature.ecdsa.signatureS.size;
4086+
sigOutSz = curveSize * 2;
40864087
if (sigOutSz > *sigSz) {
40874088
#ifdef DEBUG_WOLFTPM
4088-
printf("TPM2_Sign: ECC result truncated %d -> %d\n",
4089+
printf("TPM2_Sign: ECC result buffer too small %d -> %d\n",
40894090
sigOutSz, *sigSz);
40904091
#endif
4091-
sigOutSz = *sigSz;
4092+
return BUFFER_E;
40924093
}
4093-
XMEMCPY(sig,
4094-
signOut.signature.signature.ecdsa.signatureR.buffer,
4095-
signOut.signature.signature.ecdsa.signatureR.size);
4096-
XMEMCPY(sig + signOut.signature.signature.ecdsa.signatureR.size,
4097-
signOut.signature.signature.ecdsa.signatureS.buffer,
4098-
signOut.signature.signature.ecdsa.signatureS.size);
4094+
XMEMCPY(sig, ecdsa->signatureR.buffer,
4095+
ecdsa->signatureR.size);
4096+
XMEMSET(sig + ecdsa->signatureR.size, 0,
4097+
curveSize - ecdsa->signatureR.size);
4098+
XMEMCPY(sig + curveSize, ecdsa->signatureS.buffer,
4099+
ecdsa->signatureS.size);
4100+
XMEMSET(sig + curveSize + ecdsa->signatureS.size, 0,
4101+
curveSize - ecdsa->signatureS.size);
40994102
}
41004103
else if (key->pub.publicArea.type == TPM_ALG_RSA) {
41014104
/* RSA signature size and buffer (with padding depending on scheme) */
41024105
sigOutSz = signOut.signature.signature.rsassa.sig.size;
41034106
if (sigOutSz > *sigSz) {
41044107
#ifdef DEBUG_WOLFTPM
4105-
printf("TPM2_Sign: RSA result truncated %d -> %d\n",
4108+
printf("TPM2_Sign: RSA result buffer too small %d -> %d\n",
41064109
sigOutSz, *sigSz);
41074110
#endif
4108-
sigOutSz = *sigSz;
4111+
return BUFFER_E;
41094112
}
41104113
XMEMCPY(sig, signOut.signature.signature.rsassa.sig.buffer, sigOutSz);
41114114
}
@@ -7368,7 +7371,7 @@ static int CSR_MakeAndSign(WOLFTPM2_DEV* dev, WOLFTPM2_CSR* csr, CSRKey* key,
73687371
}
73697372
#else
73707373
#ifdef DEBUG_WOLFTPM
7371-
printf("CSR_MakeAndSign PEM not supported\n")
7374+
printf("CSR_MakeAndSign PEM not supported\n");
73727375
#endif
73737376
rc = NOT_COMPILED_IN;
73747377
#endif

tests/unit_tests.c

Lines changed: 77 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -409,9 +409,12 @@ static void test_wolfTPM2_CSR(void)
409409

410410
#if !defined(WOLFTPM2_NO_WOLFCRYPT) && defined(HAVE_ECC) && \
411411
!defined(WOLFTPM2_NO_ASN)
412+
#define FLAGS_USE_WOLFCRYPT (1 << 0)
413+
#define FLAGS_USE_CRYPTO_CB (1 << 1)
414+
#define FLAGS_USE_PK_CB (1 << 2) /* requires TLS layer to test */
412415
static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
413416
WOLFTPM2_KEY* storageKey, const byte* digest, int digestSz,
414-
TPM_ECC_CURVE curve, TPMI_ALG_HASH hashAlg)
417+
TPM_ECC_CURVE curve, TPMI_ALG_HASH hashAlg, int flags)
415418
{
416419
int rc;
417420
int verifyRes = 0;
@@ -425,6 +428,21 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
425428
word32 rLen, sLen;
426429
ecc_key wolfKey;
427430
int curveSize = TPM2_GetCurveSize(curve);
431+
#ifdef WOLF_CRYPTO_CB
432+
int tpmDevId = INVALID_DEVID;
433+
TpmCryptoDevCtx tpmCtx;
434+
435+
XMEMSET(&tpmCtx, 0, sizeof(tpmCtx));
436+
tpmCtx.dev = dev;
437+
tpmCtx.eccKey = &eccKey;
438+
tpmCtx.storageKey = storageKey;
439+
440+
if (flags & FLAGS_USE_CRYPTO_CB) {
441+
rc = wolfTPM2_SetCryptoDevCb(dev, wolfTPM2_CryptoDevCb, &tpmCtx,
442+
&tpmDevId);
443+
AssertIntEQ(rc, 0);
444+
}
445+
#endif
428446

429447
/* -- Use TPM key to sign and verify with wolfCrypt -- */
430448
/* Create ECC key for signing */
@@ -439,6 +457,10 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
439457
printf("Hash type not supported... Skipping\n");
440458
return;
441459
}
460+
if ((rc & TPM_RC_CURVE) == TPM_RC_CURVE) {
461+
printf("Curve not supported... Skipping\n");
462+
return;
463+
}
442464
AssertIntEQ(rc, 0);
443465

444466
/* Sign with TPM */
@@ -450,16 +472,14 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
450472
rLen = sLen = sigRsSz / 2;
451473
r = &sigRs[0];
452474
s = &sigRs[rLen];
453-
r = TPM2_ASN_TrimZeros(r, &rLen);
454-
s = TPM2_ASN_TrimZeros(s, &sLen);
455475

456476
/* Encode ECDSA Header */
457477
sigSz = (word32)sizeof(sig);
458478
rc = wc_ecc_rs_raw_to_sig(r, rLen, s, sLen, sig, &sigSz);
459479
AssertIntEQ(rc, 0);
460480

461481
/* Initialize wolfCrypt ECC key */
462-
rc = wc_ecc_init(&wolfKey);
482+
rc = wc_ecc_init_ex(&wolfKey, NULL, tpmDevId);
463483
AssertIntEQ(rc, 0);
464484

465485
/* Convert TPM key to wolfCrypt key for verification */
@@ -478,7 +498,7 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
478498

479499
/* -- Use wolfCrypt key to sign and verify with TPM -- */
480500
/* Initialize new wolfCrypt ECC key */
481-
rc = wc_ecc_init(&wolfKey);
501+
rc = wc_ecc_init_ex(&wolfKey, NULL, tpmDevId);
482502
AssertIntEQ(rc, 0);
483503

484504
/* Generate new ECC key with wolfCrypt */
@@ -490,6 +510,7 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
490510
rc = wc_ecc_sign_hash(digest, digestSz, sig, &sigSz, wolfTPM2_GetRng(dev),
491511
&wolfKey);
492512
AssertIntEQ(rc, 0);
513+
wolfTPM2_UnloadHandle(dev, &eccKey.handle);
493514

494515
/* Decode ECDSA Header */
495516
r = sigRs;
@@ -519,18 +540,63 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
519540
wolfTPM2_UnloadHandle(dev, &eccKey.handle);
520541

521542
printf("Test TPM Wrapper:\t"
522-
"Sign/Verify (DigSz=%d, CurveSz=%d, Hash=%s):"
543+
"Sign/Verify (DigSz=%d, CurveSz=%d, Hash=%s, Flags=%s):"
523544
"\t%s\n",
524545
digestSz, TPM2_GetCurveSize(curve), TPM2_GetAlgName(hashAlg),
546+
(flags & FLAGS_USE_CRYPTO_CB) ? "Crypto CB" : "",
525547
rc == 0 ? "Passed" : "Failed");
548+
549+
if (flags & FLAGS_USE_CRYPTO_CB) {
550+
wolfTPM2_ClearCryptoDevCb(dev, tpmDevId);
551+
}
552+
}
553+
554+
static void test_wolfTPM2_EccSignVerify_All(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* storageKey, int flags)
555+
{
556+
int i;
557+
byte digest[TPM_MAX_DIGEST_SIZE];
558+
559+
for (i = 0; i < (int)sizeof(digest); i++) {
560+
digest[i] = (byte)i;
561+
}
562+
563+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 20,
564+
TPM_ECC_NIST_P256, TPM_ALG_SHA256, flags);
565+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 32,
566+
TPM_ECC_NIST_P256, TPM_ALG_SHA256, flags);
567+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 48,
568+
TPM_ECC_NIST_P256, TPM_ALG_SHA256, flags);
569+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 64,
570+
TPM_ECC_NIST_P256, TPM_ALG_SHA256, flags);
571+
572+
#if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
573+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 20,
574+
TPM_ECC_NIST_P384, TPM_ALG_SHA384, flags);
575+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 32,
576+
TPM_ECC_NIST_P384, TPM_ALG_SHA384, flags);
577+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 48,
578+
TPM_ECC_NIST_P384, TPM_ALG_SHA384, flags);
579+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 64,
580+
TPM_ECC_NIST_P384, TPM_ALG_SHA384, flags);
581+
#endif
582+
583+
#if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
584+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 20,
585+
TPM_ECC_NIST_P521, TPM_ALG_SHA512, flags);
586+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 32,
587+
TPM_ECC_NIST_P521, TPM_ALG_SHA512, flags);
588+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 48,
589+
TPM_ECC_NIST_P521, TPM_ALG_SHA512, flags);
590+
test_wolfTPM2_EccSignVerifyDig(dev, storageKey, digest, 64,
591+
TPM_ECC_NIST_P521, TPM_ALG_SHA512, flags);
592+
#endif
526593
}
527594

528595
/* Test with smaller, same and larger digest sizes using different ECC curves.
529596
* Interop sign and verify with wolfCrypt and TPM */
530597
static void test_wolfTPM2_EccSignVerify(void)
531598
{
532-
int rc, i;
533-
byte digest[TPM_MAX_DIGEST_SIZE];
599+
int rc;
534600
WOLFTPM2_DEV dev;
535601
WOLFTPM2_KEY storageKey;
536602

@@ -543,29 +609,9 @@ static void test_wolfTPM2_EccSignVerify(void)
543609
(byte*)gStorageKeyAuth, sizeof(gStorageKeyAuth)-1);
544610
AssertIntEQ(rc, 0);
545611

546-
547-
for (i = 0; i < (int)sizeof(digest); i++) {
548-
digest[i] = (byte)i;
549-
}
550-
551-
test_wolfTPM2_EccSignVerifyDig(&dev, &storageKey, digest, 20,
552-
TPM_ECC_NIST_P256, TPM_ALG_SHA256);
553-
test_wolfTPM2_EccSignVerifyDig(&dev, &storageKey, digest, 32,
554-
TPM_ECC_NIST_P256, TPM_ALG_SHA256);
555-
test_wolfTPM2_EccSignVerifyDig(&dev, &storageKey, digest, 48,
556-
TPM_ECC_NIST_P256, TPM_ALG_SHA256);
557-
test_wolfTPM2_EccSignVerifyDig(&dev, &storageKey, digest, 64,
558-
TPM_ECC_NIST_P256, TPM_ALG_SHA256);
559-
560-
#if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
561-
test_wolfTPM2_EccSignVerifyDig(&dev, &storageKey, digest, 20,
562-
TPM_ECC_NIST_P384, TPM_ALG_SHA384);
563-
test_wolfTPM2_EccSignVerifyDig(&dev, &storageKey, digest, 32,
564-
TPM_ECC_NIST_P384, TPM_ALG_SHA384);
565-
test_wolfTPM2_EccSignVerifyDig(&dev, &storageKey, digest, 48,
566-
TPM_ECC_NIST_P384, TPM_ALG_SHA384);
567-
test_wolfTPM2_EccSignVerifyDig(&dev, &storageKey, digest, 64,
568-
TPM_ECC_NIST_P384, TPM_ALG_SHA384);
612+
test_wolfTPM2_EccSignVerify_All(&dev, &storageKey, 0);
613+
#ifdef WOLF_CRYPTO_CB
614+
test_wolfTPM2_EccSignVerify_All(&dev, &storageKey, FLAGS_USE_CRYPTO_CB);
569615
#endif
570616

571617
wolfTPM2_UnloadHandle(&dev, &storageKey.handle);

0 commit comments

Comments
 (0)