> From: owner-openssl-us...@openssl.org On Behalf Of Leonardo Laface de
Almeida
> Sent: Monday, 29 October, 2012 16:20

> The problem I've got is quite simple. The callback I pass 
> throught this
> function is not called. <snip>
> Someone could please help me figure out why? I've wrote as 
> OpenSSL page
> tells. Am I doing something wrong? Is thera a best way for 
> doing this? 
> 
What page is that? Your posted code is quite unlike any 
OpenSSL example (or actual) code I've seen.

<snip>
> EVP_PKEY *pkey;
> BIO *bio;
> 
There's no reason (this) bio variable should be global,  
and pkey maybe not.

> typedef struct pw_cb_data
> {
>     const void *password;
>     const char *prompt_info;
> } PW_CB_DATA;
> 
> static int rsa_cb(char *buf, int size, int rwflag, void *u)
> {
>     int len;
>     PW_CB_DATA *cb_data = (PW_CB_DATA *)u;
>     
>     //Programm doesn't enter here!!
>     len = strlen((char *)cb_data->password);
> 
>     if (len <= 0)
>         return 0;
> 
>     /* if too long, truncate */
>     if (len > size)
>         len = size;
> 
>     memcpy(buf, cb_data->password, len);
> 
>     return len;
> }
> 
Using a callback to set a caller-supplied C-style string is 
a waste of time. You can _read*PrivateKey(,,NULL,password).

> int main()
> {
>     PW_CB_DATA cb_data; 
>     int ret = 1;
> 
> (...)
>     memcpy(&kprPath[0],"path_to_Kpr",pathlen);
>     kprPath[pathlen] = '\0';
> 
>     memcpy(&kprPath[0],"Kpr_password",passlen);
>     kprPath[passlen] = '\0';
> 
>     if (ret)
>         bio = BIO_new(BIO_s_file());
> 
>     if (bio == NULL)
>         ret = 0;
> 
>     if (ret && !BIO_read_filename(bio,&kprPath[0]))
>         ret = 0;
> 
The code above set kprPath to "Kpr_password" 
which I doubt is the correct filename.

>     cb_data.password = &passwd[0];
>     cb_data.prompt_info = &kprPath[0];
> 
It might be the correct "prompt", but 
your callback doesn't use the .prompt_info .
It does use .password, and your code doesn't 
set .password to anything valid at all.

>     if (ret)
>         
> pkey=PEM_read_bio_PrivateKey(bio,NULL,(pem_password_cb *)rsa_cb,
> &cb_data); 
>     
>     if (pkey != NULL)
>         ret = 0;
> 
If pretty much any OpenSSL routine returns an error indicateion, 
and here read*PrivateKey == NULL is an error indication, you should 
look at the error queue: http://www.openssl.org/support/faq.html#PROG6
I bet you'll see that you didn't give it the correct filename.


______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to