error in encrypt / Decrypt

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



hello,

Please refer to the attached sample code.

EVP_PKEY_encrypt_init is giving following error :

==============================================================
40F755D58C730000:error:03000096:digital envelope routines:evp_pkey_asym_cipher_init:operation not supported for this keytype:../crypto/evp/asymcipher.c:189:
encrypt_using_DER_public_key 52
==============================================================

Can someone help me understand how to fix the issue ?

Thanks.
Lokesh.

--
You received this message because you are subscribed to the Google Groups "openssl-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to openssl-users+unsubscribe@xxxxxxxxxxx.
To view this discussion on the web visit https://groups.google.com/a/openssl.org/d/msgid/openssl-users/8785d9b5-ded1-4dad-9e9a-8dbffb346cd1n%40openssl.org.
//gcc source/encrypt_decrypt.c -lcrypto
#include<openssl/evp.h>
#include<openssl/err.h>
#include<openssl/ec.h>

uint8_t *private_key = NULL;
int private_key_len;
uint8_t *public_key = NULL;
int public_key_len;
uint8_t * const plain_text_input = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
uint8_t cipher_text[200];
size_t cipher_text_len;
uint8_t plain_text_output[200];
size_t plain_text_output_len;

void handle_errors( char const * const function, const int line )
{
	ERR_print_errors_fp( stderr );
	fprintf( stderr, "%s %d\n", function, line );
	exit(1);
}

void generate_public_private_keys_DER()
{
	OpenSSL_add_all_algorithms();
	ERR_load_crypto_strings();
	EVP_PKEY_CTX * pctx = EVP_PKEY_CTX_new_id( EVP_PKEY_EC, NULL );
	if( pctx == NULL )														handle_errors( __func__, __LINE__ );
	if( EVP_PKEY_paramgen_init( pctx ) <= 0 )									handle_errors( __func__, __LINE__ );
	if( EVP_PKEY_CTX_set_ec_paramgen_curve_nid( pctx, NID_X9_62_prime256v1 ) <= 0 )		handle_errors( __func__, __LINE__ );
	EVP_PKEY *pkey = NULL;
	if( EVP_PKEY_paramgen( pctx, &pkey ) <= 0 )									handle_errors( __func__, __LINE__ );
	EVP_PKEY_CTX_free( pctx );
	pctx = EVP_PKEY_CTX_new( pkey, NULL );
	if( pctx == NULL )														handle_errors( __func__, __LINE__ );
	if( EVP_PKEY_keygen_init( pctx ) <= 0 )										handle_errors( __func__, __LINE__ );
	if( EVP_PKEY_keygen( pctx, &pkey ) <= 0 )									handle_errors( __func__, __LINE__ );
	private_key_len = i2d_PrivateKey( pkey, &private_key );
	if( private_key_len < 0 )												handle_errors( __func__, __LINE__ );
	public_key_len = i2d_PublicKey( pkey, &public_key );
	if( public_key_len < 0 )													handle_errors( __func__, __LINE__ );
}

void encrypt_using_DER_public_key()
{
	uint8_t const *pub_key_DER = public_key;
	EVP_PKEY *pub_key_EVP;
	if( d2i_PublicKey( EVP_PKEY_EC, &pub_key_EVP, &pub_key_DER, public_key_len ) == NULL )	handle_errors( __func__, __LINE__ );
	EVP_PKEY_CTX * const ctx = EVP_PKEY_CTX_new( pub_key_EVP, NULL );
	if( ctx == NULL )														handle_errors( __func__, __LINE__ );
	if( EVP_PKEY_encrypt_init( ctx ) <= 0 )										handle_errors( __func__, __LINE__ );
	if( EVP_PKEY_encrypt( ctx, cipher_text, &cipher_text_len, plain_text_input, strlen( plain_text_input ) ) <= 0 )
																		handle_errors( __func__, __LINE__ );
	EVP_PKEY_CTX_free( ctx );
	EVP_PKEY_free( pub_key_EVP );
}

void decrypt_using_DER_private_key()
{
	uint8_t const *pvt_key_DER = private_key;
	EVP_PKEY *pvt_key_EVP;
	if( d2i_PublicKey( EVP_PKEY_EC, &pvt_key_EVP, &pvt_key_DER, private_key_len ) == NULL )	handle_errors( __func__, __LINE__ );
	EVP_PKEY_CTX * const ctx = EVP_PKEY_CTX_new( pvt_key_EVP, NULL );
	if( ctx == NULL )														handle_errors( __func__, __LINE__ );
	if( EVP_PKEY_decrypt_init( ctx ) <= 0 )										handle_errors( __func__, __LINE__ );
	if( EVP_PKEY_decrypt( ctx, plain_text_output, &plain_text_output_len, cipher_text, cipher_text_len ) <= 0 )
																		handle_errors( __func__, __LINE__ );
	EVP_PKEY_CTX_free( ctx );
	EVP_PKEY_free( pvt_key_EVP );
	fprintf( stderr, "%s %d decrypted text is :%s\n", __func__, __LINE__, plain_text_output );
}

int main()
{
	generate_public_private_keys_DER();
	encrypt_using_DER_public_key();
	decrypt_using_DER_private_key();
}

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux