/* rsa oaep encryption */ unsigned char *rsacrypt(pk_context *pkctx,const unsigned char *plaintext,const unsigned int plaintextsize){ entropy_context entropy = {0}; ctr_drbg_context ctr_drbg = {0}; rsa_context rsactx = {0}; int pkresult = 0; unsigned char *encryptedoutput = NULL; unsigned int encryptedoutputsize = 0; char pers[33] = "3s:!2OXI(FX%#Q($[CEjiGRIk\\-)4e&?"; int ret = 0; entropy_init( &entropy ); if((ret = ctr_drbg_init(&ctr_drbg, entropy_func, &entropy, (unsigned char *)&pers[0],strlen(pers))) != 0 ){ outputerror(DBG_ERROR,"%s\n","rsacrypt::failed to initialize random generator"); return NULL; } encryptedoutputsize = pk_get_len(pkctx); outputerror(DBG_INFO,"%s %Iu\n","rsacrypt::buffer size for rsa encrypted output ",encryptedoutputsize); encryptedoutput = (unsigned char *)malloc(encryptedoutputsize); SecureZeroMemory(encryptedoutput,encryptedoutputsize); rsa_copy(&rsactx,pkctx->pk_ctx); rsactx.padding = RSA_PKCS_V21; rsactx.hash_id = POLARSSL_MD_SHA1; pkresult = 0; pkresult = rsa_rsaes_oaep_encrypt(&rsactx,ctr_drbg_random,&ctr_drbg,RSA_PUBLIC,"cryptoshot",strlen("cryptoshot"),plaintextsize,plaintext,encryptedoutput); if(pkresult != 0){ outputerror(DBG_ERROR,"%s %i\n","rsacrypt::failed to encrypt data",pkresult); return NULL; } entropy_free(&entropy); rsa_free(&rsactx); return encryptedoutput; }
/* * Add the message padding, then do an RSA operation */ int rsa_pkcs1_encrypt( rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t ilen, const unsigned char *input, unsigned char *output ) { switch( ctx->padding ) { #if defined(POLARSSL_PKCS1_V15) case RSA_PKCS_V15: return rsa_rsaes_pkcs1_v15_encrypt( ctx, f_rng, p_rng, mode, ilen, input, output ); #endif #if defined(POLARSSL_PKCS1_V21) case RSA_PKCS_V21: return rsa_rsaes_oaep_encrypt( ctx, f_rng, p_rng, mode, NULL, 0, ilen, input, output ); #endif default: return( POLARSSL_ERR_RSA_INVALID_PADDING ); } }