1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
/*
* Copyright (C) 2008 Michael Leupold <lemma@confuego.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
*/
#include <QtCrypto>
#include <QtPlugin>
#include <qstringlist.h>
#ifdef Q_OS_WIN32
#include <wincrypt.h>
//-----------------------------------------------------------
class WinCryptoRandomContext : public QCA::RandomContext
{
public:
WinCryptoRandomContext(QCA::Provider *p)
: RandomContext(p)
{
}
Context *clone() const
{
return new WinCryptoRandomContext(*this);
}
QCA::SecureArray nextBytes(int size)
{
QCA::SecureArray buf(size);
HCRYPTPROV hProv;
/* FIXME: currently loop while there's an error. */
while (true) {
// acquire the crypto context
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
continue;
if (CryptGenRandom(hProv, static_cast<DWORD>(size), (BYTE *)buf.data())) {
break;
}
}
// release the crypto context
CryptReleaseContext(hProv, 0);
return buf;
}
};
//-----------------------------------------------------------
class WinCryptoProvider : public QCA::Provider
{
public:
void init()
{
}
~WinCryptoProvider()
{
}
int qcaVersion() const
{
return QCA_VERSION;
}
QString name() const
{
return "qca-wincrypto";
}
QStringList features() const
{
QStringList list;
list += "random";
return list;
}
Context *createContext(const QString &type)
{
if (type == "random")
return new WinCryptoRandomContext(this);
else
return 0;
}
};
//-----------------------------------------------------------
class WinCryptoPlugin : public QObject, public QCAPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "com.affinix.qca.Plugin/1.0")
Q_INTERFACES(QCAPlugin)
public:
virtual QCA::Provider *createProvider()
{
return new WinCryptoProvider;
}
};
Q_EXPORT_PLUGIN2(qca_wincrypto, WinCryptoPlugin);
#endif // Q_OS_WIN32
|