keyloader.cpp
The code below shows how to load a private key from a PEM format file, including handling any requirement for a passphrase. This is done using the
QCA::KeyLoader class.
#include <QtCrypto>
#include <QCoreApplication>
#include <QTimer>
#include <stdio.h>
class PassphraseHandler: public QObject
{
Q_OBJECT
public:
QCA::EventHandler handler;
PassphraseHandler(QObject *parent = 0) : QObject(parent)
{
connect(&handler, SIGNAL(eventReady(int, const QCA::Event &)),
SLOT(eh_eventReady(int, const QCA::Event &)));
handler.start();
}
private slots:
void eh_eventReady(int id, const QCA::Event &event)
{
if(event.type() == QCA::Event::Password)
{
QCA::SecureArray pass;
QCA::ConsolePrompt prompt;
prompt.getHidden("Passphrase");
prompt.waitForFinished();
pass = prompt.result();
handler.submitPassword(id, pass);
}
else
handler.reject(id);
}
};
class App : public QObject
{
Q_OBJECT
public:
QCA::KeyLoader keyLoader;
QString str;
App()
{
connect(&keyLoader, SIGNAL(finished()), SLOT(kl_finished()));
}
public slots:
void start()
{
keyLoader.loadPrivateKeyFromPEMFile(str);
}
signals:
void quit();
private slots:
void kl_finished()
{
if(keyLoader.convertResult() == QCA::ConvertGood)
{
QCA::PrivateKey key = keyLoader.privateKey();
printf("Loaded successfully. Bits: %d\n", key.bitSize());
}
else
printf("Unable to load.\n");
emit quit();
}
};
int main(int argc, char **argv)
{
QCA::Initializer init;
QCoreApplication qapp(argc, argv);
if(argc < 2)
{
printf("usage: keyloader [privatekey.pem]\n");
return 0;
}
PassphraseHandler passphraseHandler;
App app;
app.str = argv[1];
QObject::connect(&app, SIGNAL(quit()), &qapp, SLOT(quit()));
QTimer::singleShot(0, &app, SLOT(start()));
qapp.exec();
return 0;
}
#include "keyloader.moc"