Skip to content

Commit 45847e3

Browse files
authored
Merge pull request #307 from dgarske/csr_sigtype
Fixes and improvements for wolfTPM CSR wrappers
2 parents 79105f9 + cfd96d5 commit 45847e3

File tree

4 files changed

+61
-10
lines changed

4 files changed

+61
-10
lines changed

.github/workflows/make-test-swtpm.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,25 @@ jobs:
5252
run: |
5353
make check
5454
WOLFSSL_PATH=./wolfssl ./examples/run_examples.sh
55+
- name: make install
56+
run: sudo make install
57+
58+
# build and test CSharp wrapper
59+
- name: Install mono
60+
run: |
61+
sudo apt-get install -y mono-mcs mono-tools-devel nunit nunit-console
62+
- name: Build CSharp wrapper
63+
working-directory: ./wrapper/CSharp
64+
run: |
65+
mcs wolfTPM.cs wolfTPM-tests.cs -r:/usr/lib/cli/nunit.framework-2.6.3/nunit.framework.dll -t:library
66+
- name: Run self test
67+
working-directory: ./wrapper/CSharp
68+
run: |
69+
LD_LIBRARY_PATH=../../src/.libs/:../../wolfssl/src/.libs/ nunit-console wolfTPM.dll -run=tpm_csharp_test.WolfTPMTest.TrySelfTest
70+
- name: Run unit tests
71+
working-directory: ./wrapper/CSharp
72+
run: |
73+
LD_LIBRARY_PATH=../../src/.libs/:../../wolfssl/src/.libs/ nunit-console wolfTPM.dll
5574
5675
#test no wolfcrypt
5776
- name: configure no wolfCrypt

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: 20 additions & 2 deletions
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;
@@ -6247,7 +6261,7 @@ static int CSR_KeySetup(WOLFTPM2_DEV* dev, WOLFTPM2_CSR* csr, WOLFTPM2_KEY* key,
62476261
csr->req.sigType = CTC_SHA256wECDSA;
62486262
}
62496263
}
6250-
else if (csr->req.sigType == 0) {
6264+
else if (sigType != 0) {
62516265
csr->req.sigType = sigType;
62526266
}
62536267
}
@@ -6335,6 +6349,10 @@ int wolfTPM2_CSR_SetKeyUsage(WOLFTPM2_DEV* dev, WOLFTPM2_CSR* csr,
63356349

63366350
/* add Extended Key Usage */
63376351
rc = wc_SetExtKeyUsage(&csr->req, keyUsage);
6352+
if (rc == EXTKEYUSAGE_E) {
6353+
/* try setting key usage values */
6354+
rc = wc_SetKeyUsage(&csr->req, keyUsage);
6355+
}
63386356
#else
63396357
if (keyUsage != NULL) {
63406358
#ifdef DEBUG_WOLFTPM

wolftpm/tpm2_wrap.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2670,15 +2670,19 @@ WOLFTPM_API int wolfTPM2_CSR_SetCustomExt(WOLFTPM2_DEV* dev, WOLFTPM2_CSR* csr,
26702670
/*!
26712671
\ingroup wolfTPM2_Wrappers
26722672
\brief Helper for Certificate Signing Request (CSR) generation to set a
2673-
key usage for a WOLFTPM2_CSR structure.
2673+
extended key usage or key usage for a WOLFTPM2_CSR structure.
2674+
Pass either extended key usage or key usage values.
2675+
Mixed string types are not supported, however you can call `wolfTPM2_CSR_SetKeyUsage`
2676+
twice (once for extended key usage strings and once for standard key usage strings).
26742677
26752678
\return TPM_RC_SUCCESS: successful
26762679
\return BAD_FUNC_ARG: check the provided arguments
26772680
26782681
\param dev pointer to a TPM2_DEV struct (not used)
26792682
\param csr pointer to a WOLFTPM2_CSR structure
26802683
\param keyUsage string list of comma separated key usage attributes.
2681-
Possible values: any, serverAuth, clientAuth, codeSigning, emailProtection, timeStamping and OCSPSigning
2684+
Possible Extended Key Usage values: any, serverAuth, clientAuth, codeSigning, emailProtection, timeStamping and OCSPSigning
2685+
Possible Key Usage values: digitalSignature, nonRepudiation, contentCommitment, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign, encipherOnly, decipherOnly
26822686
Default: "serverAuth,clientAuth,codeSigning"
26832687
26842688
\sa wolfTPM2_CSR_SetSubject

0 commit comments

Comments
 (0)