AW: Key generation with GPGME and GnuPG hangs at gpgme_op_genkey

Sandra Schreiner sasc0041 at stud.hs-kl.de
Thu Jan 28 09:35:32 CET 2016


>Don't give up!

>So far we've cleared two major problems: the first was GnuPG taking ~15
>minutes to generate a certificate, and the second was GPGME not working
>with your callback.  Two major problems solved in two days.  Imagine
>what we can get solved by the end of the week.

>Programming is hard, but you're not stupid, and you're in a place where
>you can get help.  Stick with it.  Things will be okay.

Thank you for this encouraging words. In fact I got solved another problem.
It seems that the reason GnuPG was asking for the dummy password, was
that this user was set as a signer in my context (as default). Now I use

gpgme_signers_clear(mContext);

before I encrypt/sign my string. The request for the dummy password 
disappeared. The only problem remaining is that the application still ignores my 
own password callback and uses the GnuPG default:

gpgme_set_passphrase_cb(mContext, passphrase_cb, nullptr);

I replaced my callback with your code:

gpgme_error_t passphrase_cb(void *hook, const char *uid_hint, const char *passphrase_info,
                            int prev_was_bad, int fd){
   
    std::string passphrase { "" };
    size_t written { 0 };
    std::cout << "Enter your passphrase: ";
    std::getline(std::cin, passphrase);

    if (passphrase.empty())
        return GPG_ERR_CANCELED;

    while (written < passphrase.size())
    {
        ssize_t bytesWritten = gpgme_io_write(fd,
                                              &passphrase[0] + written,
                passphrase.size() - written);
        if (bytesWritten == 0)
            break;
        written += bytesWritten;
    }
    gpgme_io_write(fd, "\n", 1);
    return GPG_ERR_NO_ERROR;
}


More information about the Gnupg-users mailing list