diff --git a/src/tpm2_wrap.c b/src/tpm2_wrap.c index 46550c20..1104c04c 100644 --- a/src/tpm2_wrap.c +++ b/src/tpm2_wrap.c @@ -2496,6 +2496,7 @@ int wolfTPM2_SignHashScheme(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key, Sign_In signIn; Sign_Out signOut; int curveSize = 0; + int sigOutSz = 0; if (dev == NULL || key == NULL || digest == NULL || sig == NULL || sigSz == NULL) { @@ -2506,12 +2507,7 @@ int wolfTPM2_SignHashScheme(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key, /* get curve size */ curveSize = wolfTPM2_GetCurveSize( key->pub.publicArea.parameters.eccDetail.curveID); - if (curveSize <= 0 || *sigSz < (curveSize * 2)) { - return BAD_FUNC_ARG; - } - } - else if (key->pub.publicArea.type == TPM_ALG_RSA) { - if (*sigSz < (int)sizeof(signOut.signature.signature.rsassa.sig.buffer)) { + if (curveSize <= 0) { return BAD_FUNC_ARG; } } @@ -2539,20 +2535,35 @@ int wolfTPM2_SignHashScheme(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key, if (key->pub.publicArea.type == TPM_ALG_ECC) { /* Assemble R and S into signature (R then S) */ - *sigSz = signOut.signature.signature.ecdsa.signatureR.size + - signOut.signature.signature.ecdsa.signatureS.size; - XMEMCPY(sig, signOut.signature.signature.ecdsa.signatureR.buffer, - signOut.signature.signature.ecdsa.signatureR.size); - XMEMCPY(sig + signOut.signature.signature.ecdsa.signatureR.size, - signOut.signature.signature.ecdsa.signatureS.buffer, - signOut.signature.signature.ecdsa.signatureS.size); + sigOutSz = signOut.signature.signature.ecdsa.signatureR.size + + signOut.signature.signature.ecdsa.signatureS.size; + if (sigOutSz > *sigSz) { + #ifdef DEBUG_WOLFTPM + printf("TPM2_Sign: ECC result truncated %d -> %d\n", + sigOutSz, *sigSz); + #endif + sigOutSz = *sigSz; + } + XMEMCPY(sig, + signOut.signature.signature.ecdsa.signatureR.buffer, + sigOutSz/2); + XMEMCPY(sig + sigOutSz/2, + signOut.signature.signature.ecdsa.signatureS.buffer, + sigOutSz/2); } else if (key->pub.publicArea.type == TPM_ALG_RSA) { /* RSA signature size and buffer (with padding depending on scheme) */ - *sigSz = signOut.signature.signature.rsassa.sig.size; - XMEMCPY(sig, signOut.signature.signature.rsassa.sig.buffer, - signOut.signature.signature.rsassa.sig.size); + sigOutSz = signOut.signature.signature.rsassa.sig.size; + if (sigOutSz > *sigSz) { + #ifdef DEBUG_WOLFTPM + printf("TPM2_Sign: RSA result truncated %d -> %d\n", + sigOutSz, *sigSz); + #endif + sigOutSz = *sigSz; + } + XMEMCPY(sig, signOut.signature.signature.rsassa.sig.buffer, sigOutSz); } + *sigSz = sigOutSz; #ifdef DEBUG_WOLFTPM printf("TPM2_Sign: %s %d\n", @@ -2604,7 +2615,7 @@ int wolfTPM2_VerifyHashScheme(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* key, if (curveSize <= 0 || sigSz < (curveSize * 2)) { return BAD_FUNC_ARG; } - /* verify curvesize cannot exceed buffer */ + /* verify curve size cannot exceed buffer */ if (curveSize > (int)sizeof(verifySigIn.signature.signature.ecdsa.signatureR.buffer)) return BAD_FUNC_ARG; diff --git a/wrapper/CSharp/wolfTPM-tests.cs b/wrapper/CSharp/wolfTPM-tests.cs index 7f03279f..8950ade3 100644 --- a/wrapper/CSharp/wolfTPM-tests.cs +++ b/wrapper/CSharp/wolfTPM-tests.cs @@ -108,8 +108,8 @@ namespace tpm_csharp_test private void GetSRK(Key srkKey, string auth) { int rc = device.CreateSRK(srkKey, - (int)TPM2_Alg.RSA, - auth); + TPM2_Alg.RSA, + auth); Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); } @@ -142,7 +142,7 @@ namespace tpm_csharp_test } rc = device.CreateKey(blob, parent_key, template, - "ThisIsMyStorageKeyAuth"); + "ThisIsMyKeyAuth"); Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); rc = device.LoadKey(blob, parent_key); @@ -338,7 +338,8 @@ namespace tpm_csharp_test rc = device.ImportRsaPrivateKey(parent_key, blob, pub_buffer, exp, priv_buffer, - (uint)TPM2_Alg.NULL, (uint)TPM2_Alg.NULL); + TPM2_Alg.NULL, + TPM2_Alg.NULL); Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); rc = device.UnloadHandle(blob); @@ -425,7 +426,7 @@ namespace tpm_csharp_test Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); rc = device.CreateKey(keyBlob, parent_key, template, - "ThisIsMyStorageKeyAuth"); + "ThisIsMyKeyAuth"); Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); rc = device.LoadKey(keyBlob, parent_key); @@ -466,7 +467,7 @@ namespace tpm_csharp_test Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); rc = device.CreateKey(keyBlob, parent_key, template, - "ThisIsMyStorageKeyAuth"); + "ThisIsMyKeyAuth"); Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); rc = device.LoadKey(keyBlob, parent_key); @@ -511,7 +512,7 @@ namespace tpm_csharp_test Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); rc = device.CreateKey(keyBlob, parent_key, template, - "ThisIsMyStorageKeyAuth"); + "ThisIsMyKeyAuth"); Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); rc = device.LoadKey(keyBlob, parent_key); @@ -561,7 +562,7 @@ namespace tpm_csharp_test /* Generate new key */ rc = device.CreateKey(keyBlob, parent_key, template, - "ThisIsMyStorageKeyAuth"); + "ThisIsMyKeyAuth"); Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); /* Load key */ @@ -596,5 +597,98 @@ namespace tpm_csharp_test Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); } + [Test] + public void TryRsaEncryptDecrypt() + { + int rc; + KeyBlob keyBlob = new KeyBlob(); + Template template = new Template(); + const int RsaKeySz = 256; + byte[] message = new byte[RsaKeySz]; + byte[] cipher = new byte[RsaKeySz]; + byte[] plain = new byte[RsaKeySz]; + + Console.WriteLine("Testing RSA Encrypt/Decrypt"); + + rc = template.GetKeyTemplate_RSA((ulong)( + TPM2_Object.sensitiveDataOrigin | + TPM2_Object.userWithAuth | + TPM2_Object.decrypt | + TPM2_Object.sign | + TPM2_Object.noDA)); + Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); + + rc = device.CreateKey(keyBlob, parent_key, template, + "ThisIsMyKeyAuth"); + Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); + + rc = device.LoadKey(keyBlob, parent_key); + Assert.AreEqual((int)Status.TPM_RC_SUCCESS, rc); + + /* Perform RSA encrypt / decrypt (no pad) */ + for (int i=0; i