Hi,

I think I did it way too complicated. I think the problem was that I
always tried to mimic some openssl php code I know, but I think the
solution I have now is much easier and standard complained:

void Encryption::generateUserKeys(QString password)
{
    RSA *rsa;
    EVP_PKEY *pkey;

    int bits = 1024;
    unsigned long exp = RSA_F4;
    QMap<QString, QString> keypair;

    rsa = RSA_generate_key(bits, exp, NULL, NULL);

    pkey = EVP_PKEY_new();
    EVP_PKEY_assign_RSA(pkey, rsa);

    keypair = key2pem(rsa, password);

    RSA_free(rsa);

    sendUserKeysToServer(keypair);
}

QMap<QString, QString> Encryption::key2pem(RSA *rsa, QString password)
{
    QMap<QString, QString> keypair;
    BUF_MEM *bptr;
    BIO *pubBio = BIO_new(BIO_s_mem());
    BIO *privBio = BIO_new(BIO_s_mem());

    PEM_write_bio_RSA_PUBKEY(pubBio, rsa);
    PEM_write_bio_RSAPrivateKey(privBio, rsa, EVP_aes_128_cfb(),NULL,
    0, 0, password.toLocal8Bit().data());

    BIO_get_mem_ptr(pubBio, &bptr);
    char *pubKey = (char *)malloc(bptr->length+1);
    memcpy(pubKey, bptr->data, bptr->length);
    pubKey[bptr->length] = 0;

    BIO_get_mem_ptr(privBio, &bptr);
    char *privKey = (char *)malloc(bptr->length+1);
    memcpy(privKey, bptr->data, bptr->length);
    privKey[bptr->length] = 0;

    keypair["privatekey"] = QString(privKey);
    keypair["publickey"] = QString(pubKey);

    BIO_free_all(pubBio);
    BIO_free_all(privBio);

    return keypair;

}

Please feel free to commend on it if you think there is still something
to improve.

best wishes,
Björn

-- 
Björn Schießle <bjo...@schiessle.org>
www: http://schiessle.org 
gnupg key: 0x0x2378A753E2BF04F6 
fingerprint: 244F CEB0 CB09 9524 B21F B896 2378 A753 E2BF 04F6
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to