Merge pull request #497 from wolfSSL/devin/1742500258-rsa-encrypt-decrypt-example
Add RSA encrypt/decrypt example to pkcs11_rsa.cpull/498/head
commit
d7f7fb9636
|
@ -1,6 +1,6 @@
|
||||||
/* pkcs11_rsa.c
|
/* pkcs11_rsa.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006-2020 wolfSSL Inc.
|
* Copyright (C) 2006-2025 wolfSSL Inc.
|
||||||
*
|
*
|
||||||
* This file is part of wolfSSL.
|
* This file is part of wolfSSL.
|
||||||
*
|
*
|
||||||
|
@ -320,6 +320,87 @@ static int rsa_sign_verify_pss(int devId)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* ifdef WC_RSA_PSS */
|
#endif /* ifdef WC_RSA_PSS */
|
||||||
|
|
||||||
|
/* Define maximum RSA key size in bits */
|
||||||
|
#define MAX_RSA_KEY_BITS 2048
|
||||||
|
|
||||||
|
static int rsa_encrypt_decrypt(int devId)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
byte plain[128], out[MAX_RSA_KEY_BITS/8], dec[MAX_RSA_KEY_BITS/8];
|
||||||
|
word32 plainSz, outSz, decSz;
|
||||||
|
RsaKey pub;
|
||||||
|
RsaKey priv;
|
||||||
|
|
||||||
|
/* Initialize plain text buffer with 9's as sample data */
|
||||||
|
memset(plain, 9, sizeof(plain));
|
||||||
|
plainSz = (word32)sizeof(plain);
|
||||||
|
outSz = (word32)sizeof(out);
|
||||||
|
decSz = (word32)sizeof(dec);
|
||||||
|
|
||||||
|
/* Encrypt with public key */
|
||||||
|
ret = decode_public_key(&pub, devId);
|
||||||
|
if (ret == 0) {
|
||||||
|
fprintf(stderr, "RSA Public Encrypt\n");
|
||||||
|
|
||||||
|
#ifdef WC_RSA_BLINDING
|
||||||
|
ret = wc_RsaSetRNG(&pub, &rng);
|
||||||
|
if (ret != 0)
|
||||||
|
fprintf(stderr, "Failed to set RNG: %d\n", ret);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ret == 0) {
|
||||||
|
outSz = ret = wc_RsaPublicEncrypt_ex(plain, plainSz, out, (int)outSz,
|
||||||
|
&pub, &rng, WC_RSA_PKCSV15_PAD, WC_HASH_TYPE_NONE, WC_MGF1NONE,
|
||||||
|
NULL, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
fprintf(stderr, "Failed to perform public encrypt: %d\n", ret);
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wc_FreeRsaKey(&pub);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decrypt with private key */
|
||||||
|
if (ret == 0) {
|
||||||
|
ret = decode_private_key(&priv, devId);
|
||||||
|
if (ret == 0) {
|
||||||
|
fprintf(stderr, "RSA Private Decrypt\n");
|
||||||
|
|
||||||
|
#ifdef WC_RSA_BLINDING
|
||||||
|
ret = wc_RsaSetRNG(&priv, &rng);
|
||||||
|
if (ret != 0)
|
||||||
|
fprintf(stderr, "Failed to set RNG: %d\n", ret);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ret == 0) {
|
||||||
|
decSz = ret = wc_RsaPrivateDecrypt_ex(out, outSz, dec, (int)decSz,
|
||||||
|
&priv, WC_RSA_PKCSV15_PAD, WC_HASH_TYPE_NONE, WC_MGF1NONE,
|
||||||
|
NULL, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
fprintf(stderr, "Failed to perform private decrypt: %d\n", ret);
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Verify the decrypted data matches the original */
|
||||||
|
if (ret == 0) {
|
||||||
|
if (decSz != plainSz || memcmp(plain, dec, decSz) != 0) {
|
||||||
|
fprintf(stderr, "Decrypted data does not match plain text\n");
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "Decryption successful\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wc_FreeRsaKey(&priv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
#endif /* ifndef NO_RSA */
|
#endif /* ifndef NO_RSA */
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
|
@ -388,6 +469,11 @@ int main(int argc, char* argv[])
|
||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if (ret == 0) {
|
||||||
|
ret = rsa_encrypt_decrypt(devId);
|
||||||
|
if (ret != 0)
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
wc_Pkcs11Token_Final(&token);
|
wc_Pkcs11Token_Final(&token);
|
||||||
|
|
Loading…
Reference in New Issue