123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- #include "sgx_ecc256_common.h"
- sgx_status_t sgx_rsa3072_sign(const uint8_t * p_data,
- uint32_t data_size,
- const sgx_rsa3072_key_t * p_key,
- sgx_rsa3072_signature_t * p_signature)
- {
- if ((p_data == NULL) || (data_size < 1) || (p_key == NULL) ||
- (p_signature == NULL) )
- {
- return SGX_ERROR_INVALID_PARAMETER;
- }
- IppStatus ipp_ret = ippStsNoErr;
- IppHashAlgId hash_alg = ippHashAlg_SHA256;
- IppsRSAPrivateKeyState* p_rsa_privatekey_ctx = NULL;
- Ipp8u *temp_buff = NULL;
- IppsBigNumState* p_prikey_mod_bn = NULL;
- IppsBigNumState* p_prikey_d_bn = NULL;
- do
- {
-
- ipp_ret = sgx_ipp_newBN((const Ipp32u *)p_key->mod, sizeof(p_key->mod), &p_prikey_mod_bn);
- ERROR_BREAK(ipp_ret);
- ipp_ret = sgx_ipp_newBN((const Ipp32u *)p_key->d, sizeof(p_key->d), &p_prikey_d_bn);
- ERROR_BREAK(ipp_ret);
-
- int private_key_ctx_size = 0;
- ipp_ret = ippsRSA_GetSizePrivateKeyType1(SGX_RSA3072_KEY_SIZE * 8, SGX_RSA3072_PRI_EXP_SIZE * 8,
- &private_key_ctx_size);
- ERROR_BREAK(ipp_ret);
- p_rsa_privatekey_ctx = (IppsRSAPrivateKeyState*)malloc(private_key_ctx_size);
- if (!p_rsa_privatekey_ctx) {
- ipp_ret = ippStsMemAllocErr;
- break;
- }
-
- ipp_ret = ippsRSA_InitPrivateKeyType1(SGX_RSA3072_KEY_SIZE * 8, SGX_RSA3072_PRI_EXP_SIZE * 8,
- p_rsa_privatekey_ctx, private_key_ctx_size);
- ERROR_BREAK(ipp_ret);
- ipp_ret = ippsRSA_SetPrivateKeyType1(p_prikey_mod_bn, p_prikey_d_bn, p_rsa_privatekey_ctx);
- ERROR_BREAK(ipp_ret);
-
- int private_key_buffer_size = 0;
- ipp_ret = ippsRSA_GetBufferSizePrivateKey(&private_key_buffer_size, p_rsa_privatekey_ctx);
- ERROR_BREAK(ipp_ret);
- temp_buff = (Ipp8u*)malloc(private_key_buffer_size);
- if (!temp_buff) {
- ipp_ret = ippStsMemAllocErr;
- break;
- }
-
- ipp_ret = ippsRSASign_PKCS1v15(p_data, data_size, *p_signature, p_rsa_privatekey_ctx, NULL, hash_alg, temp_buff);
- } while (0);
- sgx_ipp_secure_free_BN(p_prikey_mod_bn, sizeof(p_key->mod));
- sgx_ipp_secure_free_BN(p_prikey_d_bn, sizeof(p_key->d));
- SAFE_FREE(p_rsa_privatekey_ctx);
- SAFE_FREE(temp_buff);
- switch (ipp_ret)
- {
- case ippStsNoErr: return SGX_SUCCESS;
- case ippStsNoMemErr:
- case ippStsMemAllocErr: return SGX_ERROR_OUT_OF_MEMORY;
- case ippStsNullPtrErr:
- case ippStsLengthErr:
- case ippStsOutOfRangeErr:
- case ippStsSizeErr:
- case ippStsBadArgErr: return SGX_ERROR_INVALID_PARAMETER;
- default: return SGX_ERROR_UNEXPECTED;
- }
- }
- sgx_status_t sgx_rsa3072_verify(const uint8_t *p_data,
- uint32_t data_size,
- const sgx_rsa3072_public_key_t *p_public,
- const sgx_rsa3072_signature_t *p_signature,
- sgx_rsa_result_t *p_result)
- {
- if ((p_data == NULL) || (data_size < 1) || (p_public == NULL) ||
- (p_signature == NULL) || (p_result == NULL))
- {
- return SGX_ERROR_INVALID_PARAMETER;
- }
- *p_result = SGX_RSA_INVALID_SIGNATURE;
- IppStatus ipp_ret = ippStsNoErr;
- IppHashAlgId hash_alg = ippHashAlg_SHA256;
- IppsRSAPublicKeyState* p_rsa_publickey_ctx = NULL;
- Ipp8u *temp_buff = NULL;
- IppsBigNumState* p_pubkey_mod_bn = NULL;
- IppsBigNumState* p_pubkey_exp_bn = NULL;
- int result = 0;
- do
- {
-
- ipp_ret = sgx_ipp_newBN((const Ipp32u *)p_public->mod, sizeof(p_public->mod), &p_pubkey_mod_bn);
- ERROR_BREAK(ipp_ret);
- ipp_ret = sgx_ipp_newBN((const Ipp32u *)&p_public->exp, sizeof(p_public->exp), &p_pubkey_exp_bn);
- ERROR_BREAK(ipp_ret);
-
- int public_key_ctx_size = 0;
- ipp_ret = ippsRSA_GetSizePublicKey(SGX_RSA3072_KEY_SIZE * 8, SGX_RSA3072_PUB_EXP_SIZE * 8,
- &public_key_ctx_size);
- ERROR_BREAK(ipp_ret);
- p_rsa_publickey_ctx = (IppsRSAPublicKeyState*)malloc(public_key_ctx_size);
- if (!p_rsa_publickey_ctx) {
- ipp_ret = ippStsMemAllocErr;
- break;
- }
-
- ipp_ret = ippsRSA_InitPublicKey(SGX_RSA3072_KEY_SIZE * 8, SGX_RSA3072_PUB_EXP_SIZE * 8,
- p_rsa_publickey_ctx, public_key_ctx_size);
- ERROR_BREAK(ipp_ret);
- ipp_ret = ippsRSA_SetPublicKey(p_pubkey_mod_bn, p_pubkey_exp_bn, p_rsa_publickey_ctx);
- ERROR_BREAK(ipp_ret);
-
- int public_key_buffer_size = 0;
- ipp_ret = ippsRSA_GetBufferSizePublicKey(&public_key_buffer_size, p_rsa_publickey_ctx);
- ERROR_BREAK(ipp_ret);
- temp_buff = (Ipp8u*)malloc(public_key_buffer_size);
- if (!temp_buff) {
- ipp_ret = ippStsMemAllocErr;
- break;
- }
-
- ipp_ret = ippsRSAVerify_PKCS1v15(p_data, data_size, *p_signature, &result, p_rsa_publickey_ctx, hash_alg, temp_buff);
- } while (0);
- if ((result != 0) && (ipp_ret == ippStsNoErr))
- {
-
- *p_result = SGX_RSA_VALID;
- }
- sgx_ipp_secure_free_BN(p_pubkey_mod_bn, sizeof(p_public->mod));
- sgx_ipp_secure_free_BN(p_pubkey_exp_bn, sizeof(p_public->exp));
- SAFE_FREE(p_rsa_publickey_ctx);
- SAFE_FREE(temp_buff);
- switch (ipp_ret)
- {
- case ippStsNoErr: return SGX_SUCCESS;
- case ippStsNoMemErr:
- case ippStsMemAllocErr: return SGX_ERROR_OUT_OF_MEMORY;
- case ippStsNullPtrErr:
- case ippStsLengthErr:
- case ippStsOutOfRangeErr:
- case ippStsSizeErr:
- case ippStsBadArgErr: return SGX_ERROR_INVALID_PARAMETER;
- default: return SGX_ERROR_UNEXPECTED;
- }
- }
|