> From: [email protected] 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 [email protected]
Automated List Manager [email protected]