Skip to content

Commit 7a11cb2

Browse files
committed
Fix support for ECC 384-bit only support. Tested with: ./configure --enable-wolftpm CFLAGS="-DECC_USER_CURVES -DNO_ECC256 -DHAVE_ECC384" --disable-examples --disable-crypttests && make
1 parent 8ae11cf commit 7a11cb2

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

examples/csr/csr.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ static const char* gClientCertEccFile = "./certs/tpm-ecc-cert.pem";
5151
/******************************************************************************/
5252

5353
static int TPM2_CSR_Generate(WOLFTPM2_DEV* dev, int keyType, WOLFTPM2_KEY* key,
54-
const char* outputPemFile, int makeSelfSignedCert, int devId)
54+
const char* outputPemFile, int makeSelfSignedCert, int devId, int sigType)
5555
{
5656
int rc;
5757
const char* subject = NULL;
@@ -63,6 +63,7 @@ static int TPM2_CSR_Generate(WOLFTPM2_DEV* dev, int keyType, WOLFTPM2_KEY* key,
6363
const char* custOid = "1.2.3.4.5";
6464
const char* custOidVal = "This is NOT a critical extension";
6565
WOLFTPM2_CSR* csr = wolfTPM2_NewCSR();
66+
6667
if (csr == NULL) {
6768
return MEMORY_E;
6869
}
@@ -82,7 +83,7 @@ static int TPM2_CSR_Generate(WOLFTPM2_DEV* dev, int keyType, WOLFTPM2_KEY* key,
8283
#ifdef WOLFTPM2_NO_HEAP
8384
/* single shot API for CSR generation */
8485
rc = wolfTPM2_CSR_Generate_ex(dev, key, subject, keyUsage,
85-
CTC_FILETYPE_PEM, output, outputSz, 0, makeSelfSignedCert,
86+
CTC_FILETYPE_PEM, output, outputSz, sigType, makeSelfSignedCert,
8687
devId);
8788
#else
8889
rc = wolfTPM2_CSR_SetSubject(dev, csr, subject);
@@ -100,7 +101,7 @@ static int TPM2_CSR_Generate(WOLFTPM2_DEV* dev, int keyType, WOLFTPM2_KEY* key,
100101
}
101102
if (rc == 0) {
102103
rc = wolfTPM2_CSR_MakeAndSign_ex(dev, csr, key, CTC_FILETYPE_PEM,
103-
output, outputSz, 0, makeSelfSignedCert, devId);
104+
output, outputSz, sigType, makeSelfSignedCert, devId);
104105
}
105106
#endif
106107
if (rc >= 0) {
@@ -202,27 +203,36 @@ int TPM2_CSR_ExampleArgs(void* userCtx, int argc, char *argv[])
202203
if (rc == 0) {
203204
rc = TPM2_CSR_Generate(&dev, RSA_TYPE, &key,
204205
makeSelfSignedCert ? gClientCertRsaFile : gClientCsrRsaFile,
205-
makeSelfSignedCert, tpmDevId);
206+
makeSelfSignedCert, tpmDevId, CTC_SHA256wRSA);
206207
}
207208
wolfTPM2_UnloadHandle(&dev, &key.handle);
208209
}
209210
#endif /* !NO_RSA */
210211

211212
#ifdef HAVE_ECC
212213
if (rc == 0) {
214+
int sigType = CTC_SHA256wECDSA;
215+
TPM_ECC_CURVE curve = TPM_ECC_NIST_P256;
213216
tpmCtx.eccKey = &key;
217+
218+
#if defined(NO_ECC256) && defined(HAVE_ECC384) && ECC_MIN_KEY_SZ <= 384
219+
/* make sure we use a curve that is enabled */
220+
sigType = CTC_SHA384wECDSA;
221+
curve = TPM_ECC_NIST_P384;
222+
#endif
223+
214224
rc = wolfTPM2_GetKeyTemplate_ECC(&publicTemplate,
215225
TPMA_OBJECT_sensitiveDataOrigin | TPMA_OBJECT_userWithAuth |
216226
TPMA_OBJECT_sign | TPMA_OBJECT_noDA,
217-
TPM_ECC_NIST_P256, TPM_ALG_ECDSA);
227+
curve, TPM_ALG_ECDSA);
218228
if (rc == 0) {
219229
rc = getECCkey(&dev, &storageKey, &key, NULL, tpmDevId,
220230
(byte*)gKeyAuth, sizeof(gKeyAuth)-1, &publicTemplate);
221231
}
222232
if (rc == 0) {
223233
rc = TPM2_CSR_Generate(&dev, ECC_TYPE, &key,
224234
makeSelfSignedCert ? gClientCertEccFile : gClientCsrEccFile,
225-
makeSelfSignedCert, tpmDevId);
235+
makeSelfSignedCert, tpmDevId, sigType);
226236
}
227237
wolfTPM2_UnloadHandle(&dev, &key.handle);
228238
}

src/tpm2_wrap.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3461,20 +3461,25 @@ int wolfTPM2_SignHash(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key,
34613461
const byte* digest, int digestSz, byte* sig, int* sigSz)
34623462
{
34633463
TPM_ALG_ID sigAlg = TPM_ALG_NULL;
3464+
TPMI_ALG_HASH hashAlg = WOLFTPM2_WRAP_DIGEST;
34643465

34653466
if (dev == NULL || key == NULL || digest == NULL || sig == NULL) {
34663467
return BAD_FUNC_ARG;
34673468
}
34683469

34693470
if (key->pub.publicArea.type == TPM_ALG_ECC) {
34703471
sigAlg = key->pub.publicArea.parameters.eccDetail.scheme.scheme;
3472+
hashAlg = key->pub.publicArea.parameters.eccDetail.scheme.details.any.hashAlg;
3473+
34713474
}
34723475
else if (key->pub.publicArea.type == TPM_ALG_RSA) {
34733476
sigAlg = key->pub.publicArea.parameters.rsaDetail.scheme.scheme;
3477+
hashAlg = key->pub.publicArea.parameters.rsaDetail.scheme.details.anySig.hashAlg;
34743478
}
34753479

34763480
return wolfTPM2_SignHashScheme(dev, key, digest, digestSz, sig, sigSz,
3477-
sigAlg, WOLFTPM2_WRAP_DIGEST);
3481+
sigAlg, hashAlg);
3482+
34783483
}
34793484

34803485
/* sigAlg: TPM_ALG_RSASSA, TPM_ALG_RSAPSS, TPM_ALG_ECDSA or TPM_ALG_ECDAA */
@@ -5315,6 +5320,15 @@ static int GetKeyTemplateECC(TPMT_PUBLIC* publicTemplate,
53155320
if (publicTemplate == NULL || curveSz == 0)
53165321
return BAD_FUNC_ARG;
53175322

5323+
#if defined(NO_ECC256) && defined(HAVE_ECC384) && ECC_MIN_KEY_SZ <= 384
5324+
/* make sure we use a curve that is enabled */
5325+
if (curve == TPM_ECC_NIST_P256) {
5326+
curve = TPM_ECC_NIST_P384;
5327+
nameAlg = TPM_ALG_SHA384;
5328+
sigHash = TPM_ALG_SHA384;
5329+
}
5330+
#endif
5331+
53185332
XMEMSET(publicTemplate, 0, sizeof(TPMT_PUBLIC));
53195333
publicTemplate->type = TPM_ALG_ECC;
53205334
publicTemplate->nameAlg = nameAlg;

0 commit comments

Comments
 (0)