Mailing List Archive

Problem with gcry_sexp_build
hi,
I'm using the following functions to encrypt a session key but I recive a
segmantation fault!

typedef struct
{
MPI *prikey; /*private key*/
MPI *pubkey; /*public key*/
} pkkey;

int wcrypt_rsagenkey(pkkey *key,int bits)
{
int ret;
GCRY_SEXP parms;
GCRY_SEXP key_;
gcry_sexp_build(&parms, NULL, "(genkey(rsa(nbits %d)))", bits); /*build
key*/
ret=gcry_pk_genkey(&key_,parms);
if( (key->pubkey=malloc(sizeof(MPI))) ==NULL ||
(key->prikey=malloc(sizeof(MPI))) ) /*?? is here the problem?*/
return -1;
/*extract public and private key from GCRY_SEXP structure*/
wcrypt_key_from_sexp(key->pubkey,key_,"public-key","ne"); /*the
key_from_sexp function from gnupg*/
wcrypt_key_from_sexp(key->prikey,key_,"private-key","ne");
gcry_sexp_release(parms);
gcry_sexp_dump(key_);
gcry_sexp_release(key_);
return ret;
}

int wcrypt_pkencrypt(enum pkalgo alg,unsigned char*sdata,size_t
ndata,unsigned char*to,size_t nto,pkkey key)
{
GCRY_SEXP list,s_pkey,s_data,s_ciph;
GCRY_MPI* pkey=key.pubkey;
GCRY_MPI data,resarr[2];

gcry_mpi_scan(&data,GCRYMPI_FMT_USG,sdata,&ndata);
switch(alg)
{
case GCRY_PK_ELG:
case GCRY_PK_ELG_E:
if(gcry_sexp_build ( &s_pkey, NULL,
"(public-key(elg(p%m)(g%m)(y%m)))",
pkey[0], pkey[1], pkey[2] ))
return 1;
break;
case GCRY_PK_RSA:
if(gcry_sexp_build( &s_pkey, NULL,
"(public-key(rsa(n%m)(e%m)))",
pkey[0] /* n */, pkey[1] /* e */ )) /*here the SEGFAULT happens!*/
return 1;
break;
default:
return 1;
}
/* put the data into a simple list */
if ( gcry_sexp_build( &s_data, NULL, "%m", data ) )
return 1;

/* pass it to libgcrypt */
gcry_pk_encrypt( &s_ciph, s_data, s_pkey );
gcry_sexp_release( s_data );
gcry_sexp_release( s_pkey );

/* extract the MPI values */
list = gcry_sexp_find_token( s_ciph, "a" , 0 );
if(!list)
return 1;
resarr[0] = gcry_sexp_nth_mpi( list, 1, 0 );
if(!resarr[0])
return 1;
gcry_sexp_release ( list );

list = gcry_sexp_find_token( s_ciph, "b" , 0 );
if(!list)
return 1;
resarr[1] = gcry_sexp_nth_mpi( list, 1, 0 );
if(!resarr[1])
return 1;
gcry_sexp_release ( list );
gcry_mpi_print(GCRYMPI_FMT_USG,to,&nto,resarr[0]);
return 0;
}

What is wrong with this code?

--
GMX - Die Kommunikationsplattform im Internet.
http://www.gmx.net
Re: Problem with gcry_sexp_build [ In reply to ]
On Thu, 1 Aug 2002 22:20:15 +0200 (MEST), cplusplushelp said:

> if(gcry_sexp_build( &s_pkey, NULL,
> "(public-key(rsa(n%m)(e%m)))",
> pkey[0] /* n */, pkey[1] /* e */ )) /*here the SEGFAULT happens!*/

You are dereferencing a pad pointer, either pkey[0] or pkey[1]. BTW,
it is good practice to send a stack backtrace in such cases: Run
under gdb and enter "bt" after it failed or do it on the core file.


Salam-Shalom,

Werner
Re: Problem with gcry_sexp_build [ In reply to ]
On Friday, 2. August 2002 11:35, you wrote:
> You are dereferencing a pad pointer, either pkey[0] or pkey[1].

Now I have another problem.

I'm using the key_from_sexp function (see gnupg-1.1.2/g10/keygen.c) to
extract the private RSA Key

wcrypt_key_from_sexp(key->prikey,key_,"private-key","nedpqu");

then I use this function

int wcrypt_pkencrypt(enum pkalgo alg,unsigned char*sdata,size_t
ndata,unsigned char*to,size_t nto,pkkey key)
{
GCRY_SEXP list,s_pkey,s_data,s_ciph;
GCRY_MPI* pkey=key.pubkey;
GCRY_MPI data,resarr[2];

gcry_mpi_scan(&data,GCRYMPI_FMT_USG,sdata,&ndata);
switch(alg)
{
case GCRY_PK_ELG:
case GCRY_PK_ELG_E:
if(gcry_sexp_build ( &s_pkey, NULL,
"(public-key(elg(p%m)(g%m)(y%m)))",
pkey[0], pkey[1], pkey[2] ))
return 1;
break;
case GCRY_PK_RSA:
if(gcry_sexp_build( &s_pkey, NULL,
"(public-key(rsa(n%m)(e%m)))",
pkey[0] /* n */, pkey[1] /* e */ )) /*here the
SEGFAULT happens!*/
return 1;
break;
default:
return 1;
}
/* put the data into a simple list */
if ( gcry_sexp_build( &s_data, NULL, "%m", data ) )
return 1;

/* pass it to libgcrypt */
gcry_pk_encrypt( &s_ciph, s_data, s_pkey ); //here
gcry_sexp_release( s_data );
gcry_sexp_release( s_pkey );

/* extract the MPI values */
list = gcry_sexp_find_token( s_ciph, "a" , 0 );
if(!list)
return 1;
resarr[0] = gcry_sexp_nth_mpi( list, 1, 0 );
if(!resarr[0])
return 1;
gcry_sexp_release ( list );

list = gcry_sexp_find_token( s_ciph, "b" , 0 );
if(!list)
return 1;
resarr[1] = gcry_sexp_nth_mpi( list, 1, 0 );
if(!resarr[1])
return 1;
gcry_sexp_release ( list );
gcry_mpi_print(GCRYMPI_FMT_USG,to,&nto,resarr[0]);
return 0;
}

to encrypt some data. But I recive a segmentation fault

Program received signal SIGSEGV, Segmentation fault.
0x4008e9bb in malloc () from /lib/libc.so.6
(gdb) where
#0 0x4008e9bb in malloc () from /lib/libc.so.6
#1 0x4008e074 in malloc () from /lib/libc.so.6
#2 0x401469ba in _gcry_private_malloc (n=136) at stdmem.c:68
#3 0x40144155 in gcry_malloc (n=136) at global.c:367
#4 0x4014435d in gcry_xmalloc (n=136) at global.c:457
#5 0x4016c715 in _gcry_mpi_alloc_limb_space (nlimbs=34, secure=0)
at mpiutil.c:84
#6 0x4016994e in gcry_mpi_powm (res=0x804a37c, base=0x804a80c,
exp=0x804a7dc,
mod=0x804a754) at mpi-pow.c:156
#7 0x401612d6 in public (output=0x804a37c, input=0x804a80c, pkey=0xbffff448)
at rsa.c:227
#8 0x40161557 in _gcry_rsa_encrypt (algo=1, resarr=0x804a82c,
data=0x804a80c,
pkey=0x804a6e4) at rsa.c:403
#9 0x40149a1a in pubkey_encrypt (algo=1, resarr=0x804a82c, data=0x804a80c,
pkey=0x804a6e4) at pubkey.c:540
#10 0x4014a622 in gcry_pk_encrypt (r_ciph=0xbffff508, s_data=0x804a4c4,
s_pkey=0x804a4ec) at pubkey.c:982
#11 0x4001e379 in wcrypt_pkencrypt () from /usr/lib/libwcrypt.so
#12 0x08048888 in main (argc=2, argv=0xbffffdc4) at ppd1.c:23

if I change the string "nedpqu" to "ne" I recive a segmentation fault because
I'm dereferencing a bad pointer in the decrypt function

rc = gcry_sexp_build ( &s_skey, NULL,
"(private-key(rsa(n%m)(e%m)(d%m)(p%m)(q%m)(u%m)))",
skey[0], skey[1], skey[2], skey[3], skey[4], skey[5] );

What is wrong?