/*
- Copyright (C) 2006 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-// QtCrypto has the declarations for all of QCA
-#include <QtCrypto>
-
-#include <QCoreApplication>
-#include <QDebug>
-
-class AESCMACContext : public QCA::MACContext
-{
-public:
- AESCMACContext(QCA::Provider *p) : QCA::MACContext(p, "cmac(aes)")
- {
- }
-
- ~AESCMACContext()
- {
- }
-
-
- // Helper to left shift an arbitrary length array
- // This is heavily based on the example in the I-D.
- QCA::SecureArray leftShift(constQCA::SecureArray &array)
- {
- // We create an output of the same size as the input
- QCA::SecureArray out(array.size());
- // We handle one byte at a time - this is the high bit
- // from the previous byte.
- int overflow = 0;
-
- // work through each byte.
- for (int i = array.size() -1; i >= 0; --i) {
- // do the left shift on this byte.
- out[i] = array[i] << 1;
- // make the low bit on this byte be the high bit
- // from the previous byte.
- out[i] |= overflow;
- // save the high bit for next time
- overflow = (array[i] & 0x80) ? 1 : 0;
- }
- return out;
- }
-
-
- // Helper to XOR two arrays - must be same length
- QCA::SecureArray xorArray(constQCA::SecureArray &array1,
- constQCA::SecureArray &array2)
- {
- if (array1.size() != array2.size())
- // empty array
- returnQCA::SecureArray();
-
- QCA::SecureArray result(array1.size());
-
- for (int i = 0; i < array1.size(); ++i)
- result[i] = array1[i] ^ array2[i];
-
- return result;
- }
-
-
- void setup(constQCA::SymmetricKey &key)
- {
- // We might not have a real key, since this can get called
- // from the constructor.
- if (key.size() == 0)
- return;
-
- m_key = key;
- // Generate the subkeys
- QCA::SecureArray const_Zero(16);
- QCA::SecureArray const_Rb(16);
- const_Rb[15] = (char)0x87;
-
- m_X = const_Zero;
- m_residual = QCA::SecureArray();
-
- // Figure 2.2, step 1.
- QCA::Cipher aesObj(QString("aes128"),
- QCA::Cipher::ECB, QCA::Cipher::DefaultPadding,
- QCA::Encode, key);
- QCA::SecureArray L = aesObj.process(const_Zero);
-
- // Figure 2.2, step 2
- if (0 == (L[0] & 0x80))
- m_k1 = leftShift(L);
- else
- m_k1 = xorArray(leftShift(L), const_Rb);
-
- // Figure 2.2, step 3
- if (0 == (m_k1[0] & 0x80))
- m_k2 = leftShift(m_k1);
- else
- m_k2 = xorArray(leftShift(m_k1), const_Rb);
- }
-
- QCA::Provider::Context *clone() const
-{
- returnnew AESCMACContext(*this);
- }
-
- void clear()
- {
- setup(m_key);
- }
-
- QCA::KeyLength keyLength() const
-{
- returnQCA::KeyLength(16, 16, 1);
- }
-
- // This is a bit different to the way the I-D does it,
- // to allow for multiple update() calls.
- void update(constQCA::MemoryRegion &a)
- {
- QCA::SecureArray bytesToProcess = m_residual + a;
- int blockNum;
- // note that we don't want to do the last full block here, because
- // it needs special treatment in final().
- for (blockNum = 0; blockNum < ((bytesToProcess.size()-1)/16); ++blockNum) {
- // copy a block of data
- QCA::SecureArray thisBlock(16);
- for (int yalv = 0; yalv < 16; ++yalv)
- thisBlock[yalv] = bytesToProcess[blockNum*16 + yalv];
-
- m_Y = xorArray(m_X, thisBlock);
-
- QCA::Cipher aesObj(QString("aes128"),
- QCA::Cipher::ECB, QCA::Cipher::DefaultPadding,
- QCA::Encode, m_key);
- m_X = aesObj.process(m_Y);
- }
- // This can be between 1 and 16
- int numBytesLeft = bytesToProcess.size() - 16*blockNum;
- // we copy the left over part
- m_residual.resize(numBytesLeft);
- for(int yalv = 0; yalv < numBytesLeft; ++yalv)
- m_residual[yalv] = bytesToProcess[blockNum*16 + yalv];
- }
-
- voidfinal( QCA::MemoryRegion *out)
- {
- QCA::SecureArray lastBlock;
- int numBytesLeft = m_residual.size();
-
- if ( numBytesLeft != 16 ) {
- // no full block, so we have to pad.
- m_residual.resize(16);
- m_residual[numBytesLeft] = (char)0x80;
- lastBlock = xorArray(m_residual, m_k2);
- } else {
- // this is a full block - no padding
- lastBlock = xorArray(m_residual, m_k1);
- }
- m_Y = xorArray(m_X, lastBlock);
- QCA::Cipher aesObj(QString("aes128"),
- QCA::Cipher::ECB, QCA::Cipher::DefaultPadding,
- QCA::Encode, m_key);
- *out = aesObj.process(m_Y);
-
- }
-
-protected:
- // first subkey
- QCA::SecureArray m_k1;
- // second subkey
- QCA::SecureArray m_k2;
- // main key
- QCA::SecureArray m_key;
-
- // state
- QCA::SecureArray m_X;
- QCA::SecureArray m_Y;
-
- // partial block that we can't do yet
- QCA::SecureArray m_residual;
-};
-
-class ClientSideProvider : public QCA::Provider
-{
-public:
- intqcaVersion() const
-{
- returnQCA_VERSION;
- }
-
- QString name() const
-{
- return"exampleClientSideProvider";
- }
-
- QStringList features() const
-{
- QStringList list;
- list += "cmac(aes)";
- // you can add more features in here, if you have some.
- return list;
- }
-
- Provider::Context *createContext(constQString &type)
- {
- if(type == "cmac(aes)")
- returnnew AESCMACContext(this);
- // else if (type == some other feature)
- // return some other context.
- else
- return 0;
- }
-};
-
-
-// AES CMAC is a Message Authentication Code based on a block cipher
-// instead of the more normal keyed hash.
-// See RFC 4493 "The AES-CMAC Algorithm"
-class AES_CMAC: public QCA::MessageAuthenticationCode
-{
-public:
- AES_CMAC(constQCA::SymmetricKey &key = QCA::SymmetricKey(),
- constQString &provider = QString()):
- QCA::MessageAuthenticationCode( "cmac(aes)", key, provider)
- {}
-};
-
-
-int main(int argc, char **argv)
-{
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- qDebug() << "This example shows AES CMAC";
-
- QCoreApplication app(argc, argv);
-
- if( ! QCA::isSupported("aes128-ecb") ) {
- qDebug() << "AES not supported!";
- }
-
- if ( QCA::insertProvider(new ClientSideProvider, 0) )
- qDebug() << "Inserted our provider";
- else
- qDebug() << "our provider could not be added";
-
- // We should check AES CMAC is supported before using it.
- if( ! QCA::isSupported("cmac(aes)") ) {
- qDebug() << "AES CMAC not supported!";
- } else {
- // create the required object
- AES_CMAC cmacObject;
-
- // create the key
- QCA::SymmetricKey key(QCA::hexToArray("2b7e151628aed2a6abf7158809cf4f3c"));
-
- // set the MAC to use the key
- cmacObject.setup(key);
-
- QCA::SecureArray message = QCA::hexToArray("6bc1bee22e409f96e93d7e117393172a"
- "ae2d8a571e03ac9c9eb76fac45af8e51"
- "30c81c46a35ce411e5fbc1191a0a52ef"
- "f69f2445df4f9b17ad2b417be66c3710");
- QCA::SecureArray message1(message);
- message1.resize(0);
- qDebug();
- qDebug() << "Message1: " << QCA::arrayToHex(message1.toByteArray());
- qDebug() << "Expecting: bb1d6929e95937287fa37d129b756746";
- qDebug() << "AES-CMAC: " << QCA::arrayToHex(cmacObject.process(message1).toByteArray());
-
- cmacObject.clear();
- QCA::SecureArray message2(message);
- message2.resize(16);
- qDebug();
- qDebug() << "Message2: " << QCA::arrayToHex(message2.toByteArray());
- qDebug() << "Expecting: 070a16b46b4d4144f79bdd9dd04a287c";
- qDebug() << "AES-CMAC: " << QCA::arrayToHex(cmacObject.process(message2).toByteArray());
-
- cmacObject.clear();
- QCA::SecureArray message3(message);
- message3.resize(40);
- qDebug();
- qDebug() << "Message3: " << QCA::arrayToHex(message3.toByteArray());
- qDebug() << "Expecting: dfa66747de9ae63030ca32611497c827";
- qDebug() << "AES-CMAC " << QCA::arrayToHex(cmacObject.process(message3).toByteArray());
-
- cmacObject.clear();
- QCA::SecureArray message4(message);
- message4.resize(64);
- qDebug();
- qDebug() << "Message4: " << QCA::arrayToHex(message4.toByteArray());
- qDebug() << "Expecting: 51f0bebf7e3b9d92fc49741779363cfe";
- qDebug() << "AES-CMAC: " << QCA::arrayToHex(cmacObject.process(message4).toByteArray());
- }
-
- return 0;
-}
-
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/annotated.html qca2-2.1.0/apidocs/html/annotated.html
--- qca2-2.0.3/apidocs/html/annotated.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/annotated.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,155 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: Class List
-
-
-
-
-
-
You don't need to understand any of this to use QCA - it is documented for those who are curious, and for anyone planning to extend or modify QCA.
-
The design of QCA is based on the Bridge design pattern. The intent of the Bridge pattern is to "Decouple an abstraction from its
-implementation so that the two can vary independently." [Gamma et.al, pg 151].
-
To understand how this decoupling works in the case of QCA, is is easiest to look at an example - a cryptographic Hash. The API is pretty simple (although I've left out some parts that aren't required for this example):
-
class QCA_EXPORT Hash : public Algorithm, public BufferedComputation
-{
-public:
- Hash(constQString &type, constQString &provider);
- virtualvoid clear();
- virtualvoid update(constQCA::SecureArray &a);
- virtualQCA::SecureArrayfinal();
-}
-
The implementation for the Hash class is almost as simple:
The reason why it looks so simple is that the various methods in Hash just call out to equivalent routines in the context() object. The context comes from a call (getContext()) that is made as part of the Algorithm constructor. That getContext() call causes QCA to work through the list of providers (generally plugins) that it knows about, looking for a provider that can produce the right kind of context (in this case, a HashContext).
-
The code for a HashContext doesn't need to be linked into QCA - it can be varied in its implementation, including being changed at run-time. The application doesn't need to know how HashContext is implemented, because it just has to deal with the Hash class interface. In fact, HashContext may not be implemented, so the application should check (using QCA::isSupported()) before trying to use features that are implemented with plugins.
-
The code for one implementation (in this case, calling OpenSSL) is shown below.
The resulting effect is that QCA can ask the provider to provide an appropriate Context object without worrying about how it is implemented.
-
For features that are implemented with variable algorithms (for example, HashContext can support a wide range of algorithms - MD5, SHA0, and SHA1 in the example above; and CipherContext and MACContext can also do this), we need to be able to let applications determine which algorithms are supported. This is handled through the InfoContext class. A typical example is shown below:
-
class opensslInfoContext : public InfoContext
- {
- Q_OBJECT
- public:
- opensslInfoContext(Provider *p) : InfoContext(p)
- {
- }
-
- Context *clone() const
-{
- returnnew opensslInfoContext(*this);
- }
-
- QStringList supportedHashTypes() const
-{
- QStringList list;
- list += "sha1";
- list += "sha0";
- list += "md5";
- return list;
- }
-
- // MAC and Cipher types can go in here
- };
-
Note that InfoContext is itself a feature, so you have to add it to the createContext() method for the provider, as shown below:
/*
- Copyright (C) 2004-2005 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-// QtCrypto has the declarations for all of QCA
-#include <QtCrypto>
-
-#include <QCoreApplication>
-
-#include <iostream>
-
-int main(int argc, char **argv)
-{
- QCoreApplication(argc, argv);
-
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- // we use the first argument as the data to encode
- // if an argument is provided. Use "hello" if no argument
- QByteArray arg; // empty array
- arg.append((argc >= 2) ? argv[1] : "hello");
-
- // create our object, which does encoding by default
- // QCA::Base64 encoder(QCA::Encode); is equivalent
- QCA::Base64 encoder;
-
- // This does the actual conversion (encoding).
- // You might prefer to use encoder.encode(); and have
- // it return a QCA::SecureArray, depending on your needs
- QString encoded = encoder.arrayToString(arg);
-
- std::cout << arg.data() << " in base64 encoding is ";
- std::cout << encoded.toLatin1().data() << std::endl;
-
- // This time, we'll create an object to decode base64. We
- // could also have reused the existing object, calling
- // clear(); and setup(QCA::Decode); on it.
- QCA::Base64 decoder(QCA::Decode);
-
- // This time, we convert a QString into a QString
- QString decoded = decoder.decodeString(encoded);
-
- std::cout << encoded.toLatin1().data() << " decoded from base64 is ";
- std::cout << decoded.toLatin1().data() << std::endl;
-
- return 0;
-}
-
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/certtest.cpp-example.html qca2-2.1.0/apidocs/html/certtest.cpp-example.html
--- qca2-2.0.3/apidocs/html/certtest.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/certtest.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,204 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: certtest.cpp
-
-
-
-
-
-
/*
- Copyright (C) 2003 Justin Karneges <justin@affinix.com>
- Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-
-#include <QtCrypto>
-
-#include <QCoreApplication>
-
-#include <iostream>
-
-// dump out information about some part of the certificate
-// we use this same approach for information about the subject
-// of the certificate, and also about the issuer of the certificate
-staticvoid dumpCertificateInfo( QCA::CertificateInfo info)
-{
- std::cout << " Organization: " << std::endl;
-
- // Note that a single certificate can apply to more than one
- // organisation. QCA::Certificate is a multimap, so when you
- // ask for the values associated with a parameter, it returns
- // a list.
- QList<QString> orgInfoList = info.values(QCA::Organization);
-
- // foreach() interates over each value in the list, and we dump
- // out each value. Note that is uncommon for a certificate to
- // actually contain multiple values for a single parameter.
- QString organization;
- foreach( organization, orgInfoList ) {
- std::cout << " " << qPrintable(organization) << std::endl;
- }
-
- std::cout << " Country: " << std::endl;
- // As above, however this shows a more compact way to represent
- // the iteration and output.
- foreach( QString country, info.values(QCA::Country) ) {
- std::cout << " " << qPrintable(country) << std::endl;
- }
-}
-
-// This is just a convenience routine
-staticvoid dumpSubjectInfo( QCA::CertificateInfo subject)
-{
- std::cout << "Subject: " << std::endl;
-
- dumpCertificateInfo( subject );
-}
-
-
-// This is just a convenience routine
-staticvoid dumpIssuerInfo( QCA::CertificateInfo issuer)
-{
- std::cout << "Issuer: " << std::endl;
-
- dumpCertificateInfo( issuer );
-}
-
-
-int main(int argc, char** argv)
-{
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
-
- // We need to ensure that we have certificate handling support
- if ( !QCA::isSupported( "cert" ) ) {
- std::cout << "Sorry, no PKI certificate support" << std::endl;
- return 1;
- }
-
- // We are going to work with a number of certificates, and a
- // QList is a great template class for that
- QList<QCA::Certificate> certlist;
-
- // We do two different cases - if we provide an argument, it is taken
- // as a filename to read the keys from. If there is no argument, we just
- // read from the system store certificates.
- if (argc >= 2) {
- // we are going to read the certificates in using a single call
- // which requires a CertificateCollection.
- QCA::CertificateCollection filecerts;
- // The conversion can be tested (although you don't have to) to find out if it
- // worked.
- QCA::ConvertResult importResult;
- // This imports all the PEM encoded certificates from the file specified as the argument
- // Note that you pass in a pointer to the result argument.
- filecerts = QCA::CertificateCollection::fromFlatTextFile( argv[1], &importResult );
- if ( QCA::ConvertGood == importResult) {
- std::cout << "Import succeeded" << std::endl;
- // this turns the CertificateCollection into a QList of Certificate objects
- certlist = filecerts.certificates();
- }
- } else {
- // we have no arguments, so just use the system certificates
- if ( !QCA::haveSystemStore() ) {
- std::cout << "System certificates not available" << std::endl;
- return 2;
- }
-
- // Similar to above, except we just want the system certificates
- QCA::CertificateCollection systemcerts = QCA::systemStore();
-
- // this turns the CertificateCollection into a QList of Certificate objects
- certlist = systemcerts.certificates();
- }
-
- std::cout << "Number of certificates: " << certlist.count() << std::endl;
-
- QCA::Certificate cert;
- foreach (cert, certlist) {
- std::cout << "Serial Number:";
- // the serial number of the certificate is a QCA::BigInteger, but we can
- // just convert it to a string, and then output it.
- std::cout << qPrintable(cert.serialNumber().toString()) << std::endl;
-
- // The subject information shows properties of who the certificate
- // applies to. See the convenience routines above.
- dumpSubjectInfo( cert.subjectInfo() );
-
- // The issuer information shows properties of who the certificate
- // was signed by. See the convenience routines above.
- dumpIssuerInfo( cert.issuerInfo() );
-
- // Test if the certificate can be used as a certificate authority
- if ( cert.isCA() ) {
- std::cout << "Is certificate authority" << std::endl;
- } else {
- std::cout << "Is not a certificate authority" << std::endl;
- }
-
- // Test if the certificate is self-signed.
- if (cert.isSelfSigned() ) {
- std::cout << "Self signed" << std::endl;
- } else {
- std::cout << "Is not self-signed!!!" << std::endl;
- }
-
- // Certificate are only valid between specific dates. We can get the dates
- // (as a QDateTime) using a couple of calls
- std::cout << "Valid from " << qPrintable(cert.notValidBefore().toString());
- std::cout << ", until " << qPrintable(cert.notValidAfter().toString());
- std::cout << std::endl;
-
- // You can get the certificate in PEM encoding with a simple toPEM() call
- std::cout << "PEM:" << std::endl;
- std::cout << qPrintable(cert.toPEM());
- std::cout << std::endl << std::endl;
- }
-
- return 0;
-}
-
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/ciphertest.cpp-example.html qca2-2.1.0/apidocs/html/ciphertest.cpp-example.html
--- qca2-2.0.3/apidocs/html/ciphertest.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/ciphertest.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,161 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: ciphertest.cpp
-
-
-
-
-
-
The code below shows the normal way to use the QCA::Cipher class.
-
/*
- Copyright (C) 2003 Justin Karneges <justin@affinix.com>
- Copyright (C) 2005-2006 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-// QtCrypto has the declarations for all of QCA
-#include <QtCrypto>
-#include <stdio.h>
-
-#include <QCoreApplication>
-
-int main(int argc, char **argv)
-{
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
-
- // we use the first argument if provided, or
- // use "hello" if no arguments
- QCA::SecureArray arg = (argc >= 2) ? argv[1] : "hello";
-
- // AES128 testing
- if(!QCA::isSupported("aes128-cbc-pkcs7"))
- printf("AES128-CBC not supported!\n");
- else {
- // Create a random key - you'd probably use one from another
- // source in a real application
- QCA::SymmetricKey key(16);
-
- // Create a random initialisation vector - you need this
- // value to decrypt the resulting cipher text, but it
- // need not be kept secret (unlike the key).
- QCA::InitializationVector iv(16);
-
- // create a 128 bit AES cipher object using Cipher Block Chaining (CBC) mode
- QCA::Cipher cipher(QString("aes128"),QCA::Cipher::CBC,
- // use Default padding, which is equivalent to PKCS7 for CBC
- QCA::Cipher::DefaultPadding,
- // this object will encrypt
- QCA::Encode,
- key, iv);
-
- // we use the cipher object to encrypt the argument we passed in
- // the result of that is returned - note that if there is less than
- // 16 bytes (1 block), then nothing will be returned - it is buffered
- // update() can be called as many times as required.
- QCA::SecureArray u = cipher.update(arg);
-
- // We need to check if that update() call worked.
- if (!cipher.ok()) {
- printf("Update failed\n");
- }
- // output the results of that stage
- printf("AES128 encryption of %s is [%s]\n",
- arg.data(),
- qPrintable(QCA::arrayToHex(u.toByteArray())) );
-
-
- // Because we are using PKCS7 padding, we need to output the final (padded) block
- // Note that we should always call final() even with no padding, to clean up
- QCA::SecureArray f = cipher.final();
-
- // Check if the final() call worked
- if (!cipher.ok()) {
- printf("Final failed\n");
- }
- // and output the resulting block. The ciphertext is the results of update()
- // and the result of final()
- printf("Final block for AES128 encryption is [0x%s]\n", qPrintable(QCA::arrayToHex(f.toByteArray())) );
-
- // re-use the Cipher t decrypt. We need to use the same key and
- // initialisation vector as in the encryption.
- cipher.setup( QCA::Decode, key, iv );
-
- // Build a single cipher text array. You could also call update() with
- // each block as you receive it, if that is more useful.
- QCA::SecureArray cipherText = u.append(f);
-
- // take that cipher text, and decrypt it
- QCA::SecureArray plainText = cipher.update(cipherText);
-
- // check if the update() call worked
- if (!cipher.ok()) {
- printf("Update failed\n");
- }
-
- // output results
- printf("Decryption using AES128 of [0x%s] is %s\n",
- qPrintable(QCA::arrayToHex(cipherText.toByteArray())), plainText.data());
-
- // Again we need to call final(), to get the last block (with its padding removed)
- plainText = cipher.final();
-
- // check if the final() call worked
- if (!cipher.ok()) {
- printf("Final failed\n");
- }
-
- // output results
- printf("Final decryption block using AES128 is %s\n", plainText.data());
- // instead of update() and final(), you can do the whole thing
- // in one step, using process()
- printf("One step decryption using AES128: %s\n",
- QCA::SecureArray(cipher.process(cipherText)).data() );
-
- }
-
- return 0;
-}
-
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/classContext_01public_01QObject.html qca2-2.1.0/apidocs/html/classContext_01public_01QObject.html
--- qca2-2.0.3/apidocs/html/classContext_01public_01QObject.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/classContext_01public_01QObject.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,43 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: Context public QObject Class Reference
-
-
-
-
-
-
The direction can be changed using the setup() call.
-
-
-
-
Member Function Documentation
-
-
-
-
-
-
bool QCA::Base64::lineBreaksEnabled
-
(
-
-
)
-
const
-
-
-
-
-
-
Returns true if line breaks are enabled.
-
-
-
-
-
-
-
-
-
int QCA::Base64::lineBreaksColumn
-
(
-
-
)
-
const
-
-
-
-
-
-
Returns the line break column.
-
-
-
-
-
-
-
-
-
void QCA::Base64::setLineBreaksEnabled
-
(
-
bool
-
b
-
)
-
-
-
-
-
-
-
Sets line break mode.
-
If enabled, linebreaks will be added to encoded output or accepted in encoded input. If disabled, linebreaks in encoded input will cause a failure to decode. The default is disabled.
-
Parameters:
-
-
b
whether to enable line breaks (true) or disable line breaks (false)
-
-
-
-
-
-
-
-
-
-
-
-
void QCA::Base64::setLineBreaksColumn
-
(
-
int
-
column
-
)
-
-
-
-
-
-
-
Sets the column that linebreaks should be inserted at when encoding.
-
Parameters:
-
-
column
the column number that line breaks should be inserted at.
any remaining output. Because of the way Base64 encoding works, you will get either an empty array, or an array containing one or two "=" (equals, 0x3D) characters.
Base class to use for primitive provider contexts.
-
For internal use only.
-
This class inherits Provider::Context and calls moveToThread(0) on itself, thereby disabling the event properties of the underlying QObject. Context types that need to be a QObject should inherit from Provider::Context, those that don't should inherit from BasicContext.
it is the application's responsibility to make sure that the QString represents a valid integer (ie it only contains numbers and an optional minus sign at the start)
it is the application's responsibility to make sure that the QString represents a valid integer (ie it only contains numbers and an optional minus sign at the start)
zero if the values are the same, negative if the argument is less than the value of this BigInteger, and positive if the argument value is greater than this BigInteger
General superclass for buffered computation algorithms.
-
A buffered computation is characterised by having the algorithm take data in an incremental way, then having the results delivered at the end. Conceptually, the algorithm has some internal state that is modified when you call update() and returned when you call final().
X.509 certificate and certificate request provider base.
-
Note:
This class is part of the provider plugin interface and should not be used directly by applications. You probably want Certificate, CertificateRequest, or CRL instead.
X.509 certificate or certificate request properties.
-
Note:
This class is part of the provider plugin interface and should not be used directly by applications. You probably want Certificate or CertificateRequest instead.
-
Some fields are only for certificates or only for certificate requests, and these fields are noted.
Complete a certificate chain for the primary certificate, using the rest of the certificates in the chain object, as well as those in issuers, as possible issuers in the chain.
-
If there are issuers missing, then the chain might be incomplete (at the worst case, if no issuers exist for the primary certificate, then the resulting chain will consist of just the primary certificate). Use the result argument to find out if there was a problem during completion. A result of ValidityGood means the chain was completed successfully.
Properties of the subject of the certificate, as a QMultiMap.
-
This is the method that provides information on the subject organisation, common name, DNS name, and so on. The list of information types (i.e. the key to the multi-map) is a CertificateInfoType. The values are a list of QString.
-
An example of how you can iterate over the list is:
This class represents a type of information being stored in a certificate. It can be created either using a known type (from the Known enumerator) or an identifier string (usually an OID). Types created either way are interchangeable.
-
Types also have the notion of a Section. Some types may reside in the Distinguished Name field of a certificate, and some types may reside in the Subject Alternative Name field. This class is capable of representing a type from either section.
-
In the general case, applications will want to use the CertificateInfoTypeKnown enumerator types. These are from RFC3280 (http://www.ietf.org/rfc/rfc3280.txt) except where shown.
-
The entries for IncorporationLocality, IncorporationState and IncorporationCountry are the same as Locality, State and Country respectively, except that the Extended Validation (EV) certificate guidelines (published by the Certificate Authority / Browser Forum, see http://www.cabforum.org) distinguish between the place of where the company does business (which is the Locality / State / Country combination) and the jurisdiction where the company is legally incorporated (the IncorporationLocality / IncorporationState / IncorporationCountry combination).
For types that have OIDs, this function returns an OID in string form. For types that do not have OIDs, this function returns an internal identifier string whose first character is not a digit (this allows you to tell the difference between an OID and an internal identifier).
-
It is hereby stated that General Names (of the X.509 Subject Alternative Name) shall use the internal identifier format "GeneralName.[rfc field name]". For example, the rfc822Name field would have the identifier "GeneralName.rfc822Name".
-
Applications should not store, use, or compare against internal identifiers unless the identifiers are explicitly documented (e.g. GeneralName).
General class for cipher (encryption / decryption) algorithms.
-
Cipher is the class for the various algorithms that perform low level encryption and decryption within QCA.
-
AES128, AES192 and AES256 are recommended for new applications.
-
Standard names for ciphers are:
-
-
Blowfish - "blowfish"
-
TripleDES - "tripledes"
-
DES - "des"
-
AES128 - "aes128"
-
AES192 - "aes192"
-
AES256 - "aes256"
-
CAST5 (CAST-128) - "cast5"
-
-
When checking for the availability of a particular kind of cipher operation (e.g. AES128 in CBC mode with PKCS7 padding), you append the mode and padding type (in that example "aes128-cbc-pkcs7"). CFB and OFB modes don't use padding, so they are always just the cipher name followed by the mode (e.g. "blowfish-cfb" or "aes192-ofb"). If you are not using padding with CBC mode (i.e. you are ensuring block size operations yourself), just use the cipher name followed by "-cbc" (e.g. "blowfish-cbc" or "aes256-cbc").
Returns a list of all of the cipher types available.
-
Parameters:
-
-
provider
the name of the provider to get a list from, if one provider is required. If not specified, available cipher types from all providers will be returned.
pass in a byte array of data, which will be encrypted or decrypted (according to the Direction that was set in the constructor or in setup() ) and returned.
Cryptographic Message Syntax (CMS) "is used to digitally sign, digest, authenticate, or encrypt arbitrary message content. The CMS describes an encapsulation syntax for data protection. It supports digital signatures and encryption. The syntax allows multiple encapsulations; one encapsulation envelope can be nested inside another. Likewise, one party can digitally sign some previously encapsulated data. It also allows arbitrary attributes, such as signing time, to be signed along with the message content, and provides for other attributes such as countersignatures to be associated with a signature." (from
- <a href="http://www.ietf.org/rfc/rfc3852.txt">RFC3852</a>
- "Cryptographic Message Syntax")
Set the untrusted certificates to use for the messages built using this CMS object.
-
This function is useful when verifying messages that don't contain the certificates (or intermediate signers) within the CMS blob. In order to verify such messages, you'll have to pass the possible signer certs with this function.
QCA provides an API for asynchronous, event-based access to the console and stdin/stdout, as these facilities are otherwise not portable. The primary use of this system within QCA is for passphrase prompting in command-line applications, using the tty console type.
-
How it works: Create a Console object for the type of console desired, and then use ConsoleReference to act on the console. Only one ConsoleReference may operate on a Console at a time.
-
A Console object takes over either the physical console (Console::Tty type) or stdin/stdout (Console::Stdio type). Only one of each type may be created at a time.
-
Whenever code is written that needs a tty or stdio object, the code should first call one of the static methods (ttyInstance() or stdioInstance()) to see if a console object for the desired type exists already. If the object exists, use it. If it does not exist, the rule is that the relevant code should create the object, use the object, and then destroy the object when the operation is completed.
-
By following the above rule, you can write code that utilizes a console without the application having to create some master console object for you. Of course, if the application has created a console then it will be used.
-
The reason why there is a master console object is that it is not guaranteed that all I/O will survive creation and destruction of a console object. If you are using the Stdio Type, then you probably want a long-lived console object. It is possible to capture unprocessed I/O by calling bytesLeftToRead or bytesLeftToWrite. However, it is not expected that general console-needing code will call these functions when utilizing a temporary console. Thus, an application developer would need to create his own console object, invoke the console-needing code, and then do his own extraction of the unprocessed I/O if necessary. Another reason to extract unprocessed I/O is if you need to switch from Console back to standard functions (e.g. fgets() ).
Note that library code should not create a new Console object without checking whether there is already a Console object of the required Type. See the main documentation for Console for the rationale for this.
ttyInstance() and stdioInstance for static methods that allow you to test whether there is already a Console object of the required Type, and if there is, obtain a reference to that object.
It is not necessary to use waitForFinished(), because you can just connect the finished() signal to a suitable method, however command line (console) applications often require waitForFinished().
X.509 certificates can be constrained in their application - that is, some certificates can only be used for certain purposes. This class is used to identify an approved purpose for a certificate.
-
Note:
It is common for a certificate to have more than one purpose.
For types that have OIDs, this function returns an OID in string form. For types that do not have OIDs, this function returns an internal identifier string whose first character is not a digit (this allows you to tell the difference between an OID and an internal identifier).
-
It is hereby stated that the KeyUsage bit fields shall use the internal identifier format "KeyUsage.[rfc field name]". For example, the keyEncipherment field would have the identifier "KeyUsage.keyEncipherment".
-
Applications should not store, use, or compare against internal identifiers unless the identifiers are explicitly documented (e.g. KeyUsage).
A CRL is a list of certificates that are special in some way. The normal reason for including a certificate on a CRL is that the certificate should no longer be used. For example, if a key is compromised, then the associated certificate may no longer provides appropriate security. There are other reasons why a certificate may be placed on a CRL, as shown in the CRLEntry::Reason enumeration.
This class is part of the provider plugin interface and should not be used directly by applications. You probably want DHPublicKey or DHPrivateKey instead.
If block is true, then this function blocks until completion. Otherwise, this function returns immediately and finished() is emitted when the operation completes.
-
If an error occurs during generation, then the operation will complete and isNull() will return true.
Support class to monitor a directory for activity.
-
DirWatch monitors a specified file for any changes. When the directory changes, the changed() signal is emitted.
-
Note:
QFileSystemWatcher has very similar functionality to this class. You should evaluate this class and QFileSystemWatcher to determine which better suits your application needs.
Attempt to create P, Q, and G values from the specified group set.
-
If block is true, then this function blocks until completion. Otherwise, this function returns immediately and finished() is emitted when the operation completes.
-
If an error occurs during generation, then the operation will complete and isNull() will return true.
This class is part of the provider plugin interface and should not be used directly by applications. You probably want DSAPublicKey or DSAPrivateKey instead.
If block is true, then this function blocks until completion. Otherwise, this function returns immediately and finished() is emitted when the operation completes.
-
If an error occurs during generation, then the operation will complete and isNull() will return true.
Interface class for password / passphrase / PIN and token handlers.
-
This class is used on client side applications to handle the provision of passwords, passphrases and PINs by users, and to indicate that tokens have been correctly inserted.
-
The concept behind this class is that the library can raise events (typically using PasswordAsker or TokenAsker), which may (or may not) be handled by the application using a handler object (that has-a EventHandler, or possibly is-a EventHandler) that is connected to the eventReady() signal.
Events are produced in response to the library's need for some user intervention, such as entering a pin or password, or inserting a cryptographic token.
-
Event is an abstraction, so you can handle this need in a way that makes sense for your application.
Events are associated with access to a KeyStore, or access to a file (or bytearray/stream or equivalent). This tells you the type of source that caused the Event.
FileWatch monitors a specified file for any changes. When the file changes, the changed() signal is emitted.
-
Note:
QFileSystemWatcher has very similar functionality to this class. You should evaluate this class and QFileSystemWatcher to determine which better suits your application needs.
General superclass for filtering transformation algorithms.
-
A filtering computation is characterised by having the algorithm take input data in an incremental way, with results delivered for each input, or block of input. Some internal state may be managed, with the transformation completed when final() is called.
-
If this seems a big vague, then you might try deriving your class from a subclass with stronger semantics, or if your update() function is always returning null results, and everything comes out at final(), try BufferedComputation.
Hash is the class for the various hashing algorithms within QCA. SHA256, SHA1 or RIPEMD160 are recommended for new applications, although MD2, MD4, MD5 or SHA0 may be applicable (for interoperability reasons) for some applications.
-
To perform a hash, you create a Hash object, call update() with the data that needs to be hashed, and then call final(), which returns a QByteArray of the hash result. An example (using the SHA1 hash, with 1000 updates of a 1000 byte string) is shown below:
If you only have a simple hash requirement - a single string that is fully available in memory at one time - then you may be better off with one of the convenience methods. So, for example, instead of creating a QCA::Hash object, then doing a single update() and the final() call; you could simply call QCA::Hash("algoName").hash() with the data that you would otherwise have provided to the update() call.
Reset a hash, dumping all previous parts of the message.
-
This method clears (or resets) the hash algorithm, effectively undoing any previous update() calls. You should use this call if you are re-using a Hash sub-class object to calculate additional hashes.
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. This method is provided to assist with code that already exists, and is being ported to QCA.
-
You are better off passing a SecureArray (as shown above) if you are writing new code.
-
Parameters:
-
-
data
pointer to a char array
-
len
the length of the array. If not specified (or specified as a negative number), the length will be determined with strlen(), which may not be what you want if the array contains a null (0x00) character.
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. This allows you to read from a file or other I/O device.
-
Note that the device must be already open for reading
-
Parameters:
-
-
file
an I/O device
-
-
-
-
If you are trying to calculate the hash of a whole file (and it isn't already open), you might want to use code like this:
After calling update() with the required data, the hash results are finalised and produced.
-
Note that it is not possible to add further data (with update()) after calling final(), because of the way the hashing works - null bytes are inserted to pad the results up to a fixed size. If you want to reuse the Hash object, you should call clear() and start to update() again.
If you need more flexibility (e.g. you are constructing a large byte array object just to pass it to hash(), then consider creating an Hash object, and then calling update() and final().
any remaining output. Because of the way hexadecimal encoding works, this will return a zero length array - any output will have been returned from the update() call.
Convenience method for initialising and cleaning up QCA.
-
To ensure that QCA is properly initialised and cleaned up, it is convenient to create an Initializer object, and let it go out of scope at the end of QCA usage.
KeyBundle is essentially a convience class that holds a certificate chain and an associated private key. This class has a number of methods that make it particularly suitable for accessing a PKCS12 (.p12) format file, however it can be used as just a container for a Certificate, its associated PrivateKey and optionally additional X.509 Certificate that form a chain.
Export the key bundle to a file in PKCS12 (.p12) format.
-
This method requires appropriate plugin (provider) support - you must check for the "pkcs12" feature, as shown below.
-
if( QCA::isSupported("pkcs12") )
-{
- // can use I/O
- bool result = bundle.toFile( filename, "pass phrase" );
-}
-else
-{
- // not possible to use I/O
-}
-
Parameters:
-
-
fileName
the name of the file to save to
-
passphrase
the passphrase to use to protect the bundle
-
provider
the provider to use, if a specific provider is required
Import the key bundle from a file in PKCS12 (.p12) format.
-
This method requires appropriate plugin (provider) support - you must check for the "pkcs12" feature, as shown below.
-
if( QCA::isSupported("pkcs12") )
-{
- // can use I/O
- bundle = QCA::KeyBundle::fromFile( filename, "pass phrase" );
-}
-else
-{
- // not possible to use I/O
-}
-
Parameters:
-
-
fileName
the name of the file to read from
-
passphrase
the passphrase for the encoded bundle
-
result
pointer to the result of the import process
-
provider
the provider to use, if a specific provider is required
KeyDerivationFunction is a superclass for the various key derivation function algorithms within QCA. You should not need to use it directly unless you are adding another key derivation capability to QCA - you should be using a sub-class. PBKDF2 using SHA1 is recommended for new applications.
This method creates both the public key and corresponding private key. You almost certainly want to extract the public key part out - see PKey::toPublicKey for an easy way.
-
Key length is a tricky judgment - using less than 2048 is probably being too liberal for long term use. Don't use less than 1024 without serious analysis.
-
Parameters:
-
-
bits
the length of key that is required
-
exp
the exponent - typically 3, 17 or 65537
-
provider
the name of the provider to use, if a particular provider is required
This method creates both the public key and corresponding private key. You almost certainly want to extract the public key part out - see PKey::toPublicKey for an easy way.
-
Parameters:
-
-
domain
the discrete logarithm group that this key should be generated from
-
provider
the name of the provider to use, if a particular provider is required
-
-
-
-
Note:
Not every DLGroup makes sense for DSA. You should use one of DSA_512, DSA_768 and DSA_1024.
This method creates both the public key and corresponding private key. You almost certainly want to extract the public key part out - see PKey::toPublicKey for an easy way.
-
Parameters:
-
-
domain
the discrete logarithm group that this key should be generated from
-
provider
the name of the provider to use, if a particular provider is required
-
-
-
-
Note:
For compatibility, you should use one of the IETF_ groupsets as the domain argument.
GUI applications generally must use KeyLoader to load private keys. This is because the synchronous private key loading functions, for example QCA::PrivateKey::fromPEMFile(), cannot be used within the same thread as an EventHandler, and most GUI applications will use EventHandler from the main thread. KeyLoader does not have this problem. It can be used from any thread, including the same thread as EventHandler.
-
The KeyLoader class allows you to asynchronously load stand-alone private keys (QCA::PrivateKey) or private keys with a certificate (QCA::KeyBundle) with a signal that advises of completion.
-
To use this class to load a PrivateKey, you create a KeyLoader object then use one of the loadPrivateKeyFrom...() functions, depending on the format for your key. These functions return immediately. When you get the finished() signal, you can check that the loading operation succeeded (using convertResult()) and then obtain the PrivateKey using the privateKey() function.
The loader may need a passphrase to complete the loading of the key or key bundle. You should use the QCA::EventHandler class to ensure that you deal with this correctly.
Signal that is emitted when the load process has completed.
-
Note:
The load process may not have completed successfully - check the result of convertResult() to confirm this before using the privateKey() or keyBundle() results.
-
-
-
-The documentation for this class was generated from the following file:
This is a container for any kind of object in a KeyStore (such as PGP keys, or X.509 certificates / private keys).
-
KeyStoreEntry objects are obtained through KeyStore or loaded from a serialized string format. The latter method requires a KeyStoreEntry obtained through KeyStore to be serialized for future loading. For example:
-
QString str = someKeyStoreEntry.toString();
-[ app saves str to disk ]
-[ app quits ]
-...
-[ app launches ]
-[ app reads str from disk ]
-KeyStoreEntry entry(str);
-printf("Entry name: [%s]\n", qPrintable(entry.name()));
-
KeyStoreEntry objects may or may not be available. An entry is unavailable if it has a private content that is not present. The private content might exist on external hardware. To determine if an entry is available, call isAvailable(). To ensure an entry is available before performing a private key operation, call ensureAvailable. For example:
ensureAvailable() blocks and may cause hardware access, but if it completes successfully then you may use the entry's private content. It also means, in the case of a Smart Card token, that it is probably inserted.
-
To watch this entry asynchronously, you would do:
-
KeyStoreEntryWatcher *watcher = new KeyStoreEntryWatcher(entry);
-connect(watcher, SIGNAL(available()), SLOT(entry_available()));
-...
-void entry_available()
-{
- // entry now available
- watcher->entry().keyBundle().privateKey().signMessage(...);
-}
-
Unlike private content, public content is always usable even if the entry is not available. Serialized entry data contains all of the metadata necessary to reconstruct the public content.
-
Now, even though an entry may be available, it does not mean you have access to use it for operations. For example, even though a KeyBundle entry offered by a Smart Card may be available, as soon as you try to use the PrivateKey object for a signing operation, a PIN might be asked for. You can call ensureAccess() if you want to synchronously provide the PIN early on:
After an application is configured to use a particular key, it is expected that its usual running procedure will be:
-
1) Construct KeyStoreEntry from the serialized data. 2) If the content object is not available, wait for it (with either ensureAvailable() or KeyStoreEntryWatcher). 3) Pass the content object(s) to a high level operation like TLS.
-
In this case, any PIN prompting and private key operations would be caused/handled from the TLS object. Omit step 2 and the private key operations might cause token prompting.
This means that the private key part can be used at this time. For a smartcard, this means that all required operations (e.g. login / PIN entry) are completed.
If the key stored in this object is either an public or private PGP key, extract the public key part of that PGP key.
-
-
-
-
-
-
-
-
-
bool QCA::KeyStoreEntry::ensureAvailable
-
(
-
-
)
-
-
-
-
-
-
-
Returns true if the entry is available, otherwise false.
-
Available means that any private content for this entry is present and ready for use. In the case of a smart card, this will ensure the card is inserted, and may invoke a token prompt.
-
Calling this function on an already available entry may cause the entry to be refreshed.
Class to monitor the availability of a KeyStoreEntry.
-
Some KeyStore types have the concept of an entry that can be available only part of the time (for example, a smart card that can be removed). This class allows you to identify when a KeyStoreEntry becomes available / unavailable.
This creates an object that monitors the specified KeyStore entry, emitting available() and unavailable() as the entry becomes available and unavailable respectively.
there can be multiple KeyStore objects referring to the same id
-
when a KeyStore is constructed, it refers to a given id (deviceId) and internal contextId. if the context goes away, the KeyStore becomes invalid (isValid() == false), and unavailable() is emitted. even if the device later reappears, the KeyStore remains invalid. a new KeyStore will have to be created to use the device again.
Turns on asynchronous mode for this KeyStore instance.
-
Normally, entryList() and writeEntry() are blocking calls. However, if startAsynchronousMode() is called, then these functions will return immediately. entryList() will return with the latest known entries, or an empty list if none are known yet (in this mode, updated() will be emitted once the initial entries are known, even if the store has not actually been altered). writeEntry() will always return an empty string, and the entryWritten() signal indicates the result of a write.
This synchronous operation may require event handling, and so it must not be called from the same thread as an EventHandler (this is not a concern if asynchronous mode is enabled).
This synchronous operation may require event handling, and so it must not be called from the same thread as an EventHandler (this is not a concern if asynchronous mode is enabled).
This synchronous operation may require event handling, and so it must not be called from the same thread as an EventHandler (this is not a concern if asynchronous mode is enabled).
Key store information, outside of a KeyStore object.
-
This class is used in conjunction with the Event class, and related classes such as PasswordAsker and TokenAsker, to describe the key store source of the Event.
-
Each KeyStoreInfo represents a single KeyStore, and describes the type of store (e.g. smartcard or PGP keyring - see KeyStore::Type), and a couple of names. The id() of a KeyStore is used to reference it, and is typically of the form "qca-mystorename". The name() of a KeyStore is used to describe it (i.e. this is the "pretty" name to show the user), and is typically of the form "My Store Name".
Returns a list of integer context ids, each representing a keystore instance.
-
If a keystore becomes unavailable and then later becomes available again (for example, if a smart card is removed and then the same one is inserted again), the integer context id must be different than last time.
Returns the string id of the store, or an empty string if the integer context id is invalid.
-
The string id of the store should be unique to a single store, and it should persist between availability/unavailability. For example, a smart card that is removed and inserted again should have the same string id (despite having a new integer context id).
Returns true if the entry is successfully removed, otherwise false.
-
Parameters:
-
-
id
the id for the store context
-
entryId
the entry to remove from the store
-
-
-
-
-
-
-
-
-
-
-
-
void QCA::KeyStoreListContext::busyStart
-
(
-
-
)
-
[signal]
-
-
-
-
-
-
Emit this when the provider is busy looking for keystores.
-
The provider goes into a busy state when it has reason to believe there are keystores present, but it still needs to check or query some devices to see for sure.
-
For example, if a smart card is inserted, then the provider may immediately go into a busy state upon detecting the insert. However, it may take some seconds before the smart card information can be queried and reported by the provider. Once the card is queried successfully, the provider would leave the busy state and report the new keystore.
-
When this object is first started with start(), it is assumed to be in the busy state, so there is no need to emit this signal at the beginning.
-
-
-
-
-
-
-
-
-
void QCA::KeyStoreListContext::busyEnd
-
(
-
-
)
-
[signal]
-
-
-
-
-
-
Emit this to leave the busy state.
-
When this object is first started with start(), it is assumed to be in the busy state. You must emit busyEnd() at some point, or QCA will never ask you about keystores.
-
-
-
-
-
-
-
-
-
void QCA::KeyStoreListContext::updated
-
(
-
-
)
-
[signal]
-
-
-
-
-
-
Indicates the list of keystores has changed, and that QCA should call keyStores() to obtain the latest list.
This class provides a simple but flexible approach to logging information that may be used for debugging or system operation diagnostics.
-
There is a single Logger for each application that uses QCA. You do not need to create this Logger yourself - QCA automatically creates it on startup. You can get access to the Logger using the global QCA::logger() method.
-
By default the Logger just accepts all messages (binary and text). If you want to get access to those messages, you need to subclass AbstractLogDevice, and register your subclass (using registerLogDevice()). You can then take whatever action is appropriate (e.g. show to the user using the GUI, log to a file or send to standard error).
This class is part of the provider plugin interface and should not be used directly by applications. You probably want MessageAuthenticationCode instead.
General class for message authentication code (MAC) algorithms.
-
MessageAuthenticationCode is a class for accessing the various message authentication code algorithms within QCA. HMAC using SHA1 ("hmac(sha1)") or HMAC using SHA256 ("hmac(sha256)") is recommended for new applications.
-
Note that if your application is potentially susceptable to "replay
- attacks" where the message is sent more than once, you should include a counter in the message that is covered by the MAC, and check that the counter is always incremented every time you receive a message and MAC.
-
For more information on HMAC, see H. Krawczyk et al. RFC2104 "HMAC: Keyed-Hashing for Message Authentication"
Returns a list of all of the message authentication code types available.
-
Parameters:
-
-
provider
the name of the provider to get a list from, if one provider is required. If not specified, available message authentication codes types from all providers will be returned.
This method clears (or resets) the algorithm, effectively undoing any previous update() calls. You should use this call if you are re-using a MessageAuthenticationCode sub-class object to calculate additional MACs. Note that if the key doesn't need to be changed, you don't need to call setup() again, since the key can just be reused.
After calling update() with the required data, the hash results are finalised and produced.
-
Note that it is not possible to add further data (with update()) after calling final(). If you want to reuse the MessageAuthenticationCode object, you should call clear() and start to update() again.
If there is input data, update() will be called (potentially repeatedly) afterwards. Emit updated() if there is data to read, if input data has been accepted, or if the operation has finished.
Determine whether the password / passphrase was accepted or not.
-
In this context, returning true is indicative of the user clicking "Ok" or equivalent; and returning false indicates that either the user clicked "Cancel" or equivalent, or that the cancel() function was called, or that the request is still pending.
This holds either a reference to an item in a real PGP keyring, or a standalone item created using the from*() functions.
-
Note that with the latter method, the key is of no use besides being informational. The key must be in a keyring (that is, inKeyring() == true) to actually do crypto with it.
This class is part of the provider plugin interface and should not be used directly by applications. You probably want PKey, PublicKey, or PrivateKey instead.
Returns true if this is a private key, otherwise false.
-
-
-
-
-
-
-
-
-
virtual bool QCA::PKeyBase::canExport
-
(
-
-
)
-
const [pure virtual]
-
-
-
-
-
-
Returns true if the components of this key are accessible and whether it can be serialized into an output format.
-
Private keys from a smart card device will often not be exportable.
-
-
-
-
-
-
-
-
-
virtual void QCA::PKeyBase::convertToPublic
-
(
-
-
)
-
[pure virtual]
-
-
-
-
-
-
If the key is a private key, this function will convert it into a public key (all private key data includes the public data as well, which is why this is possible).
-
If the key is already a public key, then this function has no effect.
This class is part of the provider plugin interface and should not be used directly by applications. You probably want PKey, PublicKey, or PrivateKey instead.
-
This object "holds" a public key object. By default it contains no key (key() returns 0), but you can put a key into it with setKey(), or you can call an import function such as publicFromDER().
Generally this function is used if the specified key's provider does not support serialization, but your provider does. The call to this function would then be followed by an export function, such as publicToDER().
Normally you would just test if the capability is present, however for PKey, you also need to test which types of keys are available. So if you want to figure out if RSA keys are supported, you need to do something like:
To make things a bit more complex, supportedTypes() only checks for basic functionality. If you want to check that you can do operations with PEM or DER (eg toPEM(), fromPEM(), and the equivalent DER and PEMfile operations, plus anything else that uses them, including the constructor form that takes a fileName), then you need to check for supportedIOTypes() instead.
-
Parameters:
-
-
provider
the name of the provider to use, if a particular provider is required.
Test what types of keys are supported for IO operations.
-
If you are using PKey DER or PEM operations, then you need to check for appropriate support using this method. For example, if you want to check if you can export or import an RSA key, then you need to do something like:
Note that if you only want to check for basic functionality (ie not PEM or DER import/export), then you can use supportedTypes(). There is no need to use both - if the key type is supported for IO, then is also supported for basic operations.
-
Parameters:
-
-
provider
the name of the provider to use, if a particular provider is required.
Provider represents a plugin provider (or as a special case, the built-in provider). This is the class you need to inherit from to create your own plugin. You don't normally need to worry about this class if you are just using existing QCA capabilities and plugins, however there is nothing stopping you from using it to obtain information about specific plugins, as shown in the example below.
This routine will be called when your plugin is loaded, so this is a good place to do any one-off initialisation tasks. If you don't need any initialisation, just implement it as an empty routine.
-
-
-
-
-
-
-
-
-
virtual void QCA::Provider::deinit
-
(
-
-
)
-
[virtual]
-
-
-
-
-
-
Deinitialisation routine.
-
This routine will be called just before provider destruction. Notably, during QCA shutdown, deinit() will be called on all providers before any of the providers are destructed. Use this opportunity to free any resources that may be used by other providers.
-
-
-
-
-
-
-
-
-
virtual int QCA::Provider::version
-
(
-
-
)
-
const [virtual]
-
-
-
-
-
-
Version number of the plugin.
-
The format is the same as QCA itself. Version 1.2.3 would be represented as 0x010203.
This is used to verify compatibility between the provider and QCA. For a provider to be used, it must supply major and minor version numbers here that are less-than or equal to the actual QCA version (the patch version number is ignored). This means an older provider may be used with a newer QCA, but a newer provider cannot be used with an older QCA.
You might display this information in a credits or "About" dialog. Returns an empty string if the provider has no credit text. Only report credit text when absolutely required (for example, an "advertisement
- clause" related to licensing). Do not use it for reporting general author information.
You need to return a pointer to an algorithm Context that corresponds with the algorithm name specified.
-
Parameters:
-
-
type
the name of the algorithm required
-
-
-
-
Context *createContext(constQString &type)
-{
- if ( type == "sha1" )
- returnnew SHA1Context( this );
- elseif ( type == "sha256" )
- returnnew SHA0256Context( this );
- elseif ( type == "hmac(sha1)" )
- returnnew HMACSHA1Context( this );
- else
- return 0;
-}
-
Naturally you also need to implement the specified Context subclasses as well.
-
-
-
-
-
-
-
-
-
virtual QVariantMap QCA::Provider::defaultConfig
-
(
-
-
)
-
const [virtual]
-
-
-
-
-
-
Method to set up the default configuration options.
-
If your provider needs some configuration options, this method allows you to establish default options. The user can then change the configuration options as required, and set them using configChanged().
-
You need to return a QVariantMap that has configuration options as the keys, and the default configuration as the values, as shown below:
Import a key in Distinguished Encoding Rules (DER) format.
-
This function takes a binary array, which is assumed to contain a public key in DER encoding, and returns the key. Unless you don't care whether the import succeeded, you should test the result, as shown below.
Import a key in Privacy Enhanced Mail (PEM) format.
-
This function takes a string, which is assumed to contain a public key in PEM encoding, and returns that key. Unless you don't care whether the import succeeded, you should test the result, as shown below.
Import a key in Privacy Enhanced Mail (PEM) format from a file.
-
This function takes the name of a file, which is assumed to contain a public key in PEM encoding, and returns that key. Unless you don't care whether the import succeeded, you should test the result, as shown below.
This class creates a full buffer, consisting of two ends (QPipeEnd). You can obtain each end (after calling create()) using readEnd() and writeEnd(), however you must call enable() on each end before using the pipe.
-
By default, the pipe ends are not inheritable by child processes. On Windows, the pipe is created with inheritability disabled. On Unix, the FD_CLOEXEC flag is set on each end's file descriptor.
QCA provides a built in source of random numbers, which can be accessed through this class. You can also use an alternative random number source, by implementing another provider.
This class is part of the provider plugin interface and should not be used directly by applications. You probably want RSAPublicKey or RSAPrivateKey instead.
If block is true, then this function blocks until completion. Otherwise, this function returns immediately and finished() is emitted when the operation completes.
-
If an error occurs during generation, then the operation will complete and isNull() will return true.
This value is the actual public key value (the product of p and q, the random prime numbers used to generate the RSA key), also known as the public modulus.
This value is the actual public key value (the product of p and q, the random prime numbers used to generate the RSA key), also known as the public modulus.
Begins the session in server mode, starting with the authentication.
-
This function returns immediately, and completion is signaled with the resultsReady() signal.
-
On completion, result() and mechlist() will be valid. The result() function will return Success or Error. If the result is Success, then serverFirstStep() will be called next.
-
Parameters:
-
-
realm
the realm to authenticate in
-
disableServerSendLast
whether the client sends first (true) or the server sends first (false)
Simple Authentication and Security Layer protocol implementation.
-
This class implements the Simple Authenication and Security Layer protocol, which is described in RFC2222 - see http://www.ietf.org/rfc/rfc2222.txt.
-
As the name suggests, SASL provides authentication (eg, a "login" of some form), for a connection oriented protocol, and can also provide protection for the subsequent connection.
-
The SASL protocol is designed to be extensible, through a range of "mechanisms", where a mechanism is the actual authentication method. Example mechanisms include Anonymous, LOGIN, Kerberos V4, and GSSAPI. Mechanisms can be added (potentially without restarting the server application) by the system administrator.
-
It is important to understand that SASL is neither "network aware" nor "protocol aware". That means that SASL does not understand how the client connects to the server, and SASL does not understand the actual application protocol.
SASL supports a range of authentication requirements, and a range of security levels. This method allows you to specify the requirements for your connection.
-
Parameters:
-
-
f
the authentication requirements, which you typically build using a binary OR function (eg AllowPlain | AllowAnonymous)
-
s
the security level of the encryption, if used. See SecurityLevel for details of what each level provides.
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. Unless you have a specific reason for directly specifying a strength factor, you probably should use the method above.
-
Parameters:
-
-
f
the authentication requirements, which you typically build using a binary OR function (eg AllowPlain | AllowAnonymous)
-
minSSF
the minimum security strength factor that is required
-
maxSSF
the maximum security strength factor that is required
-
-
-
-
Note:
Security strength factors are a rough approximation to key length in the encryption function (eg if you are securing with plain DES, the security strength factor would be 56).
Call this with the mechanism selected by the client, and initial client data. If there is no initial client data, call the other version of this function instead.
Call this with authentication data received from the network. The only exception is the first step in server mode, in which case putServerFirstStep must be called.
This method accepts encoded (typically encrypted) data for processing.
-
You normally call this function using data read from the network socket (e.g. using QTcpSocket::readAll()) after receiving a signal that indicates that the socket has data to read.
This method provides encoded (typically encrypted) data.
-
You normally call this function to get data to write out to the network socket (e.g. using QTcpSocket::write()) after receiving the readyReadOutgoing() signal.
This signal is emitted when the client has been successfully started.
-
Parameters:
-
-
clientInit
true if the client should send an initial response to the server
-
clientInitData
the initial response to send to the server. Do note that there is a difference in SASL between an empty initial response and no initial response, and so even if clientInitData is an empty array, you still need to send an initial response if clientInit is true.
-
-
-
-
-
-
-
-
-
-
-
-
void QCA::SASL::serverStarted
-
(
-
-
)
-
[signal]
-
-
-
-
-
-
This signal is emitted after the server has been successfully started.
The SecureArray provides an array of memory from a pool that is, at least partly, secure. In this sense, secure means that the contents of the memory should not be made available to other applications. By comparison, a QByteArray or QString may be held in pages that might be swapped to disk or free'd without being cleared first.
-
Note that this class is implicitly shared (that is, copy on write).
Returns a reference to the byte at the index position.
-
Parameters:
-
-
index
the zero-based offset to obtain
-
-
-
-
-
-
-
-
-
-
-
-
const char& QCA::SecureArray::operator[]
-
(
-
int
-
index
-
)
-
const
-
-
-
-
-
-
Returns a reference to the byte at the index position.
-
Parameters:
-
-
index
the zero-based offset to obtain
-
-
-
-
-
-
-
-
-
-
-
-
char* QCA::SecureArray::data
-
(
-
-
)
-
-
-
-
-
-
-
Pointer to the data in the secure array.
-
You can use this for memcpy and similar functions. If you are trying to obtain data at a particular offset, you might be better off using at() or operator[]
You can use this for memcpy and similar functions. If you are trying to obtain data at a particular offset, you might be better off using at() or operator[]
You can use this for memcpy and similar functions. If you are trying to obtain data at a particular offset, you might be better off using at() or operator[]
SecureLayer is normally used between an application and a potentially insecure network. It provides secure communications over that network.
-
The concept is that (after some initial setup), the application can write() some data to the SecureLayer implementation, and that data is encrypted (or otherwise protected, depending on the setup). The SecureLayer implementation then emits the readyReadOutgoing() signal, and the application uses readOutgoing() to retrieve the the encrypted data from the SecureLayer implementation. The encrypted data is then sent out on the network.
-
When some encrypted data comes back from the network, the application does a writeIncoming() to the SecureLayer implementation. Some time later, the SecureLayer implementation may emit readyRead() to the application, which then read()s the decrypted data from the SecureLayer implementation.
-
Note that sometimes data is sent or received between the SecureLayer implementation and the network without any data being sent between the application and the SecureLayer implementation. This is a result of the initial negotiation activities (which require network traffic to agree a configuration to use) and other overheads associated with the secure link.
This method accepts encoded (typically encrypted) data for processing.
-
You normally call this function using data read from the network socket (e.g. using QTcpSocket::readAll()) after receiving a signal that indicates that the socket has data to read.
This method provides encoded (typically encrypted) data.
-
You normally call this function to get data to write out to the network socket (e.g. using QTcpSocket::write()) after receiving the readyReadOutgoing() signal.
This allows you to read data without having it decrypted first.
-
This is intended to be used for protocols that close off the connection and return to plain text transfer. You do not normally need to use this function.
SecureMessage presents a unified interface for working with both OpenPGP and CMS (S/MIME) messages. Prepare the object by calling setFormat(), setRecipient(), and setSigner() as necessary, and then begin the operation by calling an appropriate 'start' function, such as startSign().
-
Here is an example of how to perform a Clearsign operation using PGP:
-
// first make the SecureMessageKey
-PGPKey myPGPKey = getSecretKeyFromSomewhere();
-SecureMessageKey key;
-key.setPGPSecretKey(myPGPKey);
-
-// our data to sign
-QByteArray plain = "Hello, world";
-
-// let's do it
-OpenPGP pgp;
-SecureMessage msg(&pgp);
-msg.setSigner(key);
-msg.startSign(SecureMessage::Clearsign);
-msg.update(plain);
-msg.end();
-msg.waitForFinished(-1);
-
-if(msg.success())
-{
- QByteArray result = msg.read();
- // result now contains the clearsign text data
-}
-else
-{
- // error
- ...
-}
-
CMS cannot clearsign - this is normally only available for PGP
-
-
-
-
-
-
-
-
-
bool QCA::SecureMessage::canSignAndEncrypt
-
(
-
-
)
-
const
-
-
-
-
-
-
True if the SecureMessageSystem can both sign and encrypt (in the same operation).
-
Note:
CMS cannot do an integrated sign/encrypt - this is normally only available for PGP. You can do separate signing and encrypting operations on the same message with CMS though.
-
-
-
-
-
-
-
-
-
void QCA::SecureMessage::reset
-
(
-
-
)
-
-
-
-
-
-
-
Reset the object state to that of original construction.
-
Now a new operation can be performed immediately.
-
-
-
-
-
-
-
-
-
bool QCA::SecureMessage::bundleSignerEnabled
-
(
-
-
)
-
const
-
-
-
-
-
-
Returns true if bundling of the signer certificate chain is enabled.
-
-
-
-
-
-
-
-
-
bool QCA::SecureMessage::smimeAttributesEnabled
-
(
-
-
)
-
const
-
-
-
-
-
-
Returns true if inclusion of S/MIME attributes is enabled.
For CMS only, this will bundle the signer certificate chain into the message.
-
This allows a message to be verified on its own, without the need to have obtained the signer's certificate in advance. Email clients using S/MIME often bundle the signer, greatly simplifying key management.
You will normally use this with some code along these lines:
-
encryptingObj.startEncrypt();
-encryptingObj.update(message);
-// perhaps some more update()s
-encryptingObj.end();
-
Each update() may (or may not) result in some encrypted data, as indicated by the readyRead() signal being emitted. Alternatively, you can wait until the whole message is available (using either waitForFinished(), or use the finished() signal. The encrypted message can then be read using the read() method.
You will normally use this with some code along these lines:
-
decryptingObj.startEncrypt();
-decryptingObj.update(message);
-// perhaps some more update()s
-decryptingObj.end();
-
Each update() may (or may not) result in some decrypted data, as indicated by the readyRead() signal being emitted. Alternatively, you can wait until the whole message is available (using either waitForFinished(), or the finished() signal). The decrypted message can then be read using the read() method.
-
Note:
If decrypted result is also signed (not for CMS), then the signature will be verified during this operation.
You will normally use this with some code along these lines:
-
signingObj.startSign(QCA::SecureMessage::Detached)
-signingObj.update(message);
-// perhaps some more update()s
-signingObj.end();
-
For Detached signatures, you won't get any results until the whole process is done - you either waitForFinished(), or use the finished() signal, to figure out when you can get the signature (using the signature() method, not using read()). For other formats, you can use the readyRead() signal to determine when there may be part of a signed message to read().
-
Parameters:
-
-
m
the mode that will be used to generate the signature
Block until the operation (encryption, decryption, signing or verifying) completes.
-
Parameters:
-
-
msecs
the number of milliseconds to wait for the operation to complete. Pass -1 to wait indefinitely.
-
-
-
-
Note:
You should not use this in GUI applications where the blocking behaviour looks like a hung application. Instead, connect the finished() signal to a slot that handles the results.
-
-This synchronous operation may require event handling, and so it must not be called from the same thread as an EventHandler.
You are meant to be using a subclass (such as OpenPGP or CMS) - you only need to worry about this class if you are creating a whole new SecureMessageSystem type.
Convenience class to run a thread and interact with it synchronously.
-
SyncThread makes it easy to perform the common practice of starting a thread, running some objects in that thread, and then interacting with those objects safely. Often, there is no need to directly use threading primitives (e.g. QMutex), resulting in very clean multi-threaded code.
---
- With SyncThread, you can start, stop, and call a method in another thread while the main thread sleeps. The only requirement is that the methods be declared as slots.
-
Below is a contrived example, where we have an object in another thread that increments a counter over a some interval, using the Qt event loop, and provides a method to inspect the value.
Now to wrap Counter with SyncThread. We went over how to do this in the first article, and it is very straightforward:
-
class CounterThread : publicSyncThread
-{
- Q_OBJECT
-public:
- Counter *counter;
-
- CounterThread(QObject *parent) : SyncThread(parent)
- {
- counter = 0;
- }
-
- ~CounterThread()
- {
- // SyncThread will stop the thread on destruct, but since our
- // atStop() function makes references to CounterThread's
- // members, we need to shutdown here, before CounterThread
- // destructs.
- stop();
- }
-
-protected:
- virtualvoidatStart()
- {
- counter = new Counter;
- }
-
- virtualvoid atStop()
- {
- delete counter;
- }
-};
-
We can then use it like this:
-
CounterThread *thread = new CounterThread;
-
-// after this call, the thread is started and the Counter is ready
-thread->start();
-
-// let's start the counter with a 1 second interval
-thread->call(thread->counter, "start", QVariantList() << 1);
-...
-
-// after some time passes, let's check on the value
-int x = thread->call(thread->counter, "value").toInt();
-
-// we're done with this thing
-delete thread;
-
Do you see a mutex anywhere? I didn't think so.
- ---
-
Even without the call() function, SyncThread is still very useful for preparing objects in another thread, which you can then QObject::connect() to and use signals and slots like normal.
Process an array in the "forward" direction, returning an array.
-
This method runs in the forward direction, so for something like a Base64 encoding, it takes the "native" array, and returns that array encoded in base64.
Process an array in the "reverse" direction, returning an array.
-
This method runs in the reverse direction, so for something like a Base64 encoding, it takes a Base64 encoded array, and returns the "native" representation.
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. Set the constraints of the session using a cipher suite list.
This function returns immediately, and completion is signaled with the resultsReady() signal.
-
On completion, the result() function will return Success if the TLS session is able to begin, or Error if there is a failure to initialize the TLS subsystem. If successful, the session is now in the handshake state, and update() will be called repeatedly until the session ends.
Transport Layer Security (TLS) is the current state-of-the-art in secure transport mechanisms over the internet. It can be used in a way where only one side of the link needs to authenticate to the other. This makes it very useful for servers to provide their identity to clients. Note that is is possible to use TLS to authenticate both client and server.
-
TLS is a IETF standard (RFC2712 for TLS version 1.0, and RFC4346 for TLS version 1.1) based on earlier Netscape work on Secure Socket Layer (SSL version 2 and SSL version 3). New applications should use at least TLS 1.0, and SSL version 2 should be avoided due to known security problems.
Get the list of cipher suites that are available for use.
-
A cipher suite is a combination of key exchange, encryption and hashing algorithms that are agreed during the initial handshake between client and server.
-
Parameters:
-
-
version
the protocol Version that the cipher suites are required for
-
-
-
-
Returns:
list of the the names of the cipher suites supported.
This is the certificate that will be provided to the peer. This is almost always required on the server side (because the server has to provide a certificate to the client), and may be used on the client side.
-
Parameters:
-
-
cert
a chain of certificates that link the host certificate to a trusted root certificate.
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. Allows setting a certificate from a KeyBundle.
-
Parameters:
-
-
kb
key bundle containing the local certificate and associated private key.
Set up the set of trusted certificates that will be used to verify that the certificate provided is valid.
-
Typically, this will be the collection of root certificates from the system, which you can get using QCA::systemStore(), however you may choose to pass whatever certificates match your assurance needs.
Resume a TLS session using the given session object.
-
Parameters:
-
-
session
the session state to use for resumption.
-
-
-
-
-
-
-
-
-
-
-
-
bool QCA::TLS::canCompress
-
(
-
-
)
-
const
-
-
-
-
-
-
Test if the link can use compression.
-
Returns:
true if the link can use compression
-
-
-
-
-
-
-
-
-
bool QCA::TLS::canSetHostName
-
(
-
-
)
-
const
-
-
-
-
-
-
Test if the link can specify a hostname (Server Name Indication).
-
Returns:
true if the link can specify a hostname
-
-
-
-
-
-
-
-
-
bool QCA::TLS::compressionEnabled
-
(
-
-
)
-
const
-
-
-
-
-
-
Returns true if compression is enabled.
-
This only indicates whether or not the object is configured to use compression, not whether or not the link is actually compressed. Use isCompressed() for that.
-
-
-
-
-
-
-
-
-
void QCA::TLS::setCompressionEnabled
-
(
-
bool
-
b
-
)
-
-
-
-
-
-
-
Set the link to use compression.
-
Parameters:
-
-
b
true if the link should use compression, or false to disable compression
Typically, you'll want to perform RFC 2818 validation on the server's certificate, based on the hostname you're intending to connect to. Pass a value for host in order to have the validation for you. If you want to bypass this behavior and do the validation yourself, pass an empty string for host.
-
If the host is an internationalized domain name, then it must be provided in unicode format, not in IDNA ACE/punycode format.
-
Parameters:
-
-
host
the hostname that you want to connect to
-
-
-
-
Note:
The hostname will be used for Server Name Indication extension (see RFC 3546 Section 3.1) if supported by the backend provider.
The number of effective bits of security being used for this connection.
-
This can differ from the actual number of bits in the cipher for certain older "export ciphers" that are deliberately crippled. If you want that information, use cipherMaxBits().
After the SSL/TLS handshake is complete, this method allows you to determine if the other end of the connection (if the application is a client, this is the server; if the application is a server, this is the client) has a valid identity.
-
Note that the security of TLS/SSL depends on checking this. It is not enough to check that the certificate is valid - you must check that the certificate is valid for the entity that you are trying to communicate with.
This method accepts encoded (typically encrypted) data for processing.
-
You normally call this function using data read from the network socket (e.g. using QTcpSocket::readAll()) after receiving a signal that indicates that the socket has data to read.
This method provides encoded (typically encrypted) data.
-
You normally call this function to get data to write out to the network socket (e.g. using QTcpSocket::write()) after receiving the readyReadOutgoing() signal.
This allows you to read data without having it decrypted first.
-
This is intended to be used for protocols that close off the connection and return to plain text transfer. You do not normally need to use this function.
QCA loads cryptographic provider plugins with QPluginLoader. The QObject obtained when loading the plugin must implement the QCAPlugin interface. This is done by inheriting QCAPlugin, and including Q_INTERFACES(QCAPlugin) in your class declaration.
The code below shows to implement a client side handler for password / passphrase / PIN and token requests from QCA and any associated providers.
-
/*
- Copyright (C) 2007 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-// QtCrypto has the declarations for all of QCA
-#include <QtCrypto>
-
-#include <QCoreApplication>
-
-#include <iostream>
-
-class ClientPassphraseHandler: publicQObject
-{
- Q_OBJECT
-public:
- ClientPassphraseHandler(QObject *parent = 0) : QObject( parent )
- {
- // When the PasswordAsker or TokenAsker needs to interact
- // with the user, it raises a signal. We connect that to a
- // local slot to get the required information.
- connect( &m_handler, SIGNAL( eventReady(int, constQCA::Event &) ),
- SLOT( my_eventReady(int, constQCA::Event &) ) );
-
- // Now that we are set up, we can start the EventHandler. Nothing
- // will happen if you don't call this method.
- m_handler.start();
- }
-
-private slots:
- // This slot gets called when the provider needs a token inserted,
- // or to get a passphrase / password / PIN.
- void my_eventReady(intid, constQCA::Event &event)
- {
- // We can sanity check the event
- if ( event.isNull() ) {
- return;
- }
-
- // Events can be associated with a a keystore or a file/bytearray
- // You can tell which by looking at the Source
- if ( event.source() == QCA::Event::KeyStore ) {
- std::cout << "Event is associated with a key store operation" << std::endl;
- } elseif ( event.source() == QCA::Event::Data ) {
- std::cout << "Event is associated with a file or some other data" << std::endl;
- // if the event comes from a file type operation, you can get the
- // name / label using fileName()
- std::cout << " Filename: " << qPrintable( event.fileName() ) << std::endl;
- } else {
- std::cout << "Unexpected Source for Event" << std::endl;
- }
-
- // There are different kinds of events.
- if ( event.type() == QCA::Event::Token ) {
- // You would typically ask the user to insert the token here
- std::cout << "Request for token" << std::endl;
- // we just fake it for this demo.
- m_handler.tokenOkay( id );
- // you could use m_handler.reject( id ) to refuse the token request
-
- } elseif ( event.type() == QCA::Event::Password ) {
- std::cout << "Request for password, passphrase or PIN" << std::endl;
- // and within the Password type, we have a few different styles.
- if ( event.passwordStyle() == QCA::Event::StylePassword ) {
- std::cout << " [Password request]" << std::endl;
- } elseif ( event.passwordStyle() == QCA::Event::StylePassphrase ) {
- std::cout << " [Passphrase request]" << std::endl;
- } elseif ( event.passwordStyle() == QCA::Event::StylePIN ){
- std::cout << " [PIN request]" << std::endl;
- } else {
- std::cout << " [unexpect request style]" << std::endl;
- }
- // You would typically request the password/PIN/passphrase.
- // again, we just fake it.
- m_handler.submitPassword( id, QCA::SecureArray( "hello" ) );
-
- } else {
- std::cout << "Unexpected event type" << std::endl;
- }
- }
-private:
- QCA::EventHandler m_handler;
-
-};
-
-void asker_procedure();
-
-class AskerThread : publicQThread
-{
- Q_OBJECT
-protected:
- virtualvoidrun()
- {
- asker_procedure();
- }
-};
-
-int main(int argc, char **argv)
-{
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- QCoreApplication exampleApp(argc, argv);
-
- ClientPassphraseHandler cph;
-
- // handler and asker cannot occur in the same thread
- AskerThread askerThread;
- QObject::connect(&askerThread, SIGNAL(finished()), &exampleApp, SLOT(quit()));
- askerThread.start();
-
- exampleApp.exec();
- return 0;
-}
-
-void asker_procedure()
-{
- QCA::PasswordAsker pwAsker;
-
- pwAsker.ask( QCA::Event::StylePassword, "foo.tmp", 0 );
-
- pwAsker.waitForResponse();
-
- std::cout << "Password was: " << pwAsker.password().toByteArray().data() << std::endl;
-
- std::cout << std::endl << "Now do token:" << std::endl;
-
- QCA::TokenAsker tokenAsker;
-
- tokenAsker.ask( QCA::KeyStoreInfo( QCA::KeyStore::SmartCard, "Token Id", "Token Name" ), QCA::KeyStoreEntry(), 0 );
-
- tokenAsker.waitForResponse();
-
- if ( tokenAsker.accepted() ) {
- std::cout << "Token was accepted" << std::endl;
- } else {
- std::cout << "Token was not accepted" << std::endl;
- }
-}
-
-#include "eventhandlerdemo.moc"
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/examples.html qca2-2.1.0/apidocs/html/examples.html
--- qca2-2.0.3/apidocs/html/examples.html 2010-11-27 21:41:19.000000000 +0000
+++ qca2-2.1.0/apidocs/html/examples.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,69 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: Examples
-
-
-
-
-
-
This page explains how to interpret the graphs that are generated by doxygen.
-
Consider the following example:
-
/*! Invisible class because of truncation */
-class Invisible { };
-
-/*! Truncated class, inheritance relation is hidden */
-class Truncated : public Invisible { };
-
-/* Class not documented with doxygen comments */
-class Undocumented { };
-
-/*! Class that is inherited using public inheritance */
-class PublicBase : public Truncated { };
-
-/*! A template class */
-template<class T> class Templ { };
-
-/*! Class that is inherited using protected inheritance */
-class ProtectedBase { };
-
-/*! Class that is inherited using private inheritance */
-class PrivateBase { };
-
-/*! Class that is used by the Inherited class */
-class Used { };
-
-/*! Super class that inherits a number of other classes */
-class Inherited : public PublicBase,
- protected ProtectedBase,
- private PrivateBase,
- public Undocumented,
- public Templ<int>
-{
- private:
- Used *m_usedClass;
-};
-
This will result in the following graph:
-
-
-
-
The boxes in the above graph have the following meaning:
-
-
-A filled gray box represents the struct or class for which the graph is generated.
-
-A box with a black border denotes a documented struct or class.
-
-A box with a grey border denotes an undocumented struct or class.
-
-A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
-
-
The arrows have the following meaning:
-
-
-A dark blue arrow is used to visualize a public inheritance relation between two classes.
-
-A dark green arrow is used for protected inheritance.
-
-A dark red arrow is used for private inheritance.
-
-A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
-
-A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
-
-
-Generated on Sat Nov 27 13:41:19 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
Binary files /tmp/5eREEt0AAl/qca2-2.0.3/apidocs/html/graph_legend.png and /tmp/TUoR4IBecB/qca2-2.1.0/apidocs/html/graph_legend.png differ
diff -Nru qca2-2.0.3/apidocs/html/group__ProviderAPI.html qca2-2.1.0/apidocs/html/group__ProviderAPI.html
--- qca2-2.0.3/apidocs/html/group__ProviderAPI.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/group__ProviderAPI.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,111 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: QCA provider API
-
-
-
-
-
-
The MD2 algorithm takes an arbitrary data stream, known as the message and outputs a condensed 128 bit (16 byte) representation of that data stream, known as the message digest. This algorithm is considered slightly more secure than MD5, but is more expensive to compute. Unless backward compatibility or interoperability are considerations, you are better off using the SHA1 or RIPEMD160 hashing algorithms. For more information on MD2, see B. Kalinski RFC1319 "The %MD2
- Message-Digest Algorithm". The label for MD2 is "md2".
-
The MD4 algorithm takes an arbitrary data stream, known as the message and outputs a condensed 128 bit (16 byte) representation of that data stream, known as the message digest. MD4 is not considered to be secure, based on known attacks. It should only be used for applications where collision attacks are not a consideration (for example, as used in the rsync algorithm for fingerprinting blocks of data). If a secure hash is required, you are better off using the SHA1 or RIPEMD160 hashing algorithms. MD2 and MD5 are both stronger 128 bit hashes. For more information on MD4, see R. Rivest RFC1320 "The %MD4 Message-Digest Algorithm". The label for MD4 is "md4".
-
The MD5 takes an arbitrary data stream, known as the message and outputs a condensed 128 bit (16 byte) representation of that data stream, known as the message digest. MD5 is not considered to be secure, based on known attacks. It should only be used for applications where collision attacks are not a consideration. If a secure hash is required, you are better off using the SHA1 or RIPEMD160 hashing algorithms. For more information on MD5, see R. Rivest RFC1321 "The %MD5
- Message-Digest Algorithm". The label for MD5 is "md5".
-
The RIPEMD160 algorithm takes an arbitrary data stream, known as the message (up to bits in length) and outputs a condensed 160 bit (20 byte) representation of that data stream, known as the message digest. The RIPEMD160 algorithm is considered secure in that it is considered computationally infeasible to find the message that produced the message digest. The label for RIPEMD160 is "ripemd160".
-
The SHA-0 algorithm is a 160 bit hashing function, no longer recommended for new applications because of known (partial) attacks against it. The label for SHA-0 is "sha0".
-
The SHA-1 algorithm takes an arbitrary data stream, known as the message (up to bits in length) and outputs a condensed 160 bit (20 byte) representation of that data stream, known as the message digest. SHA-1 is considered secure in that it is considered computationally infeasible to find the message that produced the message digest. For more information on the SHA-1 algorithm,, see Federal Information Processing Standard Publication 180-2 "Specifications for the
- Secure %Hash Standard", available from http://csrc.nist.gov/publications/. The label for SHA-1 is "sha1".
-
The SHA-224 algorithm takes an arbitrary data stream, known as the message (up to bits in length) and outputs a condensed 224 bit (28 byte) representation of that data stream, known as the message digest. SHA-224 is a "cut down" version of SHA-256, and you may be better off using SHA-256 in new designs. The SHA-224 algorithm is considered secure in that it is considered computationally infeasible to find the message that produced the message digest. For more information on SHA-224, see Federal Information Processing Standard Publication 180-2 "Specifications for the Secure %Hash
- Standard", with change notice 1, available from http://csrc.nist.gov/publications/. The label for SHA-224 is "sha224".
-
The SHA-256 algorithm takes an arbitrary data stream, known as the message (up to bits in length) and outputs a condensed 256 bit (32 byte) representation of that data stream, known as the message digest. The SHA-256 algorithm is considered secure in that it is considered computationally infeasible to find the message that produced the message digest. For more information on SHA-256, see Federal Information Processing Standard Publication 180-2 "Specifications for the Secure %Hash Standard", available from http://csrc.nist.gov/publications/. The label for SHA-256 is "sha256".
-
The SHA-384 algorithm takes an arbitrary data stream, known as the message (up to bits in length) and outputs a condensed 384 bit (48 byte) representation of that data stream, known as the message digest. The SHA-384 algorithm is a "cut down" version of SHA-512, and you may be better off using SHA-512 in new designs. The SHA-384 algorithm is considered secure in that it is considered computationally infeasible to find the message that produced the message digest. For more information on SHA-384, see Federal Information Processing Standard Publication 180-2 "Specifications for the Secure %Hash Standard", available from http://csrc.nist.gov/publications/. The label for SHA-384 is "sha384".
-
The SHA-512 algorithm takes an arbitrary data stream, known as the message (up to bits in length) and outputs a condensed 512 bit (64 byte) representation of that data stream, known as the message digest. The SHA-512 algorithm is considered secure in that it is considered computationally infeasible to find the message that produced the message digest. For more information on SHA-512, see Federal Information Processing Standard Publication 180-2 "Specifications for the Secure %Hash Standard", available from http://csrc.nist.gov/publications/. The label for SHA-512 is "sha512".
-
The Whirlpool algorithm takes an arbitrary data stream, known as the message (up to bits in length) and outputs a condensed 512 bit (64 byte) representation of that data stream, known as the message digest. The Whirlpool algorithm is considered secure in that it is considered computationally infeasible to find the message that produced the message digest. For more information on Whirlpool, see http://paginas.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html or ISO/IEC 10118-3:2004. The label for Whirlpool is "whirlpool".
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/hashtest.cpp-example.html qca2-2.1.0/apidocs/html/hashtest.cpp-example.html
--- qca2-2.0.3/apidocs/html/hashtest.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/hashtest.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,106 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: hashtest.cpp
-
-
-
-
-
-
The code below shows how to use the QCA::Hash class
-
/*
- Copyright (C) 2004 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-// QtCrypto/QtCrypto has the declarations for all of QCA
-#include <QtCrypto>
-
-#include <QCoreApplication>
-
-#include <stdio.h>
-
-int main(int argc, char **argv)
-{
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
-
- // we use the first argument if provided, or
- // use "hello" if no arguments
- QCA::SecureArray arg = (argc >= 2) ? argv[1] : "hello";
-
- // must always check that an algorithm is supported before using it
- if( !QCA::isSupported("sha1") )
- printf("SHA1 not supported!\n");
- else {
- // this shows the "all in one" approach
- QString result = QCA::Hash("sha1").hashToString(arg);
- printf("sha1(\"%s\") = [%s]\n", arg.data(), result.toAscii().data());
- }
-
- // must always check that an algorithm is supported before using it
- if( !QCA::isSupported("md5") )
- printf("MD5 not supported!\n");
- else {
- // this shows the incremental approach. Naturally
- // for this simple job, we could use the "all in one"
- // approach - this is an example, after all :-)
- QCA::SecureArray part1(arg.toByteArray().left(3)); // three chars - "hel"
- QCA::SecureArray part2(arg.toByteArray().mid(3)); // the rest - "lo"
-
- // create the required object.
- QCA::Hash hashObject("md5");
- // we split it into two parts to show incremental update
- hashObject.update(part1);
- hashObject.update(part2);
- // no more updates after calling final.
- QCA::SecureArray resultArray = hashObject.final();
- // convert the result into printable hexadecimal.
- QString result = QCA::arrayToHex(resultArray.toByteArray());
- printf("md5(\"%s\") = [%s]\n", arg.data(), result.toAscii().data());
- }
-
- return 0;
-}
-
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/hextest.cpp-example.html qca2-2.1.0/apidocs/html/hextest.cpp-example.html
--- qca2-2.0.3/apidocs/html/hextest.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/hextest.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,98 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: hextest.cpp
-
-
-
-
-
-
/*
- Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-// QtCrypto has the declarations for all of QCA
-#include <QtCrypto>
-
-#include <QCoreApplication>
-
-#include <iostream>
-
-int main(int argc, char **argv)
-{
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
-
- // we use the first argument as the data to encode / decode
- // if an argument is provided. Use "hello" if no argument
- QByteArray arg; // empty array
- arg.append((argc >= 2) ? argv[1] : "hello");
-
- // create our object, which does encoding by default
- // QCA::Hex encoder(QCA::Encode); is equivalent
- QCA::Hex encoder;
-
- // You might prefer to use encoder.encode(); and have
- // it return a QCA::SecureArray, depending on your needs
- QString encoded = encoder.arrayToString(arg);
-
- std::cout << arg.data() << " in hex encoding is ";
- std::cout << encoded.toLatin1().data() << std::endl;
-
- // This time, we'll create an object to decode hexadecimal.
- // We could also have reused the existing object, calling
- // clear(); and setup(QCA::Decode); on it.
- QCA::Hex decoder(QCA::Decode);
-
- // This time, we convert a QString into a QString
- QString decoded = decoder.decodeString(encoded);
-
- std::cout << encoded.toLatin1().data() << " decoded from hex is ";
- std::cout << decoded.toLatin1().data() << std::endl;
-
- return 0;
-}
-
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/hierarchy.html qca2-2.1.0/apidocs/html/hierarchy.html
--- qca2-2.0.3/apidocs/html/hierarchy.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/hierarchy.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,211 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: Hierarchical Index
-
-
-
-
-
-
Taking a hint from the similarly-named Java Cryptography Architecture, QCA aims to provide a straightforward and cross-platform cryptographic API, using Qt datatypes and conventions. QCA separates the API from the implementation, using plugins known as Providers. The advantage of this model is to allow applications to avoid linking to or explicitly depending on any particular cryptographic library. This allows one to easily change or upgrade Provider implementations without even needing to recompile the application!
-
QCA should work everywhere Qt does, including Windows/Unix/MacOSX. This version of QCA is for Qt4, and requires no Qt3 compatibility code.
Encoding and decoding of hexadecimal (QCA::Hex) and Base64 (QCA::Base64) strings.
-
-
Functionality is supplied via plugins. This is useful for avoiding dependence on a particular crypto library and makes upgrading easier, as there is no need to recompile your application when adding or upgrading a crypto plugin. Also, by pushing crypto functionality into plugins, your application is free of legal issues, such as export regulation.
-
And of course, you get a very simple crypto API for Qt, where you can do things like:
The application simply includes <QtCrypto> and links to libqca, which provides the 'wrapper API' and plugin loader. Crypto functionality is determined during runtime, and plugins are loaded from the 'crypto' subfolder of the Qt library paths. There are additional examples available.
Using QCA is much like using Qt, and if you are familiar with Qt, then it should feel "natural". There are a few things you do need to know though, to build reliable applications:
-
-
QCA needs to be initialized before you use any class that requires plugin support, or uses secure memory. That is most of QCA, so you should assume that you need to perform initialization. The easiest way to do this is to instantiate a QCA::Initializer object and ensure it is not deleted (or allowed to go out of scope) until you have finished using QCA.
-
Most features/algorithms are provided by plugins/Providers. You should check that the required feature is actually available (using QCA::isSupported()) before trying to create it. If you try to create a class and suitable provider support is not available, you will get back a null object, and when you try to use one of the methods, your application will segfault. Also, for features that take algorithm names (e.g. QCA::Hash, which takes the name of the hashing algorithm such as "md5" or "sha256"), the name is looked up at run-time, so if you make a typographical error (e.g. "md56") it will compile correctly, but segfault at run-time.
QCA tries to be flexible in what it supports. That does not mean that every possible combination of features makes sense though.
-
We strongly recommend against coming up with your own design made up of low-level cryptographic primitives (e.g. QCA::Hash, QCA::Cipher and similar features) and trying to use higher level capabilities. In particular, we recommend looking at QCA::TLS, QCA::SASL, QCA::CMS and QCA::OpenPGP as starting points.
-
When selecting a particular cryptographic feature, you should make sure that you understand what sort of threats your application is likely to be exposed to, and how that threat can be effectively countered. In addition, you should consider whether you can avoid adding cryptographic features directly to your application (e.g. for secure transport, you may be able to tunnel your application over SSH).
-
Also, you may need to look beyond QCA for some security needs (e.g. for authentication, your situation may be more suited to using Kerberos than SASL or TLS).
Application authors normally only need to use the User API. The provider API is available for plugin authors, but can also be used by application authors to provide very specific capabilities.
-
For more information on the design of QCA, you might like to review the Architecture description.
The latest version of the code is available from the KDE Subversion server (there is no formal release of the current version at this time). See http://developer.kde.org/source/anonsvn.html for general instructions. You do not need kdelibs or arts modules for QCA - just pull down kdesupport/qca. The plugins are in the same tree. Naturally you will need Qt properly set up and configured in order to build and use QCA.
-
The Subversion code can also be browsed via the web
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.
-
/*
- Copyright (C) 2007 Justin Karneges <justin@affinix.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-// QtCrypto has the declarations for all of QCA
-#include <QtCrypto>
-
-#include <QCoreApplication>
-#include <QTimer>
-
-#include <stdio.h>
-
-class PassphraseHandler: publicQObject
-{
- Q_OBJECT
-public:
- QCA::EventHandler handler;
-
- PassphraseHandler(QObject *parent = 0) : QObject(parent)
- {
- connect(&handler, SIGNAL(eventReady(int, constQCA::Event &)),
- SLOT(eh_eventReady(int, constQCA::Event &)));
- handler.start();
- }
-
-private slots:
- void eh_eventReady(intid, constQCA::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 : publicQObject
-{
- 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::Initializerinit;
- 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"
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/mactest.cpp-example.html qca2-2.1.0/apidocs/html/mactest.cpp-example.html
--- qca2-2.0.3/apidocs/html/mactest.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/mactest.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,114 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: mactest.cpp
-
-
-
-
-
-
/*
- Copyright (C) 2004, 2006 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-// QtCrypto has the declarations for all of QCA
-#include <QtCrypto>
-
-#include <QCoreApplication>
-#include <QDebug>
-
-// needed for printf
-#include<stdio.h>
-
-int main(int argc, char **argv)
-{
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
-
- qDebug() << "This example shows hashed MAC";
-
- // we use the first argument as the data to authenticate
- // if an argument is provided. Use "hello" if no argument
- QByteArray arg = (argc >= 2) ? argv[1] : "hello";
-
- // we use the second argument as the key to authenticate
- // with, if two arguments are provided. Use "secret" as
- // the key if less than two arguments.
- QCA::SecureArray key((argc >= 3) ? argv[2] : "secret");
-
- // must always check that an algorithm is supported before using it
- if( !QCA::isSupported("hmac(sha1)") ) {
- printf("HMAC(SHA1) not supported!\n");
- } else {
- // create the required object using HMAC with SHA-1, and an
- // empty key.
- QCA::MessageAuthenticationCode hmacObject( "hmac(sha1)", QCA::SecureArray() );
-
- // create the key
- QCA::SymmetricKey keyObject(key);
-
- // set the HMAC object to use the key
- hmacObject.setup(key);
- // that could also have been done in the
- // QCA::MessageAuthenticationCode constructor
-
- // we split it into two parts to show incremental update
- QCA::SecureArray part1(arg.left(3)); // three chars - "hel"
- QCA::SecureArray part2(arg.mid(3)); // the rest - "lo"
- hmacObject.update(part1);
- hmacObject.update(part2);
-
- // no more updates after calling final.
- QCA::SecureArray resultArray = hmacObject.final();
-
- // convert the result into printable hexadecimal.
- QString result = QCA::arrayToHex(resultArray.toByteArray());
- printf("HMAC(SHA1) of \"%s\" with \"%s\" = [%s]\n", arg.data(), key.data(), result.toLatin1().data());
- }
-
- return 0;
-}
-
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/md5crypt.cpp-example.html qca2-2.1.0/apidocs/html/md5crypt.cpp-example.html
--- qca2-2.0.3/apidocs/html/md5crypt.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/md5crypt.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,253 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: md5crypt.cpp
-
-
-
-
-
-
With this container, the information is not necessarily stored in the same sequence as the certificate format itself. Use this container if the order the information is/was stored does not matter for you (this is the case with most applications).
-
Additionally, the EmailLegacy type should not be used with this container. Use Email instead.
This enumerator offers a convenient way to work with common types.
-
Enumerator:
-
DigitalSignature
-
Certificate can be used to create digital signatures, id = "KeyUsage.digitalSignature"
-
-
NonRepudiation
-
Certificate can be used for non-repudiation, id = "KeyUsage.nonRepudiation"
-
-
KeyEncipherment
-
Certificate can be used for encrypting / decrypting keys, id = "KeyUsage.keyEncipherment"
-
-
DataEncipherment
-
Certificate can be used for encrypting / decrypting data, id = "KeyUsage.dataEncipherment"
-
-
KeyAgreement
-
Certificate can be used for key agreement, id = "KeyUsage.keyAgreement"
-
-
KeyCertificateSign
-
Certificate can be used for key certificate signing, id = "KeyUsage.keyCertSign"
-
-
CRLSign
-
Certificate can be used to sign Certificate Revocation Lists, id = "KeyUsage.crlSign"
-
-
EncipherOnly
-
Certificate can only be used for encryption, id = "KeyUsage.encipherOnly"
-
-
DecipherOnly
-
Certificate can only be used for decryption, id = "KeyUsage.decipherOnly"
-
-
ServerAuth
-
Certificate can be used for server authentication (e.g. web server), id = "1.3.6.1.5.5.7.3.1". This is an extended usage constraint.
-
-
ClientAuth
-
Certificate can be used for client authentication (e.g. web browser), id = "1.3.6.1.5.5.7.3.2". This is an extended usage constraint.
-
-
CodeSigning
-
Certificate can be used to sign code, id = "1.3.6.1.5.5.7.3.3". This is an extended usage constraint.
-
-
EmailProtection
-
Certificate can be used to sign / encrypt email, id = "1.3.6.1.5.5.7.3.4". This is an extended usage constraint.
-
-
IPSecEndSystem
-
Certificate can be used to authenticate a endpoint in IPSEC, id = "1.3.6.1.5.5.7.3.5". This is an extended usage constraint.
-
-
IPSecTunnel
-
Certificate can be used to authenticate a tunnel in IPSEC, id = "1.3.6.1.5.5.7.3.6". This is an extended usage constraint.
-
-
IPSecUser
-
Certificate can be used to authenticate a user in IPSEC, id = "1.3.6.1.5.5.7.3.7". This is an extended usage constraint.
-
-
TimeStamping
-
Certificate can be used to create a "time stamp" signature, id = "1.3.6.1.5.5.7.3.8". This is an extended usage constraint.
-
-
OCSPSigning
-
Certificate can be used to sign an Online Certificate Status Protocol (OCSP) assertion, id = "1.3.6.1.5.5.7.3.9". This is an extended usage constraint.
QCA can use secure memory, however most operating systems restrict the amount of memory that can be pinned by user applications, to prevent a denial-of-service attack.
-
QCA supports two approaches to getting memory - the mlock method, which generally requires root (administrator) level privileges, and the mmap method which is not as secure, but which should be able to be used by any process.
Any cipher suite that provides non-authenticated communications (usually anonymous Diffie-Hellman) is SL_Integrity.
-
Any cipher suite that is limited to 40 bits (export-version crippled forms of RC2, RC4 or DES) is SL_Export. Standard DES (56 bits) and some forms of RC4 (64 bits) are also SL_Export.
-
Any normal cipher (AES, Camellia, RC4 or similar) with 128 bits, or Elliptic Curve Ciphers with 283 bits, is SL_Baseline
-
AES or Camellia at least 192 bits, triple-DES and similar ciphers are SL_High. ECC with 409 or more bits is also SL_High.
-
Highest does not have an equivalent strength. It indicates that the provider should use the strongest ciphers available (but not less than SL_High).
if specified, only check for the capability in that specific provider. If not provided, or provided as an empty string, then check for capabilities in all available providers
-
-
-
-
Returns:
true if the capability is available, otherwise false
-
Note that you can test for a combination of capabilities, using a comma delimited list:
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
-
Parameters:
-
-
features
a list of features to test for
-
provider
if specified, only check for the capability in that specific provider. If not provided, or provided as an empty string, then check for capabilities in all available providers
This function allows you to add a provider to the current plugin providers at a specified priority. If a provider with the name already exists, this call fails.
-
Parameters:
-
-
p
a pointer to a Provider object, which must be set up.
-
priority
the priority level to set the provider to
-
-
-
-
Returns:
true if the provider is added, and false if the provider is not added (failure)
QCA supports a number of providers, and if a number of providers support the same algorithm, it needs to choose between them. You can do this at object instantiation time (by specifying the name of the provider that should be used). Alternatively, you can provide a relative priority level at an application level, using this call.
-
Priority is used at object instantiation time. The provider is selected according to the following logic:
-
-
if a particular provider is nominated, and that provider supports the required algorithm, then the nominated provider is used
-
if no provider is nominated, or it doesn't support the required algorithm, then the provider with the lowest priority number will be used, if that provider supports the algorithm.
-
if the provider with the lowest priority number doesn't support the required algorithm, the provider with the next lowest priority number will be tried, and so on through to the provider with the largest priority number
-
if none of the plugin providers support the required algorithm, then the default (built-in) provider will be tried.
-
-
Parameters:
-
-
name
the name of the provider
-
priority
the new priority of the provider. As a special case, if you pass in -1, then this provider gets the same priority as the the last provider that was added or had its priority set using this call.
The name of the provider (eg "qca-ossl") is used to look up the current priority associated with that provider. If the provider is not found (or something else went wrong), -1 is returned.
Get system-wide root Certificate Authority (CA) certificates.
-
Many operating systems (or distributions, on Linux-type systems) come with some trusted certificates. Typically, these include the root certificates for major Certificate Authorities (for example, Verisign, Comodo) and some additional certificates that are used for system updates. They are provided in different ways for different systems.
-
This function provides an common way to access the system certificates. There are other ways to access certificates - see the various I/O methods (such as fromDER() and fromPEM()) in the Certificate and CertificateCollection classes.
-
Note:
Availability of the system certificates depends on how QCA was built. You can test whether the system certificates are available using the haveSystemStore() function.
Get the application name that will be used by SASL server mode.
-
The application name is used by SASL in server mode, as some systems might have different security policies depending on the app. The default application name is 'qca'
Set the application name that will be used by SASL server mode.
-
The application name is used by SASL in server mode, as some systems might have different security policies depending on the app. This should be set before using SASL objects, and it cannot be changed later.
This is a convenience function for providers that only have access to raw RSA signing (mainly smartcard providers). This is a built-in function of QCA and does not utilize a provider. SHA1, MD5, MD2, and RIPEMD160 are supported.
-
Parameters:
-
-
hashName
the hash type used to create the digest
-
digest
the digest to encode in EMSA3 format
-
size
the desired size of the encoding output (-1 for automatic size)
For those Cipher sub-classes that are block based, there are modes that require a full block on encryption and decryption - Cipher Block Chaining mode and Electronic Code Book modes are good examples.
-
Since real world messages are not always a convenient multiple of a block size, we have to adding padding. There are a number of padding modes that QCA supports, including not doing any padding at all.
-
If you are not going to use padding, then you can pass QCA::Cipher::NoPadding as the pad argument to the Cipher sub-class, however it is then your responsibility to pass in appropriate data for the mode that you are using.
-
The most common padding scheme is known as PKCS#7 (also PKCS#1), and it specifies that the pad bytes are all equal to the length of the padding ( for example, if you need three pad bytes to complete the block, then the padding is 0x03 0x03 0x03 ).
-
On encryption, for algorithm / mode combinations that require padding, you will get a block of ciphertext when the input plain text block is complete. When you call final(), you will get out the ciphertext that corresponds to the last part of the plain text, plus any padding. If you had provided plaintext that matched up with a block size, then the cipher text block is generated from pure padding - you always get at least some padding, to ensure that the padding can be safely removed on decryption.
-
On decryption, for algorithm / mode combinations that use padding, you will get back a block of plaintext when the input ciphertext block is complete. When you call final(), you will get a block that has been stripped of ciphertext.
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/pages.html qca2-2.1.0/apidocs/html/pages.html
--- qca2-2.0.3/apidocs/html/pages.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/pages.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,41 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: Page Index
-
-
-
-
-
-
There is a limited internal provider (named "default"), but most of the work is done in plugin modules.
-
The logic to selection of a provider is fairly simple. The user can specify a provider name - if that name exists, and the provider supports the requested feature, then the named provider is used. If that didn't work, then the available plugins are searched (based on a priority order) for the requested feature. If that doesn't work, then the default provider is searched for the requested feature.
-
So the only way to get the default provider is to either have no other support whatsoever, or to specify the default provider directly (this goes for the algorithm constructors as well as setGlobalRNG()).
-
You can add your own provider in two ways - as a shared object plugin, and as a part of the client code.
-
The shared object plugin needs to be able to be found using the built-in scan logic - this normally means you need to install it into the plugins/crypto subdirectory within the directory that Qt is installed to. This will make it available for all applications.
-
If you have a limited application domain (such as a specialist algorithm, or a need to be bug-compatible), you may find it easier to create a client-side provider, and add it using the QCA::insertProvider call. There is an example of this - see the AES-CMAC example.
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/providertest.cpp-example.html qca2-2.1.0/apidocs/html/providertest.cpp-example.html
--- qca2-2.0.3/apidocs/html/providertest.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/providertest.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,95 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: providertest.cpp
-
-
-
-
-
-
The code below shows some simple operations on a QCA::Provider object, including use of iterators and some member functions.
-
/*
- Copyright (C) 2004 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-// QtCrypto has the declarations for all of QCA
-#include <QtCrypto>
-#include <QCoreApplication>
-
-#include <iostream>
-#include <qstringlist.h>
-
-int main(int argc, char **argv)
-{
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
-
- // get all the available providers loaded.
- // you don't normally need this (because you test using isSupported())
- // but this is a special case.
- QCA::scanForPlugins();
-
- // this gives us all the plugin providers as a list
- QCA::ProviderList qcaProviders = QCA::providers();
- for (int i = 0; i < qcaProviders.size(); ++i) {
- // each provider has a name, which we can display
- std::cout << qcaProviders[i]->name().toLatin1().data() << ": ";
- // ... and also a list of features
- QStringList capabilities = qcaProviders[i]->features();
- // we turn the string list back into a single string,
- // and display it as well
- std::cout << capabilities.join(", ").toLatin1().data() << std::endl;
- }
-
- // Note that the default provider isn't included in
- // the result of QCA::providers()
- std::cout << "default: ";
- // However it is still possible to get the features
- // supported by the default provider
- QStringList capabilities = QCA::defaultFeatures();
- std::cout << capabilities.join(", ").toLatin1().data() << std::endl;
- return 0;
-}
-
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/publickeyexample.cpp-example.html qca2-2.1.0/apidocs/html/publickeyexample.cpp-example.html
--- qca2-2.0.3/apidocs/html/publickeyexample.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/publickeyexample.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,146 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: publickeyexample.cpp
-
-
-
-
-
-
The code below shows how to do public key encryption, decryption, signing and verification.
-
/*
- Copyright (C) 2003 Justin Karneges <justin@affinix.com>
- Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-
-#include <QtCrypto>
-
-#include <QCoreApplication>
-
-#include <iostream>
-
-
-int main(int argc, char** argv)
-{
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
-
- // We need to ensure that we have certificate handling support
- if ( !QCA::isSupported( "cert" ) ) {
- std::cout << "Sorry, no PKI certificate support" << std::endl;
- return 1;
- }
-
- // Read in a private key
- QCA::PrivateKey privKey;
- QCA::ConvertResult convRes;
- QCA::SecureArray passPhrase = "start";
- privKey = QCA::PrivateKey::fromPEMFile( "Userkey.pem", passPhrase, &convRes );
- if ( convRes != QCA::ConvertGood ) {
- std::cout << "Sorry, could not import Private Key" << std::endl;
- return 1;
- }
-
- // Read in a matching public key cert
- // you could also build this using the fromPEMFile() method
- QCA::Certificate pubCert( "User.pem" );
- if ( pubCert.isNull() ) {
- std::cout << "Sorry, could not import public key certificate" << std::endl;
- return 1;
- }
- // We are building the certificate into a SecureMessageKey object, via a
- // CertificateChain
- QCA::SecureMessageKey secMsgKey;
- QCA::CertificateChain chain;
- chain += pubCert;
- secMsgKey.setX509CertificateChain( chain );
-
- // build up a SecureMessage object, based on our public key certificate
- QCA::CMS cms;
- QCA::SecureMessage msg(&cms);
- msg.setRecipient(secMsgKey);
-
- // Some plain text - we use the first command line argument if provided
- QByteArray plainText = (argc >= 2) ? argv[1] : "What do ya want for nuthin'";
-
- // Now use the SecureMessage object to encrypt the plain text.
- msg.startEncrypt();
- msg.update(plainText);
- msg.end();
- // I think it is reasonable to wait for 1 second for this
- msg.waitForFinished(1000);
-
- // check to see if it worked
- if(!msg.success())
- {
- std::cout << "Error encrypting: " << msg.errorCode() << std::endl;
- return 1;
- }
-
- // get the result
- QCA::SecureArray cipherText = msg.read();
- QCA::Base64 enc;
- std::cout << plainText.data() << " encrypts to (in base 64): ";
- std::cout << qPrintable( enc.arrayToString( cipherText ) ) << std::endl;
-
- // Show we can decrypt it with the private key
- if ( !privKey.canDecrypt() ) {
- std::cout << "Private key cannot be used to decrypt" << std::endl;
- return 1;
- }
- QCA::SecureArray plainTextResult;
- if ( 0 == privKey.decrypt(cipherText, &plainTextResult, QCA::EME_PKCS1_OAEP ) ) {
- std::cout << "Decryption process failed" << std::endl;
- return 1;
- }
-
- std::cout << qPrintable( enc.arrayToString( cipherText ) );
- std::cout << " (in base 64) decrypts to: ";
- std::cout << plainTextResult.data() << std::endl;
-
- return 0;
-}
-
-
00001 /*
-00002 * qca.h - Qt Cryptographic Architecture
-00003 * Copyright (C) 2003-2005 Justin Karneges <justin@affinix.com>
-00004 * Copyright (C) 2004-2006 Brad Hards <bradh@frogmouth.net>
-00005 *
-00006 * This library is free software; you can redistribute it and/or
-00007 * modify it under the terms of the GNU Lesser General Public
-00008 * License as published by the Free Software Foundation; either
-00009 * version 2.1 of the License, or (at your option) any later version.
-00010 *
-00011 * This library is distributed in the hope that it will be useful,
-00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
-00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-00014 * Lesser General Public License for more details.
-00015 *
-00016 * You should have received a copy of the GNU Lesser General Public
-00017 * License along with this library; if not, write to the Free Software
-00018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-00019 * 02110-1301 USA
-00020 *
-00021 */
-00022
-00033 #ifndef QCA_H
-00034 #define QCA_H
-00035
-00036 #include "qca_core.h"
-00037 #include "qca_textfilter.h"
-00038 #include "qca_basic.h"
-00039 #include "qca_publickey.h"
-00040 #include "qca_cert.h"
-00041 #include "qca_keystore.h"
-00042 #include "qca_securelayer.h"
-00043 #include "qca_securemessage.h"
-00044 #include "qcaprovider.h"
-00045 #include "qpipe.h"
-00046
-00047 #endif
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
Binary files /tmp/5eREEt0AAl/qca2-2.0.3/apidocs/html/qca-arch.png and /tmp/TUoR4IBecB/qca2-2.1.0/apidocs/html/qca-arch.png differ
diff -Nru qca2-2.0.3/apidocs/html/qca__basic_8h__dep__incl.map qca2-2.1.0/apidocs/html/qca__basic_8h__dep__incl.map
--- qca2-2.0.3/apidocs/html/qca__basic_8h__dep__incl.map 2010-11-27 21:30:33.000000000 +0000
+++ qca2-2.1.0/apidocs/html/qca__basic_8h__dep__incl.map 1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-
diff -Nru qca2-2.0.3/apidocs/html/qca__basic_8h__dep__incl.md5 qca2-2.1.0/apidocs/html/qca__basic_8h__dep__incl.md5
--- qca2-2.0.3/apidocs/html/qca__basic_8h__dep__incl.md5 2010-11-27 21:30:33.000000000 +0000
+++ qca2-2.1.0/apidocs/html/qca__basic_8h__dep__incl.md5 1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-57524b98e349bdef6774313b0994817c
\ No newline at end of file
Binary files /tmp/5eREEt0AAl/qca2-2.0.3/apidocs/html/qca__basic_8h__dep__incl.png and /tmp/TUoR4IBecB/qca2-2.1.0/apidocs/html/qca__basic_8h__dep__incl.png differ
diff -Nru qca2-2.0.3/apidocs/html/qca__basic_8h.html qca2-2.1.0/apidocs/html/qca__basic_8h.html
--- qca2-2.0.3/apidocs/html/qca__basic_8h.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/qca__basic_8h.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,81 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: qca_basic.h File Reference
-
-
-
-
-
-
00001 /*
-00002 * qca_export.h - Qt Cryptographic Architecture
-00003 * Copyright (C) 2003-2005 Justin Karneges <justin@affinix.com>
-00004 *
-00005 * This library is free software; you can redistribute it and/or
-00006 * modify it under the terms of the GNU Lesser General Public
-00007 * License as published by the Free Software Foundation; either
-00008 * version 2.1 of the License, or (at your option) any later version.
-00009 *
-00010 * This library is distributed in the hope that it will be useful,
-00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
-00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-00013 * Lesser General Public License for more details.
-00014 *
-00015 * You should have received a copy of the GNU Lesser General Public
-00016 * License along with this library; if not, write to the Free Software
-00017 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-00018 * 02110-1301 USA
-00019 *
-00020 */
-00021
-00034 #ifndef QCA_EXPORT_H
-00035 #define QCA_EXPORT_H
-00036
-00037 #include <QtGlobal>
-00038
-00039 #ifdef Q_OS_WIN
-00040 # ifndef QCA_STATIC
-00041 # ifdef QCA_MAKEDLL
-00042 # define QCA_EXPORT Q_DECL_EXPORT
-00043 # else
-00044 # define QCA_EXPORT Q_DECL_IMPORT
-00045 # endif
-00046 # endif
-00047 #endif
-00048 #ifndef QCA_EXPORT
-00049 # define QCA_EXPORT
-00050 #endif
-00051
-00052 #endif
-
The code below shows the normal way to use the QCA::Random class.
-
/*
- Copyright (C) 2004, 2006 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-// QtCrypto has the declarations for all of QCA
-#include <QtCrypto>
-
-#include <QCoreApplication>
-#include <QDebug>
-
-#include <iostream>
-
-int main(int argc, char **argv)
-{
- // the Initializer object sets things up, and
- // also does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
-
- qDebug() << "This example generates random numbers";
-
- int randInt;
- // This is the standard way to generate a random integer.
- randInt = QCA::Random::randomInt();
- qDebug() << "A random number: " << randInt;
-
- // If you wanted a random character (octet), you could
- // use something like:
- unsignedchar randChar;
- randChar = QCA::Random::randomChar();
- // It might not be printable, so this may not produce output
- std::cout << "A random character: " << randChar << std::endl;
-
- QCA::SecureArray tenBytes(10);
- // If you need more random values, you may want to
- // get an array, as shown below.
- tenBytes = QCA::Random::randomArray(10);
-
- // To make this viewable, we convert to hexadecimal.
- std::cout << "A random 10 byte array (in hex): ";
- std::cout << QCA::Hex().arrayToString(tenBytes).toAscii().data() << std::endl;
-
- // Under some circumstances, you may want to create a
- // Random object, rather than a static public member function.
- // This isn't normally the easiest way, but it does work
- QCA::Random myRandomObject;
- randChar = myRandomObject.nextByte();
- tenBytes = myRandomObject.nextBytes(10);
- return 0;
-}
-
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/rsatest.cpp-example.html qca2-2.1.0/apidocs/html/rsatest.cpp-example.html
--- qca2-2.0.3/apidocs/html/rsatest.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/rsatest.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,185 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: rsatest.cpp
-
-
-
-
-
-
The code below shows some of the capabilities for how to use RSA. This example also shows how to export and import a key to a file, using PEM encoding.
-
/*
- Copyright (C) 2003 Justin Karneges <justin@affinix.com>
- Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include <QtCrypto>
-#include <QCoreApplication>
-
-#include <iostream>
-
-int main(int argc, char **argv)
-{
- // The Initializer object sets things up, and also
- // does cleanup when it goes out of scope
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
-
- // we use the first argument if provided, or
- // use "hello" if no arguments
- QCA::SecureArray arg = (argc >= 2) ? argv[1] : "hello";
-
- // We demonstrate PEM usage here, so we need to test for
- // supportedIOTypes, not just supportedTypes
- if(!QCA::isSupported("pkey") ||
- !QCA::PKey::supportedIOTypes().contains(QCA::PKey::RSA))
- std::cout << "RSA not supported!\n";
- else {
- // When creating a public / private key pair, you make the
- // private key, and then extract the public key component from it
- // Using RSA is very common, however DSA can provide equivalent
- // signature/verification. This example applies to DSA to the
- // extent that the operations work on that key type.
-
- // QCA provides KeyGenerator as a convenient source of new keys,
- // however you could also import an existing key instead.
- QCA::PrivateKey seckey = QCA::KeyGenerator().createRSA(1024);
- if(seckey.isNull()) {
- std::cout << "Failed to make private RSA key" << std::endl;
- return 1;
- }
-
- QCA::PublicKey pubkey = seckey.toPublicKey();
-
- // check if the key can encrypt
- if(!pubkey.canEncrypt()) {
- std::cout << "Error: this kind of key cannot encrypt" << std::endl;
- return 1;
- }
-
- // encrypt some data - note that only the public key is required
- // you must also choose the algorithm to be used
- QCA::SecureArray result = pubkey.encrypt(arg, QCA::EME_PKCS1_OAEP);
- if(result.isEmpty()) {
- std::cout << "Error encrypting" << std::endl;
- return 1;
- }
-
- // output the encrypted data
- QString rstr = QCA::arrayToHex(result.toByteArray());
- std::cout << "\"" << arg.data() << "\" encrypted with RSA is \"";
- std::cout << qPrintable(rstr) << "\"" << std::endl;
-
- // save the private key - in a real example, make sure this goes
- // somewhere secure and has a good pass phrase
- // You can use the same technique with the public key too.
- QCA::SecureArray passPhrase = "pass phrase";
- seckey.toPEMFile("keyprivate.pem", passPhrase);
-
- // Read that key back in, checking if the read succeeded
- QCA::ConvertResult conversionResult;
- QCA::PrivateKey privateKey = QCA::PrivateKey::fromPEMFile( "keyprivate.pem",
- passPhrase,
- &conversionResult);
- if (! (QCA::ConvertGood == conversionResult) ) {
- std::cout << "Private key read failed" << std::endl;
- }
-
- // now decrypt that encrypted data using the private key that
- // we read in. The algorithm is the same.
- QCA::SecureArray decrypt;
- if(0 == privateKey.decrypt(result, &decrypt, QCA::EME_PKCS1_OAEP)) {
- std::cout << "Error decrypting.\n";
- return 1;
- }
-
- // output the resulting decrypted string
- std::cout << "\"" << qPrintable(rstr) << "\" decrypted with RSA is \"";
- std::cout << decrypt.data() << "\"" << std::endl;
-
-
- // Some private keys can also be used for producing signatures
- if(!privateKey.canSign()) {
- std::cout << "Error: this kind of key cannot sign" << std::endl;
- return 1;
- }
- privateKey.startSign( QCA::EMSA3_MD5 );
- privateKey.update( arg ); // just reuse the same message
- QByteArray argSig = privateKey.signature();
-
- // instead of using the startSign(), update(), signature() calls,
- // you may be better doing the whole thing in one go, using the
- // signMessage call. Of course you need the whole message in one
- // hit, which may or may not be a problem
-
- // output the resulting signature
- rstr = QCA::arrayToHex(argSig);
- std::cout << "Signature for \"" << arg.data() << "\" using RSA, is ";
- std::cout << "\"" << qPrintable( rstr ) << "\"" << std::endl;
-
- // to check a signature, we must check that the key is
- // appropriate
- if(pubkey.canVerify()) {
- pubkey.startVerify( QCA::EMSA3_MD5 );
- pubkey.update( arg );
- if ( pubkey.validSignature( argSig ) ) {
- std::cout << "Signature is valid" << std::endl;
- } else {
- std::cout << "Bad signature" << std::endl;
- }
- }
-
- // We can also do the verification in a single step if we
- // have all the message
- if ( pubkey.canVerify() &&
- pubkey.verifyMessage( arg, argSig, QCA::EMSA3_MD5 ) ) {
- std::cout << "Signature is valid" << std::endl;
- } else {
- std::cout << "Signature could not be verified" << std::endl;
- }
-
- }
-
- return 0;
-}
-
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/saslclient.cpp-example.html qca2-2.1.0/apidocs/html/saslclient.cpp-example.html
--- qca2-2.0.3/apidocs/html/saslclient.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/saslclient.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,597 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: saslclient.cpp
-
-
-
-
-
-
The code below shows how to create an SSL server.Note that this server returns a self-signed certificate for "example.com", and that the certificate is expired.
-
The design used here only allows for one connection at a time. If you want to allow for more, you should probably create a "TlsConnection" object that agregates a QCA::TLS object and a QTcpSocket (plus a little bit of state information) that handles a single connection. Then just create a TlsConnection for each server connection.
-
/*
- Copyright (C) 2003 Justin Karneges <justin@affinix.com>
- Copyright (C) 2006 Brad Hards <bradh@frogmouth.net>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include <QtCrypto>
-
-#include <QCoreApplication>
-#include <QDebug>
-#include <QHostAddress>
-#include <QTcpServer>
-#include <QTcpSocket>
-#include <QTimer>
-
-char pemdata_cert[] =
- "-----BEGIN CERTIFICATE-----\n"
- "MIICeTCCAeKgAwIBAgIRAKKKnOj6Aarmwf0phApitVAwDQYJKoZIhvcNAQEFBQAw\n"
- "ODELMAkGA1UEBhMCVVMxFDASBgNVBAoTC0V4YW1wbGUgT3JnMRMwEQYDVQQDEwpF\n"
- "eGFtcGxlIENBMB4XDTA2MDMxNTA3MDU1MloXDTA3MDMxNTA3MDU1MlowOjEVMBMG\n"
- "A1UEAxMMRXhhbXBsZSBVc2VyMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRXhhbXBs\n"
- "ZSBPcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPkKn0FfHMvRZv+3uFcw\n"
- "VrOadJmANzLVeVW/DHZp4CXokXSksM66ZMqFuQRBk5rnIZZpZmVp1tTRDVt9sEAY\n"
- "YNa8CRM4HXkVlU0lCKdey18CSq2VuSvNtw8dDpoBmQt3nr9tePvKHnpS3nm6YjR2\n"
- "NEvIKt1P4mHzYXLmwoF24C1bAgMBAAGjgYAwfjAdBgNVHQ4EFgQUmQIdzyDaPYWF\n"
- "fPJ8PPOOm1eSsucwHwYDVR0jBBgwFoAUkCglAizTO7iqwLeaO6r/8kJuqhMwDAYD\n"
- "VR0TAQH/BAIwADAeBgNVHREEFzAVgRNleGFtcGxlQGV4YW1wbGUuY29tMA4GA1Ud\n"
- "DwEB/wQEAwIF4DANBgkqhkiG9w0BAQUFAAOBgQAuhbiUgy2a++EUccaonID7eTJZ\n"
- "F3D5qXMqUpQxlYxU8du+9AxDD7nFxTMkQC2pzfmEc1znRNmJ1ZeLRL72VYsVndcT\n"
- "psyM8ABkvPp1d2jWIyccVjGpt+/RN5IPKm/YIbtIZcywvWuXrOp1lanVmppLfPnO\n"
- "6yneBkC9iqjOv/+Q+A==\n"
- "-----END CERTIFICATE-----\n";
-
-char pemdata_privkey[] =
- "-----BEGIN PRIVATE KEY-----\n"
- "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAPkKn0FfHMvRZv+3\n"
- "uFcwVrOadJmANzLVeVW/DHZp4CXokXSksM66ZMqFuQRBk5rnIZZpZmVp1tTRDVt9\n"
- "sEAYYNa8CRM4HXkVlU0lCKdey18CSq2VuSvNtw8dDpoBmQt3nr9tePvKHnpS3nm6\n"
- "YjR2NEvIKt1P4mHzYXLmwoF24C1bAgMBAAECgYEAyIjJHDaeVXDU42zovyxpZE4n\n"
- "PcOEryY+gdFJE8DFgUD4f1huFsj4iCuNg+PaG42p+hf9IARNvSho/RcEaVg4AJrV\n"
- "jRP8r7fSqcIGr6lGuvDFFv3SU5ddy84g5oqLYGKvuPSHMGfVsZSxAwOrzD4bH19L\n"
- "SNqtNcpdBsBd7ZiEE4ECQQD/oJGui9D5Dx3QVcS+QV4F8wuyN9jYIANmX/17o0fl\n"
- "BL0bwRU4RICwadrcybi5N0JQLIYSUm2HGqNvAJbtnuQxAkEA+WeYLLYPeawcy+WU\n"
- "kGcOR7BUjHiG71+6cvU4XIDW2bezA04fqWXkZRFAwHTMpQb785/XalFftgS21kql\n"
- "8yLDSwJAHkeT2hwftdDPlEUEmBDAJW5DvWmWGwu3u2G1cfbGZl9oUyhM7ixXHg57\n"
- "6VlPs0jTZxHPE86FwNIr99MXDbCbkQJBAMDFOJK+ecGirXNP1P+0GA6DFSap9inJ\n"
- "BRTbwx+EmgwX966DUOefEOSpbDIVVSPs/Qr2LgtIMEFA7Y0+j3wZD3cCQBsTwccd\n"
- "ASQx59xakpq11eOlTYz14rjwodr4QMyj26WxEPJtz7hKokx/+EH6fWuPIUSrROM5\n"
- "07y2gaVbYxtis0s=\n"
- "-----END PRIVATE KEY-----\n";
-
-class SecureServer : publicQObject
-{
- Q_OBJECT
-
-public:
- enum { Idle, Handshaking, Active, Closing };
-
- SecureServer(quint16 _port) : port(_port)
- {
- server = newQTcpServer;
- connect( server, SIGNAL(newConnection()), SLOT(server_handleConnection()) );
-
- ssl = newQCA::TLS;
- connect(ssl, SIGNAL(handshaken()), SLOT(ssl_handshaken()));
- connect(ssl, SIGNAL(readyRead()), SLOT(ssl_readyRead()));
- connect(ssl, SIGNAL(readyReadOutgoing()), SLOT(ssl_readyReadOutgoing()));
- connect(ssl, SIGNAL(closed()), SLOT(ssl_closed()));
- connect(ssl, SIGNAL(error()), SLOT(ssl_error()));
-
- cert = QCA::Certificate::fromPEM(pemdata_cert);
- privkey = QCA::PrivateKey::fromPEM(pemdata_privkey);
-
- mode = Idle;
- }
-
- ~SecureServer()
- {
- delete ssl;
- delete server;
- }
-
- void start()
- {
- if(cert.isNull()) {
- qDebug() << "Error loading cert!";
- QTimer::singleShot(0, this, SIGNAL(quit()));
- return;
- }
- if(privkey.isNull()) {
- qDebug() << "Error loading private key!";
- QTimer::singleShot(0, this, SIGNAL(quit()));
- return;
- }
- if(false == server->listen(QHostAddress::Any, port)) {
- qDebug() << "Error binding to port " << port;
- QTimer::singleShot(0, this, SIGNAL(quit()));
- return;
- }
- qDebug() << "Listening on port" << port;
- }
-
-signals:
- void quit();
-
-private slots:
- void sock_readyRead()
- {
- QByteArray buf(sock->bytesAvailable(), 0x00);
-
- int num = sock->read(buf.data(), buf.size());
-
- if ( -1 == num )
- qDebug() << "Error reading data from socket";
-
- if (num < buf.size() )
- buf.resize(num);
-
- ssl->writeIncoming(buf);
- }
-
- void server_handleConnection()
- {
- // Note: only 1 connection supported at a time in this example!
- if(mode != Idle) {
- QTcpSocket* tmp = server->nextPendingConnection();
- tmp->close();
- connect(tmp, SIGNAL(disconnected()), tmp, SLOT(deleteLater()));
- qDebug() << "throwing away extra connection";
- return;
- }
- mode = Handshaking;
- sock = server->nextPendingConnection();
- connect(sock, SIGNAL(readyRead()), SLOT(sock_readyRead()));
- connect(sock, SIGNAL(disconnected()), SLOT(sock_disconnected()));
- connect(sock, SIGNAL(error(QAbstractSocket::SocketError)),
- SLOT(sock_error(QAbstractSocket::SocketError)));
- connect(sock, SIGNAL(bytesWritten(qint64)), SLOT(sock_bytesWritten(qint64)));
-
- qDebug() << "Connection received! Starting TLS handshake.";
- ssl->setCertificate(cert, privkey);
- ssl->startServer();
- }
-
- void sock_disconnected()
- {
- qDebug() << "Connection closed.";
- }
-
- void sock_bytesWritten(qint64 x)
- {
- if(mode == Active && sent) {
- qint64 bytes = ssl->convertBytesWritten(x);
- bytesLeft -= bytes;
-
- if(bytesLeft == 0) {
- mode = Closing;
- qDebug() << "Data transfer complete - SSL shutting down";
- ssl->close();
- }
- }
- }
-
- void sock_error(QAbstractSocket::SocketError error)
- {
- qDebug() << "Socket error: " << (unsigned) error;
- }
-
- void ssl_handshaken()
- {
- qDebug() << "Successful SSL handshake. Waiting for newline.";
- bytesLeft = 0;
- sent = false;
- mode = Active;
- ssl->continueAfterStep();
- }
-
- void ssl_readyRead()
- {
- QByteArray a = ssl->read();
- QByteArray b =
- "<html>\n"
- "<head><title>Test</title></head>\n"
- "<body>this is only a test</body>\n"
- "</html>\n";
-
- qDebug() << "Sending test response.";
- sent = true;
- ssl->write(b);
- }
-
- void ssl_readyReadOutgoing()
- {
- int plainBytes;
- QByteArray outgoingData = ssl->readOutgoing(&plainBytes);
- sock->write( outgoingData );
- }
-
- void ssl_closed()
- {
- qDebug() << "Closing socket.";
- sock->close();
- mode = Idle;
- }
-
- void ssl_error()
- {
- if(ssl->errorCode() == QCA::TLS::ErrorHandshake) {
- qDebug() << "SSL Handshake Error! Closing.";
- sock->close();
- }
- else {
- qDebug() << "SSL Error! Closing.";
- sock->close();
- }
- mode = Idle;
- }
-
-private:
- quint16 port;
- QTcpServer *server;
- QTcpSocket *sock;
- QCA::TLS *ssl;
- QCA::Certificate cert;
- QCA::PrivateKey privkey;
-
- bool sent;
- int mode;
- qint64 bytesLeft;
-};
-
-#include "sslservtest.moc"
-
-int main(int argc, char **argv)
-{
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
- int port = argc > 1 ? QString(argv[1]).toInt() : 8000;
-
- if(!QCA::isSupported("tls")) {
- qDebug() << "TLS not supported!";
- return 1;
- }
-
- SecureServer *server = new SecureServer(port);
- QObject::connect(server, SIGNAL(quit()), &app, SLOT(quit()));
- server->start();
- app.exec();
- delete server;
-
- return 0;
-}
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
diff -Nru qca2-2.0.3/apidocs/html/ssltest.cpp-example.html qca2-2.1.0/apidocs/html/ssltest.cpp-example.html
--- qca2-2.0.3/apidocs/html/ssltest.cpp-example.html 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/ssltest.cpp-example.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,364 +0,0 @@
-
-
-
-
-Qt Cryptographic Architecture: ssltest.cpp
-
-
-
-
-
-
/*
- Copyright (C) 2003-2005 Justin Karneges <justin@affinix.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include <QtCrypto>
-
-#include <QCoreApplication>
-#include <QTcpSocket>
-
-char exampleCA_cert[] =
- "-----BEGIN CERTIFICATE-----\n"
- "MIICSzCCAbSgAwIBAgIBADANBgkqhkiG9w0BAQUFADA4MRMwEQYDVQQDEwpFeGFt\n"
- "cGxlIENBMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRXhhbXBsZSBPcmcwHhcNMDYw\n"
- "MzE1MDY1ODMyWhcNMDYwNDE1MDY1ODMyWjA4MRMwEQYDVQQDEwpFeGFtcGxlIENB\n"
- "MQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRXhhbXBsZSBPcmcwgZ8wDQYJKoZIhvcN\n"
- "AQEBBQADgY0AMIGJAoGBAL6ULdOxmpeZ+G/ypV12eNO4qnHSVIPTrYPkQuweXqPy\n"
- "atwGFheG+hLVsNIh9GGOS0tCe7a3hBBKN0BJg1ppfk2x39cDx7hefYqjBuZvp/0O\n"
- "8Ja3qlQiJLezITZKLxMBrsibcvcuH8zpfUdys2yaN+YGeqNfjQuoNN3Byl1TwuGJ\n"
- "AgMBAAGjZTBjMB0GA1UdDgQWBBSQKCUCLNM7uKrAt5o7qv/yQm6qEzASBgNVHRMB\n"
- "Af8ECDAGAQEBAgEIMB4GA1UdEQQXMBWBE2V4YW1wbGVAZXhhbXBsZS5jb20wDgYD\n"
- "VR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4GBAAh+SIeT1Ao5qInw8oMSoTdO\n"
- "lQ6h67ec/Jk5KmK4OoskuimmHI0Sp0C5kOCLehXbsVWW8pXsNC2fv0d2HkdaSUcX\n"
- "hwLzqgyZXd4mupIYlaOTZhuHDwWPCAOZS4LVsi2tndTRHKCP12441JjNKhmZRhkR\n"
- "u5zzD60nWgM9dKTaxuZM\n"
- "-----END CERTIFICATE-----\n";
-
-void showCertInfo(constQCA::Certificate &cert)
-{
- printf("-- Cert --\n");
- printf(" CN: %s\n", qPrintable(cert.commonName()));
- printf(" Valid from: %s, until %s\n",
- qPrintable(cert.notValidBefore().toString()),
- qPrintable(cert.notValidAfter().toString()));
- printf(" PEM:\n%s\n", qPrintable(cert.toPEM()));
-}
-
-staticQString validityToString(QCA::Validity v)
-{
- QString s;
- switch(v)
- {
- caseQCA::ValidityGood:
- s = "Validated";
- break;
- caseQCA::ErrorRejected:
- s = "Root CA is marked to reject the specified purpose";
- break;
- caseQCA::ErrorUntrusted:
- s = "Certificate not trusted for the required purpose";
- break;
- caseQCA::ErrorSignatureFailed:
- s = "Invalid signature";
- break;
- caseQCA::ErrorInvalidCA:
- s = "Invalid CA certificate";
- break;
- caseQCA::ErrorInvalidPurpose:
- s = "Invalid certificate purpose";
- break;
- caseQCA::ErrorSelfSigned:
- s = "Certificate is self-signed";
- break;
- caseQCA::ErrorRevoked:
- s = "Certificate has been revoked";
- break;
- caseQCA::ErrorPathLengthExceeded:
- s = "Maximum certificate chain length exceeded";
- break;
- caseQCA::ErrorExpired:
- s = "Certificate has expired";
- break;
- caseQCA::ErrorExpiredCA:
- s = "CA has expired";
- break;
- caseQCA::ErrorValidityUnknown:
- default:
- s = "General certificate validation error";
- break;
- }
- return s;
-}
-
-class SecureTest : publicQObject
-{
- Q_OBJECT
-public:
- SecureTest()
- {
- sock_done = false;
- ssl_done = false;
-
- sock = newQTcpSocket;
- connect(sock, SIGNAL(connected()), SLOT(sock_connected()));
- connect(sock, SIGNAL(readyRead()), SLOT(sock_readyRead()));
- connect(sock, SIGNAL(error(QAbstractSocket::SocketError)),
- SLOT(sock_error(QAbstractSocket::SocketError)));
-
- ssl = newQCA::TLS;
- connect(ssl, SIGNAL(certificateRequested()), SLOT(ssl_certificateRequested()));
- connect(ssl, SIGNAL(handshaken()), SLOT(ssl_handshaken()));
- connect(ssl, SIGNAL(readyRead()), SLOT(ssl_readyRead()));
- connect(ssl, SIGNAL(readyReadOutgoing()),
- SLOT(ssl_readyReadOutgoing()));
- connect(ssl, SIGNAL(closed()), SLOT(ssl_closed()));
- connect(ssl, SIGNAL(error()), SLOT(ssl_error()));
- }
-
- ~SecureTest()
- {
- delete ssl;
- delete sock;
- }
-
- void start(constQString &_host)
- {
- int n = _host.indexOf(':');
- int port;
- if(n != -1)
- {
- host = _host.mid(0, n);
- port = _host.mid(n+1).toInt();
- }
- else
- {
- host = _host;
- port = 443;
- }
-
- printf("Trying %s:%d...\n", qPrintable(host), port);
- sock->connectToHost(host, port);
- }
-
-signals:
- void quit();
-
-private slots:
- void sock_connected()
- {
- // We just do this to help doxygen...
- QCA::TLS *ssl = SecureTest::ssl;
-
- printf("Connected, starting TLS handshake...\n");
-
- QCA::CertificateCollection rootCerts = QCA::systemStore();
-
- // We add this one to show how, and to make it work with
- // the server example.
- rootCerts.addCertificate(QCA::Certificate::fromPEM(exampleCA_cert));
-
- if(!QCA::haveSystemStore())
- printf("Warning: no root certs\n");
- else
- ssl->setTrustedCertificates(rootCerts);
-
- ssl->startClient(host);
- }
-
- void sock_readyRead()
- {
- // We just do this to help doxygen...
- QCA::TLS *ssl = SecureTest::ssl;
-
- ssl->writeIncoming(sock->readAll());
- }
-
- void sock_connectionClosed()
- {
- printf("\nConnection closed.\n");
- sock_done = true;
-
- if(ssl_done && sock_done)
- emit quit();
- }
-
- void sock_error(QAbstractSocket::SocketError x)
- {
- if(x == QAbstractSocket::RemoteHostClosedError)
- {
- sock_connectionClosed();
- return;
- }
-
- printf("\nSocket error.\n");
- emit quit();
- }
-
- void ssl_handshaken()
- {
- // We just do this to help doxygen...
- QCA::TLS *ssl = SecureTest::ssl;
-
- QCA::TLS::IdentityResult r = ssl->peerIdentityResult();
-
- printf("Successful SSL handshake using %s (%i of %i bits)\n",
- qPrintable(ssl->cipherSuite()),
- ssl->cipherBits(),
- ssl->cipherMaxBits() );
- if(r != QCA::TLS::NoCertificate)
- {
- cert = ssl->peerCertificateChain().primary();
- if(!cert.isNull())
- showCertInfo(cert);
- }
-
- QString str = "Peer Identity: ";
- if(r == QCA::TLS::Valid)
- str += "Valid";
- elseif(r == QCA::TLS::HostMismatch)
- str += "Error: Wrong certificate";
- elseif(r == QCA::TLS::InvalidCertificate)
- str += "Error: Invalid certificate.\n -> Reason: " +
- validityToString(ssl->peerCertificateValidity());
- else
- str += "Error: No certificate";
- printf("%s\n", qPrintable(str));
-
- ssl->continueAfterStep();
-
- printf("Let's try a GET request now.\n");
- QString req = "GET / HTTP/1.0\nHost: " + host + "\n\n";
- ssl->write(req.toLatin1());
- }
-
- void ssl_certificateRequested()
- {
- // We just do this to help doxygen...
- QCA::TLS *ssl = SecureTest::ssl;
-
- printf("Server requested client certificate.\n");
- QList<QCA::CertificateInfoOrdered> issuerList = ssl->issuerList();
- if(!issuerList.isEmpty())
- {
- printf("Allowed issuers:\n");
- foreach(QCA::CertificateInfoOrdered i, issuerList)
- printf(" %s\n", qPrintable(i.toString()));
- }
-
- ssl->continueAfterStep();
- }
-
- void ssl_readyRead()
- {
- // We just do this to help doxygen...
- QCA::TLS *ssl = SecureTest::ssl;
-
- QByteArray a = ssl->read();
- printf("%s", a.data());
- }
-
- void ssl_readyReadOutgoing()
- {
- // We just do this to help doxygen...
- QCA::TLS *ssl = SecureTest::ssl;
-
- sock->write(ssl->readOutgoing());
- }
-
- void ssl_closed()
- {
- printf("SSL session closed.\n");
- ssl_done = true;
-
- if(ssl_done && sock_done)
- emit quit();
- }
-
- void ssl_error()
- {
- // We just do this to help doxygen...
- QCA::TLS *ssl = SecureTest::ssl;
-
- int x = ssl->errorCode();
- if(x == QCA::TLS::ErrorHandshake)
- {
- printf("SSL Handshake Error!\n");
- emit quit();
- }
- else
- {
- printf("SSL Error!\n");
- emit quit();
- }
- }
-
-private:
- QString host;
- QTcpSocket *sock;
- QCA::TLS *ssl;
- QCA::Certificate cert;
- bool sock_done, ssl_done;
-};
-
-#include "ssltest.moc"
-
-int main(int argc, char **argv)
-{
- QCA::Initializerinit;
-
- QCoreApplication app(argc, argv);
- QString host = argc > 1 ? argv[1] : "andbit.net";
-
- if(!QCA::isSupported("tls"))
- {
- printf("TLS not supported!\n");
- return 1;
- }
-
- SecureTest *s = new SecureTest;
- QObject::connect(s, SIGNAL(quit()), &app, SLOT(quit()));
- s->start(host);
- app.exec();
- delete s;
-
- return 0;
-}
-
-Generated on Sat Nov 27 13:41:18 2010 for Qt Cryptographic Architecture by
-
- 1.6.3
-
-
Binary files /tmp/5eREEt0AAl/qca2-2.0.3/apidocs/html/tab_b.gif and /tmp/TUoR4IBecB/qca2-2.1.0/apidocs/html/tab_b.gif differ
Binary files /tmp/5eREEt0AAl/qca2-2.0.3/apidocs/html/tab_l.gif and /tmp/TUoR4IBecB/qca2-2.1.0/apidocs/html/tab_l.gif differ
Binary files /tmp/5eREEt0AAl/qca2-2.0.3/apidocs/html/tab_r.gif and /tmp/TUoR4IBecB/qca2-2.1.0/apidocs/html/tab_r.gif differ
diff -Nru qca2-2.0.3/apidocs/html/tabs.css qca2-2.1.0/apidocs/html/tabs.css
--- qca2-2.0.3/apidocs/html/tabs.css 2010-11-27 21:41:18.000000000 +0000
+++ qca2-2.1.0/apidocs/html/tabs.css 1970-01-01 00:00:00.000000000 +0000
@@ -1,105 +0,0 @@
-/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */
-
-DIV.tabs
-{
- float : left;
- width : 100%;
- background : url("tab_b.gif") repeat-x bottom;
- margin-bottom : 4px;
-}
-
-DIV.tabs UL
-{
- margin : 0px;
- padding-left : 10px;
- list-style : none;
-}
-
-DIV.tabs LI, DIV.tabs FORM
-{
- display : inline;
- margin : 0px;
- padding : 0px;
-}
-
-DIV.tabs FORM
-{
- float : right;
-}
-
-DIV.tabs A
-{
- float : left;
- background : url("tab_r.gif") no-repeat right top;
- border-bottom : 1px solid #84B0C7;
- font-size : 80%;
- font-weight : bold;
- text-decoration : none;
-}
-
-DIV.tabs A:hover
-{
- background-position: 100% -150px;
-}
-
-DIV.tabs A:link, DIV.tabs A:visited,
-DIV.tabs A:active, DIV.tabs A:hover
-{
- color: #1A419D;
-}
-
-DIV.tabs SPAN
-{
- float : left;
- display : block;
- background : url("tab_l.gif") no-repeat left top;
- padding : 5px 9px;
- white-space : nowrap;
-}
-
-DIV.tabs #MSearchBox
-{
- float : right;
- display : inline;
- font-size : 1em;
-}
-
-DIV.tabs TD
-{
- font-size : 80%;
- font-weight : bold;
- text-decoration : none;
-}
-
-
-
-/* Commented Backslash Hack hides rule from IE5-Mac \*/
-DIV.tabs SPAN {float : none;}
-/* End IE5-Mac hack */
-
-DIV.tabs A:hover SPAN
-{
- background-position: 0% -150px;
-}
-
-DIV.tabs LI.current A
-{
- background-position: 100% -150px;
- border-width : 0px;
-}
-
-DIV.tabs LI.current SPAN
-{
- background-position: 0% -150px;
- padding-bottom : 6px;
-}
-
-DIV.navpath
-{
- background : none;
- border : none;
- border-bottom : 1px solid #84B0C7;
- text-align : center;
- margin : 2px;
- padding : 2px;
-}
diff -Nru qca2-2.0.3/app.pri qca2-2.1.0/app.pri
--- qca2-2.0.3/app.pri 2009-04-24 21:12:15.000000000 +0000
+++ qca2-2.1.0/app.pri 1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
-include(confapp.pri)
-
-mac:QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.3
-
-exists(crypto.prf) {
- # our apps should build against the qca in this tree
- include(crypto.prf)
-} else {
- # attempt to use system-wide qca
- CONFIG *= crypto
-}
diff -Nru qca2-2.0.3/cmake/modules/COPYING-CMAKE-SCRIPTS qca2-2.1.0/cmake/modules/COPYING-CMAKE-SCRIPTS
--- qca2-2.0.3/cmake/modules/COPYING-CMAKE-SCRIPTS 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake/modules/COPYING-CMAKE-SCRIPTS 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,22 @@
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff -Nru qca2-2.0.3/cmake/modules/ECMQt4To5Porting.cmake qca2-2.1.0/cmake/modules/ECMQt4To5Porting.cmake
--- qca2-2.0.3/cmake/modules/ECMQt4To5Porting.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake/modules/ECMQt4To5Porting.cmake 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,238 @@
+#=============================================================================
+# Copyright 2005-2011 Kitware, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the name of Kitware, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#=============================================================================
+
+# The automoc_qt4 macro is superceded by CMAKE_AUTOMOC from CMake 2.8.6
+# A Qt 5 version is not provided by CMake or Qt.
+
+include(MacroAddFileDependencies)
+
+MACRO (QT4_GET_MOC_FLAGS _moc_flags)
+ SET(${_moc_flags})
+ GET_DIRECTORY_PROPERTY(_inc_DIRS INCLUDE_DIRECTORIES)
+
+ FOREACH(_current ${_inc_DIRS})
+ IF("${_current}" MATCHES "\\.framework/?$")
+ STRING(REGEX REPLACE "/[^/]+\\.framework" "" framework_path "${_current}")
+ SET(${_moc_flags} ${${_moc_flags}} "-F${framework_path}")
+ ELSE("${_current}" MATCHES "\\.framework/?$")
+ SET(${_moc_flags} ${${_moc_flags}} "-I${_current}")
+ ENDIF("${_current}" MATCHES "\\.framework/?$")
+ ENDFOREACH(_current ${_inc_DIRS})
+
+ GET_DIRECTORY_PROPERTY(_defines COMPILE_DEFINITIONS)
+ FOREACH(_current ${_defines})
+ SET(${_moc_flags} ${${_moc_flags}} "-D${_current}")
+ ENDFOREACH(_current ${_defines})
+
+ IF(Q_WS_WIN)
+ SET(${_moc_flags} ${${_moc_flags}} -DWIN32)
+ ENDIF(Q_WS_WIN)
+
+ENDMACRO(QT4_GET_MOC_FLAGS)
+
+# helper macro to set up a moc rule
+MACRO (QT4_CREATE_MOC_COMMAND infile outfile moc_flags moc_options)
+ # For Windows, create a parameters file to work around command line length limit
+ IF (WIN32)
+ # Pass the parameters in a file. Set the working directory to
+ # be that containing the parameters file and reference it by
+ # just the file name. This is necessary because the moc tool on
+ # MinGW builds does not seem to handle spaces in the path to the
+ # file given with the @ syntax.
+ GET_FILENAME_COMPONENT(_moc_outfile_name "${outfile}" NAME)
+ GET_FILENAME_COMPONENT(_moc_outfile_dir "${outfile}" PATH)
+ IF(_moc_outfile_dir)
+ SET(_moc_working_dir WORKING_DIRECTORY ${_moc_outfile_dir})
+ ENDIF(_moc_outfile_dir)
+ SET (_moc_parameters_file ${outfile}_parameters)
+ SET (_moc_parameters ${moc_flags} ${moc_options} -o "${outfile}" "${infile}")
+ STRING (REPLACE ";" "\n" _moc_parameters "${_moc_parameters}")
+ FILE (WRITE ${_moc_parameters_file} "${_moc_parameters}")
+ ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
+ COMMAND ${QT_MOC_EXECUTABLE} @${_moc_outfile_name}_parameters
+ DEPENDS ${infile}
+ ${_moc_working_dir}
+ VERBATIM)
+ ELSE (WIN32)
+ ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
+ COMMAND ${QT_MOC_EXECUTABLE}
+ ARGS ${moc_flags} ${moc_options} -o ${outfile} ${infile}
+ DEPENDS ${infile} VERBATIM)
+ ENDIF (WIN32)
+ENDMACRO (QT4_CREATE_MOC_COMMAND)
+
+
+MACRO(QT4_AUTOMOC)
+ QT4_GET_MOC_FLAGS(_moc_INCS)
+
+ SET(_matching_FILES )
+ FOREACH (_current_FILE ${ARGN})
+
+ GET_FILENAME_COMPONENT(_abs_FILE ${_current_FILE} ABSOLUTE)
+ # if "SKIP_AUTOMOC" is set to true, we will not handle this file here.
+ # This is required to make uic work correctly:
+ # we need to add generated .cpp files to the sources (to compile them),
+ # but we cannot let automoc handle them, as the .cpp files don't exist yet when
+ # cmake is run for the very first time on them -> however the .cpp files might
+ # exist at a later run. at that time we need to skip them, so that we don't add two
+ # different rules for the same moc file
+ GET_SOURCE_FILE_PROPERTY(_skip ${_abs_FILE} SKIP_AUTOMOC)
+
+ IF ( NOT _skip AND EXISTS ${_abs_FILE} )
+
+ FILE(READ ${_abs_FILE} _contents)
+
+ GET_FILENAME_COMPONENT(_abs_PATH ${_abs_FILE} PATH)
+
+ STRING(REGEX MATCHALL "# *include +[^ ]+\\.moc[\">]" _match "${_contents}")
+ IF(_match)
+ FOREACH (_current_MOC_INC ${_match})
+ STRING(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}")
+
+ GET_FILENAME_COMPONENT(_basename ${_current_MOC} NAME_WE)
+ IF(EXISTS ${_abs_PATH}/${_basename}.hpp)
+ SET(_header ${_abs_PATH}/${_basename}.hpp)
+ ELSE(EXISTS ${_abs_PATH}/${_basename}.hpp)
+ SET(_header ${_abs_PATH}/${_basename}.h)
+ ENDIF(EXISTS ${_abs_PATH}/${_basename}.hpp)
+ SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC})
+ QT4_CREATE_MOC_COMMAND(${_header} ${_moc} "${_moc_INCS}" "")
+ MACRO_ADD_FILE_DEPENDENCIES(${_abs_FILE} ${_moc})
+ ENDFOREACH (_current_MOC_INC)
+ ENDIF(_match)
+ ENDIF ( NOT _skip AND EXISTS ${_abs_FILE} )
+ ENDFOREACH (_current_FILE)
+ENDMACRO(QT4_AUTOMOC)
+
+
+# Portability helpers.
+
+set(QT_QTGUI_LIBRARIES
+ ${Qt5Gui_LIBRARIES}
+ ${Qt5Widgets_LIBRARIES}
+ ${Qt5PrintSupport_LIBRARIES}
+ ${Qt5Svg_LIBRARIES}
+)
+
+set(QT_INCLUDES
+ ${Qt5Gui_INCLUDE_DIRS}
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${Qt5PrintSupport_INCLUDE_DIRS}
+ ${Qt5Svg_INCLUDE_DIRS}
+)
+set(QT_QTGUI_LIBRARY ${QT_QTGUI_LIBRARIES})
+
+set(_qt_modules
+ Core
+ Declarative
+ Widgets
+ Script
+ ScriptTools
+ DBus
+ Network
+ Test
+ Designer
+ Concurrent
+ Xml
+ UiTools
+ Qml
+ Quick1
+ WebKit
+ WebKitWidgets
+ Sql
+ OpenGL
+)
+
+foreach(_module ${_qt_modules})
+ string(TOUPPER ${_module} _module_upper)
+ set(QT_QT${_module_upper}_LIBRARIES ${Qt5${_module}_LIBRARIES})
+ set(QT_QT${_module_upper}_LIBRARY ${QT_QT${_module_upper}_LIBRARIES})
+ list(APPEND QT_INCLUDES ${Qt5${_module}_INCLUDE_DIRS})
+ set(QT_QT${_module_upper}_FOUND ${Qt5${_module}_FOUND})
+endforeach()
+
+list(APPEND QT_QTCORE_LIBRARIES ${Qt5Concurrent_LIBRARIES})
+list(APPEND QT_QTCORE_LIBRARY ${Qt5Concurrent_LIBRARIES})
+
+list(APPEND QT_QTWEBKIT_LIBRARIES ${Qt5WebKitWidgets_LIBRARIES})
+list(APPEND QT_QTWEBKIT_LIBRARY ${Qt5WebKitWidgets_LIBRARIES})
+
+set(QT_QTDECLARATIVE_LIBRARIES ${Qt5Quick1_LIBRARIES})
+set(QT_QTDECLARATIVE_LIBRARY ${Qt5Quick1_LIBRARIES})
+
+get_target_property(QT_QMAKE_EXECUTABLE Qt5::qmake LOCATION)
+get_target_property(QT_RCC_EXECUTABLE Qt5::rcc LOCATION)
+if (TARGET Qt5::uic)
+ get_target_property(QT_UIC_EXECUTABLE Qt5::uic LOCATION)
+endif()
+
+if (TARGET Qt5::qdbuscpp2xml)
+ get_target_property(QT_QDBUSCPP2XML_EXECUTABLE Qt5::qdbuscpp2xml LOCATION)
+endif()
+
+if (TARGET Qt5::qdbusxml2cpp)
+ get_target_property(QT_QDBUSXML2CPP_EXECUTABLE Qt5::qdbusxml2cpp LOCATION)
+endif()
+
+add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0)
+
+macro(qt4_wrap_ui)
+ qt5_wrap_ui(${ARGN})
+endmacro()
+
+macro(qt4_wrap_cpp)
+ qt5_wrap_cpp(${ARGN})
+endmacro()
+
+macro(qt4_generate_moc)
+ qt5_generate_moc(${ARGN})
+endmacro()
+
+macro(qt4_add_dbus_adaptor)
+ qt5_add_dbus_adaptor(${ARGN})
+endmacro()
+
+macro(qt4_add_dbus_interfaces)
+ qt5_add_dbus_interfaces(${ARGN})
+endmacro()
+
+macro(qt4_add_dbus_interface)
+ qt5_add_dbus_interface(${ARGN})
+endmacro()
+
+macro(qt4_generate_dbus_interface)
+ qt5_generate_dbus_interface(${ARGN})
+endmacro()
+
+macro(qt4_add_resources)
+ qt5_add_resources(${ARGN})
+endmacro()
diff -Nru qca2-2.0.3/cmake/modules/FindBotan.cmake qca2-2.1.0/cmake/modules/FindBotan.cmake
--- qca2-2.0.3/cmake/modules/FindBotan.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake/modules/FindBotan.cmake 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,49 @@
+
+# - Try to find the Gcrypt library
+# Once run this will define
+#
+# BOTAN_FOUND - set if the system has the gcrypt library
+# BOTAN_CFLAGS - the required gcrypt compilation flags
+# BOTAN_LIBRARIES - the linker libraries needed to use the gcrypt library
+#
+# Copyright (c) 2006 Brad Hards
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+# libgcrypt is moving to pkg-config, but earlier version don't have it
+
+#search in typical paths for libgcrypt-config
+FIND_PROGRAM(BOTANCONFIG_EXECUTABLE NAMES botan-config botan-config-1.10)
+mark_as_advanced(BOTANCONFIG_EXECUTABLE)
+
+#reset variables
+set(BOTAN_LIBRARIES)
+set(BOTAN_CFLAGS)
+
+# if botan-config has been found
+IF(BOTANCONFIG_EXECUTABLE)
+
+ EXEC_PROGRAM(${BOTANCONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE BOTAN_LIBRARIES)
+
+ EXEC_PROGRAM(${BOTANCONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE BOTAN_CFLAGS)
+
+ IF(BOTAN_LIBRARIES)
+ SET(BOTAN_FOUND TRUE)
+ ENDIF(BOTAN_LIBRARIES)
+
+ MARK_AS_ADVANCED(BOTAN_CFLAGS BOTAN_LIBRARIES)
+
+ENDIF(BOTANCONFIG_EXECUTABLE)
+
+if (BOTAN_FOUND)
+ if (NOT Botan_FIND_QUIETLY)
+ message(STATUS "Found Botan: ${BOTAN_LIBRARIES}")
+ endif (NOT Botan_FIND_QUIETLY)
+else (BOTAN_FOUND)
+ if (Botan_FIND_REQUIRED)
+ message(FATAL_ERROR "Could not find Botan libraries")
+ endif (Botan_FIND_REQUIRED)
+endif (BOTAN_FOUND)
+
+
diff -Nru qca2-2.0.3/cmake/modules/FindCarbon.cmake qca2-2.1.0/cmake/modules/FindCarbon.cmake
--- qca2-2.0.3/cmake/modules/FindCarbon.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake/modules/FindCarbon.cmake 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,13 @@
+# Copyright (c) 2006, Benjamin Reed,
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+INCLUDE(CMakeFindFrameworks)
+
+CMAKE_FIND_FRAMEWORKS(Carbon)
+
+if (Carbon_FRAMEWORKS)
+ set(CARBON_LIBRARY "-framework Carbon" CACHE FILEPATH "Carbon framework" FORCE)
+ set(CARBON_FOUND 1)
+endif (Carbon_FRAMEWORKS)
diff -Nru qca2-2.0.3/cmake/modules/FindLibGcrypt.cmake qca2-2.1.0/cmake/modules/FindLibGcrypt.cmake
--- qca2-2.0.3/cmake/modules/FindLibGcrypt.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake/modules/FindLibGcrypt.cmake 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,52 @@
+
+# - Try to find the Gcrypt library
+# Once run this will define
+#
+# LIBGCRYPT_FOUND - set if the system has the gcrypt library
+# LIBGCRYPT_CFLAGS - the required gcrypt compilation flags
+# LIBGCRYPT_LIBRARIES - the linker libraries needed to use the gcrypt library
+#
+# Copyright (c) 2006 Brad Hards
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+# libgcrypt is moving to pkg-config, but earlier version don't have it
+
+#search in typical paths for libgcrypt-config
+FIND_PROGRAM(LIBGCRYPTCONFIG_EXECUTABLE NAMES libgcrypt-config)
+mark_as_advanced(LIBGCRYPTCONFIG_EXECUTABLE)
+
+#reset variables
+set(LIBGCRYPT_LIBRARIES)
+set(LIBGCRYPT_CFLAGS)
+
+# if libgcrypt-config has been found
+IF(LIBGCRYPTCONFIG_EXECUTABLE)
+
+ # workaround for MinGW/MSYS
+ # CMake can't starts shell scripts on windows so it need to use sh.exe
+ EXECUTE_PROCESS(COMMAND sh ${LIBGCRYPTCONFIG_EXECUTABLE} --libs RESULT_VARIABLE _return_VALUE OUTPUT_VARIABLE LIBGCRYPT_LIBRARIES OUTPUT_STRIP_TRAILING_WHITESPACE)
+ EXECUTE_PROCESS(COMMAND sh ${LIBGCRYPTCONFIG_EXECUTABLE} --cflags RESULT_VARIABLE _return_VALUE OUTPUT_VARIABLE LIBGCRYPT_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ IF(NOT LIBGCRYPT_CFLAGS AND NOT _return_VALUE)
+ SET(LIBGCRYPT_CFLAGS " ")
+ ENDIF(NOT LIBGCRYPT_CFLAGS AND NOT _return_VALUE)
+
+ IF(LIBGCRYPT_LIBRARIES AND LIBGCRYPT_CFLAGS)
+ SET(LIBGCRYPT_FOUND TRUE)
+ ENDIF(LIBGCRYPT_LIBRARIES AND LIBGCRYPT_CFLAGS)
+
+ENDIF(LIBGCRYPTCONFIG_EXECUTABLE)
+
+if (LIBGCRYPT_FOUND)
+ if (NOT LibGcrypt_FIND_QUIETLY)
+ message(STATUS "Found libgcrypt: ${LIBGCRYPT_LIBRARIES}")
+ endif (NOT LibGcrypt_FIND_QUIETLY)
+else (LIBGCRYPT_FOUND)
+ if (LibGcrypt_FIND_REQUIRED)
+ message(FATAL_ERROR "Could not find libgcrypt libraries")
+ endif (LibGcrypt_FIND_REQUIRED)
+endif (LIBGCRYPT_FOUND)
+
+MARK_AS_ADVANCED(LIBGCRYPT_CFLAGS LIBGCRYPT_LIBRARIES)
diff -Nru qca2-2.0.3/cmake/modules/FindNss.cmake qca2-2.1.0/cmake/modules/FindNss.cmake
--- qca2-2.0.3/cmake/modules/FindNss.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake/modules/FindNss.cmake 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,37 @@
+# - Try to find the NSS library
+# Once done this will define
+#
+# NSS_FOUND - system has mozilla-nss lib
+# NSS_INCLUDE_DIRS - the mozilla-nss include directories
+# NSS_LDFLAGS - Link these to use mozilla-nss
+# NSS_CFLAGS_OTHER - Compiler switches required for using NSS
+#
+# Copyright (c) 2006, Laurent Montel,
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+if(NSS_INCLUDE_DIRS AND NSS_LDFLAGS)
+
+ # in cache already
+ SET(NSS_FOUND TRUE)
+
+else()
+ if(NOT WIN32)
+ find_package(PkgConfig REQUIRED)
+ pkg_search_module(NSS nss)
+ endif(NOT WIN32)
+
+ if (NSS_FOUND)
+ if (NOT Nss_FIND_QUIETLY)
+ message(STATUS "Found NSS: ${NSS_LDFLAGS}")
+ endif (NOT Nss_FIND_QUIETLY)
+ else (NSS_FOUND)
+ if (Nss_FIND_REQUIRED)
+ message(FATAL_ERROR "Could NOT find NSS")
+ endif (Nss_FIND_REQUIRED)
+ endif (NSS_FOUND)
+
+ mark_as_advanced(NSS_INCLUDE_DIRS NSS_LDFLAGS NSS_CFLAGS_OTHER)
+
+endif()
diff -Nru qca2-2.0.3/cmake/modules/FindPkcs11Helper.cmake qca2-2.1.0/cmake/modules/FindPkcs11Helper.cmake
--- qca2-2.0.3/cmake/modules/FindPkcs11Helper.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake/modules/FindPkcs11Helper.cmake 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,40 @@
+# - Try to find the pkcs11-helper library
+# Once done this will define
+#
+# PKCS11H_FOUND - system has pkcs11-helper
+# PKCS11H_INCLUDE_DIRS - the pkcs11-helper include directories
+# PKCS11H_LDFLAGS - Link to these to use pkcs11-helper
+# PKCS11H_CFLAGS_OTHER - Compiler switches required for using pkcs11-helper
+#
+# Copyright (c) 2006, Laurent Montel,
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+# pkcs11-helper can be found at http://www.opensc-project.org/pkcs11-helper
+#
+
+if(PKCS11H_INCLUDE_DIRS AND PKCS11H_LDFLAGS)
+
+ # in cache already
+ SET(PKCS11H_FOUND TRUE)
+
+else()
+ if(NOT WIN32)
+ find_package(PkgConfig REQUIRED)
+ pkg_search_module(PKCS11H libpkcs11-helper-1)
+ endif(NOT WIN32)
+
+ if (PKCS11H_FOUND)
+ if (NOT Pkcs11Helper_FIND_QUIETLY)
+ message(STATUS "Found pkcs11-helper: ${PKCS11H_LDFLAGS}")
+ endif (NOT Pkcs11Helper_FIND_QUIETLY)
+ else (PKCS11H_FOUND)
+ if (Pkcs11Helper_FIND_REQUIRED)
+ message(FATAL_ERROR "Could NOT find pkcs11-helper")
+ endif (Pkcs11Helper_FIND_REQUIRED)
+ endif (PKCS11H_FOUND)
+
+ mark_as_advanced(PKCS11H_INCLUDE_DIRS PKCS11H_LDFLAGS PKCS11H_CFLAGS_OTHER)
+
+endif()
diff -Nru qca2-2.0.3/cmake/modules/FindQt5Transitional.cmake qca2-2.1.0/cmake/modules/FindQt5Transitional.cmake
--- qca2-2.0.3/cmake/modules/FindQt5Transitional.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake/modules/FindQt5Transitional.cmake 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,125 @@
+
+find_package(Qt5Core QUIET)
+mark_as_advanced(Qt5Core_DIR)
+
+if (Qt5Core_FOUND)
+ if (NOT Qt5Transitional_FIND_COMPONENTS)
+ set(_components
+ Core
+ Gui
+ DBus
+ Designer
+ Declarative
+ Script
+ ScriptTools
+ Network
+ Test
+ Xml
+ Svg
+ Sql
+ Widgets
+ PrintSupport
+ Concurrent
+ UiTools
+ WebKit
+ WebKitWidgets
+ OpenGL
+ )
+ foreach(_component ${_components})
+ find_package(Qt5${_component})
+ mark_as_advanced(Qt5${_component}_DIR)
+ list(APPEND QT_LIBRARIES ${Qt5${_component}_LIBRARIES})
+ endforeach()
+ else()
+ set(_components ${Qt5Transitional_FIND_COMPONENTS})
+ foreach(_component ${Qt5Transitional_FIND_COMPONENTS})
+ find_package(Qt5${_component} REQUIRED)
+ mark_as_advanced(Qt5${_component}_DIR)
+ if ("${_component}" STREQUAL "WebKit")
+ find_package(Qt5WebKitWidgets REQUIRED)
+ mark_as_advanced(Qt5WebKitWidgets_DIR)
+ list(APPEND QT_LIBRARIES ${Qt5WebKitWidgets_LIBRARIES} )
+ endif()
+ if ("${_component}" STREQUAL "Gui")
+ find_package(Qt5Widgets REQUIRED)
+ find_package(Qt5PrintSupport REQUIRED)
+ find_package(Qt5Svg REQUIRED)
+ mark_as_advanced(Qt5Widgets_DIR Qt5PrintSupport_DIR Qt5Svg_DIR)
+ list(APPEND QT_LIBRARIES ${Qt5Widgets_LIBRARIES}
+ ${Qt5PrintSupport_LIBRARIES}
+ ${Qt5Svg_LIBRARIES} )
+ endif()
+# Core module was separated to Core and Concurrent in Qt5.
+# But QCA doesn't use any classes from QtConcurrent.
+# So QtConcurrent mustn't be used in QCA.
+# Uncomment this if Concurrent support will be added.
+
+# if ("${_component}" STREQUAL "Core")
+# find_package(Qt5Concurrent REQUIRED)
+# list(APPEND QT_LIBRARIES ${Qt5Concurrent_LIBRARIES} )
+# endif()
+ endforeach()
+ endif()
+
+ set(Qt5Transitional_FOUND TRUE)
+ set(QT5_BUILD TRUE)
+
+ # Temporary until upstream does this:
+ foreach(_component ${_components})
+ if (TARGET Qt5::${_component})
+ set_property(TARGET Qt5::${_component}
+ APPEND PROPERTY
+ INTERFACE_INCLUDE_DIRECTORIES ${Qt5${_component}_INCLUDE_DIRS})
+ set_property(TARGET Qt5::${_component}
+ APPEND PROPERTY
+ INTERFACE_COMPILE_DEFINITIONS ${Qt5${_component}_COMPILE_DEFINITIONS})
+ endif()
+ endforeach()
+
+ set_property(TARGET Qt5::Core
+ PROPERTY
+ INTERFACE_POSITION_INDEPENDENT_CODE ON
+ )
+
+ if (WIN32 AND NOT Qt5_NO_LINK_QTMAIN)
+ set(_isExe $,EXECUTABLE>)
+ set(_isWin32 $>)
+ set(_isNotExcluded $>>)
+ get_target_property(_configs Qt5::Core IMPORTED_CONFIGURATIONS)
+ foreach(_config ${_configs})
+ set_property(TARGET Qt5::Core APPEND PROPERTY
+ IMPORTED_LINK_INTERFACE_LIBRARIES_${_config}
+ $<$:Qt5::WinMain>
+ )
+ endforeach()
+ unset(_configs)
+ unset(_isExe)
+ unset(_isWin32)
+ unset(_isNotExcluded)
+ endif()
+ # End upstreamed stuff.
+
+ get_filename_component(_modules_dir "${CMAKE_CURRENT_LIST_DIR}/../modules" ABSOLUTE)
+ include("${_modules_dir}/ECMQt4To5Porting.cmake") # TODO: Port away from this.
+ include_directories(${QT_INCLUDES}) # TODO: Port away from this.
+
+ if (Qt5_POSITION_INDEPENDENT_CODE)
+ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+ endif()
+
+else()
+ foreach(_component ${Qt5Transitional_FIND_COMPONENTS})
+ if("${_component}" STREQUAL "Widgets") # new in Qt5
+ set(_component Gui)
+ elseif("${_component}" STREQUAL "Concurrent") # new in Qt5
+ set(_component Core)
+ endif()
+ list(APPEND _components Qt${_component})
+ endforeach()
+ find_package(Qt4 ${QT_MIN_VERSION} REQUIRED ${_components})
+ include_directories(${QT_INCLUDES})
+
+ if(QT4_FOUND)
+ set(Qt5Transitional_FOUND TRUE)
+ endif()
+endif()
diff -Nru qca2-2.0.3/cmake/modules/FindSasl2.cmake qca2-2.1.0/cmake/modules/FindSasl2.cmake
--- qca2-2.0.3/cmake/modules/FindSasl2.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake/modules/FindSasl2.cmake 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,41 @@
+# - Try to find the sasl2 directory library
+# Once done this will define
+#
+# SASL2_FOUND - system has SASL2
+# SASL2_INCLUDE_DIR - the SASL2 include directory
+# SASL2_LIBRARIES - The libraries needed to use SASL2
+#
+# Copyright (c) 2006, Laurent Montel,
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+if (SASL2_INCLUDE_DIR)
+ # Already in cache, be silent
+ set(SASL2_FIND_QUIETLY TRUE)
+endif (SASL2_INCLUDE_DIR)
+
+FIND_PATH(SASL2_INCLUDE_DIR sasl/sasl.h)
+
+FIND_LIBRARY(SASL2_LIBRARIES NAMES sasl2)
+
+
+if (SASL2_INCLUDE_DIR AND SASL2_LIBRARIES)
+ set(SASL2_FOUND TRUE)
+endif (SASL2_INCLUDE_DIR AND SASL2_LIBRARIES)
+
+
+if (SASL2_FOUND)
+ if (NOT Sasl2_FIND_QUIETLY)
+ message(STATUS "Found Sasl2: ${SASL2_LIBRARIES}")
+ endif (NOT Sasl2_FIND_QUIETLY)
+else (SASL2_FOUND)
+ if (Sasl2_FIND_REQUIRED)
+ message(FATAL_ERROR "Could not find sasl2 libraries")
+ endif (Sasl2_FIND_REQUIRED)
+endif (SASL2_FOUND)
+
+
+MARK_AS_ADVANCED(SASL2_INCLUDE_DIR SASL2_LIBRARIES)
+
diff -Nru qca2-2.0.3/cmake/modules/QcaMacro.cmake qca2-2.1.0/cmake/modules/QcaMacro.cmake
--- qca2-2.0.3/cmake/modules/QcaMacro.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake/modules/QcaMacro.cmake 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,119 @@
+
+IF (Qt5Core_FOUND)
+ # FindQt4.cmake wasn't used, so define it here
+ MACRO (QT4_GET_MOC_INC_DIRS _moc_INC_DIRS)
+ SET(${_moc_INC_DIRS})
+ GET_DIRECTORY_PROPERTY(_inc_DIRS INCLUDE_DIRECTORIES)
+
+ FOREACH(_current ${_inc_DIRS})
+ SET(${_moc_INC_DIRS} ${${_moc_INC_DIRS}} "-I" ${_current})
+ ENDFOREACH(_current ${_inc_DIRS})
+ ENDMACRO(QT4_GET_MOC_INC_DIRS)
+
+ MACRO(SETUP_QT5_DIRS)
+ GET_TARGET_PROPERTY(QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} LOCATION)
+ EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_LIBS" OUTPUT_VARIABLE QT_LIBRARY_DIR )
+ EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_PREFIX" OUTPUT_VARIABLE QT_PREFIX_DIR )
+ EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_PLUGINS" OUTPUT_VARIABLE QT_PLUGINS_DIR )
+ EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_BINS" OUTPUT_VARIABLE QT_BINARY_DIR )
+ EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_HEADERS" OUTPUT_VARIABLE QT_HEADERS_DIR )
+ EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_DOCS" OUTPUT_VARIABLE QT_DOC_DIR )
+ EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_DATA" OUTPUT_VARIABLE QT_DATA_DIR )
+ EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_ARCHDATA" OUTPUT_VARIABLE QT_ARCHDATA_DIR )
+ SET( QT_MKSPECS_DIR "${QT_ARCHDATA_DIR}/mkspecs" )
+ ENDMACRO(SETUP_QT5_DIRS)
+ELSE (Qt5Core_FOUND)
+ # Cmake FindQt4 module doesn't provide QT_INSTALL_PREFIX and QT_INSTALL_DATA vars
+ # It will be done here
+ MACRO(SETUP_QT4_DIRS)
+ _qt4_query_qmake(QT_INSTALL_PREFIX QT_PREFIX_DIR)
+ _qt4_query_qmake(QT_INSTALL_DATA QT_DATA_DIR)
+ ENDMACRO(SETUP_QT4_DIRS)
+ENDIF()
+
+MACRO(MY_AUTOMOC _srcsList)
+ # QT4_GET_MOC_INC_DIRS(_moc_INCS)
+ FOREACH (_current_FILE ${${_srcsList}})
+ GET_FILENAME_COMPONENT(_abs_FILE ${_current_FILE} ABSOLUTE)
+ GET_FILENAME_COMPONENT(_basename ${_current_FILE} NAME_WE)
+ SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc)
+ # SET(extra_moc_argument)
+ # if(WIN32)
+ # SET(extra_moc_argument -DWIN32)
+ # endif(WIN32)
+ QT4_GENERATE_MOC(${_abs_FILE} ${_moc})
+ # ADD_CUSTOM_COMMAND(OUTPUT ${_moc}
+ # COMMAND ${QT_MOC_EXECUTABLE}
+ # ARGS ${extra_moc_argument} ${_moc_INCS} -o ${_moc} ${_abs_FILE}
+ # DEPENDS ${_current_FILE}
+ # )
+ LIST(APPEND ${_srcsList} ${_moc})
+ ENDFOREACH (_current_FILE)
+ENDMACRO(MY_AUTOMOC)
+
+macro(set_enabled_plugin PLUGIN ENABLED)
+ # To nice looks
+ if(ENABLED)
+ set(ENABLED "on")
+ else(ENABLED)
+ set(ENABLED "off")
+ endif(ENABLED)
+ set(WITH_${PLUGIN}_PLUGIN_INTERNAL ${ENABLED} CACHE INTERNAL "")
+endmacro(set_enabled_plugin)
+
+macro(enable_plugin PLUGIN)
+ set_enabled_plugin(${PLUGIN} "on")
+endmacro(enable_plugin)
+
+macro(disable_plugin PLUGIN)
+ set_enabled_plugin(${PLUGIN} "off")
+endmacro(disable_plugin)
+
+# it used to build examples and tools
+macro(target_link_qca_libraries TARGET)
+ # Link with QCA library
+ target_link_libraries(${TARGET} ${QT_QTCORE_LIBRARY})
+ target_link_libraries(${TARGET} ${QCA_LIB_NAME})
+
+ # Statically link with all enabled QCA plugins
+ if(STATIC_PLUGINS)
+ target_link_libraries(${TARGET} ${QT_QTCORE_LIB_DEPENDENCIES})
+ foreach(PLUGIN IN LISTS PLUGINS)
+ # Check plugin for enabled
+ if(WITH_${PLUGIN}_PLUGIN_INTERNAL)
+ target_link_libraries(${TARGET} qca-${PLUGIN})
+ endif(WITH_${PLUGIN}_PLUGIN_INTERNAL)
+ endforeach(PLUGIN)
+ endif(STATIC_PLUGINS)
+endmacro(target_link_qca_libraries)
+
+# it used to build unittests
+macro(target_link_qca_test_libraries TARGET)
+ target_link_qca_libraries(${TARGET})
+ target_link_libraries(${TARGET} ${QT_QTTEST_LIBRARY})
+endmacro(target_link_qca_test_libraries)
+
+# it used to build unittests
+macro(add_qca_test TARGET DESCRIPTION)
+ add_test(NAME "${DESCRIPTION}"
+ WORKING_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
+ COMMAND "${TARGET}")
+endmacro(add_qca_test)
+
+macro(install_pdb TARGET INSTALL_PATH)
+ if(MSVC)
+ get_target_property(LOCATION ${TARGET} LOCATION_DEBUG)
+ string(REGEX REPLACE "\\.[^.]*$" ".pdb" LOCATION "${LOCATION}")
+ install(FILES ${LOCATION} DESTINATION ${INSTALL_PATH} CONFIGURATIONS Debug)
+
+ get_target_property(LOCATION ${TARGET} LOCATION_RELWITHDEBINFO)
+ string(REGEX REPLACE "\\.[^.]*$" ".pdb" LOCATION "${LOCATION}")
+ install(FILES ${LOCATION} DESTINATION ${INSTALL_PATH} CONFIGURATIONS RelWithDebInfo)
+ endif(MSVC)
+endmacro(install_pdb)
+
+macro(normalize_path PATH)
+ get_filename_component(${PATH} "${${PATH}}" ABSOLUTE)
+ # Strip trailing slashes
+ string(REGEX REPLACE "/+$" "" PATH ${PATH})
+endmacro()
diff -Nru qca2-2.0.3/CMakeLists.txt qca2-2.1.0/CMakeLists.txt
--- qca2-2.0.3/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,443 @@
+# Checking for user explicity defined CMAKE_INSTALL_PREFIX
+# It must be done before project(...)
+if(NOT CMAKE_INSTALL_PREFIX)
+ set(QCA_INSTALL_IN_QT_PREFIX ON)
+ # If CMAKE_INSTALL_PREFIX is set in cmake arguments
+ unset(CMAKE_INSTALL_PREFIX CACHE)
+endif(NOT CMAKE_INSTALL_PREFIX)
+
+project(qca)
+
+cmake_minimum_required(VERSION 2.6.0)
+
+set(QCA_LIB_MAJOR_VERSION "2")
+set(QCA_LIB_MINOR_VERSION "1")
+set(QCA_LIB_PATCH_VERSION "0")
+
+# Do not automatically link Qt executables to qtmain target on Windows.
+# QCA exucatables use console mode only. Not need to link against
+# qtmain.lib.
+cmake_policy(SET CMP0020 OLD)
+
+option(BUILD_TESTS "Create test" ON)
+option(BUILD_TOOLS "Compile mozcerts and qcatool" ON)
+set(BUILD_PLUGINS "auto" CACHE STRING "Plugins for building (also possible values: none, all and auto)")
+option(BUILD_SHARED_LIBS "Build shared library" ON)
+option(DEVELOPER_MODE "Special developer mode" OFF)
+
+if(APPLE)
+ option(OSX_FRAMEWORK "Build a Mac OS X Framework" ON)
+else()
+ set(OSX_FRAMEWORK OFF)
+endif()
+
+find_package(Doxygen)
+
+string(TOLOWER "${BUILD_PLUGINS}" BUILD_PLUGINS)
+if(NOT BUILD_PLUGINS)
+ set(BUILD_PLUGINS "none")
+endif(NOT BUILD_PLUGINS)
+
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" )
+
+option(QT4_BUILD "Force building with Qt4 even if Qt5 is found")
+if (NOT QT4_BUILD)
+ find_package(Qt5Core QUIET)
+ mark_as_advanced(Qt5Core_DIR)
+endif()
+
+include(QcaMacro)
+
+if (Qt5Core_FOUND)
+ message(STATUS "Building with Qt5 support")
+ # Got from ECM
+ # Distros have no ECM. So I just copied required cmake modules.
+ find_package(Qt5Transitional REQUIRED Core Network)
+ include(ECMQt4To5Porting)
+
+ include(GNUInstallDirs)
+ setup_qt5_dirs()
+ set(QCA_QT_PC_VERSION "Qt5Core")
+else()
+ set(QT_MIN_VERSION "4.7.0")
+ set(QT_USE_IMPORTED_TARGETS ON)
+ if(BUILD_TESTS)
+ find_package(Qt4 REQUIRED QtCore QtNetwork QtTest)
+ else(BUILD_TESTS)
+ find_package(Qt4 REQUIRED QtCore)
+ endif(BUILD_TESTS)
+ # WORKAROUND: Seems it must be done in Qt4 find module but didn't
+ mark_as_advanced(QT_QMAKE_EXECUTABLE)
+
+ # properly set up compile flags (QT_DEBUG/QT_NO_DEBUG, ...)
+ include(${QT_USE_FILE})
+ setup_qt4_dirs()
+ set(QCA_QT_PC_VERSION "QtCore")
+endif()
+
+# QCA can be shared but plugins will be static
+# if Qt is static.
+if(NOT BUILD_SHARED_LIBS OR QT_IS_STATIC)
+ set(STATIC_PLUGINS ON)
+ add_definitions(-DQT_STATICPLUGIN)
+ set(PLUGIN_TYPE "STATIC")
+else(NOT BUILD_SHARED_LIBS OR QT_IS_STATIC)
+ set(PLUGIN_TYPE "MODULE")
+endif(NOT BUILD_SHARED_LIBS OR QT_IS_STATIC)
+
+set(QCA_SUFFIX "" CACHE STRING "QCA common suffix")
+if(QCA_SUFFIX)
+ set(QCA_LIB_NAME qca-${QCA_SUFFIX})
+ set(QCA_TOOL_NAME qcatool-${QCA_SUFFIX})
+ set(MOZCERTS_NAME mozcerts-${QCA_SUFFIX})
+ set(QCA_PC_NAME qca2-${QCA_SUFFIX}.pc)
+else(QCA_SUFFIX)
+ set(QCA_LIB_NAME qca)
+ set(QCA_TOOL_NAME qcatool)
+ set(MOZCERTS_NAME mozcerts)
+ set(QCA_PC_NAME qca2.pc)
+endif(QCA_SUFFIX)
+
+set(QCA_LIB_VERSION_STRING "${QCA_LIB_MAJOR_VERSION}.${QCA_LIB_MINOR_VERSION}.${QCA_LIB_PATCH_VERSION}")
+
+configure_file("include/QtCrypto/qca_version.h.in" "${CMAKE_BINARY_DIR}/qca_version.h")
+
+if (WIN32)
+ set(CMAKE_DEBUG_POSTFIX "d")
+ add_definitions(-DWIN32_LEAN_AND_MEAN)
+elseif (APPLE)
+ set(CMAKE_DEBUG_POSTFIX "_debug")
+endif (WIN32)
+
+if (CMAKE_COMPILER_IS_GNUCXX)
+ if (CMAKE_SYSTEM_NAME MATCHES Linux)
+ add_definitions (-D_BSD_SOURCE)
+ set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-long-long -ansi -Wundef -Wcast-align -Werror-implicit-function-declaration -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common")
+ set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -fno-check-new -fno-common")
+ endif (CMAKE_SYSTEM_NAME MATCHES Linux)
+endif (CMAKE_COMPILER_IS_GNUCXX)
+
+add_definitions (${QT_DEFINITIONS})
+include_directories("include/QtCrypto/")
+# for generated files
+include_directories(${CMAKE_BINARY_DIR})
+
+if(NOT DEVELOPER_MODE)
+ # uninstall target
+ configure_file(
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+ IMMEDIATE @ONLY)
+
+ add_custom_target(uninstall
+ COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
+endif()
+
+# Always include srcdir and builddir in include path
+# This saves typing ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY} in about every subdir
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+# put the include dirs which are in the source or build tree
+# before all other include dirs, so the headers in the sources
+# are prefered over the already installed ones
+set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON)
+
+set(qca_INCLUDEDIR "${CMAKE_CURRENT_SOURCE_DIR}/include" )
+
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" )
+# Use the same path for shared and static library
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" )
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" )
+
+if( QCA_INSTALL_IN_QT_PREFIX )
+ set(QCA_PREFIX_INSTALL_DIR "${QT_PREFIX_DIR}" CACHE PATH "Directory where qca will install")
+ set(QCA_PLUGINS_INSTALL_DIR "${QT_PLUGINS_DIR}" CACHE PATH "Directory where qca plugins will install")
+ set(QCA_BINARY_INSTALL_DIR "${QT_BINARY_DIR}" CACHE PATH "Directory where qca plugins will install")
+ set(QCA_LIBRARY_INSTALL_DIR "${QT_LIBRARY_DIR}" CACHE PATH "Directory where qca library will install")
+ set(QCA_FEATURE_INSTALL_DIR "${QT_MKSPECS_DIR}/features" CACHE PATH "Directory where qca feature file will install")
+ set(QCA_INCLUDE_INSTALL_DIR "${QT_HEADERS_DIR}" CACHE PATH "Directory where qca public headers will install")
+ set(QCA_PRIVATE_INCLUDE_INSTALL_DIR "${QT_HEADERS_DIR}" CACHE PATH "Directory where qca headers will install")
+ set(QCA_DOC_INSTALL_DIR "${QT_DOC_DIR}/html/qca/" CACHE PATH "Directory where qca documentation will install")
+ set(QCA_MAN_INSTALL_DIR "${QT_DATA_DIR}/man" CACHE PATH "Directory where qca man pages will install")
+else( QCA_INSTALL_IN_QT_PREFIX )
+ # Cmake says nothing about LIB_SUFFIX
+ # de facto it is a standard way to specify lib suffix on many distros
+ set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)" )
+ set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "Directory where lib will install")
+
+ set(QCA_PREFIX_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Directory where qca will install")
+ set(QCA_PLUGINS_INSTALL_DIR "${LIB_INSTALL_DIR}/${QCA_LIB_NAME}" CACHE PATH "Directory where qca plugins will install")
+ set(QCA_BINARY_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Directory where qca plugins will install")
+ set(QCA_LIBRARY_INSTALL_DIR "${LIB_INSTALL_DIR}" CACHE PATH "Directory where qca library will install")
+ set(QCA_FEATURE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/mkspecs/features" CACHE PATH "Directory where qca feature file will install")
+ set(QCA_INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Directory where qca public headers will install")
+ set(QCA_PRIVATE_INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Directory where qca headers will install")
+ set(QCA_DOC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${QCA_LIB_NAME}/html" CACHE PATH "Directory where qca documentation will install")
+ set(QCA_MAN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Directory where qca man pages will install")
+endif( QCA_INSTALL_IN_QT_PREFIX )
+
+set(PKGCONFIG_INSTALL_PREFIX "${QCA_LIBRARY_INSTALL_DIR}/pkgconfig" CACHE PATH "Base directory for pkgconfig files")
+
+normalize_path(QCA_PREFIX_INSTALL_DIR)
+
+# check for oportunity to use relative paths
+option(USE_RELATIVE_PATHS "Try to make relocatable package")
+
+foreach(PATH QCA_PLUGINS_INSTALL_DIR
+ QCA_BINARY_INSTALL_DIR
+ QCA_LIBRARY_INSTALL_DIR
+ QCA_FEATURE_INSTALL_DIR
+ QCA_INCLUDE_INSTALL_DIR
+ QCA_PRIVATE_INCLUDE_INSTALL_DIR
+ QCA_DOC_INSTALL_DIR
+ QCA_MAN_INSTALL_DIR
+ PKGCONFIG_INSTALL_PREFIX)
+
+ # Normalize path before comparsion
+ normalize_path(${PATH})
+
+ # if all paths are subdirs of CMAKE_INSTALL_PREFIX it is possible to use relative paths
+ string(FIND "${${PATH}}" "${QCA_PREFIX_INSTALL_DIR}/" POS)
+ if(NOT "${POS}" STREQUAL "0")
+ set(USE_RELATIVE_PATHS OFF)
+ endif()
+endforeach()
+
+if(NOT WIN32)
+ if(OSX_FRAMEWORK)
+ set(PKGCONFIG_CFLAGS "-F\${libdir} -I\${libdir}/${QCA_LIB_NAME}.framework/Headers")
+ set(PKGCONFIG_LIBS "-F\${libdir} -framework ${QCA_LIB_NAME}")
+ else()
+ set(PKGCONFIG_CFLAGS "-I\${includedir}")
+ set(PKGCONFIG_LIBS "-L\${libdir} -l${QCA_LIB_NAME}")
+ endif()
+
+ # qca2.pc uses absolute paths. So it must be there. Don't rellocate this.
+ configure_file("qca2.pc.cmake" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pkgconfig/${QCA_PC_NAME}" @ONLY)
+ if(NOT DEVELOPER_MODE)
+ install(FILES "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pkgconfig/${QCA_PC_NAME}" DESTINATION ${PKGCONFIG_INSTALL_PREFIX})
+ endif()
+endif(NOT WIN32)
+
+# strip CMAKE_INSTALL_PREFIX in all paths
+if(USE_RELATIVE_PATHS)
+ message(STATUS "Installed package is relocatable")
+ file(RELATIVE_PATH CRYPTO_PRF_RELATIVE_PATH "${QCA_FEATURE_INSTALL_DIR}" ${CMAKE_INSTALL_PREFIX})
+ set(CRYPTO_PRF_RELATIVE_PATH "$$PWD/${CRYPTO_PRF_RELATIVE_PATH}")
+ foreach(PATH QCA_PLUGINS_INSTALL_DIR
+ QCA_BINARY_INSTALL_DIR
+ QCA_LIBRARY_INSTALL_DIR
+ QCA_FEATURE_INSTALL_DIR
+ QCA_INCLUDE_INSTALL_DIR
+ QCA_PRIVATE_INCLUDE_INSTALL_DIR
+ QCA_DOC_INSTALL_DIR
+ QCA_MAN_INSTALL_DIR
+ PKGCONFIG_INSTALL_PREFIX)
+
+ file(RELATIVE_PATH ${PATH} ${CMAKE_INSTALL_PREFIX} "${${PATH}}")
+ endforeach()
+else()
+ message(STATUS "Installed package is NOT relocatable")
+ set(CRYPTO_PRF_RELATIVE_PATH "")
+endif()
+
+if(DEVELOPER_MODE)
+ add_definitions(-DDEVELOPER_MODE)
+
+# To prefer plugins from build tree when run qca from build tree
+ file(WRITE ${CMAKE_BINARY_DIR}/bin/qt.conf
+"[Paths]
+Plugins=${CMAKE_BINARY_DIR}/lib/${QCA_LIB_NAME}
+")
+endif()
+
+if (APPLE)
+ find_package(Carbon REQUIRED)
+ set(CMAKE_INSTALL_NAME_DIR ${QCA_LIBRARY_INSTALL_DIR})
+ set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
+endif (APPLE)
+
+message(STATUS "Checking for certstore..")
+# fixme add OR mac
+if( WIN32 )
+# USE BUILTIN
+else ( WIN32 )
+ if ( ENV{QC_CERTSTORE_PATH} )
+ if(EXISTS ENV{QC_CERTSTORE_PATH})
+ set( qca_CERTSTORE $ENV{QC_CERTSTORE_PATH})
+ else(EXISTS ENV{QC_CERTSTORE_PATH})
+ # path to try
+ endif(EXISTS ENV{QC_CERTSTORE_PATH})
+ else( ENV{QC_CERTSTORE_PATH} )
+ set( toTry
+ "/etc/ssl/certs/ca-certificates.crt"
+ "/usr/share/ssl/cert.pem"
+ "/usr/share/ssl/certs/ca-bundle.crt"
+ "/etc/pki/tls/cert.pem"
+ "/etc/ssl/ca-bundle.pem"
+ "/usr/share/curl/curl-ca-bundle.crt"
+ )
+ foreach (_current_try ${toTry})
+ if(EXISTS ${_current_try})
+ set( qca_CERTSTORE ${_current_try})
+ endif(EXISTS ${_current_try})
+ endforeach (_current_try)
+ endif( ENV{QC_CERTSTORE_PATH} )
+endif(WIN32)
+
+if (qca_CERTSTORE)
+ message(STATUS "Found system certstore")
+else (qca_CERTSTORE)
+ message(STATUS "Using built in certstore.")
+ set( qca_CERTSTORE "${CMAKE_CURRENT_SOURCE_DIR}/certs/rootcerts.pem")
+ # note that INSTALL_FILES targets are relative to the current installation prefix...
+ if(NOT DEVELOPER_MODE)
+ install(FILES "${qca_CERTSTORE}" DESTINATION "${QCA_PREFIX_INSTALL_DIR}/certs")
+ endif()
+endif (qca_CERTSTORE)
+message(STATUS "certstore path: " ${qca_CERTSTORE})
+add_definitions( -DQCA_SYSTEMSTORE_PATH="${qca_CERTSTORE}" )
+
+
+set( private_HEADERS ${qca_INCLUDEDIR}/QtCrypto/qca_plugin.h ${qca_INCLUDEDIR}/QtCrypto/qca_systemstore.h )
+
+set( public_HEADERS
+ ${qca_INCLUDEDIR}/QtCrypto/qca.h
+ ${qca_INCLUDEDIR}/QtCrypto/qcaprovider.h
+ ${qca_INCLUDEDIR}/QtCrypto/QtCrypto
+ ${qca_INCLUDEDIR}/QtCrypto/qca_export.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_support.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_tools.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_core.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_textfilter.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_basic.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_publickey.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_cert.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_keystore.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_securelayer.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_securemessage.h
+ ${CMAKE_BINARY_DIR}/qca_version.h
+ ${qca_INCLUDEDIR}/QtCrypto/qpipe.h
+ ${qca_INCLUDEDIR}/QtCrypto/qca_safetimer.h)
+
+set( qca_HEADERS ${private_HEADERS} ${public_HEADERS} )
+
+include_directories(${QT_QTCORE_INCLUDE_DIR} "${qca_INCLUDEDIR}/QtCrypto")
+
+configure_file("crypto.prf.cmake" "${CMAKE_BINARY_DIR}/mkspecs/features/crypto.prf" @ONLY)
+if(NOT DEVELOPER_MODE)
+ install(FILES "${CMAKE_BINARY_DIR}/mkspecs/features/crypto.prf" DESTINATION "${QCA_FEATURE_INSTALL_DIR}")
+endif()
+
+configure_file(man/qcatool.1 "${CMAKE_BINARY_DIR}/share/man/man1/${QCA_TOOL_NAME}.1" COPYONLY)
+if(NOT DEVELOPER_MODE)
+ install(FILES "${CMAKE_BINARY_DIR}/share/man/man1/${QCA_TOOL_NAME}.1" DESTINATION "${QCA_MAN_INSTALL_DIR}/man1")
+endif()
+
+set(QCA_CRYPTO_INSTALL_DIR "${QCA_PLUGINS_INSTALL_DIR}/crypto")
+
+add_subdirectory(src)
+add_subdirectory(plugins)
+
+if(STATIC_PLUGINS)
+ # Generate header with static plugins list
+ file(WRITE "${CMAKE_BINARY_DIR}/import_plugins.h" "#include \n")
+ foreach(PLUGIN IN LISTS PLUGINS)
+ if(WITH_${PLUGIN}_PLUGIN_INTERNAL)
+ string(REPLACE "-" "_" IMPORT_NAME "qca-${PLUGIN}")
+ file(APPEND "${CMAKE_BINARY_DIR}/import_plugins.h" "Q_IMPORT_PLUGIN(${IMPORT_NAME})\n")
+ endif(WITH_${PLUGIN}_PLUGIN_INTERNAL)
+ endforeach(PLUGIN IN LISTS PLUGINS)
+endif(STATIC_PLUGINS)
+
+if(BUILD_TESTS)
+ enable_testing()
+ add_subdirectory(unittest)
+ add_subdirectory(examples)
+endif(BUILD_TESTS)
+if(BUILD_TOOLS)
+ add_subdirectory(tools)
+endif(BUILD_TOOLS)
+
+if(DOXYGEN_FOUND)
+ configure_file(${CMAKE_SOURCE_DIR}/Doxyfile.in ${CMAKE_BINARY_DIR}/Doxyfile @ONLY)
+ add_custom_target(doc
+ ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/images
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/images/qca-arch.eps ${CMAKE_BINARY_DIR}/images/qca-arch.eps
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/images/qca-arch.png ${CMAKE_BINARY_DIR}/images/qca-arch.png
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+ COMMENT "Generating API documentation with Doxygen" VERBATIM)
+endif(DOXYGEN_FOUND)
+
+include(CMakePackageConfigHelpers)
+configure_package_config_file(
+ "${CMAKE_CURRENT_SOURCE_DIR}/QcaConfig.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/Qca/QcaConfig.cmake"
+ INSTALL_DESTINATION ${QCA_LIBRARY_INSTALL_DIR}/cmake/Qca
+)
+write_basic_config_version_file("${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/Qca/QcaConfigVersion.cmake" VERSION ${QCA_LIB_VERSION_STRING} COMPATIBILITY AnyNewerVersion)
+
+if(NOT DEVELOPER_MODE)
+
+ # /usr/local is traditional path for installing apps on POSIX-systems.
+ # I consciously break this. Qt by default looks plugins and features only in
+ # own directory. So by default install libs in Qt prefix it is a best choice.
+ # This can be unwanted behaviour for users who don't read INSTALL file or/and
+ # not read cmake reports. I just try to warn their.
+
+ # In really anybody who do cmake . && make && sudo make install do it for own risk.
+
+ if(QCA_INSTALL_IN_QT_PREFIX)
+ string(ASCII 27 ESCAPE)
+ message("")
+ message("${ESCAPE}[31m")
+ message("!!!!!!!!!!!!!!!!!!!!!ATTENTION!!!!!!!!!!!!!!!!!!!!!!")
+ message("!! QCA will be installed in Qt prefix !!")
+ message("!! If you want to install in /usr/local !!")
+ message("!! you MUST explicity define CMAKE_INSTALL_PREFIX !!")
+ message("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message("${ESCAPE}[0m")
+ endif(QCA_INSTALL_IN_QT_PREFIX)
+
+ message("")
+ if(USE_RELATIVE_PATHS)
+ message("QCA prefix is " "${QCA_PREFIX_INSTALL_DIR}")
+ message("Plugins will be installed to " "${QCA_PREFIX_INSTALL_DIR}/${QCA_PLUGINS_INSTALL_DIR}")
+ message("Binary will be installed to " "${QCA_PREFIX_INSTALL_DIR}/${QCA_BINARY_INSTALL_DIR}")
+ if(OSX_FRAMEWORK)
+ message("Framework will be installed to " "${QCA_PREFIX_INSTALL_DIR}/${QCA_LIBRARY_INSTALL_DIR}")
+ else()
+ message("Library will be installed to " "${QCA_PREFIX_INSTALL_DIR}/${QCA_LIBRARY_INSTALL_DIR}")
+ message("Public headers will be installed to " "${QCA_PREFIX_INSTALL_DIR}/${QCA_INCLUDE_INSTALL_DIR}")
+ message("Private headers will be installed to " "${QCA_PREFIX_INSTALL_DIR}/${QCA_PRIVATE_INCLUDE_INSTALL_DIR}")
+ endif()
+ message("Feature file will be installed to " "${QCA_PREFIX_INSTALL_DIR}/${QCA_FEATURE_INSTALL_DIR}")
+ message("Documentation will be installed to " "${QCA_PREFIX_INSTALL_DIR}/${QCA_DOC_INSTALL_DIR}")
+ message("Man page will be installed to " "${QCA_PREFIX_INSTALL_DIR}/${QCA_MAN_INSTALL_DIR}")
+ message("Pkg-config file will be installed to " "${QCA_PREFIX_INSTALL_DIR}/${PKGCONFIG_INSTALL_PREFIX}")
+ else()
+ message("QCA prefix is " "${QCA_PREFIX_INSTALL_DIR}")
+ message("Plugins will be installed to " "${QCA_PLUGINS_INSTALL_DIR}")
+ message("Binary will be installed to " "${QCA_BINARY_INSTALL_DIR}")
+ if(OSX_FRAMEWORK)
+ message("Framework will be installed to " "${QCA_LIBRARY_INSTALL_DIR}")
+ else()
+ message("Library will be installed to " "${QCA_LIBRARY_INSTALL_DIR}")
+ message("Public headers will be installed to " "${QCA_INCLUDE_INSTALL_DIR}")
+ message("Private headers will be installed to " "${QCA_PRIVATE_INCLUDE_INSTALL_DIR}")
+ endif()
+ message("Feature file will be installed to " "${QCA_FEATURE_INSTALL_DIR}")
+ message("Documentation will be installed to " "${QCA_DOC_INSTALL_DIR}")
+ message("Man page will be installed to " "${QCA_MAN_INSTALL_DIR}")
+ message("Pkg-config file will be installed to " "${PKGCONFIG_INSTALL_PREFIX}")
+ endif()
+ message("")
+
+ install(EXPORT QCATargets DESTINATION ${QCA_LIBRARY_INSTALL_DIR}/cmake/Qca FILE QcaTargets.cmake)
+ install(FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/Qca/QcaConfig.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/Qca/QcaConfigVersion.cmake"
+ DESTINATION ${QCA_LIBRARY_INSTALL_DIR}/cmake/Qca
+ )
+endif()
diff -Nru qca2-2.0.3/cmake_uninstall.cmake.in qca2-2.1.0/cmake_uninstall.cmake.in
--- qca2-2.0.3/cmake_uninstall.cmake.in 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/cmake_uninstall.cmake.in 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,26 @@
+cmake_minimum_required(VERSION 2.6.0)
+
+cmake_policy(SET CMP0007 OLD)
+
+if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+ message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
+endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+
+file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
+string(REGEX REPLACE "\n" ";" files "${files}")
+list(REVERSE files)
+foreach (file ${files})
+ message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
+ if (EXISTS "$ENV{DESTDIR}${file}")
+ execute_process(
+ COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}"
+ OUTPUT_VARIABLE rm_out
+ RESULT_VARIABLE rm_retval
+ )
+ if(NOT ${rm_retval} EQUAL 0)
+ message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
+ endif (NOT ${rm_retval} EQUAL 0)
+ else (EXISTS "$ENV{DESTDIR}${file}")
+ message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
+ endif (EXISTS "$ENV{DESTDIR}${file}")
+endforeach(file)
diff -Nru qca2-2.0.3/configure qca2-2.1.0/configure
--- qca2-2.0.3/configure 2010-11-27 21:16:26.000000000 +0000
+++ qca2-2.1.0/configure 1970-01-01 00:00:00.000000000 +0000
@@ -1,2194 +0,0 @@
-#!/bin/sh
-#
-# Generated by qconf 1.5 ( http://delta.affinix.com/qconf/ )
-#
-
-show_usage() {
-cat </dev/null`
- if echo $WHICH | grep 'shell built-in command' >/dev/null 2>&1; then
- WHICH=which
- elif [ -z "$WHICH" ]; then
- if which which >/dev/null 2>&1; then
- WHICH=which
- else
- for a in /usr/ucb /usr/bin /bin /usr/local/bin; do
- if [ -x $a/which ]; then
- WHICH=$a/which
- break;
- fi
- done
- fi
- fi
-
- if [ -z "$WHICH" ]; then
- OLD_IFS=$IFS
- IFS=:
- for a in $PATH; do
- if [ -x $a/$1 ]; then
- echo "$a/$1"
- IFS=$OLD_IFS
- export IFS
- HOME=$OLD_HOME
- export HOME
- return 0
- fi
- done
- IFS=$OLD_IFS
- export IFS
- else
- a=`"$WHICH" "$1" 2>/dev/null`
- if [ ! -z "$a" -a -x "$a" ]; then
- echo "$a"
- HOME=$OLD_HOME
- export HOME
- return 0
- fi
- fi
- HOME=$OLD_HOME
- export HOME
- return 1
-}
-WHICH=which_command
-
-# find a make command
-if [ -z "$MAKE" ]; then
- MAKE=
- for mk in gmake make; do
- if $WHICH $mk >/dev/null 2>&1; then
- MAKE=`$WHICH $mk`
- break
- fi
- done
- if [ -z "$MAKE" ]; then
- echo "You don't seem to have 'make' or 'gmake' in your PATH."
- echo "Cannot proceed."
- exit 1
- fi
-fi
-
-show_qt_info() {
- printf "Be sure you have a proper Qt 4.0 build environment set up. This means not\n"
- printf "just Qt, but also a C++ compiler, a make tool, and any other packages\n"
- printf "necessary for compiling C++ programs.\n"
- printf "\n"
- printf "If you are certain everything is installed, then it could be that Qt 4 is not\n"
- printf "being recognized or that a different version of Qt is being detected by\n"
- printf "mistake (for example, this could happen if \$QTDIR is pointing to a Qt 3\n"
- printf "installation). At least one of the following conditions must be satisfied:\n"
- printf "\n"
- printf " 1) --qtdir is set to the location of Qt\n"
- printf " 2) \$QTDIR is set to the location of Qt\n"
- printf " 3) QtCore is in the pkg-config database\n"
- printf " 4) qmake is in the \$PATH\n"
- printf "\n"
- printf "This script will use the first one it finds to be true, checked in the above\n"
- printf "order. #3 and #4 are the recommended options. #1 and #2 are mainly for\n"
- printf "overriding the system configuration.\n"
- printf "\n"
-}
-
-while [ $# -gt 0 ]; do
- optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
- case "$1" in
- --prefix=*)
- PREFIX=$optarg
- shift
- ;;
-
- --bindir=*)
- BINDIR=$optarg
- shift
- ;;
-
- --includedir=*)
- INCDIR=$optarg
- shift
- ;;
-
- --libdir=*)
- LIBDIR=$optarg
- shift
- ;;
-
- --datadir=*)
- DATADIR=$optarg
- shift
- ;;
-
- --qtdir=*)
- EX_QTDIR=$optarg
- shift
- ;;
-
- --static)
- QC_STATIC="Y"
- shift
- ;;
-
- --release)
- QC_RELEASE="Y"
- shift
- ;;
-
- --debug)
- QC_DEBUG="Y"
- shift
- ;;
-
- --debug-and-release)
- QC_DEBUG_AND_RELEASE="Y"
- shift
- ;;
-
- --no-separate-debug-info)
- QC_NO_SEPARATE_DEBUG_INFO="Y"
- shift
- ;;
-
- --separate-debug-info)
- QC_SEPARATE_DEBUG_INFO="Y"
- shift
- ;;
-
- --no-framework)
- QC_NO_FRAMEWORK="Y"
- shift
- ;;
-
- --framework)
- QC_FRAMEWORK="Y"
- shift
- ;;
-
- --universal)
- QC_UNIVERSAL="Y"
- shift
- ;;
-
- --mac-sdk=*)
- QC_MAC_SDK=$optarg
- shift
- ;;
-
- --disable-tests)
- QC_DISABLE_TESTS="Y"
- shift
- ;;
-
- --certstore-path=*)
- QC_CERTSTORE_PATH=$optarg
- shift
- ;;
-
- --certstore-internal)
- QC_CERTSTORE_INTERNAL="Y"
- shift
- ;;
-
- --verbose)
- QC_VERBOSE="Y"
- shift
- ;;
- --help) show_usage; exit ;;
- *) show_usage; exit ;;
- esac
-done
-
-PREFIX=${PREFIX:-/usr/local}
-BINDIR=${BINDIR:-$PREFIX/bin}
-INCDIR=${INCDIR:-$PREFIX/include}
-LIBDIR=${LIBDIR:-$PREFIX/lib}
-DATADIR=${DATADIR:-$PREFIX/share}
-
-echo "Configuring Qt Cryptographic Architecture (QCA) ..."
-
-if [ "$QC_VERBOSE" = "Y" ]; then
-echo
-echo PREFIX=$PREFIX
-echo BINDIR=$BINDIR
-echo INCDIR=$INCDIR
-echo LIBDIR=$LIBDIR
-echo DATADIR=$DATADIR
-echo EX_QTDIR=$EX_QTDIR
-echo QC_STATIC=$QC_STATIC
-echo QC_RELEASE=$QC_RELEASE
-echo QC_DEBUG=$QC_DEBUG
-echo QC_DEBUG_AND_RELEASE=$QC_DEBUG_AND_RELEASE
-echo QC_NO_SEPARATE_DEBUG_INFO=$QC_NO_SEPARATE_DEBUG_INFO
-echo QC_SEPARATE_DEBUG_INFO=$QC_SEPARATE_DEBUG_INFO
-echo QC_NO_FRAMEWORK=$QC_NO_FRAMEWORK
-echo QC_FRAMEWORK=$QC_FRAMEWORK
-echo QC_UNIVERSAL=$QC_UNIVERSAL
-echo QC_MAC_SDK=$QC_MAC_SDK
-echo QC_DISABLE_TESTS=$QC_DISABLE_TESTS
-echo QC_CERTSTORE_PATH=$QC_CERTSTORE_PATH
-echo QC_CERTSTORE_INTERNAL=$QC_CERTSTORE_INTERNAL
-echo
-fi
-
-printf "Verifying Qt 4 build environment ... "
-
-# run qmake -v and check version
-qmake_check_v4() {
- if [ -x "$1" ]; then
- if echo `$1 -v 2>&1` | grep "Qt version 4\." >/dev/null 2>&1; then
- return 0
- elif [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: $1 not for Qt 4"
- fi
- fi
- return 1
-}
-
-if [ "$QC_VERBOSE" = "Y" ]; then
- echo
-fi
-
-qm=""
-names="qmake-qt4 qmake4 qmake"
-
-# qt4 check: --qtdir
-if [ -z "$qm" ] && [ ! -z "$EX_QTDIR" ]; then
- for n in $names; do
- qstr=$EX_QTDIR/bin/$n
- if qmake_check_v4 "$qstr"; then
- qm=$qstr
- break;
- fi
- done
-fi
-if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: qmake not found via --qtdir"
-fi
-
-# qt4 check: QTDIR
-if [ -z "$qm" ] && [ ! -z "$QTDIR" ]; then
- for n in $names; do
- qstr=$QTDIR/bin/$n
- if qmake_check_v4 "$qstr"; then
- qm=$qstr
- break;
- fi
- done
-fi
-if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: qmake not found via \$QTDIR"
-fi
-
-# qt4 check: pkg-config
-if [ -z "$qm" ]; then
- str=`pkg-config QtCore --variable=exec_prefix 2>/dev/null`
- if [ ! -z "$str" ]; then
- for n in $names; do
- qstr=$str/bin/$n
- if qmake_check_v4 "$qstr"; then
- qm=$qstr
- break;
- fi
- done
- fi
-fi
-if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: qmake not found via pkg-config"
-fi
-
-# qt4 check: PATH
-if [ -z "$qm" ]; then
- for n in $names; do
- qstr=`$WHICH $n 2>/dev/null`
- if qmake_check_v4 "$qstr"; then
- qm=$qstr
- break;
- fi
- done
-fi
-if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: qmake not found via \$PATH"
-fi
-
-if [ -z "$qm" ]; then
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo " -> fail"
- else
- echo "fail"
- fi
- printf "\n"
- printf "Reason: Unable to find the 'qmake' tool for Qt 4.\n"
- printf "\n"
- show_qt_info
- exit 1;
-fi
-if [ "$QC_VERBOSE" = "Y" ]; then
- echo qmake found in $qm
-fi
-
-# try to determine the active makespec
-defmakespec=$QMAKESPEC
-if [ -z "$defmakespec" ]; then
- if $WHICH readlink >/dev/null 2>&1; then
- READLINK=`$WHICH readlink`
- fi
- if [ ! -z "$READLINK" ]; then
- qt_mkspecsdir=`$qm -query QT_INSTALL_DATA`/mkspecs
- if [ -d "$qt_mkspecsdir" ] && [ -h "$qt_mkspecsdir/default" ]; then
- defmakespec=`$READLINK $qt_mkspecsdir/default`
- fi
- fi
-fi
-
-if [ "$QC_VERBOSE" = "Y" ]; then
- echo makespec is $defmakespec
-fi
-
-qm_spec=""
-# if the makespec is macx-xcode, force macx-g++
-if [ "$defmakespec" = "macx-xcode" ]; then
- qm_spec=macx-g++
- QMAKESPEC=$qm_spec
- export QMAKESPEC
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo overriding makespec to $qm_spec
- fi
-fi
-
-gen_files() {
-cat >$1/modules.cpp <= 4.2
------END QCMOD-----
-*/
-class qc_qt42 : public ConfObj
-{
-public:
- qc_qt42(Conf *c) : ConfObj(c) {}
- QString name() const { return "Qt >= 4.2"; }
- QString shortname() const { return "qt42"; }
- bool exec()
- {
- conf->debug(QString("QT_VERSION = 0x%1").arg(QString::number(QT_VERSION, 16)));
- if(QT_VERSION >= 0x040200)
- return true;
- else
- return false;
- }
-};
-#line 1 "buildmode.qcm"
-/*
------BEGIN QCMOD-----
-name: buildmode
-section: project
-arg: release,Build with debugging turned off (default).
-arg: debug,Build with debugging turned on.
-arg: debug-and-release,Build two versions, with and without debugging turned on (windows/mac only).
-arg: no-separate-debug-info,Do not store debug information in a separate file (unix only, default for mac).
-arg: separate-debug-info,Strip debug information into a separate .debug file (unix only, default for non-mac).
------END QCMOD-----
-*/
-
-#define QC_BUILDMODE
-bool qc_buildmode_release = false;
-bool qc_buildmode_debug = false;
-bool qc_buildmode_separate_debug_info = false;
-
-class qc_buildmode : public ConfObj
-{
-public:
- qc_buildmode(Conf *c) : ConfObj(c) {}
- QString name() const { return "buildmode"; }
- QString shortname() const { return "buildmode"; }
-
- // no output
- QString checkString() const { return QString(); }
-
- bool exec()
- {
- // first, parse out the options
- bool opt_release = false;
- bool opt_debug = false;
- bool opt_debug_and_release = false;
- bool opt_no_separate_debug_info = false;
- bool opt_separate_debug_info = false;
-
- if(conf->getenv("QC_RELEASE") == "Y")
- opt_release = true;
- if(conf->getenv("QC_DEBUG") == "Y")
- opt_debug = true;
- if(conf->getenv("QC_DEBUG_AND_RELEASE") == "Y")
- opt_debug_and_release = true;
- if(conf->getenv("QC_NO_SEPARATE_DEBUG_INFO") == "Y")
- opt_no_separate_debug_info = true;
- if(conf->getenv("QC_SEPARATE_DEBUG_INFO") == "Y")
- opt_separate_debug_info = true;
-
-#if !defined(Q_OS_WIN) && !defined(Q_OS_MAC)
- if(opt_debug_and_release)
- {
- printf("\nError: The --debug-and-release option is for windows/mac only.\n");
- exit(1);
- }
-#endif
-
-#ifdef Q_OS_WIN
- if(opt_no_separate_debug_info)
- {
- printf("\nError: The --no-separate-debug-info option is for unix only.\n");
- exit(1);
- }
-
- if(opt_separate_debug_info)
- {
- printf("\nError: The --separate-debug-info option is for unix only.\n");
- exit(1);
- }
-#endif
-
- // sanity check exclusive options
- int x;
-
- // build mode
- x = 0;
- if(opt_release)
- ++x;
- if(opt_debug)
- ++x;
- if(opt_debug_and_release)
- ++x;
- if(x > 1)
- {
- printf("\nError: Use only one of --release, --debug, or --debug-and-release.\n");
- exit(1);
- }
-
- // debug info
- x = 0;
- if(opt_no_separate_debug_info)
- ++x;
- if(opt_separate_debug_info)
- ++x;
- if(x > 1)
- {
- printf("\nError: Use only one of --separate-debug-info or --no-separate-debug-info\n");
- exit(1);
- }
-
- // now process the options
-
- if(opt_release)
- qc_buildmode_release = true;
- else if(opt_debug)
- qc_buildmode_debug = true;
- else if(opt_debug_and_release)
- {
- qc_buildmode_release = true;
- qc_buildmode_debug = true;
- }
- else // default
- qc_buildmode_release = true;
-
- if(opt_separate_debug_info)
- qc_buildmode_separate_debug_info = true;
- else if(opt_no_separate_debug_info)
- {
- // nothing to do
- }
- else // default
- {
-#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
- qc_buildmode_separate_debug_info = true;
-#endif
- }
-
- // make the string
- QStringList opts;
- QString other;
-
- if(qc_buildmode_release && qc_buildmode_debug)
- {
- opts += "debug_and_release";
- opts += "build_all";
- }
- else if(qc_buildmode_release)
- opts += "release";
- else // qc_buildmode_debug
- opts += "debug";
-
- if(qc_buildmode_separate_debug_info)
- {
- opts += "separate_debug_info";
- other += "QMAKE_CFLAGS += -g\n";
- other += "QMAKE_CXXFLAGS += -g\n";
- }
-
- QString str = QString("CONFIG += ") + opts.join(" ") + '\n';
- conf->addExtra(str);
-
- if(!other.isEmpty())
- conf->addExtra(other);
-
- return true;
- }
-};
-#line 1 "buildmode_framework.qcm"
-/*
------BEGIN QCMOD-----
-name: buildmode_framework
-section: project
-arg: no-framework,Do not build as a Mac framework.
-arg: framework,Build as a Mac framework (default).
------END QCMOD-----
-*/
-
-#define QC_BUILDMODE_FRAMEWORK
-bool qc_buildmode_framework_enabled = false;
-
-class qc_buildmode_framework : public ConfObj
-{
-public:
- qc_buildmode_framework(Conf *c) : ConfObj(c) {}
- QString name() const { return "buildmode_framework"; }
- QString shortname() const { return "buildmode_framework"; }
-
- // no output
- QString checkString() const { return QString(); }
-
- bool exec()
- {
- // first, parse out the options
- bool opt_no_framework = false;
- bool opt_framework = false;
-
- if(conf->getenv("QC_NO_FRAMEWORK") == "Y")
- opt_no_framework = true;
- if(conf->getenv("QC_FRAMEWORK") == "Y")
- opt_framework = true;
-
- bool staticmode = false;
- if(conf->getenv("QC_STATIC") == "Y")
- staticmode = true;
-
-#ifndef Q_OS_MAC
- if(opt_framework)
- {
- printf("\nError: The --framework option is for mac only.\n");
- exit(1);
- }
-#endif
-
- if(opt_framework && qc_buildmode_debug)
- {
- printf("\nError: Cannot use both --framework and --debug.\n");
- exit(1);
- }
-
- // sanity check exclusive options
- int x;
-
- // framework
- if(opt_framework && staticmode)
- {
- printf("\nError: Cannot use both --framework and --static.\n");
- exit(1);
- }
-
- x = 0;
- if(opt_no_framework)
- ++x;
- if(opt_framework)
- ++x;
- if(x > 1)
- {
- printf("\nError: Use only one of --framework or --no-framework.\n");
- exit(1);
- }
-
-#ifdef Q_OS_MAC
- // now process the options
-
- if(opt_framework)
- qc_buildmode_framework_enabled = true;
- else if(opt_no_framework)
- {
- // nothing to do
- }
- else // default
- {
- if(!staticmode && !qc_buildmode_debug)
- qc_buildmode_framework_enabled = true;
- }
-
- if(qc_buildmode_framework_enabled)
- conf->addExtra("CONFIG += lib_bundle");
-#endif
-
- return true;
- }
-};
-#line 1 "universal.qcm"
-/*
------BEGIN QCMOD-----
-name: Mac universal binary support
-section: project
-arg: universal,Build with Mac universal binary support.
-arg: mac-sdk=[path],Path to Mac universal SDK (PPC host only).
------END QCMOD-----
-*/
-
-#define QC_UNIVERSAL
-bool qc_universal_enabled = false;
-QString qc_universal_sdk;
-
-//----------------------------------------------------------------------------
-// qc_universal
-//----------------------------------------------------------------------------
-class qc_universal : public ConfObj
-{
-public:
- qc_universal(Conf *c) : ConfObj(c) {}
- QString name() const { return "Mac universal binary support"; }
- QString shortname() const { return "universal"; }
- QString checkString() const { return QString(); }
-
- bool exec()
- {
-#ifdef Q_OS_MAC
- if(qc_getenv("QC_UNIVERSAL") == "Y")
- {
- qc_universal_enabled = true;
-
- QString str =
- "contains(QT_CONFIG,x86):contains(QT_CONFIG,ppc) {\n"
- " CONFIG += x86 ppc\n"
- "}\n";
-
- QString sdk = qc_getenv("QC_MAC_SDK");
- if(!sdk.isEmpty())
- {
- str += QString("QMAKE_MAC_SDK = %1\n").arg(sdk);
- qc_universal_sdk = sdk;
- }
-
- conf->addExtra(str);
- }
-#endif
- return true;
- }
-};
-#line 1 "extra.qcm"
-/*
------BEGIN QCMOD-----
-name: extra
-section: project
-arg: disable-tests,Don't build examples and unittests.
------END QCMOD-----
-*/
-
-class qc_extra : public ConfObj
-{
-public:
- qc_extra(Conf *c) : ConfObj(c) {}
- QString name() const { return "extra"; }
- QString shortname() const { return "extra"; }
-
- // no output
- QString checkString() const { return QString(); }
-
- bool exec()
- {
-#ifndef Q_OS_WIN
- // --prefix=\$pwd ?
- QString datadir;
- if(QFile::exists(conf->getenv("PREFIX") + "/qca.pro"))
- datadir = "\$\$PREFIX";
- else
- datadir = "\$\$DATADIR/qca";
-
- conf->addExtra(makeEscapedDefine("DATADIR", datadir));
-#endif
-
- QString str;
- QFile f;
-
-#ifndef Q_OS_WIN
- // HAVE_SYS_FILIO_H
- if(conf->findHeader("sys/filio.h", QStringList(), &str))
- {
- if(!str.isEmpty())
- conf->addIncludePath(str);
- conf->addDefine("HAVE_SYS_FILIO_H");
- }
-
- // MLOCK_NOT_VOID_PTR
- str =
- "# include \n"
- "# include \n"
- "int main() { void *f = 0; return mlock(f,8); }\n";
- if(!conf->doCompileAndLink(str, QStringList(), QString(), QString()))
- {
- conf->debug("mlock(2) does not take a void *");
- conf->addDefine("MLOCK_NOT_VOID_PTR");
- }
-
- str = QString();
-#endif
-
- if(conf->getenv("QC_DISABLE_TESTS") == "Y")
- str += "QCA_NO_TESTS = 1\n";
-
- conf->addExtra(str);
-
- bool release = true;
- bool debug = false;
- bool debug_info = false;
- bool universal = false;
- QString sdk;
-
-#ifdef QC_BUILDMODE
- release = qc_buildmode_release;
- debug = qc_buildmode_debug;
- debug_info = qc_buildmode_separate_debug_info;
-#endif
-
-#ifdef QC_UNIVERSAL
- universal = qc_universal_enabled;
- sdk = qc_universal_sdk;
-#endif
-
- // write confapp.pri
- str = QString();
-#ifndef Q_OS_WIN
- QString var = conf->getenv("BINDIR");
- if(!var.isEmpty())
- str += QString("BINDIR = %1\n").arg(var);
-#endif
- if(debug) // debug or debug-and-release
- str += QString("CONFIG += debug\n");
- else // release
- str += QString("CONFIG += release\n");
- if(debug_info)
- {
- str += QString("CONFIG += separate_debug_info\n");
- str += "QMAKE_CFLAGS += -g\n";
- str += "QMAKE_CXXFLAGS += -g\n";
- }
- if(universal)
- {
- str +=
- "contains(QT_CONFIG,x86):contains(QT_CONFIG,ppc) {\n"
- " CONFIG += x86 ppc\n"
- "}\n";
-
- if(!sdk.isEmpty())
- str += QString("QMAKE_MAC_SDK = %1\n").arg(sdk);
- }
- f.setFileName("confapp.pri");
- if(f.open(QFile::WriteOnly | QFile::Truncate))
- f.write(str.toLatin1());
- f.close();
-
-#ifdef Q_OS_WIN
- QString prefix = QDir::currentPath();
- QString incdir = prefix + "/include";
- QString libdir = prefix + "/lib";
-#else
- QString prefix = conf->getenv("PREFIX");
- QString incdir = conf->getenv("INCDIR");
- QString libdir = conf->getenv("LIBDIR");
-#endif
-
- // write qmake-feature file
- QString crypto_in;
- f.setFileName("crypto.prf.in");
- if(f.open(QFile::ReadOnly))
- {
- crypto_in = QString::fromUtf8(f.readAll());
- f.close();
- }
-
- str = QString("QCA_INCDIR = %1\n").arg(incdir);
- str += QString("QCA_LIBDIR = %1\n").arg(libdir);
- str += crypto_in;
-
- f.setFileName("crypto.prf");
- if(f.open(QFile::WriteOnly | QFile::Truncate))
- {
- f.write(str.toLatin1());
- f.close();
- }
-
-#ifndef Q_OS_WIN
- str = QString(
- "prffiles.path = %1/mkspecs/features\n"
- "prffiles.files = crypto.prf\n"
- "INSTALLS += prffiles\n"
- ).arg(QLibraryInfo::location(QLibraryInfo::DataPath));
- conf->addExtra(str);
-
- // write pkg-config files
-
- QString pkg_template1 = QString(
- "prefix=%1\n"
- "exec_prefix=\${prefix}\n"
- "libdir=%2\n"
- "includedir=%3/QtCrypto\n"
- "\n");
-
- QString pkg_template2 = QString(
- "Name: %1\n"
- "Description: Qt Cryptographic Architecture library\n"
- "Version: 2.0.3\n");
-
- QString pkg_template3 = QString(
- "Requires: %1\n");
-
- QString pkg_template4 = QString(
- "Libs: -L\${libdir} -l%1\n"
- "Cflags: -I\${includedir}\n"
- "\n");
-
- QStringList pcfiles;
-
- QDir dir = QDir::current();
- dir.mkdir("lib");
- dir.cd("lib");
- dir.mkdir("pkgconfig");
-
- bool do_pc_normal = false;
- bool do_pc_debug = false;
-
-#ifdef Q_OS_MAC
- if(release)
- do_pc_normal = true;
- if(debug)
- do_pc_debug = true;
-#else
- do_pc_normal = true;
-#endif
-
- if(do_pc_normal)
- {
- str = pkg_template1.arg(prefix, libdir, incdir);
- str += pkg_template2.arg("QCA");
- str += pkg_template3.arg("QtCore");
- str += pkg_template4.arg("qca");
- f.setFileName("lib/pkgconfig/qca2.pc");
- if(f.open(QFile::WriteOnly | QFile::Truncate))
- f.write(str.toLatin1());
- f.close();
- pcfiles += "lib/pkgconfig/qca2.pc";
- }
-
- if(do_pc_debug)
- {
- str = pkg_template1.arg(prefix, libdir, incdir);
- str += pkg_template2.arg("QCA_debug");
- str += pkg_template3.arg("QtCore_debug");
- str += pkg_template4.arg("qca_debug");
- f.setFileName("lib/pkgconfig/qca2_debug.pc");
- if(f.open(QFile::WriteOnly | QFile::Truncate))
- f.write(str.toLatin1());
- f.close();
- pcfiles += "lib/pkgconfig/qca2_debug.pc";
- }
-
- if(!pcfiles.isEmpty())
- {
- str = QString(
- "pcfiles.path = \$\$LIBDIR/pkgconfig\n"
- "pcfiles.files = %1\n"
- "INSTALLS += pcfiles\n"
- ).arg(pcfiles.join(" "));
- conf->addExtra(str);
- }
-#endif
-
- return true;
- }
-
- QString makeEscapedDefine(const QString &var, const QString &val)
- {
- QString str = QString(
- "DEFINES += %1=\\\\\\\\\\\\\\"%2\\\\\\\\\\\\\\"\n"
- ).arg(var).arg(val);
- return str;
- }
-};
-#line 1 "certstore.qcm"
-/*
------BEGIN QCMOD-----
-name: certstore
-section: project
-arg: certstore-path=[path],Path to the SSL/X509 Certificate store file.
-arg: certstore-internal,Force the use of the bundled store.
------END QCMOD-----
-*/
-
-class qc_certstore : public ConfObj
-{
-public:
- qc_certstore(Conf *c) : ConfObj(c) {}
- QString name() const { return "certstore"; }
- QString shortname() const { return "certstore"; }
-
- bool exec()
- {
- bundled = false;
-
-#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
- // use built-in
- return true;
-#else
- if(conf->getenv("QC_CERTSTORE_INTERNAL") != "Y")
- {
- QStringList pathsToTry;
-
- path = conf->getenv("QC_CERTSTORE_PATH");
- if(!path.isEmpty())
- {
- conf->addExtra(makeEscapedDefine("QCA_SYSTEMSTORE_PATH", path));
- return true;
- }
-
- // This is from Debian
- pathsToTry.append( QString("/etc/ssl/certs/ca-certificates.crt") );
-
- // Fedora Core 2 uses these
- pathsToTry.append( QString("/usr/share/ssl/cert.pem") );
- pathsToTry.append( QString("/usr/share/ssl/certs/ca-bundle.crt") );
-
- // Fedora Core 5 changes to this
- pathsToTry.append( QString("/etc/pki/tls/cert.pem") );
-
- for(int n = 0; n < pathsToTry.count(); ++n)
- {
- if(QFile::exists(pathsToTry[n]))
- {
- path = pathsToTry[n];
- break;
- }
- }
- }
-
- // fall back to bundled
- if(path.isEmpty())
- {
- // --prefix=\$pwd ?
- if(QFile::exists(conf->getenv("PREFIX") + "/certs/rootcerts.pem"))
- path = "\$\$PREFIX/certs/rootcerts.pem";
- else
- path = "\$\$DATADIR/qca/certs/rootcerts.pem";
-
- QString extra =
- "sharedfiles.path = \$\$DATADIR/qca\n"
- "sharedfiles.files = certs\n"
- "INSTALLS += sharedfiles\n";
- conf->addExtra(extra);
- bundled = true;
- }
-
- conf->addExtra(makeEscapedDefine("QCA_SYSTEMSTORE_PATH", path));
-
- return true;
-#endif
- }
-
- QString makeEscapedDefine(const QString &var, const QString &val)
- {
- QString str = QString(
- "DEFINES += %1=\\\\\\\\\\\\\\"%2\\\\\\\\\\\\\\"\n"
- ).arg(var).arg(val);
- return str;
- }
-
- QString resultString() const
- {
-#if defined(Q_OS_WIN)
- return "using Windows built-in";
-#elif defined(Q_OS_MAC)
- return "using Mac built-in";
-#else
- if(success)
- {
- if(bundled)
- return "using bundled";
- else
- return path;
- }
- else
- return ConfObj::resultString();
-#endif
- }
-
-private:
- QString path;
- bool bundled;
-};
-
-EOT
-cat >$1/modules_new.cpp <required = true;
- o->disabled = false;
- o = new qc_buildmode(conf);
- o->required = true;
- o->disabled = false;
- o = new qc_buildmode_framework(conf);
- o->required = true;
- o->disabled = false;
- o = new qc_universal(conf);
- o->required = true;
- o->disabled = false;
- o = new qc_extra(conf);
- o->required = true;
- o->disabled = false;
- o = new qc_certstore(conf);
- o->required = true;
- o->disabled = false;
-
-EOT
-cat >$1/conf4.h <
-
-class Conf;
-
-enum VersionMode { VersionMin, VersionExact, VersionMax, VersionAny };
-
-// ConfObj
-//
-// Subclass ConfObj to create a new configuration module.
-class ConfObj
-{
-public:
- Conf *conf;
- bool required;
- bool disabled;
- bool success;
-
- ConfObj(Conf *c);
- virtual ~ConfObj();
-
- // long or descriptive name of what is being checked/performed
- // example: "KDE >= 3.3"
- virtual QString name() const = 0;
-
- // short name
- // example: "kde"
- virtual QString shortname() const = 0;
-
- // string to display during check
- // default: "Checking for [name] ..."
- virtual QString checkString() const;
-
- // string to display after check
- // default: "yes" or "no", based on result of exec()
- virtual QString resultString() const;
-
- // this is where the checking code goes
- virtual bool exec() = 0;
-};
-
-// Conf
-//
-// Interact with this class from your ConfObj to perform detection
-// operations and to output configuration parameters.
-class Conf
-{
-public:
- bool debug_enabled;
- QString qmake_path;
- QString qmakespec;
- QString maketool;
-
- QString DEFINES;
- QString INCLUDEPATH;
- QString LIBS;
- QString extra;
-
- QList list;
- QMap vars;
-
- Conf();
- ~Conf();
-
- QString getenv(const QString &var);
- QString qvar(const QString &s);
-
- bool exec();
-
- void debug(const QString &s);
-
- QString expandIncludes(const QString &inc);
- QString expandLibs(const QString &lib);
-
- int doCommand(const QString &s, QByteArray *out = 0);
- int doCommand(const QString &prog, const QStringList &args, QByteArray *out = 0);
-
- bool doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode = 0);
- bool checkHeader(const QString &path, const QString &h);
- bool findHeader(const QString &h, const QStringList &ext, QString *inc);
- bool checkLibrary(const QString &path, const QString &name);
- bool findLibrary(const QString &name, QString *lib);
- QString findProgram(const QString &prog);
- bool findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs);
- bool findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags);
- bool findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags);
-
- void addDefine(const QString &str);
- void addLib(const QString &str);
- void addIncludePath(const QString &str);
- void addExtra(const QString &str);
-
-private:
- bool first_debug;
-
- friend class ConfObj;
- void added(ConfObj *o);
-};
-
-#endif
-
-EOT
-cat >$1/conf4.cpp <
-#include
-
-class MocTestObject : public QObject
-{
- Q_OBJECT
-public:
- MocTestObject() {}
-};
-
-QString qc_getenv(const QString &var)
-{
- char *p = ::getenv(var.toLatin1().data());
- if(!p)
- return QString();
- return QString(p);
-}
-
-QStringList qc_pathlist()
-{
- QStringList list;
- QString path = qc_getenv("PATH");
- if(!path.isEmpty())
- {
-#ifdef Q_OS_WIN
- list = path.split(';', QString::SkipEmptyParts);
-#else
- list = path.split(':', QString::SkipEmptyParts);
-#endif
- }
-#ifdef Q_OS_WIN
- list.prepend(".");
-#endif
- return list;
-}
-
-QString qc_findprogram(const QString &prog)
-{
- QString out;
- QStringList list = qc_pathlist();
- for(int n = 0; n < list.count(); ++n)
- {
- QFileInfo fi(list[n] + '/' + prog);
- if(fi.exists() && fi.isExecutable())
- {
- out = fi.filePath();
- break;
- }
-
-#ifdef Q_OS_WIN
- // on windows, be sure to look for .exe
- if(prog.right(4).toLower() != ".exe")
- {
- fi = QFileInfo(list[n] + '/' + prog + ".exe");
- if(fi.exists() && fi.isExecutable())
- {
- out = fi.filePath();
- break;
- }
- }
-#endif
- }
- return out;
-}
-
-QString qc_findself(const QString &argv0)
-{
-#ifdef Q_OS_WIN
- if(argv0.contains('\\\\'))
-#else
- if(argv0.contains('/'))
-#endif
- return argv0;
- else
- return qc_findprogram(argv0);
-}
-
-int qc_runcommand(const QString &command, QByteArray *out, bool showOutput)
-{
- QString fullcmd = command;
- if(!showOutput)
- {
-#ifdef Q_OS_WIN
- fullcmd += " 2>NUL";
-#else
- fullcmd += " 2>/dev/null";
-#endif
- }
-
-#ifdef Q_OS_WIN
- FILE *f = _popen(fullcmd.toLatin1().data(), "r");
-#else
- FILE *f = popen(fullcmd.toLatin1().data(), "r");
-#endif
- if(!f)
- return -1;
- if(out)
- out->clear();
- while(1)
- {
- char c = (char)fgetc(f);
- if(feof(f))
- break;
- if(out)
- out->append(c);
- if(showOutput)
- fputc(c, stdout);
- }
-#ifdef Q_OS_WIN
- int ret = _pclose(f);
-#else
- int ret = pclose(f);
-#endif
- if(ret == -1)
- return -1;
- return ret;
-}
-
-int qc_runprogram(const QString &prog, const QStringList &args, QByteArray *out, bool showOutput)
-{
- QString fullcmd = prog;
- QString argstr = args.join(" ");
- if(!argstr.isEmpty())
- fullcmd += QString(" ") + argstr;
- return qc_runcommand(fullcmd, out, showOutput);
-
- // TODO: use QProcess once it is fixed
- /*
- QProcess process;
- if(showOutput)
- process.setReadChannelMode(ForwardedChannels);
- process.start(prog, args);
- process.waitForFinished(-1);
- return process.exitCode();
- */
-}
-
-bool qc_removedir(const QString &dirPath)
-{
- QDir dir(dirPath);
- if(!dir.exists())
- return false;
- QStringList list = dir.entryList();
- foreach(QString s, list)
- {
- if(s == "." || s == "..")
- continue;
- QFileInfo fi(dir.filePath(s));
- if(fi.isDir())
- {
- if(!qc_removedir(fi.filePath()))
- return false;
- }
- else
- {
- if(!dir.remove(s))
- return false;
- }
- }
- QString dirName = dir.dirName();
- if(!dir.cdUp())
- return false;
- if(!dir.rmdir(dirName))
- return false;
- return true;
-}
-
-void qc_splitcflags(const QString &cflags, QStringList *incs, QStringList *otherflags)
-{
- incs->clear();
- otherflags->clear();
-
- QStringList cflagsList = cflags.split(" ");
- for(int n = 0; n < cflagsList.count(); ++n)
- {
- QString str = cflagsList[n];
- if(str.startsWith("-I"))
- {
- // we want everything except the leading "-I"
- incs->append(str.remove(0, 2));
- }
- else
- {
- // we want whatever is left
- otherflags->append(str);
- }
- }
-}
-
-QString qc_escapeArg(const QString &str)
-{
- QString out;
- for(int n = 0; n < (int)str.length(); ++n) {
- if(str[n] == '-')
- out += '_';
- else
- out += str[n];
- }
- return out;
-}
-
-//----------------------------------------------------------------------------
-// ConfObj
-//----------------------------------------------------------------------------
-ConfObj::ConfObj(Conf *c)
-{
- conf = c;
- conf->added(this);
- required = false;
- disabled = false;
- success = false;
-}
-
-ConfObj::~ConfObj()
-{
-}
-
-QString ConfObj::checkString() const
-{
- return QString("Checking for %1 ...").arg(name());
-}
-
-QString ConfObj::resultString() const
-{
- if(success)
- return "yes";
- else
- return "no";
-}
-
-//----------------------------------------------------------------------------
-// qc_internal_pkgconfig
-//----------------------------------------------------------------------------
-class qc_internal_pkgconfig : public ConfObj
-{
-public:
- QString pkgname, desc;
- VersionMode mode;
- QString req_ver;
-
- qc_internal_pkgconfig(Conf *c, const QString &_name, const QString &_desc, VersionMode _mode, const QString &_req_ver) : ConfObj(c)
- {
- pkgname = _name;
- desc = _desc;
- mode = _mode;
- req_ver = _req_ver;
- }
-
- QString name() const { return desc; }
- QString shortname() const { return pkgname; }
-
- bool exec()
- {
- QStringList incs;
- QString version, libs, other;
- if(!conf->findPkgConfig(pkgname, mode, req_ver, &version, &incs, &libs, &other))
- return false;
-
- for(int n = 0; n < incs.count(); ++n)
- conf->addIncludePath(incs[n]);
- if(!libs.isEmpty())
- conf->addLib(libs);
- //if(!other.isEmpty())
- // conf->addExtra(QString("QMAKE_CFLAGS += %1\n").arg(other));
- return true;
- }
-};
-
-//----------------------------------------------------------------------------
-// Conf
-//----------------------------------------------------------------------------
-Conf::Conf()
-{
- // TODO: no more vars?
- //vars.insert("QMAKE_INCDIR_X11", new QString(X11_INC));
- //vars.insert("QMAKE_LIBDIR_X11", new QString(X11_LIBDIR));
- //vars.insert("QMAKE_LIBS_X11", new QString(X11_LIB));
- //vars.insert("QMAKE_CC", CC);
-
- debug_enabled = false;
-}
-
-Conf::~Conf()
-{
- qDeleteAll(list);
-}
-
-void Conf::added(ConfObj *o)
-{
- list.append(o);
-}
-
-QString Conf::getenv(const QString &var)
-{
- return qc_getenv(var);
-}
-
-void Conf::debug(const QString &s)
-{
- if(debug_enabled)
- {
- if(first_debug)
- printf("\n");
- first_debug = false;
- printf(" * %s\n", qPrintable(s));
- }
-}
-
-bool Conf::exec()
-{
- for(int n = 0; n < list.count(); ++n)
- {
- ConfObj *o = list[n];
-
- // if this was a disabled-by-default option, check if it was enabled
- if(o->disabled)
- {
- QString v = QString("QC_ENABLE_") + qc_escapeArg(o->shortname());
- if(getenv(v) != "Y")
- continue;
- }
- // and the opposite?
- else
- {
- QString v = QString("QC_DISABLE_") + qc_escapeArg(o->shortname());
- if(getenv(v) == "Y")
- continue;
- }
-
- bool output = true;
- QString check = o->checkString();
- if(check.isEmpty())
- output = false;
-
- if(output)
- {
- printf("%s", check.toLatin1().data());
- fflush(stdout);
- }
-
- first_debug = true;
- bool ok = o->exec();
- o->success = ok;
-
- if(output)
- {
- QString result = o->resultString();
- if(!first_debug)
- printf(" -> %s\n", result.toLatin1().data());
- else
- printf(" %s\n", result.toLatin1().data());
- }
-
- if(!ok && o->required)
- {
- printf("\nError: need %s!\n", o->name().toLatin1().data());
- return false;
- }
- }
- return true;
-}
-
-QString Conf::qvar(const QString &s)
-{
- return vars.value(s);
-}
-
-QString Conf::expandIncludes(const QString &inc)
-{
- return QString("-I") + inc;
-}
-
-QString Conf::expandLibs(const QString &lib)
-{
- return QString("-L") + lib;
-}
-
-int Conf::doCommand(const QString &s, QByteArray *out)
-{
- debug(QString("[%1]").arg(s));
- int r = qc_runcommand(s, out, debug_enabled);
- debug(QString("returned: %1").arg(r));
- return r;
-}
-
-int Conf::doCommand(const QString &prog, const QStringList &args, QByteArray *out)
-{
- QString fullcmd = prog;
- QString argstr = args.join(" ");
- if(!argstr.isEmpty())
- fullcmd += QString(" ") + argstr;
- debug(QString("[%1]").arg(fullcmd));
- int r = qc_runprogram(prog, args, out, debug_enabled);
- debug(QString("returned: %1").arg(r));
- return r;
-}
-
-bool Conf::doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode)
-{
-#ifdef Q_OS_WIN
- QDir tmp("qconftemp");
-#else
- QDir tmp(".qconftemp");
-#endif
-
- if(!tmp.mkdir("atest"))
- {
- debug("unable to create atest dir");
- return false;
- }
- QDir dir(tmp.filePath("atest"));
- if(!dir.exists())
- {
- debug("atest dir does not exist");
- return false;
- }
-
- QString fname = dir.filePath("atest.cpp");
- QString out = "atest";
- QFile f(fname);
- if(!f.open(QFile::WriteOnly | QFile::Truncate))
- {
- debug("unable to open atest.cpp for writing");
- return false;
- }
- if(f.write(filedata.toLatin1()) == -1)
- {
- debug("error writing to atest.cpp");
- return false;
- }
- f.close();
-
- debug(QString("Wrote atest.cpp:\n%1").arg(filedata));
-
- QString pro = QString(
- "CONFIG += console\n"
- "CONFIG -= qt app_bundle\n"
- "DESTDIR = \$\$PWD\n"
- "SOURCES += atest.cpp\n");
- QString inc = incs.join(" ");
- if(!inc.isEmpty())
- pro += "INCLUDEPATH += " + inc + '\n';
- if(!libs.isEmpty())
- pro += "LIBS += " + libs + '\n';
- pro += proextra;
-
- fname = dir.filePath("atest.pro");
- f.setFileName(fname);
- if(!f.open(QFile::WriteOnly | QFile::Truncate))
- {
- debug("unable to open atest.pro for writing");
- return false;
- }
- if(f.write(pro.toLatin1()) == -1)
- {
- debug("error writing to atest.pro");
- return false;
- }
- f.close();
-
- debug(QString("Wrote atest.pro:\n%1").arg(pro));
-
- QString oldpath = QDir::currentPath();
- QDir::setCurrent(dir.path());
-
- bool ok = false;
- int r = doCommand(qmake_path, QStringList() << "atest.pro");
- if(r == 0)
- {
- r = doCommand(maketool, QStringList());
- if(r == 0)
- {
- ok = true;
- if(retcode)
- {
- QString runatest = out;
-#ifdef Q_OS_UNIX
- runatest.prepend("./");
-#endif
- *retcode = doCommand(runatest, QStringList());
- }
- }
- r = doCommand(maketool, QStringList() << "distclean");
- if(r != 0)
- debug("error during atest distclean");
- }
-
- QDir::setCurrent(oldpath);
-
- // cleanup
- //dir.remove("atest.pro");
- //dir.remove("atest.cpp");
- //tmp.rmdir("atest");
-
- // remove whole dir since distclean doesn't always work
- qc_removedir(tmp.filePath("atest"));
-
- if(!ok)
- return false;
- return true;
-}
-
-bool Conf::checkHeader(const QString &path, const QString &h)
-{
- QFileInfo fi(path + '/' + h);
- if(fi.exists())
- return true;
- return false;
-}
-
-bool Conf::findHeader(const QString &h, const QStringList &ext, QString *inc)
-{
- if(checkHeader("/usr/include", h))
- {
- *inc = "";
- return true;
- }
- QStringList dirs;
- dirs += "/usr/local/include";
- dirs += ext;
- for(QStringList::ConstIterator it = dirs.begin(); it != dirs.end(); ++it)
- {
- if(checkHeader(*it, h))
- {
- *inc = *it;
- return true;
- }
- }
- return false;
-}
-
-bool Conf::checkLibrary(const QString &path, const QString &name)
-{
- QString str =
- //"#include \n"
- "int main()\n"
- "{\n"
- //" printf(\"library checker running\\\\n\");\n"
- " return 0;\n"
- "}\n";
-
- QString libs;
- if(!path.isEmpty())
- libs += QString("-L") + path + ' ';
- libs += QString("-l") + name;
- if(!doCompileAndLink(str, QStringList(), libs, QString()))
- return false;
- return true;
-}
-
-bool Conf::findLibrary(const QString &name, QString *lib)
-{
- if(checkLibrary("", name))
- {
- *lib = "";
- return true;
- }
- if(checkLibrary("/usr/local/lib", name))
- {
- *lib = "/usr/local/lib";
- return true;
- }
- return false;
-}
-
-QString Conf::findProgram(const QString &prog)
-{
- return qc_findprogram(prog);
-}
-
-bool Conf::findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs)
-{
- QString inc, lib;
- QString s;
-
- s = getenv(incvar);
- if(!s.isEmpty()) {
- if(!checkHeader(s, incname))
- return false;
- inc = s;
- }
- else {
- if(!findHeader(incname, QStringList(), &s))
- return false;
- inc = s;
- }
-
- s = getenv(libvar);
- if(!s.isEmpty()) {
- if(!checkLibrary(s, libname))
- return false;
- lib = s;
- }
- else {
- if(!findLibrary(libname, &s))
- return false;
- lib = s;
- }
-
- QString lib_out;
- if(!lib.isEmpty())
- lib_out += QString("-L") + s;
- lib_out += QString("-l") + libname;
-
- *incpath = inc;
- *libs = lib_out;
- return true;
-}
-
-bool Conf::findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags)
-{
- QStringList args;
- QByteArray out;
- int ret;
-
- args += "--version";
- ret = doCommand(path, args, &out);
- if(ret != 0)
- return false;
-
- QString version_out = QString::fromLatin1(out).trimmed();
-
- args.clear();
- args += "--libs";
- ret = doCommand(path, args, &out);
- if(ret != 0)
- return false;
-
- QString libs_out = QString::fromLatin1(out).trimmed();
-
- args.clear();
- args += "--cflags";
- ret = doCommand(path, args, &out);
- if(ret != 0)
- return false;
-
- QString cflags = QString::fromLatin1(out).trimmed();
-
- QStringList incs_out, otherflags_out;
- qc_splitcflags(cflags, &incs_out, &otherflags_out);
-
- *version = version_out;
- *incs = incs_out;
- *libs = libs_out;
- *otherflags = otherflags_out.join(" ");
- return true;
-}
-
-bool Conf::findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags)
-{
- QStringList args;
- QByteArray out;
- int ret;
-
- args += name;
- args += "--exists";
- ret = doCommand("pkg-config", args, &out);
- if(ret != 0)
- return false;
-
- if(mode != VersionAny)
- {
- args.clear();
- args += name;
- if(mode == VersionMin)
- args += QString("--atleast-version=%1").arg(req_version);
- else if(mode == VersionMax)
- args += QString("--max-version=%1").arg(req_version);
- else
- args += QString("--exact-version=%1").arg(req_version);
- ret = doCommand("pkg-config", args, &out);
- if(ret != 0)
- return false;
- }
-
- args.clear();
- args += name;
- args += "--modversion";
- ret = doCommand("pkg-config", args, &out);
- if(ret != 0)
- return false;
-
- QString version_out = QString::fromLatin1(out).trimmed();
-
- args.clear();
- args += name;
- args += "--libs";
- ret = doCommand("pkg-config", args, &out);
- if(ret != 0)
- return false;
-
- QString libs_out = QString::fromLatin1(out).trimmed();
-
- args.clear();
- args += name;
- args += "--cflags";
- ret = doCommand("pkg-config", args, &out);
- if(ret != 0)
- return false;
-
- QString cflags = QString::fromLatin1(out).trimmed();
-
- QStringList incs_out, otherflags_out;
- qc_splitcflags(cflags, &incs_out, &otherflags_out);
-
- *version = version_out;
- *incs = incs_out;
- *libs = libs_out;
- *otherflags = otherflags_out.join(" ");
- return true;
-}
-
-void Conf::addDefine(const QString &str)
-{
- if(DEFINES.isEmpty())
- DEFINES = str;
- else
- DEFINES += QString(" ") + str;
- debug(QString("DEFINES += %1").arg(str));
-}
-
-void Conf::addLib(const QString &str)
-{
- if(LIBS.isEmpty())
- LIBS = str;
- else
- LIBS += QString(" ") + str;
- debug(QString("LIBS += %1").arg(str));
-}
-
-void Conf::addIncludePath(const QString &str)
-{
- if(INCLUDEPATH.isEmpty())
- INCLUDEPATH = str;
- else
- INCLUDEPATH += QString(" ") + str;
- debug(QString("INCLUDEPATH += %1").arg(str));
-}
-
-void Conf::addExtra(const QString &str)
-{
- extra += str + '\n';
- debug(QString("extra += %1").arg(str));
-}
-
-//----------------------------------------------------------------------------
-// main
-//----------------------------------------------------------------------------
-#include "conf4.moc"
-
-#ifdef HAVE_MODULES
-# include"modules.cpp"
-#endif
-
-int main()
-{
- Conf *conf = new Conf;
- ConfObj *o;
- o = 0;
-#ifdef HAVE_MODULES
-# include"modules_new.cpp"
-#endif
-
- conf->debug_enabled = (qc_getenv("QC_VERBOSE") == "Y") ? true: false;
- if(conf->debug_enabled)
- printf(" -> ok\n");
- else
- printf("ok\n");
-
- QString confCommand = qc_getenv("QC_COMMAND");
- QString proName = qc_getenv("QC_PROFILE");
- conf->qmake_path = qc_getenv("QC_QMAKE");
- conf->qmakespec = qc_getenv("QC_QMAKESPEC");
- conf->maketool = qc_getenv("QC_MAKETOOL");
-
- if(conf->debug_enabled)
- printf("conf command: [%s]\n", qPrintable(confCommand));
-
- QString confPath = qc_findself(confCommand);
- if(confPath.isEmpty())
- {
- printf("Error: cannot find myself; rerun with an absolute path\n");
- return 1;
- }
-
- QString srcdir = QFileInfo(confPath).absolutePath();
- QString builddir = QDir::current().absolutePath();
- QString proPath = QDir(srcdir).filePath(proName);
-
- if(conf->debug_enabled)
- {
- printf("conf path: [%s]\n", qPrintable(confPath));
- printf("srcdir: [%s]\n", qPrintable(srcdir));
- printf("builddir: [%s]\n", qPrintable(builddir));
- printf("profile: [%s]\n", qPrintable(proPath));
- printf("qmake path: [%s]\n", qPrintable(conf->qmake_path));
- printf("qmakespec: [%s]\n", qPrintable(conf->qmakespec));
- printf("make tool: [%s]\n", qPrintable(conf->maketool));
- printf("\n");
- }
-
- bool success = false;
- if(conf->exec())
- {
- QFile f("conf.pri");
- if(!f.open(QFile::WriteOnly | QFile::Truncate))
- {
- printf("Error writing %s\n", qPrintable(f.fileName()));
- return 1;
- }
-
- QString str;
- str += "# qconf\n\n";
-
- QString var;
- var = qc_getenv("PREFIX");
- if(!var.isEmpty())
- str += QString("PREFIX = %1\n").arg(var);
- var = qc_getenv("BINDIR");
- if(!var.isEmpty())
- str += QString("BINDIR = %1\n").arg(var);
- var = qc_getenv("INCDIR");
- if(!var.isEmpty())
- str += QString("INCDIR = %1\n").arg(var);
- var = qc_getenv("LIBDIR");
- if(!var.isEmpty())
- str += QString("LIBDIR = %1\n").arg(var);
- var = qc_getenv("DATADIR");
- if(!var.isEmpty())
- str += QString("DATADIR = %1\n").arg(var);
- str += '\n';
-
- if(qc_getenv("QC_STATIC") == "Y")
- str += "CONFIG += staticlib\n";
-
- // TODO: don't need this?
- //str += "QT_PATH_PLUGINS = " + QString(qInstallPathPlugins()) + '\n';
-
- if(!conf->DEFINES.isEmpty())
- str += "DEFINES += " + conf->DEFINES + '\n';
- if(!conf->INCLUDEPATH.isEmpty())
- str += "INCLUDEPATH += " + conf->INCLUDEPATH + '\n';
- if(!conf->LIBS.isEmpty())
- str += "LIBS += " + conf->LIBS + '\n';
- if(!conf->extra.isEmpty())
- str += conf->extra;
- str += '\n';
-
- QByteArray cs = str.toLatin1();
- f.write(cs);
- f.close();
- success = true;
- }
- QString qmake_path = conf->qmake_path;
- QString qmakespec = conf->qmakespec;
- delete conf;
-
- if(!success)
- return 1;
-
- // run qmake on the project file
- QStringList args;
- if(!qmakespec.isEmpty())
- {
- args += "-spec";
- args += qmakespec;
- }
- args += proPath;
- int ret = qc_runprogram(qmake_path, args, 0, true);
- if(ret != 0)
- return 1;
-
- return 0;
-}
-
-EOT
-cat >$1/conf4.pro </dev/null
- else
- $qm conf4.pro >/dev/null
- fi
- $MAKE clean >/dev/null 2>&1
- $MAKE >../conf.log 2>&1
-)
-
-if [ "$?" != "0" ]; then
- rm -rf .qconftemp
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo " -> fail"
- else
- echo "fail"
- fi
- printf "\n"
- printf "Reason: There was an error compiling 'conf'. See conf.log for details.\n"
- printf "\n"
- show_qt_info
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo "conf.log:"
- cat conf.log
- fi
- exit 1;
-fi
-
-QC_COMMAND=$0
-export QC_COMMAND
-QC_PROFILE=qca.pro
-export QC_PROFILE
-QC_QMAKE=$qm
-export QC_QMAKE
-QC_QMAKESPEC=$qm_spec
-export QC_QMAKESPEC
-QC_MAKETOOL=$MAKE
-export QC_MAKETOOL
-.qconftemp/conf
-ret="$?"
-if [ "$ret" = "1" ]; then
- rm -rf .qconftemp
- echo
- exit 1;
-else
- if [ "$ret" != "0" ]; then
- rm -rf .qconftemp
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo " -> fail"
- else
- echo "fail"
- fi
- echo
- echo "Reason: Unexpected error launching 'conf'"
- echo
- exit 1;
- fi
-fi
-rm -rf .qconftemp
-
-echo
-echo "Good, your configure finished. Now run $MAKE."
-echo
Binary files /tmp/5eREEt0AAl/qca2-2.0.3/configure.exe and /tmp/TUoR4IBecB/qca2-2.1.0/configure.exe differ
diff -Nru qca2-2.0.3/crypto.prf.cmake qca2-2.1.0/crypto.prf.cmake
--- qca2-2.0.3/crypto.prf.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/crypto.prf.cmake 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,26 @@
+QCA_INCDIR = @CRYPTO_PRF_RELATIVE_PATH@@QCA_INCLUDE_INSTALL_DIR@
+QCA_LIBDIR = @CRYPTO_PRF_RELATIVE_PATH@@QCA_LIBRARY_INSTALL_DIR@
+
+CONFIG *= qt
+
+LINKAGE =
+
+exists($$QCA_LIBDIR/qca.framework) {
+ QMAKE_CXXFLAGS += -F$$QCA_LIBDIR
+ LIBS *= -F$$QCA_LIBDIR
+ INCLUDEPATH += $$QCA_LIBDIR/qca.framework/Headers
+ LINKAGE = -framework qca
+}
+
+# else, link normally
+isEmpty(LINKAGE) {
+ INCLUDEPATH += $$QCA_INCDIR/QtCrypto
+ LIBS += -L$$QCA_LIBDIR
+ LINKAGE = -lqca
+ CONFIG(debug, debug|release) {
+ windows:LINKAGE = -lqcad
+ mac:LINKAGE = -lqca_debug
+ }
+}
+
+LIBS += $$LINKAGE
diff -Nru qca2-2.0.3/crypto.prf.in qca2-2.1.0/crypto.prf.in
--- qca2-2.0.3/crypto.prf.in 2008-06-04 00:48:48.000000000 +0000
+++ qca2-2.1.0/crypto.prf.in 1970-01-01 00:00:00.000000000 +0000
@@ -1,39 +0,0 @@
-# prepend this file with QCA_INCDIR/QCA_LIBDIR definitions
-
-# NOTE: any changes made to this file need to be tracked in qcm/qca.qcm
-
-CONFIG *= qt
-
-# if we are including crypto.prf from the qca tree (and not utilizing it as
-# an installed qmake CONFIG feature), then point to the tree. this allows our
-# qca tree apps to build before qca itself is installed.
-exists($$PWD/qca.pro) {
- QCA_INCDIR = $$PWD/include
- QCA_LIBDIR = $$PWD/lib
-}
-
-LINKAGE =
-
-# on mac, if qca was built as a framework, link against it
-mac: {
- framework_dir = $$QCA_LIBDIR
- exists($$framework_dir/qca.framework) {
- #QMAKE_FRAMEWORKPATH *= $$framework_dir
- LIBS += -F$$framework_dir
- INCLUDEPATH += $$framework_dir/qca.framework/Headers
- LINKAGE = -framework qca
- }
-}
-
-# else, link normally
-isEmpty(LINKAGE) {
- INCLUDEPATH += $$QCA_INCDIR/QtCrypto
- LIBS += -L$$QCA_LIBDIR
- LINKAGE = -lqca
- CONFIG(debug, debug|release) {
- windows:LINKAGE = -lqcad
- mac:LINKAGE = -lqca_debug
- }
-}
-
-LIBS += $$LINKAGE
diff -Nru qca2-2.0.3/debian/changelog qca2-2.1.0/debian/changelog
--- qca2-2.0.3/debian/changelog 2014-06-11 14:54:42.000000000 +0000
+++ qca2-2.1.0/debian/changelog 2015-01-14 15:01:31.000000000 +0000
@@ -1,3 +1,25 @@
+qca2 (2.1.0-0ubuntu1) vivid; urgency=medium
+
+ * New upstream release
+ + This release merges the official plugins into the main package.
+ + Deprecating these sources and their binaries:
+ - qca2-plugin-gnupg
+ - qca2-plugin-ossl
+ - qca-cyrus-sasl
+ + Build system was changed to git
+ + Docs packages was removed as the source does not build documentation
+ + New binary packages:
+ - libqca2-plugins containing all plugins
+ - libqca2-plugin-ossl
+ - libqca2-plugin-gnupg
+ - libqca2-plugin-cyrus-sasl
+ + Added transitional packages for old plugins
+ * Add kubuntu_ignore_filewatch_test.diff to ignore a test which fails in
+ buildds but not for local build
+ * Add kubuntu_mkspecs-dir.diff to install mkspecs to correct place
+
+ -- Harald Sitter Sat, 22 Nov 2014 15:46:56 +0100
+
qca2 (2.0.3-6) unstable; urgency=medium
* Update the symbols file for gcc 4.9. Thanks to Sphinx Jiang for the
diff -Nru qca2-2.0.3/debian/control qca2-2.1.0/debian/control
--- qca2-2.0.3/debian/control 2014-06-11 14:53:35.000000000 +0000
+++ qca2-2.1.0/debian/control 2015-01-14 14:53:11.000000000 +0000
@@ -1,24 +1,31 @@
Source: qca2
Priority: optional
Section: libs
-Maintainer: Debian Qt/KDE Maintainers
+Maintainer: Debian/Kubuntu Qt/KDE Maintainers
Uploaders: Jan Niehusmann , Felix Geyer ,
Modestas Vainius
-Build-Depends: debhelper (>= 9), pkg-kde-tools (>= 0.12),
- libqt4-dev (>= 4.4.0), ca-certificates
-Build-Conflicts: libqca2-dev, qca-dev
-Standards-Version: 3.9.5
+Build-Depends: debhelper (>= 9), pkg-kde-tools (>= 0.12), cmake, pkg-config,
+ libqt4-dev (>= 4.4.0), ca-certificates, libsasl2-dev, libssl-dev, doxygen
+Build-Conflicts: qca-dev
+Standards-Version: 3.9.6
Homepage: http://delta.affinix.com/qca/
Vcs-Git: git://anonscm.debian.org/pkg-kde/kde-req/qca2.git
Vcs-Browser: http://anonscm.debian.org/gitweb/?p=pkg-kde/kde-req/qca2.git
+Package: libqca2-plugins
+Architecture: any
+Multi-Arch: same
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: QCA plugins for libqca2
+ This plugin provides cryptographic as well as helper plugins for Qt
+ Cryptographic Architecture (QCA).
+
Package: libqca2
Architecture: any
Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends}
Depends: ${shlibs:Depends}, ${misc:Depends}
-Recommends: ca-certificates
-Suggests: libqca2-plugin-cyrus-sasl, libqca2-plugin-gnupg, libqca2-plugin-ossl
+Recommends: ca-certificates, libqca2-plugins
Description: libraries for the Qt Cryptographic Architecture
The Qt Cryptographic Architecture (QCA) provides a straightforward and cross-
platform API for a range of cryptographic features, including SSL/TLS,
@@ -57,8 +64,7 @@
Section: libdevel
Architecture: any
Depends: ${misc:Depends}, libqca2 (= ${binary:Version}), libqt4-dev (>= 4.4.0~)
-Suggests: libqca2-doc (= ${source:Version})
-Conflicts: qca-dev
+Conflicts: qca-dev, libqca-qt5-2-dev
Description: development files for the Qt Cryptographic Architecture
The Qt Cryptographic Architecture (QCA) provides a straightforward and cross-
platform API for a range of cryptographic features, including SSL/TLS,
@@ -67,16 +73,28 @@
This package contains development files for building software that uses the
Qt Cryptographic Architecture.
-Package: libqca2-doc
-Section: doc
+# Transitional packages can be removed no sooner than May 2016.
+# Next Kubuntu LTS is 16.04.
+Package: libqca2-plugin-cyrus-sasl
+Depends: libqca2-plugins, ${misc:Depends}
Architecture: all
-Depends: ${misc:Depends}
-Recommends: qt4-doc
-Suggests: libqca2-dev (>= ${source:Version})
-Description: API documentation for the Qt Cryptographic Architecture
- The Qt Cryptographic Architecture (QCA) provides a straightforward and cross-
- platform API for a range of cryptographic features, including SSL/TLS,
- X.509 certificates, SASL, OpenPGP, S/MIME CMS, and smart cards.
- .
- This package contains documentation for developers working with the
- Qt Cryptographic Architecture.
+Priority: extra
+Section: oldlibs
+Description: transitional dummy package
+ This is a transitional dummy package. It can safely be removed.
+
+Package: libqca2-plugin-gnupg
+Depends: libqca2-plugins, ${misc:Depends}
+Architecture: all
+Priority: extra
+Section: oldlibs
+Description: transitional dummy package
+ This is a transitional dummy package. It can safely be removed.
+
+Package: libqca2-plugin-ossl
+Depends: libqca2-plugins, ${misc:Depends}
+Architecture: all
+Priority: extra
+Section: oldlibs
+Description: transitional dummy package
+ This is a transitional dummy package. It can safely be removed.
diff -Nru qca2-2.0.3/debian/libqca2-dev.install qca2-2.1.0/debian/libqca2-dev.install
--- qca2-2.0.3/debian/libqca2-dev.install 2012-05-20 09:04:00.000000000 +0000
+++ qca2-2.1.0/debian/libqca2-dev.install 2014-11-26 13:07:01.000000000 +0000
@@ -1,5 +1,5 @@
usr/include/QtCrypto
-usr/lib/*/libqca.prl
usr/lib/*/libqca.so
+usr/lib/*/cmake/
+usr/share/qt4/mkspecs/mkspecs/features/crypto.prf
usr/lib/*/pkgconfig/qca2.pc
-usr/share/qt4/mkspecs/features/crypto.prf
diff -Nru qca2-2.0.3/debian/libqca2-plugins.install qca2-2.1.0/debian/libqca2-plugins.install
--- qca2-2.0.3/debian/libqca2-plugins.install 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/debian/libqca2-plugins.install 2014-11-26 13:07:01.000000000 +0000
@@ -0,0 +1,6 @@
+usr/lib/*/qca/crypto/libqca-gnupg.so
+usr/lib/*/qca/crypto/libqca-cyrus-sasl.so
+usr/lib/*/qca/crypto/libqca-gnupg.so
+usr/lib/*/qca/crypto/libqca-logger.so
+usr/lib/*/qca/crypto/libqca-softstore.so
+usr/lib/*/qca/crypto/libqca-ossl.so
diff -Nru qca2-2.0.3/debian/libqca2-plugins.lintian-overrides qca2-2.1.0/debian/libqca2-plugins.lintian-overrides
--- qca2-2.0.3/debian/libqca2-plugins.lintian-overrides 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/debian/libqca2-plugins.lintian-overrides 2014-11-28 14:05:32.000000000 +0000
@@ -0,0 +1,4 @@
+# only contains plugins
+libqca2-plugins: pkg-has-shlibs-control-file-but-no-actual-shared-libs
+libqca2-plugins: postinst-has-useless-call-to-ldconfig
+libqca2-plugins: postrm-has-useless-call-to-ldconfig
diff -Nru qca2-2.0.3/debian/libqca2.symbols qca2-2.1.0/debian/libqca2.symbols
--- qca2-2.0.3/debian/libqca2.symbols 2014-06-11 14:44:59.000000000 +0000
+++ qca2-2.1.0/debian/libqca2.symbols 2014-11-28 14:05:32.000000000 +0000
@@ -1,12 +1,77 @@
-# SymbolsHelper-Confirmed: 2.0.3 alpha amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc ppc64 s390 s390x sh4 sparc
+# SymbolsHelper-Confirmed: 2.1.0+git20141127.0221+15.04 amd64 i386
libqca.so.2 libqca2 #MINVER#
* Build-Depends-Package: libqca2-dev
_Z10qcaVersionv@Base 2.0.2
+ _Z13qcaVersionStrv@Base 2.1.0+git20141126.2258
+ (optional=templinst)_Z13qvariant_castI5QListIN3QCA13KeyStoreEntry4TypeEEET_RK8QVariant@Base 2.1.0
+ (optional=templinst)_Z13qvariant_castI5QListIN3QCA13KeyStoreEntryEEET_RK8QVariant@Base 2.1.0
+ (optional=templinst)_Z13qvariant_castIN3QCA6PGPKeyEET_RK8QVariant@Base 2.1.0
+ _Z15qcaMajorVersionv@Base 2.1.0+git20141126.2258
+ _Z15qcaMinorVersionv@Base 2.1.0+git20141126.2258
+ _Z15qcaPatchVersionv@Base 2.1.0+git20141126.2258
_Z15qca_secure_freePv@Base 2.0.2
+ (optional=templinst)_Z16qVariantSetValueIN3QCA11CertificateEEvR8QVariantRKT_@Base 2.0.3
+ (optional=templinst)_Z16qVariantSetValueIN3QCA3CRLEEvR8QVariantRKT_@Base 2.0.3
+ (optional=templinst)_Z16qVariantSetValueIN3QCA6PGPKeyEEvR8QVariantRKT_@Base 2.0.3
+ (optional=templinst)_Z16qVariantSetValueIN3QCA9KeyBundleEEvR8QVariantRKT_@Base 2.0.3
_Z16qca_secure_alloci@Base 2.0.2
+ (optional=templinst)_Z17qRegisterMetaTypeIN3QCA11SecureArrayEEiPKcPT_@Base 2.1.0
_Z18qca_secure_reallocPvi@Base 2.0.2
- (optional=external)_ZN15QBasicAtomicInt3refEv@Base 2.0.3
- (optional=external)_ZN15QBasicAtomicInt5derefEv@Base 2.0.3
+ (optional=templinst)_Z21qMetaTypeDeleteHelperI5QListI8QVariantEEvPT_@Base 2.1.0
+ (optional=templinst)_Z21qMetaTypeDeleteHelperI5QListIN3QCA13KeyStoreEntry4TypeEEEvPT_@Base 2.1.0
+ (optional=templinst)_Z21qMetaTypeDeleteHelperI5QListIN3QCA13KeyStoreEntryEEEvPT_@Base 2.1.0
+ (optional=templinst)_Z21qMetaTypeDeleteHelperI8QVariantEvPT_@Base 2.1.0
+ (optional=templinst)_Z21qMetaTypeDeleteHelperIN3QCA11CertificateEEvPT_@Base 2.1.0
+ (optional=templinst)_Z21qMetaTypeDeleteHelperIN3QCA11SecureArrayEEvPT_@Base 2.1.0
+ (optional=templinst)_Z21qMetaTypeDeleteHelperIN3QCA13KeyStoreEntryEEvPT_@Base 2.1.0
+ (optional=templinst)_Z21qMetaTypeDeleteHelperIN3QCA3CRLEEvPT_@Base 2.1.0
+ (optional=templinst)_Z21qMetaTypeDeleteHelperIN3QCA5EventEEvPT_@Base 2.1.0
+ (optional=templinst)_Z21qMetaTypeDeleteHelperIN3QCA6PGPKeyEEvPT_@Base 2.1.0
+ (optional=templinst)_Z21qMetaTypeDeleteHelperIN3QCA9KeyBundleEEvPT_@Base 2.1.0
+ _Z23qStringComparisonHelperRK7QStringPKc@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperI5QListI8QVariantEEPvPKT_@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperI5QListIN3QCA13KeyStoreEntry4TypeEEEPvPKT_@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperI5QListIN3QCA13KeyStoreEntryEEEPvPKT_@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperI8QVariantEPvPKT_@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperIN3QCA11CertificateEEPvPKT_@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperIN3QCA11SecureArrayEEPvPKT_@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperIN3QCA13KeyStoreEntryEEPvPKT_@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperIN3QCA3CRLEEPvPKT_@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperIN3QCA5EventEEPvPKT_@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperIN3QCA6PGPKeyEEPvPKT_@Base 2.1.0
+ (optional=templinst)_Z24qMetaTypeConstructHelperIN3QCA9KeyBundleEEPvPKT_@Base 2.1.0
+ _ZN10QByteArrayD1Ev@Base 2.1.0+git20141126.2258
+ _ZN10QByteArrayD2Ev@Base 2.1.0+git20141126.2258
+ (optional=templinst)_ZN11QMetaTypeIdIN3QCA11CertificateEE14qt_metatype_idEv@Base 2.0.3
+ (optional=templinst)_ZN11QMetaTypeIdIN3QCA3CRLEE14qt_metatype_idEv@Base 2.0.3
+ (optional=templinst)_ZN11QMetaTypeIdIN3QCA9KeyBundleEE14qt_metatype_idEv@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA10BigInteger7PrivateEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA10BigInteger7PrivateEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA10BigInteger7PrivateEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA11Certificate7PrivateEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA11Certificate7PrivateEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA11Certificate7PrivateEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA12KeyStoreInfo7PrivateEED1Ev@Base 2.1.0
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA12KeyStoreInfo7PrivateEED2Ev@Base 2.1.0
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA14ConstraintType7PrivateEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA14ConstraintType7PrivateEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA16SecureMessageKey7PrivateEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA18CertificateRequest7PrivateEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA18CertificateRequest7PrivateEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA19CertificateInfoPair7PrivateEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA19CertificateInfoType7PrivateEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA19CertificateInfoType7PrivateEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA21CertificateCollection7PrivateEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA22SecureMessageSignature7PrivateEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA5Event7PrivateEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA9Algorithm7PrivateEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA9Algorithm7PrivateEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA9Algorithm7PrivateEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA9KeyBundle7PrivateEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA9KeyBundle7PrivateEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN18QSharedDataPointerIN3QCA9KeyBundle7PrivateEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN20QGlobalStaticDeleterI6QMutexED1Ev@Base 2.1.0
+ (optional=templinst)_ZN20QGlobalStaticDeleterI6QMutexED2Ev@Base 2.1.0
_ZN3QCA10BigInteger10fromStringERK7QString@Base 2.0.2
_ZN3QCA10BigInteger9fromArrayERKNS_11SecureArrayE@Base 2.0.2
_ZN3QCA10BigIntegerC1EPKc@Base 2.0.2
@@ -33,38 +98,25 @@
_ZN3QCA10CRLContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA10CRLContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA10CRLContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA10CRLContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA10CRLContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA10CRLContextD2Ev@Base 2.0.3
_ZN3QCA10CSRContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA10CSRContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA10CSRContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA10CSRContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA10CSRContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA10CSRContextD2Ev@Base 2.0.3
_ZN3QCA10DSAContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA10DSAContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA10DSAContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA10DSAContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA10DSAContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA10DSAContextD2Ev@Base 2.0.3
+ _ZN3QCA10Getter_PBE7getListEPNS_8ProviderE@Base 2.1.0+git20141126.2258
_ZN3QCA10KDFContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA10KDFContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA10KDFContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA10KDFContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA10KDFContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA10KDFContextD2Ev@Base 2.0.3
_ZN3QCA10MACContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA10MACContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA10MACContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA10MACContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA10MACContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA10MACContextD2Ev@Base 2.0.3
_ZN3QCA10PrivateKey11fromPEMFileERK7QStringRKNS_11SecureArrayEPNS_13ConvertResultES3_@Base 2.0.2
_ZN3QCA10PrivateKey11signMessageERKNS_12MemoryRegionENS_18SignatureAlgorithmENS_15SignatureFormatE@Base 2.0.2
_ZN3QCA10PrivateKey22supportedPBEAlgorithmsERK7QString@Base 2.0.2
_ZN3QCA10PrivateKey6updateERKNS_12MemoryRegionE@Base 2.0.2
_ZN3QCA10PrivateKey7decryptERKNS_11SecureArrayEPS1_NS_19EncryptionAlgorithmE@Base 2.0.2
+ _ZN3QCA10PrivateKey7encryptERKNS_11SecureArrayENS_19EncryptionAlgorithmE@Base 2.1.0+git20141126.2258
_ZN3QCA10PrivateKey7fromDERERKNS_11SecureArrayES3_PNS_13ConvertResultERK7QString@Base 2.0.2
_ZN3QCA10PrivateKey7fromPEMERK7QStringRKNS_11SecureArrayEPNS_13ConvertResultES3_@Base 2.0.2
_ZN3QCA10PrivateKey9deriveKeyERKNS_9PublicKeyE@Base 2.0.2
@@ -85,18 +137,12 @@
_ZN3QCA10RSAContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA10RSAContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA10RSAContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA10RSAContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA10RSAContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA10RSAContextD2Ev@Base 2.0.3
_ZN3QCA10SMSContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA10SMSContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA10SMSContext14setPrivateKeysERK5QListINS_16SecureMessageKeyEE@Base 2.0.2
_ZN3QCA10SMSContext16staticMetaObjectE@Base 2.0.2
_ZN3QCA10SMSContext22setTrustedCertificatesERKNS_21CertificateCollectionE@Base 2.0.2
_ZN3QCA10SMSContext24setUntrustedCertificatesERKNS_21CertificateCollectionE@Base 2.0.2
- (optional)_ZN3QCA10SMSContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA10SMSContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA10SMSContextD2Ev@Base 2.0.3
_ZN3QCA10SyncThread11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA10SyncThread11qt_metacastEPKc@Base 2.0.2
_ZN3QCA10SyncThread16staticMetaObjectE@Base 2.0.2
@@ -117,17 +163,12 @@
_ZN3QCA10SyncThreadD0Ev@Base 2.0.2
_ZN3QCA10SyncThreadD1Ev@Base 2.0.2
_ZN3QCA10SyncThreadD2Ev@Base 2.0.2
- (optional)_ZN3QCA10TLSContext11SessionInfoD1Ev@Base 2.0.3
- (optional)_ZN3QCA10TLSContext11SessionInfoD2Ev@Base 2.0.3
_ZN3QCA10TLSContext11dtlsTimeoutEv@Base 2.0.2
_ZN3QCA10TLSContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA10TLSContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA10TLSContext12resultsReadyEv@Base 2.0.2
_ZN3QCA10TLSContext16staticMetaObjectE@Base 2.0.2
_ZN3QCA10TLSContext6setMTUEi@Base 2.0.2
- (optional)_ZN3QCA10TLSContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA10TLSContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA10TLSContextD2Ev@Base 2.0.3
_ZN3QCA10TLSSessionC1ERKS0_@Base 2.0.2
_ZN3QCA10TLSSessionC1Ev@Base 2.0.2
_ZN3QCA10TLSSessionC2ERKS0_@Base 2.0.2
@@ -145,9 +186,16 @@
_ZN3QCA10TextFilter6encodeERKNS_12MemoryRegionE@Base 2.0.2
_ZN3QCA10TextFilterC1ENS_9DirectionE@Base 2.0.2
_ZN3QCA10TextFilterC2ENS_9DirectionE@Base 2.0.2
- (optional)_ZN3QCA10TextFilterD0Ev@Base 2.0.3
- (optional)_ZN3QCA10TextFilterD1Ev@Base 2.0.3
- (optional)_ZN3QCA10TextFilterD2Ev@Base 2.0.3
+ _ZN3QCA10TimerFixer11eventFilterEP7QObjectP6QEvent@Base 2.1.0+git20141126.2258
+ _ZN3QCA10TimerFixer11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA10TimerFixer11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA10TimerFixer16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA10TimerFixer5eventEP6QEvent@Base 2.1.0+git20141126.2258
+ _ZN3QCA10TimerFixerC1EP7QObjectPS0_@Base 2.1.0+git20141126.2258
+ _ZN3QCA10TimerFixerC2EP7QObjectPS0_@Base 2.1.0+git20141126.2258
+ _ZN3QCA10TimerFixerD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA10TimerFixerD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA10TimerFixerD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA10TokenAsker11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA10TokenAsker11qt_metacastEPKc@Base 2.0.2
_ZN3QCA10TokenAsker13responseReadyEv@Base 2.0.2
@@ -155,6 +203,7 @@
_ZN3QCA10TokenAsker16staticMetaObjectE@Base 2.0.2
_ZN3QCA10TokenAsker3askERKNS_12KeyStoreInfoERKNS_13KeyStoreEntryEPv@Base 2.0.2
_ZN3QCA10TokenAsker6cancelEv@Base 2.0.2
+ _ZN3QCA10TokenAsker7Private17emitResponseReadyEv@Base 2.1.0+git20141126.2258
_ZN3QCA10TokenAsker7PrivateD0Ev@Base 2.0.3
_ZN3QCA10TokenAsker7PrivateD1Ev@Base 2.0.3
_ZN3QCA10TokenAsker7PrivateD2Ev@Base 2.0.3
@@ -164,18 +213,18 @@
_ZN3QCA10TokenAskerD1Ev@Base 2.0.2
_ZN3QCA10TokenAskerD2Ev@Base 2.0.2
_ZN3QCA10arrayToHexERK10QByteArray@Base 2.0.2
+ _ZN3QCA10botan_initEib@Base 2.1.0+git20141126.2258
+ _ZN3QCA10getContextERK7QStringPNS_8ProviderE@Base 2.1.0+git20141126.2258
+ _ZN3QCA10getContextERK7QStringS2_@Base 2.1.0+git20141126.2258
_ZN3QCA10hexToArrayERK7QString@Base 2.0.2
+ _ZN3QCA10md5_appendEPNS_11md5_state_tEPKhi@Base 2.1.0+git20141126.2258
+ _ZN3QCA10md5_finishEPNS_11md5_state_tEPh@Base 2.1.0+git20141126.2258
_ZN3QCA10setAppNameERK7QString@Base 2.0.2
_ZN3QCA11CertContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA11CertContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA11CertContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA11CertContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA11CertContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA11CertContextD2Ev@Base 2.0.3
_ZN3QCA11Certificate11fromPEMFileERK7QStringPNS_13ConvertResultES3_@Base 2.0.2
_ZN3QCA11Certificate6changeEPNS_11CertContextE@Base 2.0.2
- (optional)_ZN3QCA11Certificate7PrivateD1Ev@Base 2.0.3
- (optional)_ZN3QCA11Certificate7PrivateD2Ev@Base 2.0.3
_ZN3QCA11Certificate7fromDERERK10QByteArrayPNS_13ConvertResultERK7QString@Base 2.0.2
_ZN3QCA11Certificate7fromPEMERK7QStringPNS_13ConvertResultES3_@Base 2.0.2
_ZN3QCA11CertificateC1ERK7QString@Base 2.0.2
@@ -199,18 +248,18 @@
_ZN3QCA11DHPublicKeyD0Ev@Base 2.0.3
_ZN3QCA11DHPublicKeyD1Ev@Base 2.0.3
_ZN3QCA11DHPublicKeyD2Ev@Base 2.0.3
+ _ZN3QCA11EventGlobal3askEi@Base 2.1.0+git20141127.0009
+ _ZN3QCA11EventGlobal6rejectEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA11Getter_Type7getListEPNS_8ProviderE@Base 2.1.0+git20141126.2258
+ _ZN3QCA11HandlerBase11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA11HandlerBase11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA11HandlerBase16staticMetaObjectE@Base 2.1.0+git20141126.2258
_ZN3QCA11HashContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA11HashContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA11HashContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA11HashContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA11HashContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA11HashContextD2Ev@Base 2.0.3
_ZN3QCA11InfoContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA11InfoContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA11InfoContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA11InfoContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA11InfoContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA11InfoContextD2Ev@Base 2.0.3
_ZN3QCA11InitializerC1ENS_10MemoryModeEi@Base 2.0.2
_ZN3QCA11InitializerC2ENS_10MemoryModeEi@Base 2.0.2
_ZN3QCA11InitializerD1Ev@Base 2.0.2
@@ -222,9 +271,6 @@
_ZN3QCA11PKeyContext14privateFromDERERKNS_11SecureArrayES3_@Base 2.0.2
_ZN3QCA11PKeyContext14privateFromPEMERK7QStringRKNS_11SecureArrayE@Base 2.0.2
_ZN3QCA11PKeyContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA11PKeyContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA11PKeyContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA11PKeyContextD2Ev@Base 2.0.3
_ZN3QCA11QPipeDevice11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA11QPipeDevice11qt_metacastEPKc@Base 2.0.2
_ZN3QCA11QPipeDevice14setInheritableEb@Base 2.0.2
@@ -238,6 +284,9 @@
_ZN3QCA11QPipeDevice7Private11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA11QPipeDevice7Private11qt_metacastEPKc@Base 2.0.2
_ZN3QCA11QPipeDevice7Private16staticMetaObjectE@Base 2.0.2
+ _ZN3QCA11QPipeDevice7PrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA11QPipeDevice7PrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA11QPipeDevice7PrivateD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA11QPipeDevice7releaseEv@Base 2.0.2
_ZN3QCA11QPipeDeviceC1EP7QObject@Base 2.0.2
_ZN3QCA11QPipeDeviceC2EP7QObject@Base 2.0.2
@@ -248,11 +297,6 @@
_ZN3QCA11SASLContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA11SASLContext12resultsReadyEv@Base 2.0.2
_ZN3QCA11SASLContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA11SASLContext8HostPortD1Ev@Base 2.0.3
- (optional)_ZN3QCA11SASLContext8HostPortD2Ev@Base 2.0.3
- (optional)_ZN3QCA11SASLContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA11SASLContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA11SASLContextD2Ev@Base 2.0.3
_ZN3QCA11SecureArray2atEi@Base 2.0.2
_ZN3QCA11SecureArray3setERK10QByteArray@Base 2.0.2
_ZN3QCA11SecureArray3setERKS0_@Base 2.0.2
@@ -290,15 +334,21 @@
_ZN3QCA11SecureLayer9readyReadEv@Base 2.0.2
_ZN3QCA11SecureLayerC1EP7QObject@Base 2.0.2
_ZN3QCA11SecureLayerC2EP7QObject@Base 2.0.2
- (optional)_ZN3QCA11SecureLayerD0Ev@Base 2.0.3
- (optional)_ZN3QCA11SecureLayerD1Ev@Base 2.0.3
- (optional)_ZN3QCA11SecureLayerD2Ev@Base 2.0.3
+ _ZN3QCA11arrayToFileERK7QStringRK10QByteArray@Base 2.1.0+git20141126.2258
_ZN3QCA11emsa3EncodeERK7QStringRK10QByteArrayi@Base 2.0.2
_ZN3QCA11getPropertyERK7QString@Base 2.0.2
+ _ZN3QCA11get_hash_idERK7QString@Base 2.1.0+git20141126.2258
_ZN3QCA11isSupportedEPKcRK7QString@Base 2.0.2
_ZN3QCA11isSupportedERK11QStringListRK7QString@Base 2.0.2
+ _ZN3QCA11md5_state_taSERKS0_@Base 2.1.0+git20141126.2258
+ _ZN3QCA11pluginPathsEv@Base 2.1.0+git20141126.2258
_ZN3QCA11setPropertyERK7QStringRK8QVariant@Base 2.0.2
_ZN3QCA11systemStoreEv@Base 2.0.2
+ _ZN3QCA12AskerPrivate11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA12AskerPrivate11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA12AskerPrivate12set_acceptedERKNS_11SecureArrayE@Base 2.1.0+git20141126.2258
+ _ZN3QCA12AskerPrivate12set_rejectedEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA12AskerPrivate16staticMetaObjectE@Base 2.1.0+git20141126.2258
_ZN3QCA12BasicContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA12BasicContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA12BasicContext16staticMetaObjectE@Base 2.0.2
@@ -335,6 +385,7 @@
_ZN3QCA12EventHandler7Private11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA12EventHandler7Private11qt_metacastEPKc@Base 2.0.2
_ZN3QCA12EventHandler7Private16staticMetaObjectE@Base 2.0.2
+ _ZN3QCA12EventHandler7Private3askEiRKNS_5EventE@Base 2.1.0+git20141126.2258
_ZN3QCA12EventHandler7PrivateD0Ev@Base 2.0.3
_ZN3QCA12EventHandler7PrivateD1Ev@Base 2.0.3
_ZN3QCA12EventHandler7PrivateD2Ev@Base 2.0.3
@@ -352,6 +403,9 @@
_ZN3QCA12KeyGenerator7Private11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA12KeyGenerator7Private11qt_metacastEPKc@Base 2.0.2
_ZN3QCA12KeyGenerator7Private16staticMetaObjectE@Base 2.0.2
+ _ZN3QCA12KeyGenerator7PrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA12KeyGenerator7PrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA12KeyGenerator7PrivateD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA12KeyGenerator8createDHERKNS_7DLGroupERK7QString@Base 2.0.2
_ZN3QCA12KeyGenerator8finishedEv@Base 2.0.2
_ZN3QCA12KeyGenerator9createDSAERKNS_7DLGroupERK7QString@Base 2.0.2
@@ -402,6 +456,7 @@
_ZN3QCA12RSAPublicKeyD0Ev@Base 2.0.3
_ZN3QCA12RSAPublicKeyD1Ev@Base 2.0.3
_ZN3QCA12RSAPublicKeyD2Ev@Base 2.0.3
+ _ZN3QCA12SHA1_CONTEXTaSERKS0_@Base 2.1.0+git20141126.2258
_ZN3QCA12SymmetricKey12isWeakDESKeyEv@Base 2.0.2
_ZN3QCA12SymmetricKeyC1ERK10QByteArray@Base 2.0.2
_ZN3QCA12SymmetricKeyC1ERKNS_11SecureArrayE@Base 2.0.2
@@ -411,8 +466,6 @@
_ZN3QCA12SymmetricKeyC2ERKNS_11SecureArrayE@Base 2.0.2
_ZN3QCA12SymmetricKeyC2Ei@Base 2.0.2
_ZN3QCA12SymmetricKeyC2Ev@Base 2.0.2
- (optional)_ZN3QCA12SymmetricKeyD1Ev@Base 2.0.3
- (optional)_ZN3QCA12SymmetricKeyD2Ev@Base 2.0.3
_ZN3QCA12Synchronizer11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA12Synchronizer11qt_metacastEPKc@Base 2.0.2
_ZN3QCA12Synchronizer12conditionMetEv@Base 2.0.2
@@ -421,18 +474,24 @@
_ZN3QCA12Synchronizer7Private11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA12Synchronizer7Private11qt_metacastEPKc@Base 2.0.2
_ZN3QCA12Synchronizer7Private16staticMetaObjectE@Base 2.0.2
+ _ZN3QCA12Synchronizer7Private3runEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA12Synchronizer7PrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA12Synchronizer7PrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA12Synchronizer7PrivateD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA12SynchronizerC1EP7QObject@Base 2.0.2
_ZN3QCA12SynchronizerC2EP7QObject@Base 2.0.2
_ZN3QCA12SynchronizerD0Ev@Base 2.0.2
_ZN3QCA12SynchronizerD1Ev@Base 2.0.2
_ZN3QCA12SynchronizerD2Ev@Base 2.0.2
+ _ZN3QCA12allProvidersEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA12botan_deinitEv@Base 2.1.0+git20141126.2258
_ZN3QCA12findProviderERK7QString@Base 2.0.2
+ _ZN3QCA12skip_pluginsEPNS_8ProviderE@Base 2.1.0+git20141126.2258
+ _ZN3QCA12stringToFileERK7QStringS2_@Base 2.1.0+git20141126.2258
+ _ZN3QCA12truncate_logERK7QStringi@Base 2.1.0+git20141126.2258
_ZN3QCA13CipherContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA13CipherContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA13CipherContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA13CipherContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA13CipherContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA13CipherContextD2Ev@Base 2.0.3
_ZN3QCA13ConsolePrompt11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA13ConsolePrompt11qt_metacastEPKc@Base 2.0.2
_ZN3QCA13ConsolePrompt15waitForFinishedEv@Base 2.0.2
@@ -440,6 +499,9 @@
_ZN3QCA13ConsolePrompt7Private11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA13ConsolePrompt7Private11qt_metacastEPKc@Base 2.0.2
_ZN3QCA13ConsolePrompt7Private16staticMetaObjectE@Base 2.0.2
+ _ZN3QCA13ConsolePrompt7PrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsolePrompt7PrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsolePrompt7PrivateD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA13ConsolePrompt7getCharEv@Base 2.0.2
_ZN3QCA13ConsolePrompt8finishedEv@Base 2.0.2
_ZN3QCA13ConsolePrompt9getHiddenERK7QString@Base 2.0.2
@@ -448,6 +510,28 @@
_ZN3QCA13ConsolePromptD0Ev@Base 2.0.2
_ZN3QCA13ConsolePromptD1Ev@Base 2.0.2
_ZN3QCA13ConsolePromptD2Ev@Base 2.0.2
+ _ZN3QCA13ConsoleThread11inputClosedEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThread11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThread11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThread12bytesWrittenEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThread12outputClosedEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThread16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThread5atEndEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThread7atStartEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThread9readyReadEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThreadD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThreadD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleThreadD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleWorker11inputClosedEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleWorker11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleWorker11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleWorker12bytesWrittenEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleWorker12outputClosedEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleWorker16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleWorker9readyReadEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleWorkerD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleWorkerD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA13ConsoleWorkerD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA13DSAPrivateKeyC1ERKNS_7DLGroupERKNS_10BigIntegerES6_RK7QString@Base 2.0.2
_ZN3QCA13DSAPrivateKeyC1Ev@Base 2.0.2
_ZN3QCA13DSAPrivateKeyC2ERKNS_7DLGroupERKNS_10BigIntegerES6_RK7QString@Base 2.0.2
@@ -455,6 +539,7 @@
_ZN3QCA13DSAPrivateKeyD0Ev@Base 2.0.3
_ZN3QCA13DSAPrivateKeyD1Ev@Base 2.0.3
_ZN3QCA13DSAPrivateKeyD2Ev@Base 2.0.3
+ _ZN3QCA13Getter_IOType7getListEPNS_8ProviderE@Base 2.1.0+git20141126.2258
_ZN3QCA13KeyStoreEntry10fromStringERK7QString@Base 2.0.2
_ZN3QCA13KeyStoreEntry12ensureAccessEv@Base 2.0.2
_ZN3QCA13KeyStoreEntry15ensureAvailableEv@Base 2.0.2
@@ -471,15 +556,9 @@
_ZN3QCA13PGPKeyContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA13PGPKeyContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA13PGPKeyContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA13PGPKeyContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA13PGPKeyContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA13PGPKeyContextD2Ev@Base 2.0.3
_ZN3QCA13PKCS12Context11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA13PKCS12Context11qt_metacastEPKc@Base 2.0.2
_ZN3QCA13PKCS12Context16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA13PKCS12ContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA13PKCS12ContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA13PKCS12ContextD2Ev@Base 2.0.3
_ZN3QCA13PasswordAsker11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA13PasswordAsker11qt_metacastEPKc@Base 2.0.2
_ZN3QCA13PasswordAsker13responseReadyEv@Base 2.0.2
@@ -488,6 +567,7 @@
_ZN3QCA13PasswordAsker3askENS_5Event13PasswordStyleERK7QStringPv@Base 2.0.2
_ZN3QCA13PasswordAsker3askENS_5Event13PasswordStyleERKNS_12KeyStoreInfoERKNS_13KeyStoreEntryEPv@Base 2.0.2
_ZN3QCA13PasswordAsker6cancelEv@Base 2.0.2
+ _ZN3QCA13PasswordAsker7Private17emitResponseReadyEv@Base 2.1.0+git20141126.2258
_ZN3QCA13PasswordAsker7PrivateD0Ev@Base 2.0.3
_ZN3QCA13PasswordAsker7PrivateD1Ev@Base 2.0.3
_ZN3QCA13PasswordAsker7PrivateD2Ev@Base 2.0.3
@@ -506,9 +586,6 @@
_ZN3QCA13RandomContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA13RandomContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA13RandomContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA13RandomContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA13RandomContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA13RandomContextD2Ev@Base 2.0.3
_ZN3QCA13SecureMessage10setSignersERK5QListINS_16SecureMessageKeyEE@Base 2.0.2
_ZN3QCA13SecureMessage11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA13SecureMessage11qt_metacastEPKc@Base 2.0.2
@@ -543,7 +620,15 @@
_ZN3QCA13SecureMessageD0Ev@Base 2.0.2
_ZN3QCA13SecureMessageD1Ev@Base 2.0.2
_ZN3QCA13SecureMessageD2Ev@Base 2.0.2
+ _ZN3QCA13arrayFromFileERK7QStringP10QByteArray@Base 2.1.0+git20141126.2258
+ _ZN3QCA13global_randomEv@Base 2.1.0+git20141126.2258
_ZN3QCA13orderedDNOnlyERKNS_22CertificateInfoOrderedE@Base 2.0.2
+ _ZN3QCA14ConsolePrivate11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA14ConsolePrivate11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA14ConsolePrivate16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA14ConsolePrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA14ConsolePrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA14ConsolePrivateD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA14ConstraintTypeC1ENS_19ConstraintTypeKnownE@Base 2.0.2
_ZN3QCA14ConstraintTypeC1ERK7QStringNS0_7SectionE@Base 2.0.2
_ZN3QCA14ConstraintTypeC1ERKS0_@Base 2.0.2
@@ -559,18 +644,40 @@
_ZN3QCA14DLGroupContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA14DLGroupContext16staticMetaObjectE@Base 2.0.2
_ZN3QCA14DLGroupContext8finishedEv@Base 2.0.2
- (optional)_ZN3QCA14DLGroupContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA14DLGroupContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA14DLGroupContextD2Ev@Base 2.0.3
+ _ZN3QCA14KeyStoreThread11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA14KeyStoreThread11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA14KeyStoreThread16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA14KeyStoreThread5atEndEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA14KeyStoreThread7atStartEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA14KeyStoreThreadD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA14KeyStoreThreadD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA14KeyStoreThreadD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA14MessageContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA14MessageContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA14MessageContext16staticMetaObjectE@Base 2.0.2
_ZN3QCA14MessageContext7updatedEv@Base 2.0.2
- (optional)_ZN3QCA14MessageContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA14MessageContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA14MessageContextD2Ev@Base 2.0.3
+ _ZN3QCA14ask_passphraseERK7QStringPvPNS_11SecureArrayE@Base 2.1.0+git20141126.2258
_ZN3QCA14insertProviderEPNS_8ProviderEi@Base 2.0.2
+ _ZN3QCA14providerForPBEENS_12PBEAlgorithmENS_4PKey4TypeEPKNS_11PKeyContextE@Base 2.1.0+git20141126.2258
_ZN3QCA14scanForPluginsEv@Base 2.0.2
+ _ZN3QCA14stringFromFileERK7QStringPS0_@Base 2.1.0+git20141126.2258
+ _ZN3QCA14unloadProviderERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA15DefaultProvider13configChangedERK4QMapI7QString8QVariantE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15DefaultProvider13createContextERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA15DefaultProvider4initEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15DefaultProviderD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15DefaultProviderD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15DefaultProviderD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15Getter_GroupSet7getListEPNS_8ProviderE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyLoaderThread11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyLoaderThread11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyLoaderThread16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyLoaderThread2InD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyLoaderThread2InD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyLoaderThread3runEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyLoaderThreadD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyLoaderThreadD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyLoaderThreadD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA15KeyStoreManager11busyStartedEv@Base 2.0.2
_ZN3QCA15KeyStoreManager11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA15KeyStoreManager11qt_metacastEPKc@Base 2.0.2
@@ -590,9 +697,72 @@
_ZN3QCA15KeyStoreManagerD0Ev@Base 2.0.2
_ZN3QCA15KeyStoreManagerD1Ev@Base 2.0.2
_ZN3QCA15KeyStoreManagerD2Ev@Base 2.0.2
+ _ZN3QCA15KeyStorePrivate11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivate11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivate15async_entryListEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivate16async_writeEntryERKNS_18KeyStoreWriteEntryE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivate16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivate3regEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivate5unregEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivate7getItemERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivate7getItemEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStorePrivateD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker10writeEntryEiRK8QVariant@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker11ksl_busyEndEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker11ksl_updatedEv@Base 2.1.0
+ _ZN3QCA15KeyStoreTracker11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker12entryPassiveERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker12updateStoresEPNS_19KeyStoreListContextE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker13ksl_busyStartEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker13startProviderEPNS_8ProviderE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker16ksl_storeUpdatedEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker4ItemD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker4ItemD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker4selfE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker5entryERK7QStringS3_@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker5startERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker5startEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker6isBusyEv@Base 2.1.0+git20141127.0009
+ _ZN3QCA15KeyStoreTracker7updatedEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTracker8findItemEi@Base 2.1.0
+ _ZN3QCA15KeyStoreTracker8getItemsEv@Base 2.1.0
+ _ZN3QCA15KeyStoreTracker9entryListEi@Base 2.1.0+git20141127.0009
+ _ZN3QCA15KeyStoreTracker9updated_pEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTrackerD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTrackerD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15KeyStoreTrackerD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager10setDefaultEPNS_8ProviderE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager11getPriorityERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager13mergeFeaturesEP11QStringListRKS1_@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager14changePriorityERK7QStringi@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager19clearDiagnosticTextEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager20appendDiagnosticTextERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager3addEPNS_8ProviderEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager4scanEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager6unloadERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager7addItemEPNS_12ProviderItemEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManager9unloadAllEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManagerC1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManagerC2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManagerD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15ProviderManagerD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15SyncThreadAgent11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15SyncThreadAgent11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA15SyncThreadAgent16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA15SyncThreadAgent7startedEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA15SyncThreadAgent8call_retEbRK8QVariant@Base 2.1.0+git20141126.2258
+ _ZN3QCA15SyncThreadAgentD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15SyncThreadAgentD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA15SyncThreadAgentD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA15defaultFeaturesEv@Base 2.0.2
_ZN3QCA15defaultProviderEv@Base 2.0.2
+ _ZN3QCA15get_pbe_defaultEv@Base 2.1.0+git20141126.2258
_ZN3QCA15haveSystemStoreEv@Base 2.0.2
+ _ZN3QCA15providerForNameERK7QString@Base 2.1.0+git20141126.2258
_ZN3QCA16ConsoleReference10readSecureEi@Base 2.0.2
_ZN3QCA16ConsoleReference11closeOutputEv@Base 2.0.2
_ZN3QCA16ConsoleReference11inputClosedEv@Base 2.0.2
@@ -639,15 +809,36 @@
_ZN3QCA17AbstractLogDeviceD0Ev@Base 2.0.2
_ZN3QCA17AbstractLogDeviceD1Ev@Base 2.0.2
_ZN3QCA17AbstractLogDeviceD2Ev@Base 2.0.2
+ _ZN3QCA17DefaultMD5Context5clearEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA17DefaultMD5Context5finalEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA17DefaultMD5Context6updateERKNS_12MemoryRegionE@Base 2.1.0+git20141126.2258
+ _ZN3QCA17DefaultMD5ContextD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA17DefaultMD5ContextD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA17DefaultMD5ContextD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA17KeyStoreOperation11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA17KeyStoreOperation11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA17KeyStoreOperation16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA17KeyStoreOperation3runEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA17KeyStoreOperationD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA17KeyStoreOperationD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA17KeyStoreOperationD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA17SynchronizerAgent11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA17SynchronizerAgent11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA17SynchronizerAgent16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA17SynchronizerAgent7startedEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA17SynchronizerAgentD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA17SynchronizerAgentD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA17SynchronizerAgentD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA17TLSSessionContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA17TLSSessionContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA17TLSSessionContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA17TLSSessionContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA17TLSSessionContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA17TLSSessionContextD2Ev@Base 2.0.3
+ _ZN3QCA17botan_secure_freeEPvi@Base 2.1.0+git20141126.2258
+ _ZN3QCA17botan_throw_abortEv@Base 2.1.0+git20141126.2258
_ZN3QCA17getProviderConfigERK7QString@Base 2.0.2
_ZN3QCA17makeFriendlyNamesERK5QListINS_11CertificateEE@Base 2.0.2
_ZN3QCA17orderedToDNStringERKNS_22CertificateInfoOrderedE@Base 2.0.2
+ _ZN3QCA17plugin_prioritiesEPNS_8ProviderE@Base 2.1.0+git20141126.2258
+ _ZN3QCA17providerForIOTypeENS_4PKey4TypeEPKNS_11PKeyContextE@Base 2.1.0+git20141126.2258
_ZN3QCA17setProviderConfigERK7QStringRK4QMapIS0_8QVariantE@Base 2.0.2
_ZN3QCA17supportedFeaturesEv@Base 2.0.2
_ZN3QCA18CertificateOptions11setPoliciesERK11QStringList@Base 2.0.2
@@ -659,11 +850,6 @@
_ZN3QCA18CertificateOptions16setOCSPLocationsERK11QStringList@Base 2.0.2
_ZN3QCA18CertificateOptions17setValidityPeriodERK9QDateTimeS3_@Base 2.0.2
_ZN3QCA18CertificateOptions18setIssuerLocationsERK11QStringList@Base 2.0.2
- (optional=private)_ZN3QCA18CertificateOptions7PrivateC1ERKS1_@Base 2.0.3
- (optional=private)_ZN3QCA18CertificateOptions7PrivateC2ERKS1_@Base 2.0.3
- (optional=private)_ZN3QCA18CertificateOptions7PrivateD1Ev@Base 2.0.3
- (optional=private)_ZN3QCA18CertificateOptions7PrivateD2Ev@Base 2.0.3
- (optional=private)_ZN3QCA18CertificateOptions7PrivateaSERKS1_@Base 2.0.3
_ZN3QCA18CertificateOptions7setAsCAEi@Base 2.0.2
_ZN3QCA18CertificateOptions7setInfoERK9QMultiMapINS_19CertificateInfoTypeE7QStringE@Base 2.0.2
_ZN3QCA18CertificateOptions9setAsUserEv@Base 2.0.2
@@ -693,7 +879,25 @@
_ZN3QCA18CertificateRequestD1Ev@Base 2.0.2
_ZN3QCA18CertificateRequestD2Ev@Base 2.0.2
_ZN3QCA18CertificateRequestaSERKS0_@Base 2.0.2
+ _ZN3QCA18DefaultSHA1Context5clearEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA18DefaultSHA1Context5finalEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA18DefaultSHA1Context6updateERKNS_12MemoryRegionE@Base 2.1.0+git20141126.2258
+ _ZN3QCA18DefaultSHA1Context9transformEPjPh@Base 2.1.0+git20141126.2258
+ _ZN3QCA18DefaultSHA1ContextD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA18DefaultSHA1ContextD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA18DefaultSHA1ContextD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA18KeyStoreWriteEntryD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA18KeyStoreWriteEntryD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA18SafeSocketNotifier11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA18SafeSocketNotifier11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA18SafeSocketNotifier16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA18SafeSocketNotifier9activatedEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA18SafeSocketNotifierD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA18SafeSocketNotifierD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA18SafeSocketNotifierD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA18botan_secure_allocEi@Base 2.1.0+git20141126.2258
_ZN3QCA18saveProviderConfigERK7QString@Base 2.0.2
+ _ZN3QCA18use_asker_fallbackENS_13ConvertResultE@Base 2.1.0+git20141126.2258
_ZN3QCA19BufferedComputation7processERKNS_12MemoryRegionE@Base 2.0.2
_ZN3QCA19BufferedComputationD0Ev@Base 2.0.2
_ZN3QCA19BufferedComputationD1Ev@Base 2.0.2
@@ -718,6 +922,16 @@
_ZN3QCA19CertificateInfoTypeD1Ev@Base 2.0.2
_ZN3QCA19CertificateInfoTypeD2Ev@Base 2.0.2
_ZN3QCA19CertificateInfoTypeaSERKS0_@Base 2.0.2
+ _ZN3QCA19DefaultKeyStoreList11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA19DefaultKeyStoreList11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA19DefaultKeyStoreList12entryPassiveERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA19DefaultKeyStoreList16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA19DefaultKeyStoreList5startEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA19DefaultKeyStoreList9entryListEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA19DefaultKeyStoreList9keyStoresEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA19DefaultKeyStoreListD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA19DefaultKeyStoreListD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA19DefaultKeyStoreListD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA19KeyStoreListContext10writeEntryEiRKNS_11CertificateE@Base 2.0.2
_ZN3QCA19KeyStoreListContext10writeEntryEiRKNS_3CRLE@Base 2.0.2
_ZN3QCA19KeyStoreListContext10writeEntryEiRKNS_6PGPKeyE@Base 2.0.2
@@ -735,9 +949,6 @@
_ZN3QCA19KeyStoreListContext7busyEndEv@Base 2.0.2
_ZN3QCA19KeyStoreListContext7updatedEv@Base 2.0.2
_ZN3QCA19KeyStoreListContext9busyStartEv@Base 2.0.2
- (optional)_ZN3QCA19KeyStoreListContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA19KeyStoreListContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA19KeyStoreListContextD2Ev@Base 2.0.3
_ZN3QCA19SecureMessageSystem11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA19SecureMessageSystem11qt_metacastEPKc@Base 2.0.2
_ZN3QCA19SecureMessageSystem16staticMetaObjectE@Base 2.0.2
@@ -746,6 +957,9 @@
_ZN3QCA19SecureMessageSystemD0Ev@Base 2.0.2
_ZN3QCA19SecureMessageSystemD1Ev@Base 2.0.2
_ZN3QCA19SecureMessageSystemD2Ev@Base 2.0.2
+ _ZN3QCA19global_random_mutexEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA19providerForGroupSetENS_10DLGroupSetE@Base 2.1.0+git20141126.2258
+ _ZN3QCA19qca_get_systemstoreERK7QString@Base 2.1.0+git20141126.2258
_ZN3QCA19setProviderPriorityERK7QStringi@Base 2.0.2
_ZN3QCA20CertificateAuthorityC1ERKNS_11CertificateERKNS_10PrivateKeyERK7QString@Base 2.0.2
_ZN3QCA20CertificateAuthorityC1ERKS0_@Base 2.0.2
@@ -755,6 +969,14 @@
_ZN3QCA20CertificateAuthorityD1Ev@Base 2.0.2
_ZN3QCA20CertificateAuthorityD2Ev@Base 2.0.2
_ZN3QCA20CertificateAuthorityaSERKS0_@Base 2.0.2
+ _ZN3QCA20DefaultKeyStoreEntry11deserializeERK7QStringPNS_8ProviderE@Base 2.1.0+git20141126.2258
+ _ZN3QCA20DefaultKeyStoreEntryD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA20DefaultKeyStoreEntryD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA20DefaultKeyStoreEntryD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA20DefaultRandomContext9nextBytesEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA20DefaultRandomContextD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA20DefaultRandomContextD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA20DefaultRandomContextD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA20InitializationVectorC1ERK10QByteArray@Base 2.0.2
_ZN3QCA20InitializationVectorC1ERKNS_11SecureArrayE@Base 2.0.2
_ZN3QCA20InitializationVectorC1Ei@Base 2.0.2
@@ -767,16 +989,17 @@
_ZN3QCA20KeyStoreEntryContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA20KeyStoreEntryContext12ensureAccessEv@Base 2.0.2
_ZN3QCA20KeyStoreEntryContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA20KeyStoreEntryContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA20KeyStoreEntryContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA20KeyStoreEntryContextD2Ev@Base 2.0.3
_ZN3QCA20KeyStoreEntryWatcher11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA20KeyStoreEntryWatcher11qt_metacastEPKc@Base 2.0.2
_ZN3QCA20KeyStoreEntryWatcher11unavailableEv@Base 2.0.2
_ZN3QCA20KeyStoreEntryWatcher16staticMetaObjectE@Base 2.0.2
+ _ZN3QCA20KeyStoreEntryWatcher7Private10ks_updatedEv@Base 2.1.0+git20141126.2258
_ZN3QCA20KeyStoreEntryWatcher7Private11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA20KeyStoreEntryWatcher7Private11qt_metacastEPKc@Base 2.0.2
_ZN3QCA20KeyStoreEntryWatcher7Private16staticMetaObjectE@Base 2.0.2
+ _ZN3QCA20KeyStoreEntryWatcher7PrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA20KeyStoreEntryWatcher7PrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA20KeyStoreEntryWatcher7PrivateD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA20KeyStoreEntryWatcher9availableEv@Base 2.0.2
_ZN3QCA20KeyStoreEntryWatcherC1ERKNS_13KeyStoreEntryEP7QObject@Base 2.0.2
_ZN3QCA20KeyStoreEntryWatcherC2ERKNS_13KeyStoreEntryEP7QObject@Base 2.0.2
@@ -785,12 +1008,10 @@
_ZN3QCA20KeyStoreEntryWatcherD2Ev@Base 2.0.2
_ZN3QCA20globalRandomProviderEv@Base 2.0.2
_ZN3QCA20pluginDiagnosticTextEv@Base 2.0.2
+ _ZN3QCA20qca_have_systemstoreEv@Base 2.1.0+git20141126.2258
_ZN3QCA21CertCollectionContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA21CertCollectionContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA21CertCollectionContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA21CertCollectionContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA21CertCollectionContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA21CertCollectionContextD2Ev@Base 2.0.3
_ZN3QCA21CertificateCollection11canUsePKCS7ERK7QString@Base 2.0.2
_ZN3QCA21CertificateCollection11toPKCS7FileERK7QStringS3_@Base 2.0.2
_ZN3QCA21CertificateCollection13fromPKCS7FileERK7QStringPNS_13ConvertResultES3_@Base 2.0.2
@@ -808,6 +1029,7 @@
_ZN3QCA21CertificateCollectionaSERKS0_@Base 2.0.2
_ZN3QCA21CertificateCollectionpLERKS0_@Base 2.0.2
_ZN3QCA21KeyDerivationFunction13withAlgorithmERK7QStringS3_@Base 2.0.2
+ _ZN3QCA21KeyDerivationFunction7makeKeyERKNS_11SecureArrayERKNS_20InitializationVectorEjiPj@Base 2.1.0+git20141126.2258
_ZN3QCA21KeyDerivationFunction7makeKeyERKNS_11SecureArrayERKNS_20InitializationVectorEjj@Base 2.0.2
_ZN3QCA21KeyDerivationFunctionC1ERK7QStringS3_@Base 2.0.2
_ZN3QCA21KeyDerivationFunctionC1ERKS0_@Base 2.0.2
@@ -817,6 +1039,15 @@
_ZN3QCA21KeyDerivationFunctionD1Ev@Base 2.0.2
_ZN3QCA21KeyDerivationFunctionD2Ev@Base 2.0.2
_ZN3QCA21KeyDerivationFunctionaSERKS0_@Base 2.0.2
+ _ZN3QCA22KeyStoreManagerPrivate11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA22KeyStoreManagerPrivate11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA22KeyStoreManagerPrivate15tracker_updatedEv@Base 2.1.0
+ _ZN3QCA22KeyStoreManagerPrivate16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA22KeyStoreManagerPrivate5unregEPNS_8KeyStoreE@Base 2.1.0+git20141126.2258
+ _ZN3QCA22KeyStoreManagerPrivate9do_updateEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA22KeyStoreManagerPrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA22KeyStoreManagerPrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA22KeyStoreManagerPrivateD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA22SecureMessageSignatureC1ENS0_14IdentityResultENS_8ValidityERKNS_16SecureMessageKeyERK9QDateTime@Base 2.0.2
_ZN3QCA22SecureMessageSignatureC1ERKS0_@Base 2.0.2
_ZN3QCA22SecureMessageSignatureC1Ev@Base 2.0.2
@@ -826,6 +1057,21 @@
_ZN3QCA22SecureMessageSignatureD1Ev@Base 2.0.2
_ZN3QCA22SecureMessageSignatureD2Ev@Base 2.0.2
_ZN3QCA22SecureMessageSignatureaSERKS0_@Base 2.0.2
+ _ZN3QCA23ConsoleReferencePrivate11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA23ConsoleReferencePrivate11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA23ConsoleReferencePrivate16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA23ConsoleReferencePrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA23ConsoleReferencePrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA23ConsoleReferencePrivateD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA23QFileSystemWatcherRelay11fileChangedERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA23QFileSystemWatcherRelay11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA23QFileSystemWatcherRelay11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA23QFileSystemWatcherRelay16directoryChangedERK7QString@Base 2.1.0+git20141126.2258
+ _ZN3QCA23QFileSystemWatcherRelay16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA23QFileSystemWatcherRelayD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA23QFileSystemWatcherRelayD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA23QFileSystemWatcherRelayD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA23create_default_providerEv@Base 2.1.0+git20141126.2258
_ZN3QCA23setGlobalRandomProviderERK7QString@Base 2.0.2
_ZN3QCA24invokeMethodWithVariantsEP7QObjectRK10QByteArrayRK5QListI8QVariantEPS6_N2Qt14ConnectionTypeE@Base 2.0.2
_ZN3QCA25MessageAuthenticationCode14supportedTypesERK7QString@Base 2.0.2
@@ -843,6 +1089,7 @@
_ZN3QCA25MessageAuthenticationCodeaSERKS0_@Base 2.0.2
_ZN3QCA25clearPluginDiagnosticTextEv@Base 2.0.2
_ZN3QCA26appendPluginDiagnosticTextERK7QString@Base 2.0.2
+ _ZN3QCA26getProviderConfig_internalEPNS_8ProviderE@Base 2.1.0+git20141126.2258
_ZN3QCA3CMS11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA3CMS11qt_metacastEPKc@Base 2.0.2
_ZN3QCA3CMS14setPrivateKeysERK5QListINS_16SecureMessageKeyEE@Base 2.0.2
@@ -881,7 +1128,7 @@
_ZN3QCA3TLS11startClientERK7QString@Base 2.0.2
_ZN3QCA3TLS11startServerEv@Base 2.0.2
_ZN3QCA3TLS12readOutgoingEPi@Base 2.0.2
- _ZN3QCA3TLS13connectNotifyEPKc@Base 2.0.2
+ (arch=)_ZN3QCA3TLS13connectNotifyEPKc@Base 2.1.0
_ZN3QCA3TLS13setIssuerListERK5QListINS_22CertificateInfoOrderedEE@Base 2.0.2
_ZN3QCA3TLS13writeIncomingERK10QByteArray@Base 2.0.2
_ZN3QCA3TLS14setCertificateERKNS_16CertificateChainERKNS_10PrivateKeyE@Base 2.0.2
@@ -890,7 +1137,7 @@
_ZN3QCA3TLS14setConstraintsERK11QStringList@Base 2.0.2
_ZN3QCA3TLS14setConstraintsEii@Base 2.0.2
_ZN3QCA3TLS15readUnprocessedEv@Base 2.0.2
- _ZN3QCA3TLS16disconnectNotifyEPKc@Base 2.0.2
+ (arch=)_ZN3QCA3TLS16disconnectNotifyEPKc@Base 2.1.0
_ZN3QCA3TLS16hostNameReceivedEv@Base 2.0.2
_ZN3QCA3TLS16staticMetaObjectE@Base 2.0.2
_ZN3QCA3TLS17continueAfterStepEv@Base 2.0.2
@@ -905,7 +1152,14 @@
_ZN3QCA3TLS5writeERK10QByteArray@Base 2.0.2
_ZN3QCA3TLS7Private11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA3TLS7Private11qt_metacastEPKc@Base 2.0.2
+ _ZN3QCA3TLS7Private15update_finishedEv@Base 2.1.0+git20141126.2258
_ZN3QCA3TLS7Private16staticMetaObjectE@Base 2.0.2
+ _ZN3QCA3TLS7Private17processNextActionEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA3TLS7Private5resetENS_9ResetModeE@Base 2.1.0+git20141126.2258
+ _ZN3QCA3TLS7Private6updateEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA3TLS7PrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA3TLS7PrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA3TLS7PrivateD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA3TLSC1ENS0_4ModeEP7QObjectRK7QString@Base 2.0.2
_ZN3QCA3TLSC1EP7QObjectRK7QString@Base 2.0.2
_ZN3QCA3TLSC2ENS0_4ModeEP7QObjectRK7QString@Base 2.0.2
@@ -983,8 +1237,13 @@
_ZN3QCA4SASL7Private11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA4SASL7Private11qt_metacastEPKc@Base 2.0.2
_ZN3QCA4SASL7Private16staticMetaObjectE@Base 2.0.2
- (optional=private)_ZN3QCA4SASL7Private6ActionD1Ev@Base 2.0.3
- (optional=private)_ZN3QCA4SASL7Private6ActionD2Ev@Base 2.0.3
+ _ZN3QCA4SASL7Private17processNextActionEv@Base 2.1.0+git20141126.2258
+ (arch=amd64)_ZN3QCA4SASL7Private17sasl_resultsReadyEv@Base 2.1.0+git20141127.0009
+ _ZN3QCA4SASL7Private5resetENS_9ResetModeE@Base 2.1.0+git20141126.2258
+ _ZN3QCA4SASL7Private6updateEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA4SASL7PrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA4SASL7PrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA4SASL7PrivateD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA4SASL7putStepERK10QByteArray@Base 2.0.2
_ZN3QCA4SASL8nextStepERK10QByteArray@Base 2.0.2
_ZN3QCA4SASL8setRealmERK7QString@Base 2.0.2
@@ -996,10 +1255,200 @@
_ZN3QCA4SASLD2Ev@Base 2.0.2
_ZN3QCA4initENS_10MemoryModeEi@Base 2.0.2
_ZN3QCA4initEv@Base 2.0.2
+ _ZN3QCA5Botan10bigint_mulEPjjS1_PKjjjS3_jj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan10power_of_2Ey@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan10round_downEjj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan10unlock_memEPvj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Config_ErrorC1ERKSsj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Config_ErrorC2ERKSsj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Config_ErrorD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Config_ErrorD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Config_ErrorD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Format_ErrorD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Format_ErrorD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Format_ErrorD2Ev@Base 2.1.0+git20141126.2258
+ (optional=templinst)_ZN3QCA5Botan12MemoryRegionIhE6createEj@Base 2.0.3
+ (optional=templinst)_ZN3QCA5Botan12MemoryRegionIjE6createEj@Base 2.0.3
+ _ZN3QCA5Botan12Mutex_HolderC1EPNS0_5MutexE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Mutex_HolderC2EPNS0_5MutexE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Mutex_HolderD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12Mutex_HolderD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan12global_stateEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Invalid_StateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Invalid_StateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Invalid_StateD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Library_State13add_allocatorEPNS0_9AllocatorE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Library_State15get_named_mutexERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Library_State21set_default_allocatorERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Library_State4loadERNS0_7ModulesE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Library_StateC1EPNS0_13Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Library_StateC2EPNS0_13Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Library_StateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan13Library_StateD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan14Encoding_ErrorC1ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan14Encoding_ErrorC2ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan14Encoding_ErrorD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan14Encoding_ErrorD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan14Encoding_ErrorD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan14Internal_ErrorD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan14Internal_ErrorD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan14Internal_ErrorD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan14hamming_weightEy@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan15Builtin_ModulesC1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan15Builtin_ModulesC2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan15Builtin_ModulesD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan15Builtin_ModulesD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan15Builtin_ModulesD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Invalid_ArgumentD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Invalid_ArgumentD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Invalid_ArgumentD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Malloc_Allocator11alloc_blockEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Malloc_Allocator13dealloc_blockEPvj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Malloc_AllocatorD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Malloc_AllocatorD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Malloc_AllocatorD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Qt_Mutex_Factory4makeEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Qt_Mutex_FactoryD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Qt_Mutex_FactoryD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16Qt_Mutex_FactoryD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan16set_global_stateEPNS0_13Library_StateE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Invalid_IV_LengthC1ERKSsj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Invalid_IV_LengthC2ERKSsj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Invalid_IV_LengthD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Invalid_IV_LengthD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Invalid_IV_LengthD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Locking_Allocator11alloc_blockEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Locking_Allocator13dealloc_blockEPvj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Locking_AllocatorD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Locking_AllocatorD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Locking_AllocatorD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Memory_ExhaustionC1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Memory_ExhaustionC2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Memory_ExhaustionD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Memory_ExhaustionD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Memory_ExhaustionD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator10deallocateEPvj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator12Memory_Block10BLOCK_SIZEE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator12Memory_Block11BITMAP_SIZEE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator12Memory_Block4freeEPvj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator12Memory_Block5allocEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator12Memory_BlockC1EPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator12Memory_BlockC2EPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator13get_more_coreEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator15allocate_blocksEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator7destroyEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_Allocator8allocateEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_AllocatorC1Ejb@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_AllocatorC2Ejb@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_AllocatorD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_AllocatorD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17Pooling_AllocatorD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17significant_bytesEy@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan17swap_global_stateEPNS0_13Library_StateE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Invalid_Block_SizeC1ERKSsS3_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Invalid_Block_SizeC2ERKSsS3_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Invalid_Block_SizeD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Invalid_Block_SizeD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Invalid_Block_SizeD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Invalid_Key_LengthC1ERKSsj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Invalid_Key_LengthC2ERKSsj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Invalid_Key_LengthD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Invalid_Key_LengthD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Invalid_Key_LengthD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Named_Mutex_HolderC1ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Named_Mutex_HolderC2ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Named_Mutex_HolderD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan18Named_Mutex_HolderD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan19Algorithm_Not_FoundC1ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan19Algorithm_Not_FoundC2ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan19Algorithm_Not_FoundD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan19Algorithm_Not_FoundD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan19Algorithm_Not_FoundD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan21Default_Mutex_Factory4makeEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan21Default_Mutex_FactoryD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan21Default_Mutex_FactoryD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan21Default_Mutex_FactoryD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan22Invalid_Algorithm_NameC1ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan22Invalid_Algorithm_NameC2ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan22Invalid_Algorithm_NameD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan22Invalid_Algorithm_NameD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan22Invalid_Algorithm_NameD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan22Invalid_Message_NumberC1ERKSsj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan22Invalid_Message_NumberC2ERKSsj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan22Invalid_Message_NumberD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan22Invalid_Message_NumberD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan22Invalid_Message_NumberD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan23MemoryMapping_Allocator11alloc_blockEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan23MemoryMapping_Allocator13dealloc_blockEPvj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan23MemoryMapping_AllocatorD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan23MemoryMapping_AllocatorD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan23MemoryMapping_AllocatorD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt11encode_1363ERKS1_j@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt12DivideByZeroC1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt12DivideByZeroC2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt12DivideByZeroD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt12DivideByZeroD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt12DivideByZeroD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt13binary_decodeEPKhj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt4swapERS1_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt6decodeEPKhjNS1_4BaseE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt6decodeERKNS0_12MemoryRegionIhEENS1_4BaseE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt6encodeEPhRKS1_NS1_4BaseE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt6encodeERKS1_NS1_4BaseE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt7set_bitEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt8set_signENS1_4SignE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt9clear_bitEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt9flip_signEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigInt9mask_bitsEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntC1ENS1_4SignEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntC1EPKhjNS1_4BaseE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntC1ERKS1_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntC1ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntC1Ey@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntC2ENS1_4SignEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntC2EPKhjNS1_4BaseE@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntC2ERKS1_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntC2ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntC2Ey@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntdVERKS1_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntlSEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntmIERKS1_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntmLERKS1_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntpLERKS1_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntrMERKS1_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntrMEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6BigIntrSEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan6divideERKNS0_6BigIntES3_RS1_S4_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan7Charset10char2digitEc@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan7Charset10digit2charEh@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan7Charset12caseless_cmpEcc@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan7Charset8is_digitEc@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan7Charset8is_spaceEc@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan7low_bitEy@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan7xor_bufEPhPKhS3_j@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan7xor_bufEPhPKhj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan8high_bitEy@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan8lock_memEPvj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan8round_upEjj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan9Allocator3getEb@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan9Allocator4initEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan9Allocator7destroyEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan9ExceptionC1ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan9ExceptionC2ERKSs@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan9ExceptionD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan9ExceptionD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan9ExceptionD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA5Botan9to_stringEyj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5BotandvERKNS0_6BigIntES3_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5BotanlsERKNS0_6BigIntEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5BotanmiERKNS0_6BigIntES3_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5BotanmlERKNS0_6BigIntES3_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5BotanplERKNS0_6BigIntES3_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5BotanrmERKNS0_6BigIntES3_@Base 2.1.0+git20141126.2258
+ _ZN3QCA5BotanrmERKNS0_6BigIntEj@Base 2.1.0+git20141126.2258
+ _ZN3QCA5BotanrsERKNS0_6BigIntEj@Base 2.1.0+git20141126.2258
_ZN3QCA5Event15setPasswordDataENS0_13PasswordStyleERK7QStringPv@Base 2.0.2
_ZN3QCA5Event19setPasswordKeyStoreENS0_13PasswordStyleERKNS_12KeyStoreInfoERKNS_13KeyStoreEntryEPv@Base 2.0.2
- (optional=private)_ZN3QCA5Event7PrivateC1Ev@Base 2.0.3
- (optional=private)_ZN3QCA5Event7PrivateC2Ev@Base 2.0.3
_ZN3QCA5Event8setTokenERKNS_12KeyStoreInfoERKNS_13KeyStoreEntryEPv@Base 2.0.2
_ZN3QCA5EventC1ERKS0_@Base 2.0.2
_ZN3QCA5EventC1Ev@Base 2.0.2
@@ -1042,6 +1491,8 @@
_ZN3QCA6FilterD0Ev@Base 2.0.2
_ZN3QCA6FilterD1Ev@Base 2.0.2
_ZN3QCA6FilterD2Ev@Base 2.0.2
+ _ZN3QCA6Global13ensure_loadedEv@Base 2.1.0+git20141127.0009
+ _ZN3QCA6Global4scanEv@Base 2.1.0+git20141127.0009
_ZN3QCA6Logger11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA6Logger11qt_metacastEPKc@Base 2.0.2
_ZN3QCA6Logger14logTextMessageERK7QStringNS0_8SeverityE@Base 2.0.2
@@ -1082,6 +1533,10 @@
_ZN3QCA6RandomD2Ev@Base 2.0.2
_ZN3QCA6RandomaSERKS0_@Base 2.0.2
_ZN3QCA6deinitEv@Base 2.0.2
+ (optional=templinst)_ZN3QCA6getKeyINS_10PrivateKeyENS_17Getter_PrivateKeyI7QStringEES3_EET_RKS3_RKT1_RKNS_11SecureArrayEPNS_13ConvertResultE@Base 2.0.3
+ (optional=templinst)_ZN3QCA6getKeyINS_10PrivateKeyENS_17Getter_PrivateKeyINS_11SecureArrayEEES3_EET_RK7QStringRKT1_RKS3_PNS_13ConvertResultE@Base 2.0.3
+ (optional=templinst)_ZN3QCA6getKeyINS_9PublicKeyENS_16Getter_PublicKeyI10QByteArrayEES3_EET_RK7QStringRKT1_RKNS_11SecureArrayEPNS_13ConvertResultE@Base 2.0.3
+ (optional=templinst)_ZN3QCA6getKeyINS_9PublicKeyENS_16Getter_PublicKeyI7QStringEES3_EET_RKS3_RKT1_RKNS_11SecureArrayEPNS_13ConvertResultE@Base 2.0.3
_ZN3QCA6loggerEv@Base 2.0.2
_ZN3QCA7Console11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA7Console11qt_metacastEPKc@Base 2.0.2
@@ -1119,6 +1574,10 @@
_ZN3QCA7OpenPGPD1Ev@Base 2.0.2
_ZN3QCA7OpenPGPD2Ev@Base 2.0.2
_ZN3QCA7appNameEv@Base 2.0.2
+ (optional=templinst)_ZN3QCA7getListINS_10DLGroupSetENS_15Getter_GroupSetEEE5QListIT_ERK7QString@Base 2.0.3
+ (optional=templinst)_ZN3QCA7getListINS_12PBEAlgorithmENS_10Getter_PBEEEE5QListIT_ERK7QString@Base 2.0.3
+ (optional=templinst)_ZN3QCA7getListINS_4PKey4TypeENS_11Getter_TypeEEE5QListIT_ERK7QString@Base 2.0.3
+ (optional=templinst)_ZN3QCA7getListINS_4PKey4TypeENS_13Getter_IOTypeEEE5QListIT_ERK7QString@Base 2.0.3
_ZN3QCA8CRLEntryC1ENS_10BigIntegerERK9QDateTimeNS0_6ReasonE@Base 2.0.2
_ZN3QCA8CRLEntryC1ERKNS_11CertificateENS0_6ReasonE@Base 2.0.2
_ZN3QCA8CRLEntryC1ERKS0_@Base 2.0.2
@@ -1133,9 +1592,6 @@
_ZN3QCA8CertBase11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA8CertBase11qt_metacastEPKc@Base 2.0.2
_ZN3QCA8CertBase16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA8CertBaseD0Ev@Base 2.0.3
- (optional)_ZN3QCA8CertBaseD1Ev@Base 2.0.3
- (optional)_ZN3QCA8CertBaseD2Ev@Base 2.0.3
_ZN3QCA8DirWatch10setDirNameERK7QString@Base 2.0.2
_ZN3QCA8DirWatch11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA8DirWatch11qt_metacastEPKc@Base 2.0.2
@@ -1184,9 +1640,6 @@
_ZN3QCA8PKeyBase9startSignENS_18SignatureAlgorithmENS_15SignatureFormatE@Base 2.0.2
_ZN3QCA8PKeyBaseC1EPNS_8ProviderERK7QString@Base 2.0.2
_ZN3QCA8PKeyBaseC2EPNS_8ProviderERK7QString@Base 2.0.2
- (optional)_ZN3QCA8PKeyBaseD0Ev@Base 2.0.3
- (optional)_ZN3QCA8PKeyBaseD1Ev@Base 2.0.3
- (optional)_ZN3QCA8PKeyBaseD2Ev@Base 2.0.3
_ZN3QCA8Provider13configChangedERK4QMapI7QString8QVariantE@Base 2.0.2
_ZN3QCA8Provider4initEv@Base 2.0.2
_ZN3QCA8Provider6deinitEv@Base 2.0.2
@@ -1236,6 +1689,7 @@
_ZN3QCA8QPipeEndD0Ev@Base 2.0.2
_ZN3QCA8QPipeEndD1Ev@Base 2.0.2
_ZN3QCA8QPipeEndD2Ev@Base 2.0.2
+ _ZN3QCA8md5_initEPNS_11md5_state_tE@Base 2.1.0+git20141126.2258
_ZN3QCA9Algorithm11takeContextEv@Base 2.0.2
_ZN3QCA9Algorithm6changeEPNS_8Provider7ContextE@Base 2.0.2
_ZN3QCA9Algorithm6changeERK7QStringS3_@Base 2.0.2
@@ -1250,18 +1704,15 @@
_ZN3QCA9AlgorithmD1Ev@Base 2.0.2
_ZN3QCA9AlgorithmD2Ev@Base 2.0.2
_ZN3QCA9AlgorithmaSERKS0_@Base 2.0.2
+ _ZN3QCA9AskerBase11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA9AskerBase11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA9AskerBase16staticMetaObjectE@Base 2.1.0+git20141126.2258
_ZN3QCA9CAContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA9CAContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA9CAContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA9CAContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA9CAContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA9CAContextD2Ev@Base 2.0.3
_ZN3QCA9DHContext11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA9DHContext11qt_metacastEPKc@Base 2.0.2
_ZN3QCA9DHContext16staticMetaObjectE@Base 2.0.2
- (optional)_ZN3QCA9DHContextD0Ev@Base 2.0.3
- (optional)_ZN3QCA9DHContextD1Ev@Base 2.0.3
- (optional)_ZN3QCA9DHContextD2Ev@Base 2.0.3
_ZN3QCA9FileWatch11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA9FileWatch11qt_metacastEPKc@Base 2.0.2
_ZN3QCA9FileWatch11setFileNameERK7QString@Base 2.0.2
@@ -1279,8 +1730,6 @@
_ZN3QCA9FileWatchD1Ev@Base 2.0.2
_ZN3QCA9FileWatchD2Ev@Base 2.0.2
_ZN3QCA9KeyBundle25setCertificateChainAndKeyERKNS_16CertificateChainERKNS_10PrivateKeyE@Base 2.0.2
- (optional=private)_ZN3QCA9KeyBundle7PrivateD1Ev@Base 2.0.3
- (optional=private)_ZN3QCA9KeyBundle7PrivateD2Ev@Base 2.0.3
_ZN3QCA9KeyBundle7setNameERK7QString@Base 2.0.2
_ZN3QCA9KeyBundle8fromFileERK7QStringRKNS_11SecureArrayEPNS_13ConvertResultES3_@Base 2.0.2
_ZN3QCA9KeyBundle9fromArrayERK10QByteArrayRKNS_11SecureArrayEPNS_13ConvertResultERK7QString@Base 2.0.2
@@ -1304,6 +1753,7 @@
_ZN3QCA9KeyLoader7Private11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.0.2
_ZN3QCA9KeyLoader7Private11qt_metacastEPKc@Base 2.0.2
_ZN3QCA9KeyLoader7Private16staticMetaObjectE@Base 2.0.2
+ _ZN3QCA9KeyLoader7Private5resetEv@Base 2.1.0
_ZN3QCA9KeyLoader7PrivateD0Ev@Base 2.0.3
_ZN3QCA9KeyLoader7PrivateD1Ev@Base 2.0.3
_ZN3QCA9KeyLoader7PrivateD2Ev@Base 2.0.3
@@ -1318,6 +1768,7 @@
_ZN3QCA9PublicKey13verifyMessageERKNS_12MemoryRegionERK10QByteArrayNS_18SignatureAlgorithmENS_15SignatureFormatE@Base 2.0.2
_ZN3QCA9PublicKey14validSignatureERK10QByteArray@Base 2.0.2
_ZN3QCA9PublicKey6updateERKNS_12MemoryRegionE@Base 2.0.2
+ _ZN3QCA9PublicKey7decryptERKNS_11SecureArrayEPS1_NS_19EncryptionAlgorithmE@Base 2.1.0+git20141126.2258
_ZN3QCA9PublicKey7encryptERKNS_11SecureArrayENS_19EncryptionAlgorithmE@Base 2.0.2
_ZN3QCA9PublicKey7fromDERERK10QByteArrayPNS_13ConvertResultERK7QString@Base 2.0.2
_ZN3QCA9PublicKey7fromPEMERK7QStringPNS_13ConvertResultES3_@Base 2.0.2
@@ -1335,10 +1786,276 @@
_ZN3QCA9PublicKeyD1Ev@Base 2.0.2
_ZN3QCA9PublicKeyD2Ev@Base 2.0.2
_ZN3QCA9PublicKeyaSERKS0_@Base 2.0.2
+ _ZN3QCA9SafeTimer10timerEventEP11QTimerEvent@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer11setIntervalEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer13setSingleShotEb@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer4stopEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer5eventEP6QEvent@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer5startEi@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer5startEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7Private10timerEventEP11QTimerEvent@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7Private11qt_metacallEN11QMetaObject4CallEiPPv@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7Private11qt_metacastEPKc@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7Private16staticMetaObjectE@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7Private5eventEP6QEvent@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7Private7needFixEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7Private8fixTimerEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7PrivateC1EP7QObject@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7PrivateC2EP7QObject@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7PrivateD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7PrivateD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7PrivateD2Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimer7timeoutEv@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimerC1EP7QObject@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimerC2EP7QObject@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimerD0Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimerD1Ev@Base 2.1.0+git20141126.2258
+ _ZN3QCA9SafeTimerD2Ev@Base 2.1.0+git20141126.2258
_ZN3QCA9providersEv@Base 2.0.2
_ZN3QCAlsER11QTextStreamRKNS_10BigIntegerE@Base 2.0.2
_ZN3QCAplERKNS_11SecureArrayES2_@Base 2.0.2
- (optional=templinst)_ZN9QHashData9hasShrunkEv@Base 2.0.2
+ (optional=templinst)_ZN4QMapI7QString8QVariantE11node_createEP8QMapDataPPNS3_4NodeERKS0_RKS1_@Base 2.1.0
+ (optional=templinst)_ZN4QMapI7QString8QVariantE13detach_helperEv@Base 2.0.3
+ (optional=templinst|arch=i386)_ZN4QMapI7QString8QVariantEC1ERKS2_@Base 2.1.0+git20141127.0009
+ (optional=templinst|arch=i386)_ZN4QMapI7QString8QVariantEC2ERKS2_@Base 2.1.0+git20141127.0009
+ (optional=templinst)_ZN4QMapI7QString8QVariantED1Ev@Base 2.0.3
+ (optional=templinst)_ZN4QMapI7QString8QVariantED2Ev@Base 2.0.3
+ (optional=templinst)_ZN4QMapI7QString8QVariantEixERKS0_@Base 2.0.3
+ (optional=templinst)_ZN4QMapI7QStringS_IS0_8QVariantEE11node_createEP8QMapDataPPNS4_4NodeERKS0_RKS2_@Base 2.1.0+git20141127.0009
+ (optional=templinst)_ZN4QMapI7QStringS_IS0_8QVariantEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN4QMapI7QStringS_IS0_8QVariantEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN4QMapI7QStringS_IS0_8QVariantEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN4QMapIN3QCA19CertificateInfoTypeE7QStringE11insertMultiERKS1_RKS2_@Base 2.1.0
+ (optional=templinst)_ZN4QMapIN3QCA19CertificateInfoTypeE7QStringE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN4QMapIN3QCA19CertificateInfoTypeE7QStringE6removeERKS1_@Base 2.1.0
+ (optional=templinst)_ZN4QMapIN3QCA19CertificateInfoTypeE7QStringED1Ev@Base 2.0.3
+ (optional=templinst)_ZN4QMapIN3QCA19CertificateInfoTypeE7QStringED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QHashIPN3QCA19KeyStoreListContextE15QHashDummyValueE11deleteNode2EPN9QHashData4NodeE@Base 2.0.3
+ (optional=templinst)_ZN5QHashIPN3QCA19KeyStoreListContextE15QHashDummyValueE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN5QHashIPN3QCA19KeyStoreListContextE15QHashDummyValueE13duplicateNodeEPN9QHashData4NodeEPv@Base 2.0.3
+ (optional=templinst|arch=amd64)_ZN5QHashIPN3QCA19KeyStoreListContextE15QHashDummyValueE6insertERKS2_RKS3_@Base 2.0.3
+ (optional=templinst)_ZN5QHashIPN3QCA19KeyStoreListContextE15QHashDummyValueED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QHashIPN3QCA19KeyStoreListContextE15QHashDummyValueED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QHashIPN3QCA8KeyStoreEiE11deleteNode2EPN9QHashData4NodeE@Base 2.0.3
+ (optional=templinst)_ZN5QHashIPN3QCA8KeyStoreEiE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN5QHashIPN3QCA8KeyStoreEiE13duplicateNodeEPN9QHashData4NodeEPv@Base 2.0.3
+ (optional=templinst)_ZN5QHashIPN3QCA8KeyStoreEiED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QHashIPN3QCA8KeyStoreEiED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QHashIiPN3QCA8KeyStoreEE11deleteNode2EPN9QHashData4NodeE@Base 2.0.3
+ (optional=templinst)_ZN5QHashIiPN3QCA8KeyStoreEE13detach_helperEv@Base 2.0.3
+ (optional=templinst)_ZN5QHashIiPN3QCA8KeyStoreEE13duplicateNodeEPN9QHashData4NodeEPv@Base 2.0.3
+ (optional=templinst)_ZN5QHashIiPN3QCA8KeyStoreEE6removeERKi@Base 2.0.3
+ (optional=templinst)_ZN5QListI10QByteArrayE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListI10QByteArrayE18detach_helper_growEii@Base 2.1.0
+ (optional=templinst)_ZN5QListI10QByteArrayE5clearEv@Base 2.0.3
+ (optional=templinst)_ZN5QListI10QByteArrayE6appendERKS0_@Base 2.0.3
+ (optional=templinst)_ZN5QListI10QByteArrayED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListI10QByteArrayED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListI5QPairIiiEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListI5QPairIiiEED1Ev@Base 2.1.0
+ (optional=templinst)_ZN5QListI5QPairIiiEED2Ev@Base 2.1.0
+ (optional=templinst)_ZN5QListI7QStringE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListI7QStringE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListI7QStringE6appendERKS0_@Base 2.0.3
+ (optional=templinst)_ZN5QListI7QStringE6detachEv@Base 2.1.0+git20141127.0009
+ (optional=templinst)_ZN5QListI7QStringEC1ERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListI7QStringEC2ERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListI7QStringED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListI7QStringED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListI7QStringEpLERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListI8QVariantE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListI8QVariantE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListI8QVariantE6appendERKS0_@Base 2.0.3
+ (optional=templinst)_ZN5QListI8QVariantE9node_copyEPNS1_4NodeES3_S3_@Base 2.0.3
+ (optional=templinst)_ZN5QListI8QVariantED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListI8QVariantED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA10DLGroupSetEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA10DLGroupSetEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA10DLGroupSetEE6appendERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA10DLGroupSetEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA10DLGroupSetEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA10TimerFixer9TimerInfoEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA10TimerFixer9TimerInfoEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA10TimerFixer9TimerInfoEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA10TimerFixer9TimerInfoEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA10TimerFixer9TimerInfoEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11CertificateEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11CertificateEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11CertificateEE6appendERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11CertificateEE9node_copyEPNS2_4NodeES4_S4_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11CertificateEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11CertificateEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11CertificateEEpLERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal11HandlerItemEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal11HandlerItemEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal11HandlerItemEE6appendERKS2_@Base 2.0.3
+ (optional=templinst|arch=i386)_ZN5QListIN3QCA11EventGlobal11HandlerItemEE6detachEv@Base 2.1.0+git20141127.0009
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal11HandlerItemEE9node_copyEPNS3_4NodeES5_S5_@Base 2.1.0+git20141127.0009
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal11HandlerItemEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal11HandlerItemEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal9AskerItemEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal9AskerItemEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal9AskerItemEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal9AskerItemEE9node_copyEPNS3_4NodeES5_S5_@Base 2.1.0+git20141127.0009
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal9AskerItemEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA11EventGlobal9AskerItemEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12LayerTracker4ItemEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12LayerTracker4ItemEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12LayerTracker4ItemEE5clearEv@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12LayerTracker4ItemEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12LayerTracker4ItemEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12LayerTracker4ItemEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12PBEAlgorithmEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12PBEAlgorithmEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12PBEAlgorithmEE6appendERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12PBEAlgorithmEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA12PBEAlgorithmEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntry4TypeEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntry4TypeEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntry4TypeEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntry4TypeEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntry4TypeEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntryEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntryEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntryEE6appendERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntryEE9node_copyEPNS2_4NodeES4_S4_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntryEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA13KeyStoreEntryEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA14ConstraintTypeEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIN3QCA14ConstraintTypeEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA14ConstraintTypeEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA15KeyStoreTracker4ItemEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA15KeyStoreTracker4ItemEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA15KeyStoreTracker4ItemEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA15KeyStoreTracker4ItemEE6detachEv@Base 2.1.0+git20141127.0009
+ (optional=templinst)_ZN5QListIN3QCA15KeyStoreTracker4ItemEE9node_copyEPNS3_4NodeES5_S5_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA15KeyStoreTracker4ItemEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA15KeyStoreTracker4ItemEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA16SecureMessageKeyEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIN3QCA16SecureMessageKeyEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA16SecureMessageKeyEE5clearEv@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA16SecureMessageKeyEE6appendERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA16SecureMessageKeyEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA16SecureMessageKeyEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA19CertificateInfoPairEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIN3QCA19CertificateInfoPairEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA19CertificateInfoPairEE6appendERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA19CertificateInfoPairEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA19CertificateInfoPairEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA19CertificateInfoTypeEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA19CertificateInfoTypeEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA19CertificateInfoTypeEE6appendERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA19CertificateInfoTypeEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA19CertificateInfoTypeEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA22CertificateInfoOrderedEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIN3QCA22CertificateInfoOrderedEE5clearEv@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA22CertificateInfoOrderedEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA22CertificateInfoOrderedEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA22SecureMessageSignatureEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA22SecureMessageSignatureEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA22SecureMessageSignatureEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3CRLEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3CRLEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3CRLEE6appendERKS1_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3CRLEE9node_copyEPNS2_4NodeES4_S4_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3CRLEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3CRLEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3CRLEEpLERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3TLS7Private6ActionEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3TLS7Private6ActionEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3TLS7Private6ActionEE5clearEv@Base 2.1.0
+ (optional=templinst)_ZN5QListIN3QCA3TLS7Private6ActionEE6appendERKS3_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3TLS7Private6ActionEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA3TLS7Private6ActionEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4PKey4TypeEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4PKey4TypeEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4PKey4TypeEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4PKey4TypeEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4PKey4TypeEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4PKey4TypeEEaSERKS3_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4SASL7Private6ActionEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4SASL7Private6ActionEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4SASL7Private6ActionEE5clearEv@Base 2.1.0
+ (optional=templinst)_ZN5QListIN3QCA4SASL7Private6ActionEE6appendERKS3_@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4SASL7Private6ActionEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA4SASL7Private6ActionEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIN3QCA8CRLEntryEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIP7QObjectE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIP7QObjectED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIP7QObjectED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPKN3QCA11CertContextEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIPKN3QCA11CertContextEE6appendERKS3_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPKN3QCA11CertContextEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPKN3QCA11CertContextEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA10CRLContextEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA10CRLContextEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA10CRLContextEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA10CRLContextEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA10TimerFixerEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIPN3QCA10TimerFixerEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA10TimerFixerEE5clearEv@Base 2.1.0
+ (optional=templinst)_ZN5QListIPN3QCA10TimerFixerEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA10TimerFixerEE9removeAllERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA10TimerFixerEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA10TimerFixerEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA11CertContextEE13detach_helperEi@Base 2.1.0+git20141127.0009
+ (optional=templinst)_ZN5QListIPN3QCA11CertContextEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA11CertContextEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA11CertContextEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA11CertContextEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA12ProviderItemEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIPN3QCA12ProviderItemEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA12ProviderItemEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA12ProviderItemEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA12ProviderItemEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA17AbstractLogDeviceEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA17AbstractLogDeviceEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA17KeyStoreOperationEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIPN3QCA17KeyStoreOperationEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA17KeyStoreOperationEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA17KeyStoreOperationEE9removeAllERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA17KeyStoreOperationEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA17KeyStoreOperationEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA20KeyStoreEntryContextEE13detach_helperEi@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA20KeyStoreEntryContextEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA20KeyStoreEntryContextEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA20KeyStoreEntryContextEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA20KeyStoreEntryContextEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA8KeyStoreEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIPN3QCA8KeyStoreEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA8KeyStoreEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA8KeyStoreEE9removeAllERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA8KeyStoreEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA8KeyStoreEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA8ProviderEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIPN3QCA8ProviderEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA8ProviderEE6appendERKS2_@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA8ProviderEE6detachEv@Base 2.1.0+git20141127.0009
+ (optional=templinst)_ZN5QListIPN3QCA8ProviderEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIPN3QCA8ProviderEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIS_IiEE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIS_IiEE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIS_IiEE6appendERKS0_@Base 2.0.3
+ (optional=templinst)_ZN5QListIS_IiEE9node_copyEPNS1_4NodeES3_S3_@Base 2.1.0
+ (optional=templinst)_ZN5QListIS_IiEED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIS_IiEED2Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIiE13detach_helperEi@Base 2.1.0
+ (optional=templinst)_ZN5QListIiE18detach_helper_growEii@Base 2.0.3
+ (optional=templinst)_ZN5QListIiE5clearEv@Base 2.0.3
+ (optional=templinst)_ZN5QListIiE6appendERKi@Base 2.0.3
+ (optional=templinst)_ZN5QListIiE9removeAllERKi@Base 2.0.3
+ (optional=templinst)_ZN5QListIiEC1ERKS0_@Base 2.0.3
+ (optional=templinst)_ZN5QListIiEC2ERKS0_@Base 2.0.3
+ (optional=templinst)_ZN5QListIiED1Ev@Base 2.0.3
+ (optional=templinst)_ZN5QListIiED2Ev@Base 2.0.3
+ _ZN6QMutex10lockInlineEv@Base 2.1.0+git20141127.0009
+ _ZN6QMutex12unlockInlineEv@Base 2.1.0+git20141127.0009
+ _ZN7QStringD1Ev@Base 2.1.0+git20141126.2258
+ _ZN7QStringD2Ev@Base 2.1.0+git20141126.2258
+ _ZN8QByteRefaSEc@Base 2.1.0+git20141126.2258
_ZNK3QCA10BigInteger7compareERKS0_@Base 2.0.2
_ZNK3QCA10BigInteger7toArrayEv@Base 2.0.2
_ZNK3QCA10BigInteger8toStringEv@Base 2.0.2
@@ -1348,6 +2065,8 @@
_ZNK3QCA10KDFContext10metaObjectEv@Base 2.0.2
_ZNK3QCA10MACContext10metaObjectEv@Base 2.0.2
_ZNK3QCA10PrivateKey10canDecryptEv@Base 2.0.2
+ _ZNK3QCA10PrivateKey10canEncryptEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA10PrivateKey18maximumEncryptSizeENS_19EncryptionAlgorithmE@Base 2.1.0+git20141126.2258
_ZNK3QCA10PrivateKey4toDHEv@Base 2.0.2
_ZNK3QCA10PrivateKey5toDERERKNS_11SecureArrayENS_12PBEAlgorithmE@Base 2.0.2
_ZNK3QCA10PrivateKey5toDSAEv@Base 2.0.2
@@ -1362,6 +2081,7 @@
_ZNK3QCA10TLSContext10metaObjectEv@Base 2.0.2
_ZNK3QCA10TLSSession6isNullEv@Base 2.0.2
_ZNK3QCA10TextFilter9directionEv@Base 2.0.2
+ _ZNK3QCA10TimerFixer10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA10TokenAsker10metaObjectEv@Base 2.0.2
_ZNK3QCA10TokenAsker8acceptedEv@Base 2.0.2
_ZNK3QCA11CertContext10metaObjectEv@Base 2.0.2
@@ -1397,6 +2117,7 @@
_ZNK3QCA11CertificateeqERKS0_@Base 2.0.2
_ZNK3QCA11DHPublicKey1yEv@Base 2.0.2
_ZNK3QCA11DHPublicKey6domainEv@Base 2.0.2
+ _ZNK3QCA11HandlerBase10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA11HashContext10metaObjectEv@Base 2.0.2
_ZNK3QCA11InfoContext10metaObjectEv@Base 2.0.2
_ZNK3QCA11InfoContext17supportedMACTypesEv@Base 2.0.2
@@ -1426,6 +2147,7 @@
_ZNK3QCA11SecureArrayixEi@Base 2.0.2
_ZNK3QCA11SecureLayer10isClosableEv@Base 2.0.2
_ZNK3QCA11SecureLayer10metaObjectEv@Base 2.0.2
+ _ZNK3QCA12AskerPrivate10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA12BasicContext10metaObjectEv@Base 2.0.2
_ZNK3QCA12DHPrivateKey1xEv@Base 2.0.2
_ZNK3QCA12DHPrivateKey1yEv@Base 2.0.2
@@ -1461,6 +2183,8 @@
_ZNK3QCA13ConsolePrompt10resultCharEv@Base 2.0.2
_ZNK3QCA13ConsolePrompt6resultEv@Base 2.0.2
_ZNK3QCA13ConsolePrompt7Private10metaObjectEv@Base 2.0.2
+ _ZNK3QCA13ConsoleThread10metaObjectEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA13ConsoleWorker10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA13DSAPrivateKey1xEv@Base 2.0.2
_ZNK3QCA13DSAPrivateKey1yEv@Base 2.0.2
_ZNK3QCA13DSAPrivateKey6domainEv@Base 2.0.2
@@ -1510,17 +2234,37 @@
_ZNK3QCA13SecureMessage9errorCodeEv@Base 2.0.2
_ZNK3QCA13SecureMessage9signatureEv@Base 2.0.2
_ZNK3QCA13SecureMessage9wasSignedEv@Base 2.0.2
+ _ZNK3QCA14ConsolePrivate10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA14ConstraintType2idEv@Base 2.0.2
_ZNK3QCA14ConstraintType5knownEv@Base 2.0.2
_ZNK3QCA14ConstraintType7sectionEv@Base 2.0.2
_ZNK3QCA14ConstraintTypeeqERKS0_@Base 2.0.2
_ZNK3QCA14ConstraintTypeltERKS0_@Base 2.0.2
_ZNK3QCA14DLGroupContext10metaObjectEv@Base 2.0.2
+ _ZNK3QCA14KeyStoreThread10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA14MessageContext10metaObjectEv@Base 2.0.2
_ZNK3QCA14MessageContext14diagnosticTextEv@Base 2.0.2
+ _ZNK3QCA15DefaultProvider10qcaVersionEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15DefaultProvider13defaultConfigEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15DefaultProvider4nameEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15DefaultProvider7versionEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15DefaultProvider8featuresEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15KeyLoaderThread10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA15KeyStoreManager10metaObjectEv@Base 2.0.2
_ZNK3QCA15KeyStoreManager6isBusyEv@Base 2.0.2
_ZNK3QCA15KeyStoreManager9keyStoresEv@Base 2.0.2
+ _ZNK3QCA15KeyStorePrivate10metaObjectEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15KeyStoreTracker10metaObjectEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15KeyStoreTracker18haveProviderSourceEPNS_8ProviderE@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15ProviderManager11allFeaturesEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15ProviderManager11haveAlreadyERK7QString@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15ProviderManager14diagnosticTextEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15ProviderManager20get_default_priorityERK7QString@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15ProviderManager4findEPNS_8ProviderE@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15ProviderManager4findERK7QString@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15ProviderManager7findForERK7QStringS3_@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15ProviderManager9providersEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA15SyncThreadAgent10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA16ConsoleReference10metaObjectEv@Base 2.0.2
_ZNK3QCA16ConsoleReference12bytesToWriteEv@Base 2.0.2
_ZNK3QCA16ConsoleReference12securityModeEv@Base 2.0.2
@@ -1536,6 +2280,9 @@
_ZNK3QCA16SecureMessageKey6isNullEv@Base 2.0.2
_ZNK3QCA17AbstractLogDevice10metaObjectEv@Base 2.0.2
_ZNK3QCA17AbstractLogDevice4nameEv@Base 2.0.2
+ _ZNK3QCA17DefaultMD5Context5cloneEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA17KeyStoreOperation10metaObjectEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA17SynchronizerAgent10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA17TLSSessionContext10metaObjectEv@Base 2.0.2
_ZNK3QCA18CertificateOptions11constraintsEv@Base 2.0.2
_ZNK3QCA18CertificateOptions11infoOrderedEv@Base 2.0.2
@@ -1568,6 +2315,8 @@
_ZNK3QCA18CertificateRequest9pathLimitEv@Base 2.0.2
_ZNK3QCA18CertificateRequest9toPEMFileERK7QString@Base 2.0.2
_ZNK3QCA18CertificateRequesteqERKS0_@Base 2.0.2
+ _ZNK3QCA18DefaultSHA1Context5cloneEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA18SafeSocketNotifier10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA19CertificateInfoPair4typeEv@Base 2.0.2
_ZNK3QCA19CertificateInfoPair5valueEv@Base 2.0.2
_ZNK3QCA19CertificateInfoPaireqERKS0_@Base 2.0.2
@@ -1576,6 +2325,12 @@
_ZNK3QCA19CertificateInfoType7sectionEv@Base 2.0.2
_ZNK3QCA19CertificateInfoTypeeqERKS0_@Base 2.0.2
_ZNK3QCA19CertificateInfoTypeltERKS0_@Base 2.0.2
+ _ZNK3QCA19DefaultKeyStoreList10entryTypesEi@Base 2.1.0+git20141126.2258
+ _ZNK3QCA19DefaultKeyStoreList10metaObjectEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA19DefaultKeyStoreList4nameEi@Base 2.1.0+git20141126.2258
+ _ZNK3QCA19DefaultKeyStoreList4typeEi@Base 2.1.0+git20141126.2258
+ _ZNK3QCA19DefaultKeyStoreList5cloneEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA19DefaultKeyStoreList7storeIdEi@Base 2.1.0+git20141126.2258
_ZNK3QCA19KeyStoreListContext10isReadOnlyEi@Base 2.0.2
_ZNK3QCA19KeyStoreListContext10metaObjectEv@Base 2.0.2
_ZNK3QCA19SecureMessageSystem10metaObjectEv@Base 2.0.2
@@ -1583,6 +2338,16 @@
_ZNK3QCA20CertificateAuthority11signRequestERKNS_18CertificateRequestERK9QDateTime@Base 2.0.2
_ZNK3QCA20CertificateAuthority9createCRLERK9QDateTime@Base 2.0.2
_ZNK3QCA20CertificateAuthority9updateCRLERKNS_3CRLERK5QListINS_8CRLEntryEERK9QDateTime@Base 2.0.2
+ _ZNK3QCA20DefaultKeyStoreEntry11certificateEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA20DefaultKeyStoreEntry2idEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA20DefaultKeyStoreEntry3crlEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA20DefaultKeyStoreEntry4nameEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA20DefaultKeyStoreEntry4typeEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA20DefaultKeyStoreEntry5cloneEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA20DefaultKeyStoreEntry7storeIdEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA20DefaultKeyStoreEntry9serializeEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA20DefaultKeyStoreEntry9storeNameEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA20DefaultRandomContext5cloneEv@Base 2.1.0+git20141126.2258
_ZNK3QCA20KeyStoreEntryContext10metaObjectEv@Base 2.0.2
_ZNK3QCA20KeyStoreEntryContext11certificateEv@Base 2.0.2
_ZNK3QCA20KeyStoreEntryContext11isAvailableEv@Base 2.0.2
@@ -1597,10 +2362,13 @@
_ZNK3QCA21CertificateCollection12certificatesEv@Base 2.0.2
_ZNK3QCA21CertificateCollection4crlsEv@Base 2.0.2
_ZNK3QCA21CertificateCollectionplERKS0_@Base 2.0.2
+ _ZNK3QCA22KeyStoreManagerPrivate10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA22SecureMessageSignature11keyValidityEv@Base 2.0.2
_ZNK3QCA22SecureMessageSignature14identityResultEv@Base 2.0.2
_ZNK3QCA22SecureMessageSignature3keyEv@Base 2.0.2
_ZNK3QCA22SecureMessageSignature9timestampEv@Base 2.0.2
+ _ZNK3QCA23ConsoleReferencePrivate10metaObjectEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA23QFileSystemWatcherRelay10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA25MessageAuthenticationCode14validKeyLengthEi@Base 2.0.2
_ZNK3QCA25MessageAuthenticationCode4typeEv@Base 2.0.2
_ZNK3QCA25MessageAuthenticationCode9keyLengthEv@Base 2.0.2
@@ -1687,6 +2455,33 @@
_ZNK3QCA4SASL9errorCodeEv@Base 2.0.2
_ZNK3QCA4SASL9mechanismEv@Base 2.0.2
_ZNK3QCA4SASL9realmListEv@Base 2.0.2
+ (optional=templinst)_ZNK3QCA5Botan12MemoryRegionIjE7grow_toEj@Base 2.0.3
+ _ZNK3QCA5Botan13Library_State13get_allocatorERKSs@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan13Library_State9get_mutexEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan15Builtin_Modules10allocatorsEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan15Builtin_Modules13mutex_factoryEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan15Builtin_Modules17default_allocatorEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan16Malloc_Allocator4typeEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan17Locking_Allocator4typeEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan17Pooling_Allocator12Memory_Block8containsEPvj@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan23MemoryMapping_Allocator4typeEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt12encoded_sizeENS1_4BaseE@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt12reverse_signEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt13binary_encodeEPh@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt13get_substringEjj@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt3absEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt3cmpERKS1_b@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt4bitsEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt5bytesEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt7byte_atEj@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt7get_bitEj@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt7grow_toEj@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt7is_zeroEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt8grow_regEj@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt9sig_wordsEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigInt9to_u32bitEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan6BigIntngEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA5Botan9Exception4whatEv@Base 2.1.0+git20141126.2258
_ZNK3QCA5Event12keyStoreInfoEv@Base 2.0.2
_ZNK3QCA5Event13keyStoreEntryEv@Base 2.0.2
_ZNK3QCA5Event13passwordStyleEv@Base 2.0.2
@@ -1770,6 +2565,7 @@
_ZNK3QCA9Algorithm4typeEv@Base 2.0.2
_ZNK3QCA9Algorithm7contextEv@Base 2.0.2
_ZNK3QCA9Algorithm8providerEv@Base 2.0.2
+ _ZNK3QCA9AskerBase10metaObjectEv@Base 2.1.0+git20141126.2258
_ZNK3QCA9CAContext10metaObjectEv@Base 2.0.2
_ZNK3QCA9DHContext10metaObjectEv@Base 2.0.2
_ZNK3QCA9FileWatch10metaObjectEv@Base 2.0.2
@@ -1786,6 +2582,7 @@
_ZNK3QCA9KeyLoader13convertResultEv@Base 2.0.2
_ZNK3QCA9KeyLoader7Private10metaObjectEv@Base 2.0.2
_ZNK3QCA9KeyLoader9keyBundleEv@Base 2.0.2
+ _ZNK3QCA9PublicKey10canDecryptEv@Base 2.1.0+git20141126.2258
_ZNK3QCA9PublicKey10canEncryptEv@Base 2.0.2
_ZNK3QCA9PublicKey18maximumEncryptSizeENS_19EncryptionAlgorithmE@Base 2.0.2
_ZNK3QCA9PublicKey4toDHEv@Base 2.0.2
@@ -1795,31 +2592,31 @@
_ZNK3QCA9PublicKey5toRSAEv@Base 2.0.2
_ZNK3QCA9PublicKey9canVerifyEv@Base 2.0.2
_ZNK3QCA9PublicKey9toPEMFileERK7QString@Base 2.0.2
+ _ZNK3QCA9SafeTimer10metaObjectEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA9SafeTimer12isSingleShotEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA9SafeTimer7Private10metaObjectEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA9SafeTimer8intervalEv@Base 2.1.0+git20141126.2258
+ _ZNK3QCA9SafeTimer8isActiveEv@Base 2.1.0+git20141126.2258
+ (optional=templinst)_ZNK4QMapIN3QCA19CertificateInfoTypeE7QStringE5valueERKS1_@Base 2.1.0
+ (optional=templinst)_ZNK4QMapIN3QCA19CertificateInfoTypeE7QStringE6valuesERKS1_@Base 2.0.3
+ (optional=templinst)_ZNK5QListIN3QCA14ConstraintTypeEE8containsERKS1_@Base 2.0.3
+ (optional=templinst)_ZNKSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan9AllocatorEESt10_Select1stIS6_ESt4lessISsESaIS6_EE4findERS1_@Base 2.0.3
(optional=templinst)_ZNSt6vectorIN3QCA5Botan17Pooling_Allocator12Memory_BlockESaIS3_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS3_S5_EERKS3_@Base 2.0.3
(optional=templinst)_ZNSt6vectorIPN3QCA5Botan9AllocatorESaIS3_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS3_S5_EERKS3_@Base 2.0.3
(optional=templinst)_ZNSt6vectorISt4pairIPvjESaIS2_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS2_S4_EERKS2_@Base 2.0.2
- (optional=templinst)_ZNSt6vectorISt4pairIPvjESaIS2_EED1Ev@Base 2.0.3
- (optional=templinst)_ZNSt6vectorISt4pairIPvjESaIS2_EED2Ev@Base 2.0.3
- (optional=templinst)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan5MutexEESt10_Select1stIS6_ESt4lessISsESaIS6_EE10_M_insert_EPKSt18_Rb_tree_node_baseSF_RKS6_@Base 2.0.3
- (optional=templinst)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan5MutexEESt10_Select1stIS6_ESt4lessISsESaIS6_EE16_M_insert_uniqueERKS6_@Base 2.0.3
(optional=templinst)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan5MutexEESt10_Select1stIS6_ESt4lessISsESaIS6_EE17_M_insert_unique_ESt23_Rb_tree_const_iteratorIS6_ERKS6_@Base 2.0.3
+ (optional=templinst)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan5MutexEESt10_Select1stIS6_ESt4lessISsESaIS6_EE24_M_get_insert_unique_posERS1_@Base 2.0.3
+ (optional=templinst|arch=amd64)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan5MutexEESt10_Select1stIS6_ESt4lessISsESaIS6_EE29_M_get_insert_hint_unique_posESt23_Rb_tree_const_iteratorIS6_ERS1_@Base 2.0.3
(optional=templinst)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan5MutexEESt10_Select1stIS6_ESt4lessISsESaIS6_EE8_M_eraseEPSt13_Rb_tree_nodeIS6_E@Base 2.0.3
- (optional=templinst)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan9AllocatorEESt10_Select1stIS6_ESt4lessISsESaIS6_EE10_M_insert_EPKSt18_Rb_tree_node_baseSF_RKS6_@Base 2.0.3
- (optional=templinst)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan9AllocatorEESt10_Select1stIS6_ESt4lessISsESaIS6_EE16_M_insert_uniqueERKS6_@Base 2.0.3
(optional=templinst)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan9AllocatorEESt10_Select1stIS6_ESt4lessISsESaIS6_EE17_M_insert_unique_ESt23_Rb_tree_const_iteratorIS6_ERKS6_@Base 2.0.3
+ (optional=templinst)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan9AllocatorEESt10_Select1stIS6_ESt4lessISsESaIS6_EE24_M_get_insert_unique_posERS1_@Base 2.0.3
+ (optional=templinst|arch=amd64)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan9AllocatorEESt10_Select1stIS6_ESt4lessISsESaIS6_EE29_M_get_insert_hint_unique_posESt23_Rb_tree_const_iteratorIS6_ERS1_@Base 2.0.3
(optional=templinst)_ZNSt8_Rb_treeISsSt4pairIKSsPN3QCA5Botan9AllocatorEESt10_Select1stIS6_ESt4lessISsESaIS6_EE8_M_eraseEPSt13_Rb_tree_nodeIS6_E@Base 2.0.3
- (optional=templinst)_ZSt11__push_heapIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEEiS5_EvT_T0_SC_T1_@Base 2.0.3
- (optional=templinst)_ZSt11__push_heapIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEElS5_EvT_T0_SC_T1_@Base 2.0.3
- (optional=templinst)_ZSt11lower_boundIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEES5_ET_SB_SB_RKT0_@Base 2.0.3
- (optional=templinst)_ZSt13__adjust_heapIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEEiS5_EvT_T0_SC_T1_@Base 2.0.3
- (optional=templinst)_ZSt13__adjust_heapIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEElS5_EvT_T0_SC_T1_@Base 2.0.3
- (optional=templinst)_ZSt13__heap_selectIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEEEvT_SB_SB_@Base 2.0.3
- (optional=templinst)_ZSt16__insertion_sortIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEEEvT_SB_@Base 2.0.3
- (optional=templinst)_ZSt16__introsort_loopIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEEiEvT_SB_T0_@Base 2.0.3
- (optional=templinst)_ZSt16__introsort_loopIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEElEvT_SB_T0_@Base 2.0.3
- (optional=templinst)_ZSt19__move_median_firstIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEEEvT_SB_SB_@Base 2.0.3
- (optional=templinst)_ZSt21__unguarded_partitionIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEES5_ET_SB_SB_RKT0_@Base 2.0.3
- (optional=templinst)_ZSt25__unguarded_linear_insertIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEEEvT_@Base 2.0.3
+ (optional=templinst|arch=i386)_ZSt13__adjust_heapIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEEiS5_NS0_5__ops15_Iter_less_iterEEvT_T0_SE_T1_T2_@Base 2.1.0+git20141126.2258
+ (optional=templinst|arch=amd64)_ZSt13__adjust_heapIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEElS5_NS0_5__ops15_Iter_less_iterEEvT_T0_SE_T1_T2_@Base 2.0.3
+ (optional=templinst)_ZSt16__insertion_sortIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEENS0_5__ops15_Iter_less_iterEEvT_SD_T0_@Base 2.0.3
+ (optional=templinst)_ZSt22__move_median_to_firstIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEENS0_5__ops15_Iter_less_iterEEvT_SD_SD_SD_T0_@Base 2.0.3
+ (optional=templinst)_ZSt25__unguarded_linear_insertIN9__gnu_cxx17__normal_iteratorIPN3QCA5Botan17Pooling_Allocator12Memory_BlockESt6vectorIS5_SaIS5_EEEENS0_5__ops14_Val_less_iterEEvT_T0_@Base 2.0.3
(optional=templinst)_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@Base 2.0.2
(optional=templinst)_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_PKS3_@Base 2.0.3
(optional=templinst)_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_@Base 2.0.2
@@ -1836,11 +2633,13 @@
_ZTIN3QCA10TLSContextE@Base 2.0.2
_ZTIN3QCA10TLSSessionE@Base 2.0.2
_ZTIN3QCA10TextFilterE@Base 2.0.2
+ _ZTIN3QCA10TimerFixerE@Base 2.1.0+git20141126.2258
_ZTIN3QCA10TokenAsker7PrivateE@Base 2.0.2
_ZTIN3QCA10TokenAskerE@Base 2.0.2
_ZTIN3QCA11CertContextE@Base 2.0.2
_ZTIN3QCA11CertificateE@Base 2.0.2
_ZTIN3QCA11DHPublicKeyE@Base 2.0.2
+ _ZTIN3QCA11HandlerBaseE@Base 2.1.0+git20141126.2258
_ZTIN3QCA11HashContextE@Base 2.0.2
_ZTIN3QCA11InfoContextE@Base 2.0.2
_ZTIN3QCA11PKeyContextE@Base 2.0.2
@@ -1848,6 +2647,7 @@
_ZTIN3QCA11QPipeDeviceE@Base 2.0.2
_ZTIN3QCA11SASLContextE@Base 2.0.2
_ZTIN3QCA11SecureLayerE@Base 2.0.2
+ _ZTIN3QCA12AskerPrivateE@Base 2.1.0+git20141126.2258
_ZTIN3QCA12BasicContextE@Base 2.0.2
_ZTIN3QCA12DHPrivateKeyE@Base 2.0.2
_ZTIN3QCA12DSAPublicKeyE@Base 2.0.2
@@ -1861,6 +2661,8 @@
_ZTIN3QCA13CipherContextE@Base 2.0.2
_ZTIN3QCA13ConsolePrompt7PrivateE@Base 2.0.2
_ZTIN3QCA13ConsolePromptE@Base 2.0.2
+ _ZTIN3QCA13ConsoleThreadE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA13ConsoleWorkerE@Base 2.1.0+git20141126.2258
_ZTIN3QCA13DSAPrivateKeyE@Base 2.0.2
_ZTIN3QCA13KeyStoreEntryE@Base 2.0.2
_ZTIN3QCA13PGPKeyContextE@Base 2.0.2
@@ -1871,22 +2673,40 @@
_ZTIN3QCA13RandomContextE@Base 2.0.2
_ZTIN3QCA13SecureMessage7PrivateE@Base 2.0.2
_ZTIN3QCA13SecureMessageE@Base 2.0.2
+ _ZTIN3QCA14ConsolePrivateE@Base 2.1.0+git20141126.2258
_ZTIN3QCA14DLGroupContextE@Base 2.0.2
+ _ZTIN3QCA14KeyStoreThreadE@Base 2.1.0+git20141126.2258
_ZTIN3QCA14MessageContextE@Base 2.0.2
+ _ZTIN3QCA15DefaultProviderE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA15KeyLoaderThreadE@Base 2.1.0+git20141126.2258
_ZTIN3QCA15KeyStoreManagerE@Base 2.0.2
+ _ZTIN3QCA15KeyStorePrivateE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA15KeyStoreTrackerE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA15SyncThreadAgentE@Base 2.1.0+git20141126.2258
_ZTIN3QCA16ConsoleReferenceE@Base 2.0.2
_ZTIN3QCA17AbstractLogDeviceE@Base 2.0.2
+ _ZTIN3QCA17DefaultMD5ContextE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA17KeyStoreOperationE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA17SynchronizerAgentE@Base 2.1.0+git20141126.2258
_ZTIN3QCA17TLSSessionContextE@Base 2.0.2
_ZTIN3QCA18CertificateRequestE@Base 2.0.2
+ _ZTIN3QCA18DefaultSHA1ContextE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA18SafeSocketNotifierE@Base 2.1.0+git20141126.2258
_ZTIN3QCA19BufferedComputationE@Base 2.0.2
+ _ZTIN3QCA19DefaultKeyStoreListE@Base 2.1.0+git20141126.2258
_ZTIN3QCA19KeyStoreListContextE@Base 2.0.2
_ZTIN3QCA19SecureMessageSystemE@Base 2.0.2
_ZTIN3QCA20CertificateAuthorityE@Base 2.0.2
+ _ZTIN3QCA20DefaultKeyStoreEntryE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA20DefaultRandomContextE@Base 2.1.0+git20141126.2258
_ZTIN3QCA20KeyStoreEntryContextE@Base 2.0.2
_ZTIN3QCA20KeyStoreEntryWatcher7PrivateE@Base 2.0.2
_ZTIN3QCA20KeyStoreEntryWatcherE@Base 2.0.2
_ZTIN3QCA21CertCollectionContextE@Base 2.0.2
_ZTIN3QCA21KeyDerivationFunctionE@Base 2.0.2
+ _ZTIN3QCA22KeyStoreManagerPrivateE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA23ConsoleReferencePrivateE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA23QFileSystemWatcherRelayE@Base 2.1.0+git20141126.2258
_ZTIN3QCA25MessageAuthenticationCodeE@Base 2.0.2
_ZTIN3QCA3CMSE@Base 2.0.2
_ZTIN3QCA3CRLE@Base 2.0.2
@@ -1897,6 +2717,32 @@
_ZTIN3QCA4PKeyE@Base 2.0.2
_ZTIN3QCA4SASL7PrivateE@Base 2.0.2
_ZTIN3QCA4SASLE@Base 2.0.2
+ _ZTIN3QCA5Botan12Config_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan12Format_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan13Invalid_StateE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan13Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan14Encoding_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan14Internal_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan15Builtin_ModulesE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan16Invalid_ArgumentE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan16Malloc_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan16Qt_Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan17Invalid_IV_LengthE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan17Locking_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan17Memory_ExhaustionE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan17Pooling_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan18Invalid_Block_SizeE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan18Invalid_Key_LengthE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan19Algorithm_Not_FoundE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan21Default_Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan22Invalid_Algorithm_NameE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan22Invalid_Message_NumberE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan23MemoryMapping_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan5MutexE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan6BigInt12DivideByZeroE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan7ModulesE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan9AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA5Botan9ExceptionE@Base 2.1.0+git20141126.2258
_ZTIN3QCA6Base64E@Base 2.0.2
_ZTIN3QCA6CipherE@Base 2.0.2
_ZTIN3QCA6FilterE@Base 2.0.2
@@ -1915,6 +2761,7 @@
_ZTIN3QCA8QPipeEnd7PrivateE@Base 2.0.2
_ZTIN3QCA8QPipeEndE@Base 2.0.2
_ZTIN3QCA9AlgorithmE@Base 2.0.2
+ _ZTIN3QCA9AskerBaseE@Base 2.1.0+git20141126.2258
_ZTIN3QCA9CAContextE@Base 2.0.2
_ZTIN3QCA9DHContextE@Base 2.0.2
_ZTIN3QCA9FileWatch7PrivateE@Base 2.0.2
@@ -1922,6 +2769,8 @@
_ZTIN3QCA9KeyLoader7PrivateE@Base 2.0.2
_ZTIN3QCA9KeyLoaderE@Base 2.0.2
_ZTIN3QCA9PublicKeyE@Base 2.0.2
+ _ZTIN3QCA9SafeTimer7PrivateE@Base 2.1.0+git20141126.2258
+ _ZTIN3QCA9SafeTimerE@Base 2.1.0+git20141126.2258
_ZTSN3QCA10CRLContextE@Base 2.0.2
_ZTSN3QCA10CSRContextE@Base 2.0.2
_ZTSN3QCA10DSAContextE@Base 2.0.2
@@ -1935,11 +2784,13 @@
_ZTSN3QCA10TLSContextE@Base 2.0.2
_ZTSN3QCA10TLSSessionE@Base 2.0.2
_ZTSN3QCA10TextFilterE@Base 2.0.2
+ _ZTSN3QCA10TimerFixerE@Base 2.1.0+git20141126.2258
_ZTSN3QCA10TokenAsker7PrivateE@Base 2.0.2
_ZTSN3QCA10TokenAskerE@Base 2.0.2
_ZTSN3QCA11CertContextE@Base 2.0.2
_ZTSN3QCA11CertificateE@Base 2.0.2
_ZTSN3QCA11DHPublicKeyE@Base 2.0.2
+ _ZTSN3QCA11HandlerBaseE@Base 2.1.0+git20141126.2258
_ZTSN3QCA11HashContextE@Base 2.0.2
_ZTSN3QCA11InfoContextE@Base 2.0.2
_ZTSN3QCA11PKeyContextE@Base 2.0.2
@@ -1947,6 +2798,7 @@
_ZTSN3QCA11QPipeDeviceE@Base 2.0.2
_ZTSN3QCA11SASLContextE@Base 2.0.2
_ZTSN3QCA11SecureLayerE@Base 2.0.2
+ _ZTSN3QCA12AskerPrivateE@Base 2.1.0+git20141126.2258
_ZTSN3QCA12BasicContextE@Base 2.0.2
_ZTSN3QCA12DHPrivateKeyE@Base 2.0.2
_ZTSN3QCA12DSAPublicKeyE@Base 2.0.2
@@ -1960,6 +2812,8 @@
_ZTSN3QCA13CipherContextE@Base 2.0.2
_ZTSN3QCA13ConsolePrompt7PrivateE@Base 2.0.2
_ZTSN3QCA13ConsolePromptE@Base 2.0.2
+ _ZTSN3QCA13ConsoleThreadE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA13ConsoleWorkerE@Base 2.1.0+git20141126.2258
_ZTSN3QCA13DSAPrivateKeyE@Base 2.0.2
_ZTSN3QCA13KeyStoreEntryE@Base 2.0.2
_ZTSN3QCA13PGPKeyContextE@Base 2.0.2
@@ -1970,22 +2824,40 @@
_ZTSN3QCA13RandomContextE@Base 2.0.2
_ZTSN3QCA13SecureMessage7PrivateE@Base 2.0.2
_ZTSN3QCA13SecureMessageE@Base 2.0.2
+ _ZTSN3QCA14ConsolePrivateE@Base 2.1.0+git20141126.2258
_ZTSN3QCA14DLGroupContextE@Base 2.0.2
+ _ZTSN3QCA14KeyStoreThreadE@Base 2.1.0+git20141126.2258
_ZTSN3QCA14MessageContextE@Base 2.0.2
+ _ZTSN3QCA15DefaultProviderE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA15KeyLoaderThreadE@Base 2.1.0+git20141126.2258
_ZTSN3QCA15KeyStoreManagerE@Base 2.0.2
+ _ZTSN3QCA15KeyStorePrivateE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA15KeyStoreTrackerE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA15SyncThreadAgentE@Base 2.1.0+git20141126.2258
_ZTSN3QCA16ConsoleReferenceE@Base 2.0.2
_ZTSN3QCA17AbstractLogDeviceE@Base 2.0.2
+ _ZTSN3QCA17DefaultMD5ContextE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA17KeyStoreOperationE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA17SynchronizerAgentE@Base 2.1.0+git20141126.2258
_ZTSN3QCA17TLSSessionContextE@Base 2.0.2
_ZTSN3QCA18CertificateRequestE@Base 2.0.2
+ _ZTSN3QCA18DefaultSHA1ContextE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA18SafeSocketNotifierE@Base 2.1.0+git20141126.2258
_ZTSN3QCA19BufferedComputationE@Base 2.0.2
+ _ZTSN3QCA19DefaultKeyStoreListE@Base 2.1.0+git20141126.2258
_ZTSN3QCA19KeyStoreListContextE@Base 2.0.2
_ZTSN3QCA19SecureMessageSystemE@Base 2.0.2
_ZTSN3QCA20CertificateAuthorityE@Base 2.0.2
+ _ZTSN3QCA20DefaultKeyStoreEntryE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA20DefaultRandomContextE@Base 2.1.0+git20141126.2258
_ZTSN3QCA20KeyStoreEntryContextE@Base 2.0.2
_ZTSN3QCA20KeyStoreEntryWatcher7PrivateE@Base 2.0.2
_ZTSN3QCA20KeyStoreEntryWatcherE@Base 2.0.2
_ZTSN3QCA21CertCollectionContextE@Base 2.0.2
_ZTSN3QCA21KeyDerivationFunctionE@Base 2.0.2
+ _ZTSN3QCA22KeyStoreManagerPrivateE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA23ConsoleReferencePrivateE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA23QFileSystemWatcherRelayE@Base 2.1.0+git20141126.2258
_ZTSN3QCA25MessageAuthenticationCodeE@Base 2.0.2
_ZTSN3QCA3CMSE@Base 2.0.2
_ZTSN3QCA3CRLE@Base 2.0.2
@@ -1996,6 +2868,32 @@
_ZTSN3QCA4PKeyE@Base 2.0.2
_ZTSN3QCA4SASL7PrivateE@Base 2.0.2
_ZTSN3QCA4SASLE@Base 2.0.2
+ _ZTSN3QCA5Botan12Config_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan12Format_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan13Invalid_StateE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan13Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan14Encoding_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan14Internal_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan15Builtin_ModulesE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan16Invalid_ArgumentE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan16Malloc_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan16Qt_Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan17Invalid_IV_LengthE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan17Locking_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan17Memory_ExhaustionE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan17Pooling_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan18Invalid_Block_SizeE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan18Invalid_Key_LengthE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan19Algorithm_Not_FoundE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan21Default_Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan22Invalid_Algorithm_NameE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan22Invalid_Message_NumberE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan23MemoryMapping_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan5MutexE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan6BigInt12DivideByZeroE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan7ModulesE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan9AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA5Botan9ExceptionE@Base 2.1.0+git20141126.2258
_ZTSN3QCA6Base64E@Base 2.0.2
_ZTSN3QCA6CipherE@Base 2.0.2
_ZTSN3QCA6FilterE@Base 2.0.2
@@ -2014,6 +2912,7 @@
_ZTSN3QCA8QPipeEnd7PrivateE@Base 2.0.2
_ZTSN3QCA8QPipeEndE@Base 2.0.2
_ZTSN3QCA9AlgorithmE@Base 2.0.2
+ _ZTSN3QCA9AskerBaseE@Base 2.1.0+git20141126.2258
_ZTSN3QCA9CAContextE@Base 2.0.2
_ZTSN3QCA9DHContextE@Base 2.0.2
_ZTSN3QCA9FileWatch7PrivateE@Base 2.0.2
@@ -2021,6 +2920,8 @@
_ZTSN3QCA9KeyLoader7PrivateE@Base 2.0.2
_ZTSN3QCA9KeyLoaderE@Base 2.0.2
_ZTSN3QCA9PublicKeyE@Base 2.0.2
+ _ZTSN3QCA9SafeTimer7PrivateE@Base 2.1.0+git20141126.2258
+ _ZTSN3QCA9SafeTimerE@Base 2.1.0+git20141126.2258
_ZTVN3QCA10CRLContextE@Base 2.0.2
_ZTVN3QCA10CSRContextE@Base 2.0.2
_ZTVN3QCA10DSAContextE@Base 2.0.2
@@ -2034,11 +2935,13 @@
_ZTVN3QCA10TLSContextE@Base 2.0.2
_ZTVN3QCA10TLSSessionE@Base 2.0.2
_ZTVN3QCA10TextFilterE@Base 2.0.2
+ _ZTVN3QCA10TimerFixerE@Base 2.1.0+git20141126.2258
_ZTVN3QCA10TokenAsker7PrivateE@Base 2.0.2
_ZTVN3QCA10TokenAskerE@Base 2.0.2
_ZTVN3QCA11CertContextE@Base 2.0.2
_ZTVN3QCA11CertificateE@Base 2.0.2
_ZTVN3QCA11DHPublicKeyE@Base 2.0.2
+ _ZTVN3QCA11HandlerBaseE@Base 2.1.0+git20141126.2258
_ZTVN3QCA11HashContextE@Base 2.0.2
_ZTVN3QCA11InfoContextE@Base 2.0.2
_ZTVN3QCA11PKeyContextE@Base 2.0.2
@@ -2046,6 +2949,7 @@
_ZTVN3QCA11QPipeDeviceE@Base 2.0.2
_ZTVN3QCA11SASLContextE@Base 2.0.2
_ZTVN3QCA11SecureLayerE@Base 2.0.2
+ _ZTVN3QCA12AskerPrivateE@Base 2.1.0+git20141126.2258
_ZTVN3QCA12BasicContextE@Base 2.0.2
_ZTVN3QCA12DHPrivateKeyE@Base 2.0.2
_ZTVN3QCA12DSAPublicKeyE@Base 2.0.2
@@ -2059,6 +2963,8 @@
_ZTVN3QCA13CipherContextE@Base 2.0.2
_ZTVN3QCA13ConsolePrompt7PrivateE@Base 2.0.2
_ZTVN3QCA13ConsolePromptE@Base 2.0.2
+ _ZTVN3QCA13ConsoleThreadE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA13ConsoleWorkerE@Base 2.1.0+git20141126.2258
_ZTVN3QCA13DSAPrivateKeyE@Base 2.0.2
_ZTVN3QCA13KeyStoreEntryE@Base 2.0.2
_ZTVN3QCA13PGPKeyContextE@Base 2.0.2
@@ -2069,22 +2975,40 @@
_ZTVN3QCA13RandomContextE@Base 2.0.2
_ZTVN3QCA13SecureMessage7PrivateE@Base 2.0.2
_ZTVN3QCA13SecureMessageE@Base 2.0.2
+ _ZTVN3QCA14ConsolePrivateE@Base 2.1.0+git20141126.2258
_ZTVN3QCA14DLGroupContextE@Base 2.0.2
+ _ZTVN3QCA14KeyStoreThreadE@Base 2.1.0+git20141126.2258
_ZTVN3QCA14MessageContextE@Base 2.0.2
+ _ZTVN3QCA15DefaultProviderE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA15KeyLoaderThreadE@Base 2.1.0+git20141126.2258
_ZTVN3QCA15KeyStoreManagerE@Base 2.0.2
+ _ZTVN3QCA15KeyStorePrivateE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA15KeyStoreTrackerE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA15SyncThreadAgentE@Base 2.1.0+git20141126.2258
_ZTVN3QCA16ConsoleReferenceE@Base 2.0.2
_ZTVN3QCA17AbstractLogDeviceE@Base 2.0.2
+ _ZTVN3QCA17DefaultMD5ContextE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA17KeyStoreOperationE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA17SynchronizerAgentE@Base 2.1.0+git20141126.2258
_ZTVN3QCA17TLSSessionContextE@Base 2.0.2
_ZTVN3QCA18CertificateRequestE@Base 2.0.2
+ _ZTVN3QCA18DefaultSHA1ContextE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA18SafeSocketNotifierE@Base 2.1.0+git20141126.2258
_ZTVN3QCA19BufferedComputationE@Base 2.0.2
+ _ZTVN3QCA19DefaultKeyStoreListE@Base 2.1.0+git20141126.2258
_ZTVN3QCA19KeyStoreListContextE@Base 2.0.2
_ZTVN3QCA19SecureMessageSystemE@Base 2.0.2
_ZTVN3QCA20CertificateAuthorityE@Base 2.0.2
+ _ZTVN3QCA20DefaultKeyStoreEntryE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA20DefaultRandomContextE@Base 2.1.0+git20141126.2258
_ZTVN3QCA20KeyStoreEntryContextE@Base 2.0.2
_ZTVN3QCA20KeyStoreEntryWatcher7PrivateE@Base 2.0.2
_ZTVN3QCA20KeyStoreEntryWatcherE@Base 2.0.2
_ZTVN3QCA21CertCollectionContextE@Base 2.0.2
_ZTVN3QCA21KeyDerivationFunctionE@Base 2.0.2
+ _ZTVN3QCA22KeyStoreManagerPrivateE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA23ConsoleReferencePrivateE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA23QFileSystemWatcherRelayE@Base 2.1.0+git20141126.2258
_ZTVN3QCA25MessageAuthenticationCodeE@Base 2.0.2
_ZTVN3QCA3CMSE@Base 2.0.2
_ZTVN3QCA3CRLE@Base 2.0.2
@@ -2095,6 +3019,32 @@
_ZTVN3QCA4PKeyE@Base 2.0.2
_ZTVN3QCA4SASL7PrivateE@Base 2.0.2
_ZTVN3QCA4SASLE@Base 2.0.2
+ _ZTVN3QCA5Botan12Config_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan12Format_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan13Invalid_StateE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan13Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan14Encoding_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan14Internal_ErrorE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan15Builtin_ModulesE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan16Invalid_ArgumentE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan16Malloc_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan16Qt_Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan17Invalid_IV_LengthE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan17Locking_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan17Memory_ExhaustionE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan17Pooling_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan18Invalid_Block_SizeE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan18Invalid_Key_LengthE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan19Algorithm_Not_FoundE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan21Default_Mutex_FactoryE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan22Invalid_Algorithm_NameE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan22Invalid_Message_NumberE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan23MemoryMapping_AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan5MutexE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan6BigInt12DivideByZeroE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan7ModulesE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan9AllocatorE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA5Botan9ExceptionE@Base 2.1.0+git20141126.2258
_ZTVN3QCA6Base64E@Base 2.0.2
_ZTVN3QCA6CipherE@Base 2.0.2
_ZTVN3QCA6FilterE@Base 2.0.2
@@ -2113,6 +3063,7 @@
_ZTVN3QCA8QPipeEnd7PrivateE@Base 2.0.2
_ZTVN3QCA8QPipeEndE@Base 2.0.2
_ZTVN3QCA9AlgorithmE@Base 2.0.2
+ _ZTVN3QCA9AskerBaseE@Base 2.1.0+git20141126.2258
_ZTVN3QCA9CAContextE@Base 2.0.2
_ZTVN3QCA9DHContextE@Base 2.0.2
_ZTVN3QCA9FileWatch7PrivateE@Base 2.0.2
@@ -2120,6 +3071,42 @@
_ZTVN3QCA9KeyLoader7PrivateE@Base 2.0.2
_ZTVN3QCA9KeyLoaderE@Base 2.0.2
_ZTVN3QCA9PublicKeyE@Base 2.0.2
+ _ZTVN3QCA9SafeTimer7PrivateE@Base 2.1.0+git20141126.2258
+ _ZTVN3QCA9SafeTimerE@Base 2.1.0+git20141126.2258
+ (optional=templinst)_ZZN11QMetaTypeIdI5QListIN3QCA13KeyStoreEntry4TypeEEE14qt_metatype_idEvE11metatype_id@Base 2.0.3
+ (optional=templinst)_ZZN11QMetaTypeIdI5QListIN3QCA13KeyStoreEntryEEE14qt_metatype_idEvE11metatype_id@Base 2.0.3
+ (optional=templinst)_ZZN11QMetaTypeIdIN3QCA11CertificateEE14qt_metatype_idEvE11metatype_id@Base 2.0.3
+ (optional=templinst)_ZZN11QMetaTypeIdIN3QCA11SecureArrayEE14qt_metatype_idEvE11metatype_id@Base 2.0.3
+ (optional=templinst)_ZZN11QMetaTypeIdIN3QCA13KeyStoreEntryEE14qt_metatype_idEvE11metatype_id@Base 2.0.3
+ (optional=templinst)_ZZN11QMetaTypeIdIN3QCA3CRLEE14qt_metatype_idEvE11metatype_id@Base 2.0.3
+ (optional=templinst)_ZZN11QMetaTypeIdIN3QCA6PGPKeyEE14qt_metatype_idEvE11metatype_id@Base 2.0.3
+ (optional=templinst)_ZZN11QMetaTypeIdIN3QCA9KeyBundleEE14qt_metatype_idEvE11metatype_id@Base 2.0.3
+ _ZplRK7QStringS1_@Base 2.1.0+git20141126.2258
+ _ZplRK7QStringc@Base 2.1.0+git20141126.2258
+ bigint_add2@Base 2.1.0+git20141126.2258
+ bigint_add2_nc@Base 2.1.0+git20141126.2258
+ bigint_add3@Base 2.1.0+git20141126.2258
+ bigint_add3_nc@Base 2.1.0+git20141126.2258
+ bigint_cmp@Base 2.1.0+git20141126.2258
+ bigint_comba_mul4@Base 2.1.0+git20141126.2258
+ bigint_comba_mul6@Base 2.1.0+git20141126.2258
+ bigint_comba_mul8@Base 2.1.0+git20141126.2258
+ bigint_comba_sqr4@Base 2.1.0+git20141126.2258
+ bigint_comba_sqr6@Base 2.1.0+git20141126.2258
+ bigint_comba_sqr8@Base 2.1.0+git20141126.2258
+ bigint_divcore@Base 2.1.0+git20141126.2258
+ bigint_divop@Base 2.1.0+git20141126.2258
+ bigint_linmul2@Base 2.1.0+git20141126.2258
+ bigint_linmul3@Base 2.1.0+git20141126.2258
+ bigint_modop@Base 2.1.0+git20141126.2258
+ bigint_mul_add_words@Base 2.1.0+git20141126.2258
+ bigint_shl1@Base 2.1.0+git20141126.2258
+ bigint_shl2@Base 2.1.0+git20141126.2258
+ bigint_shr1@Base 2.1.0+git20141126.2258
+ bigint_shr2@Base 2.1.0+git20141126.2258
+ bigint_sub2@Base 2.1.0+git20141126.2258
+ bigint_sub3@Base 2.1.0+git20141126.2258
+ bigint_wordmul@Base 2.1.0+git20141126.2258
(c++)"non-virtual thunk to QCA::CMS::~CMS()@Base" 2.0.2
(c++)"non-virtual thunk to QCA::Cipher::clear()@Base" 2.0.2
(c++)"non-virtual thunk to QCA::Cipher::final()@Base" 2.0.2
diff -Nru qca2-2.0.3/debian/meta/upstream_scm.json qca2-2.1.0/debian/meta/upstream_scm.json
--- qca2-2.0.3/debian/meta/upstream_scm.json 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/debian/meta/upstream_scm.json 2014-11-28 14:05:32.000000000 +0000
@@ -0,0 +1,3 @@
+{
+ "url" : "git://anongit.kde.org/qca.git"
+}
diff -Nru qca2-2.0.3/debian/not-installed qca2-2.1.0/debian/not-installed
--- qca2-2.0.3/debian/not-installed 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/debian/not-installed 2014-11-28 14:05:32.000000000 +0000
@@ -0,0 +1 @@
+./usr/share/man/man1/qcatool.1
diff -Nru qca2-2.0.3/debian/patches/disable_randomunittest.diff qca2-2.1.0/debian/patches/disable_randomunittest.diff
--- qca2-2.0.3/debian/patches/disable_randomunittest.diff 2011-05-29 19:09:30.000000000 +0000
+++ qca2-2.1.0/debian/patches/disable_randomunittest.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,16 +0,0 @@
-Description: Disable broken unit test that fails if two subsequent
- random numbers are the same.
-Author: Felix Geyer
-
-diff -Nur qca2-2.0.3.orig/unittest/checkall qca2-2.0.3/unittest/checkall
---- qca2-2.0.3.orig/unittest/checkall
-+++ qca2-2.0.3/unittest/checkall
-@@ -20,7 +20,7 @@
- cd pgpunittest && make test && cd .. && \
- cd pipeunittest && make test && cd .. && \
- cd pkits && make test && cd .. && \
--cd randomunittest && make test && cd .. && \
-+#cd randomunittest && make test && cd .. && \
- cd rsaunittest && make test && cd .. && \
- cd securearrayunittest && make test && cd .. && \
- cd staticunittest && make test && cd .. && \
diff -Nru qca2-2.0.3/debian/patches/fix_build_gcc4.7.diff qca2-2.1.0/debian/patches/fix_build_gcc4.7.diff
--- qca2-2.0.3/debian/patches/fix_build_gcc4.7.diff 2012-05-20 08:53:40.000000000 +0000
+++ qca2-2.1.0/debian/patches/fix_build_gcc4.7.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,62 +0,0 @@
-Description: Fix FTBFS with gc 4.7.
-Origin: upstream, http://websvn.kde.org/?view=revision&sortby=date&revision=1273508
-
---- a/src/botantools/botan/botan/secmem.h
-+++ b/src/botantools/botan/botan/secmem.h
-@@ -191,15 +191,15 @@
- {
- public:
- MemoryVector& operator=(const MemoryRegion& in)
-- { if(this != &in) set(in); return (*this); }
-+ { if(this != &in) this->set(in); return (*this); }
-
- MemoryVector(u32bit n = 0) { MemoryRegion::init(false, n); }
- MemoryVector(const T in[], u32bit n)
-- { MemoryRegion::init(false); set(in, n); }
-+ { MemoryRegion::init(false); this->set(in, n); }
- MemoryVector(const MemoryRegion& in)
-- { MemoryRegion::init(false); set(in); }
-+ { MemoryRegion::init(false); this->set(in); }
- MemoryVector(const MemoryRegion& in1, const MemoryRegion& in2)
-- { MemoryRegion::init(false); set(in1); append(in2); }
-+ { MemoryRegion::init(false); this->set(in1); append(in2); }
- };
-
- /*************************************************
-@@ -210,15 +210,15 @@
- {
- public:
- SecureVector& operator=(const MemoryRegion& in)
-- { if(this != &in) set(in); return (*this); }
-+ { if(this != &in) this->set(in); return (*this); }
-
- SecureVector(u32bit n = 0) { MemoryRegion::init(true, n); }
- SecureVector(const T in[], u32bit n)
-- { MemoryRegion::init(true); set(in, n); }
-+ { MemoryRegion::init(true); this->set(in, n); }
- SecureVector(const MemoryRegion& in)
-- { MemoryRegion::init(true); set(in); }
-+ { MemoryRegion::init(true); this->set(in); }
- SecureVector(const MemoryRegion& in1, const MemoryRegion& in2)
-- { MemoryRegion::init(true); set(in1); append(in2); }
-+ { MemoryRegion::init(true); this->set(in1); append(in2); }
- };
-
- /*************************************************
-@@ -229,14 +229,14 @@
- {
- public:
- SecureBuffer& operator=(const SecureBuffer& in)
-- { if(this != &in) set(in); return (*this); }
-+ { if(this != &in) this->set(in); return (*this); }
-
- SecureBuffer() { MemoryRegion::init(true, L); }
- SecureBuffer(const T in[], u32bit n)
- { MemoryRegion::init(true, L); copy(in, n); }
- private:
- SecureBuffer& operator=(const MemoryRegion& in)
-- { if(this != &in) set(in); return (*this); }
-+ { if(this != &in) this->set(in); return (*this); }
- };
-
- }
diff -Nru qca2-2.0.3/debian/patches/kubuntu_ignore_filewatch_test.diff qca2-2.1.0/debian/patches/kubuntu_ignore_filewatch_test.diff
--- qca2-2.0.3/debian/patches/kubuntu_ignore_filewatch_test.diff 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/debian/patches/kubuntu_ignore_filewatch_test.diff 2014-11-26 13:07:01.000000000 +0000
@@ -0,0 +1,20 @@
+Description: ignore test
+ this test works locally but not in the buildd for some reason
+Author: Jonathan Riddell
+Origin: me
+Forwarded: no, needs investigation why it is failing
+Last-Update: 2014-11-26
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: qca2-2.1.0/unittest/CMakeLists.txt
+===================================================================
+--- qca2-2.1.0.orig/unittest/CMakeLists.txt
++++ qca2-2.1.0/unittest/CMakeLists.txt
+@@ -13,7 +13,6 @@ add_subdirectory(cipherunittest)
+ add_subdirectory(clientplugin)
+ add_subdirectory(cms)
+ add_subdirectory(dsaunittest)
+-add_subdirectory(filewatchunittest)
+ add_subdirectory(hashunittest)
+ add_subdirectory(hexunittest)
+ add_subdirectory(kdfunittest)
diff -Nru qca2-2.0.3/debian/patches/kubuntu_mkspecs-dir.diff qca2-2.1.0/debian/patches/kubuntu_mkspecs-dir.diff
--- qca2-2.0.3/debian/patches/kubuntu_mkspecs-dir.diff 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/debian/patches/kubuntu_mkspecs-dir.diff 2014-11-26 13:07:01.000000000 +0000
@@ -0,0 +1,22 @@
+Description: fix mkspecs install dir
+Author: Jonathan Riddell
+Origin: me
+Bug: https://bugs.kde.org/show_bug.cgi?id=341289
+Last-Update: 2014-11-26
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- qca/CMakeLists.txt~ 2014-11-06 08:15:45.000000000 +0000
++++ qca/CMakeLists.txt 2014-11-26 11:51:46.624782953 +0000
+@@ -169,7 +169,11 @@
+ set(QCA_PLUGINS_INSTALL_DIR "${LIB_INSTALL_DIR}/${QCA_LIB_NAME}" CACHE PATH "Directory where qca plugins will install")
+ set(QCA_BINARY_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Directory where qca plugins will install")
+ set(QCA_LIBRARY_INSTALL_DIR "${LIB_INSTALL_DIR}" CACHE PATH "Directory where qca library will install")
+- set(QCA_FEATURE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/mkspecs/features" CACHE PATH "Directory where qca feature file will install")
++ if(QT4_BUILD)
++ set(QCA_FEATURE_INSTALL_DIR "${QT_MKSPECS_DIR}/mkspecs/features" CACHE PATH "Directory where qca feature file will install")
++ else()
++ set(QCA_FEATURE_INSTALL_DIR "${LIB_INSTALL_DIR}/mkspecs/features" CACHE PATH "Directory where qca feature file will install")
++ endif()
+ set(QCA_INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Directory where qca public headers will install")
+ set(QCA_PRIVATE_INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Directory where qca headers will install")
+ set(QCA_DOC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${QCA_LIB_NAME}/html" CACHE PATH "Directory where qca documentation will install")
diff -Nru qca2-2.0.3/debian/patches/pipeunittest_more_wait.diff qca2-2.1.0/debian/patches/pipeunittest_more_wait.diff
--- qca2-2.0.3/debian/patches/pipeunittest_more_wait.diff 2014-06-11 12:24:32.000000000 +0000
+++ qca2-2.1.0/debian/patches/pipeunittest_more_wait.diff 2014-11-26 13:07:01.000000000 +0000
@@ -7,9 +7,11 @@
Last-Update: 2012-06-03
Forwarded: no
---- a/unittest/pipeunittest/pipeunittest.cpp
-+++ b/unittest/pipeunittest/pipeunittest.cpp
-@@ -106,17 +106,17 @@ void PipeUnitTest::readWrite()
+Index: qca-2.1.0/unittest/pipeunittest/pipeunittest.cpp
+===================================================================
+--- qca-2.1.0.orig/unittest/pipeunittest/pipeunittest.cpp
++++ qca-2.1.0/unittest/pipeunittest/pipeunittest.cpp
+@@ -109,17 +109,17 @@ void PipeUnitTest::readWrite()
pipe1.readEnd().enable();
pipe1.writeEnd().write( testData1 );
@@ -31,7 +33,7 @@
QCOMPARE( pipe1.readEnd().bytesAvailable(), testData1.size() + testData2.size() );
QByteArray thisRead = pipe1.readEnd().read(1);
QCOMPARE( thisRead, QByteArray("D") );
-@@ -141,17 +141,17 @@ void PipeUnitTest::readWriteSecure()
+@@ -144,17 +144,17 @@ void PipeUnitTest::readWriteSecure()
pipe1.readEnd().enable();
pipe1.writeEnd().writeSecure( testData1 );
@@ -53,7 +55,7 @@
QCOMPARE( pipe1.readEnd().bytesAvailable(), testData1.size() + testData2.size() );
QCA::SecureArray thisRead = pipe1.readEnd().readSecure(1);
QCOMPARE( thisRead, QCA::SecureArray("D") );
-@@ -187,8 +187,8 @@ void PipeUnitTest::signalTests()
+@@ -190,8 +190,8 @@ void PipeUnitTest::signalTests()
QByteArray data("Far better, it is, to dare mighty things");
pipe->writeEnd().write( data );
@@ -64,7 +66,7 @@
QCOMPARE( readyReadSpy.count(), 1 );
QCOMPARE( bytesWrittenSpy.count(), 1 );
// this pulls out the first argument to the first signal as an integer
-@@ -199,11 +199,11 @@ void PipeUnitTest::signalTests()
+@@ -202,11 +202,11 @@ void PipeUnitTest::signalTests()
QCOMPARE( closedReadSpy.count(), 0 );
pipe->readEnd().close();
@@ -78,7 +80,7 @@
QCOMPARE( closedWriteSpy.count(), 1 );
QCOMPARE( closedReadSpy.count(), 1 );
}
-@@ -234,8 +234,8 @@ void PipeUnitTest::signalTestsSecure()
+@@ -237,8 +237,8 @@ void PipeUnitTest::signalTestsSecure()
QCA::SecureArray data("Far better, it is, to dare mighty things");
pipe->writeEnd().writeSecure( data );
@@ -89,7 +91,7 @@
QCOMPARE( readyReadSpy.count(), 1 );
QCOMPARE( bytesWrittenSpy.count(), 1 );
// this pulls out the first argument to the first signal as an integer
-@@ -246,11 +246,11 @@ void PipeUnitTest::signalTestsSecure()
+@@ -249,11 +249,11 @@ void PipeUnitTest::signalTestsSecure()
QCOMPARE( closedReadSpy.count(), 0 );
pipe->readEnd().close();
diff -Nru qca2-2.0.3/debian/patches/series qca2-2.1.0/debian/patches/series
--- qca2-2.0.3/debian/patches/series 2014-06-11 12:24:32.000000000 +0000
+++ qca2-2.1.0/debian/patches/series 2015-01-14 15:12:04.000000000 +0000
@@ -1,5 +1,6 @@
define_qca_export.diff
-disable_randomunittest.diff
-fix_build_gcc4.7.diff
pipeunittest_more_wait.diff
hurd_msync.diff
+kubuntu_mkspecs-dir.diff
+kubuntu_ignore_filewatch_test.diff
+upstream_watchfile-fixes.diff
diff -Nru qca2-2.0.3/debian/patches/upstream_watchfile-fixes.diff qca2-2.1.0/debian/patches/upstream_watchfile-fixes.diff
--- qca2-2.0.3/debian/patches/upstream_watchfile-fixes.diff 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/debian/patches/upstream_watchfile-fixes.diff 2015-01-14 15:11:47.000000000 +0000
@@ -0,0 +1,48 @@
+From: Harald Sitter
+Date: Fri, 19 Dec 2014 15:47:40 +0000
+Subject: prevent filewatches from emitting changes when there is no file
+X-Git-Url: http://quickgit.kde.org/?p=qca.git&a=commitdiff&h=4aae2dee34d2f0f6324a9e7819e29310106dc5bb
+---
+prevent filewatches from emitting changes when there is no file
+
+(this also fixes the flaky filewatch test that would fail for example on
+ubuntu launchpad builds)
+
+it can happen that (supposedly for filesystem reasons) there are two
+changes signals arriving in the watcher code, by the time the first arrives
+the file would however already be deleted, by the time the second arrives
+it would thus notify of changes to a file that does not exist which is
+silly and causes problems with the filewatchtest as it uses signal emission
+counting to verify the behavior.
+to prevent this problem from popping up there is an additional save guard
+in the file_changed slot that will ignore a change if the path in question
+doesn't exist AND there is no file being watched by the watcher.
+
+REVIEW: 121588
+---
+
+
+--- a/src/support/dirwatch.cpp
++++ b/src/support/dirwatch.cpp
+@@ -210,8 +210,19 @@
+ {
+ Q_UNUSED(path);
+ QFileInfo fi(filePath);
+- if(!fi.exists())
++ if (!fi.exists() && !fileExisted) {
++ // Got a file changed signal on a file that does not exist
++ // and is not actively watched. This happens when we
++ // previously watched a file but it was deleted and after
++ // the original deletion changed-signal we get another one
++ // (for example because of bad signal timing). In this scenario
++ // we must ignore the change as the change, whatever it may
++ // have been, is of no interest to us because we don't watch
++ // the file and furthermore the file does not even exist.
++ return;
++ } else if (!fi.exists()) {
+ fileExisted = false;
++ };
+ emit q->changed();
+ }
+ };
+
diff -Nru qca2-2.0.3/debian/qca2-utils.install qca2-2.1.0/debian/qca2-utils.install
--- qca2-2.0.3/debian/qca2-utils.install 2012-05-20 09:21:12.000000000 +0000
+++ qca2-2.1.0/debian/qca2-utils.install 2014-11-26 13:07:01.000000000 +0000
@@ -1 +1 @@
-usr/bin/qcatool2
+usr/bin/
diff -Nru qca2-2.0.3/debian/qca2-utils.lintian-overrides qca2-2.1.0/debian/qca2-utils.lintian-overrides
--- qca2-2.0.3/debian/qca2-utils.lintian-overrides 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/debian/qca2-utils.lintian-overrides 2014-11-28 14:05:32.000000000 +0000
@@ -0,0 +1 @@
+qca2-utils: binary-without-manpage usr/bin/mozcerts
diff -Nru qca2-2.0.3/debian/qca2-utils.manpages qca2-2.1.0/debian/qca2-utils.manpages
--- qca2-2.0.3/debian/qca2-utils.manpages 2012-05-20 09:01:00.000000000 +0000
+++ qca2-2.1.0/debian/qca2-utils.manpages 2014-11-26 13:07:01.000000000 +0000
@@ -1 +1 @@
-man/qcatool2.1
+man/qcatool.1
diff -Nru qca2-2.0.3/debian/rules qca2-2.1.0/debian/rules
--- qca2-2.0.3/debian/rules 2012-05-20 09:42:06.000000000 +0000
+++ qca2-2.1.0/debian/rules 2015-01-14 14:53:57.000000000 +0000
@@ -1,27 +1,24 @@
#!/usr/bin/make -f
-include /usr/share/pkg-kde-tools/qt-kde-team/2/debian-qt-kde.mk
-
-CFLAGS += -fvisibility=hidden -fvisibility-inlines-hidden
-CXXFLAGS += -fvisibility=hidden -fvisibility-inlines-hidden
+include /usr/share/pkg-kde-tools/qt-kde-team/3/debian-qt-kde.mk
+# Enable strict interdependencies
+libpkgs_gen_strict_local_shlibs = $(libpkgs_all_packages)
+include /usr/share/pkg-kde-tools/qt-kde-team/3/library-packages.mk
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
-dh += --buildsystem=qmake
override_dh_auto_configure:
- ./configure --verbose --prefix=/usr --libdir=/usr/lib/$(DEB_HOST_MULTIARCH) --qtdir=/usr/share/qt4 \
- --debug --no-separate-debug-info
- echo QMAKE_CFLAGS_DEBUG="$(CFLAGS) $(CPPFLAGS)" >> conf.pri
- echo QMAKE_CXXFLAGS_DEBUG="$(CXXFLAGS) $(CPPFLAGS)" >> conf.pri
- echo QMAKE_LFLAGS_DEBUG="$(LDFLAGS)" >> conf.pri
- echo QMAKE_CFLAGS_DEBUG="$(CFLAGS) $(CPPFLAGS)" >> confapp.pri
- echo QMAKE_CXXFLAGS_DEBUG="$(CXXFLAGS) $(CPPFLAGS)" >> confapp.pri
- echo QMAKE_LFLAGS_DEBUG="$(LDFLAGS)" >> confapp.pri
+ $(overridden_command) -- -DLIB_SUFFIX="/$(DEB_HOST_MULTIARCH)" -DQT4_BUILD=true
-override_dh_strip:
- $(overridden_command) --dbg-package=libqca2-dbg
+override_dh_auto_build:
+ $(overridden_command)
-override_dh_clean:
+override_dh_auto_install:
$(overridden_command)
- rm -rf confapp.pri confapp_unix.pri conf.log conf.pri crypto.prf lib/
+
+override_dh_install:
+ $(overridden_command) $(QT5_DH_EXCLUDE)
+
+override_dh_strip:
+ $(overridden_command) $(QT5_DH_EXCLUDE) --dbg-package=libqca2-dbg
diff -Nru qca2-2.0.3/debian/watch qca2-2.1.0/debian/watch
--- qca2-2.0.3/debian/watch 2011-05-29 14:52:34.000000000 +0000
+++ qca2-2.1.0/debian/watch 2014-11-26 13:07:01.000000000 +0000
@@ -1,3 +1,3 @@
version=3
-http://delta.affinix.com/download/qca/2.0/qca-(.*).tar\.bz2
+http://delta.affinix.com/download/qca/(.*)/qca-(.*).tar\.bz2
diff -Nru qca2-2.0.3/Doxyfile qca2-2.1.0/Doxyfile
--- qca2-2.0.3/Doxyfile 2008-06-05 02:00:11.000000000 +0000
+++ qca2-2.1.0/Doxyfile 1970-01-01 00:00:00.000000000 +0000
@@ -1,1290 +0,0 @@
-# Doxyfile 1.5.2
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-# TAG = value [value, ...]
-# For lists items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file that
-# follow. The default is UTF-8 which is also the encoding used for all text before
-# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into
-# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of
-# possible encodings.
-
-DOXYFILE_ENCODING = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
-PROJECT_NAME = "Qt Cryptographic Architecture"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = apidocs
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
-
-CREATE_SUBDIRS = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
-# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian,
-# Italian, Japanese, Japanese-en (Japanese with English messages), Korean,
-# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
-# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
-
-OUTPUT_LANGUAGE = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC = NO
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC = YES
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-
-INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
-
-STRIP_FROM_PATH =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful is your file systems
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like the Qt-style comments (thus requiring an
-# explicit @brief command for a brief description.
-
-JAVADOC_AUTOBRIEF = YES
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member
-# documentation.
-
-DETAILS_AT_TOP = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
-INHERIT_DOCS = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE = 8
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for Java.
-# For instance, namespaces will be presented as packages, qualified scopes
-# will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
-# include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-
-BUILTIN_STL_SUPPORT = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-
-CPP_CLI_SUPPORT = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
-SUBGROUPING = YES
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
-EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-EXTRACT_STATIC = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES = YES
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
-EXTRACT_LOCAL_METHODS = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-
-CASE_SENSE_NAMES = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS = NO
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
-SORT_BRIEF_DOCS = YES
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
-GENERATE_BUGLIST = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES = YES
-
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from the
-# version control system). Doxygen will invoke the program by executing (via
-# popen()) the command , where is the value of
-# the FILE_VERSION_FILTER tag, and is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER =
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
-
-WARN_NO_PARAMDOC = YES
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT = examples \
- . \
- include/QtCrypto
-
-# This tag can be used to specify the character encoding of the source files that
-# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default
-# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding.
-# See http://www.gnu.org/software/libiconv for the list of possible encodings.
-
-INPUT_ENCODING = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
-
-FILE_PATTERNS = *.h \
- *.doco \
- Mainpage.dox
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
-# directories that are symbolic links (a Unix filesystem feature) are excluded
-# from the input.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS = *.moc.* \
- moc* \
- *.all_cpp.* \
- *unload.* \
- */test/* \
- */tests/*
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the output.
-# The symbol name can be a fully qualified name, a word, or if the wildcard * is used,
-# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH = examples/aes-cmac \
- examples/base64test \
- examples/certtest \
- examples/ciphertest \
- examples/cms \
- examples/cmssigner \
- examples/eventhandlerdemo \
- examples/hashtest \
- examples/hextest \
- examples/keyloader \
- examples/mactest \
- examples/md5crypt \
- examples/providertest \
- examples/publickeyexample \
- examples/randomtest \
- examples/rsatest \
- examples/saslclient \
- examples/saslserver \
- examples/ssltest \
- examples/sslservtest \
- examples/tlssocket
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH = images
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command , where
-# is the value of the INPUT_FILTER tag, and is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output. If FILTER_PATTERNS is specified, this tag will be
-# ignored.
-
-INPUT_FILTER =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
-# is applied to all files.
-
-FILTER_PATTERNS =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default)
-# then for each documented function all documented
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES (the default)
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
-REFERENCES_RELATION = YES
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code. Otherwise they will link to the documentstion.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
-
-USE_HTAGS = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
-DISABLE_INDEX = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature.
-
-GENERATE_TREEVIEW = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
-TREEVIEW_WIDTH = 250
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-
-LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
-MAKEINDEX_CMD_NAME = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE = YES
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
-LATEX_HIDE_INDICES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
-GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
-GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader. This is useful
-# if you want to understand what is going on. On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-# add DOXYGEN_NO_PROVIDER_API here to disable generation of the
-# Provider API documentation with Doxygen.
-PREDEFINED = DOXYGEN_SHOULD_SKIP_THIS \
- QPIPE_SECURE
-
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED = QCA_EXPORT
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all function-like macros that are alone
-# on a line, have an all uppercase name, and do not end with a semicolon. Such
-# function macros are typically used for boiler-plate code, and will confuse
-# the parser if not removed.
-
-SKIP_FUNCTION_MACROS = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES = src/qt.tag
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
-EXTERNAL_GROUPS = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option is superseded by the HAVE_DOT option below. This is only a
-# fallback. It is recommended to install and use dot, since it yields more
-# powerful graphs.
-
-CLASS_DIAGRAMS = YES
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to
-# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to
-# specify the directory where the mscgen tool resides. If left empty the tool is assumed to
-# be found in the default search path.
-
-MSCGEN_PATH =
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS = NO
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH = NO
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
-UML_LOOK = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
-# generate a call dependency graph for every global function or class method.
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
-
-CALL_GRAPH = NO
-
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will
-# generate a caller dependency graph for every global function or class method.
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable caller graphs for selected
-# functions only using the \callergraph command.
-
-CALLER_GRAPH = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
-DIRECTORY_GRAPH = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS =
-
-# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
-# nodes that will be shown in the graph. If the number of nodes in a graph
-# becomes larger than this value, doxygen will truncate the graph, which is
-# visualized by representing a node as a red box. Note that doxygen will always
-# show the root nodes and its direct children regardless of this setting.
-
-DOT_GRAPH_MAX_NODES = 50
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, which results in a white background.
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-
-DOT_TRANSPARENT = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
-
-DOT_MULTI_TARGETS = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
-DOT_CLEANUP = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE = NO
diff -Nru qca2-2.0.3/Doxyfile.in qca2-2.1.0/Doxyfile.in
--- qca2-2.0.3/Doxyfile.in 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/Doxyfile.in 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,1291 @@
+# Doxyfile 1.5.2
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file that
+# follow. The default is UTF-8 which is also the encoding used for all text before
+# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into
+# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of
+# possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = "Qt Cryptographic Architecture"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = apidocs
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian,
+# Italian, Japanese, Japanese-en (Japanese with English messages), Korean,
+# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
+# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = NO
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = YES
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = YES
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = YES
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command , where is the value of
+# the FILE_VERSION_FILTER tag, and is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = @CMAKE_SOURCE_DIR@/examples \
+ @CMAKE_SOURCE_DIR@ \
+ @CMAKE_SOURCE_DIR@/include/QtCrypto \
+ @CMAKE_BINARY_DIR@/qca_version.h
+
+# This tag can be used to specify the character encoding of the source files that
+# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default
+# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding.
+# See http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS = *.h \
+ *.doco \
+ Mainpage.dox
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE = @CMAKE_BINARY_DIR@/import_plugins.h
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = *.moc.* \
+ moc* \
+ *.all_cpp.* \
+ *unload.* \
+ */test/* \
+ */tests/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the output.
+# The symbol name can be a fully qualified name, a word, or if the wildcard * is used,
+# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH = @CMAKE_SOURCE_DIR@/examples/aes-cmac \
+ @CMAKE_SOURCE_DIR@/examples/base64test \
+ @CMAKE_SOURCE_DIR@/examples/certtest \
+ @CMAKE_SOURCE_DIR@/examples/ciphertest \
+ @CMAKE_SOURCE_DIR@/examples/cms \
+ @CMAKE_SOURCE_DIR@/examples/cmssigner \
+ @CMAKE_SOURCE_DIR@/examples/eventhandlerdemo \
+ @CMAKE_SOURCE_DIR@/examples/hashtest \
+ @CMAKE_SOURCE_DIR@/examples/hextest \
+ @CMAKE_SOURCE_DIR@/examples/keyloader \
+ @CMAKE_SOURCE_DIR@/examples/mactest \
+ @CMAKE_SOURCE_DIR@/examples/md5crypt \
+ @CMAKE_SOURCE_DIR@/examples/providertest \
+ @CMAKE_SOURCE_DIR@/examples/publickeyexample \
+ @CMAKE_SOURCE_DIR@/examples/randomtest \
+ @CMAKE_SOURCE_DIR@/examples/rsatest \
+ @CMAKE_SOURCE_DIR@/examples/saslclient \
+ @CMAKE_SOURCE_DIR@/examples/saslserver \
+ @CMAKE_SOURCE_DIR@/examples/ssltest \
+ @CMAKE_SOURCE_DIR@/examples/sslservtest \
+ @CMAKE_SOURCE_DIR@/examples/tlssocket
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH = images
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command , where
+# is the value of the INPUT_FILTER tag, and is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code. Otherwise they will link to the documentstion.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+# add DOXYGEN_NO_PROVIDER_API here to disable generation of the
+# Provider API documentation with Doxygen.
+PREDEFINED = DOXYGEN_SHOULD_SKIP_THIS \
+ QPIPE_SECURE
+
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED = QCA_EXPORT
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to
+# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to
+# specify the directory where the mscgen tool resides. If left empty the tool is assumed to
+# be found in the default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = NO
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a caller dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen will always
+# show the root nodes and its direct children regardless of this setting.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff -Nru qca2-2.0.3/examples/aes-cmac/aes-cmac.cpp qca2-2.1.0/examples/aes-cmac/aes-cmac.cpp
--- qca2-2.0.3/examples/aes-cmac/aes-cmac.cpp 2009-04-24 17:59:20.000000000 +0000
+++ qca2-2.1.0/examples/aes-cmac/aes-cmac.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -25,6 +25,10 @@
#include
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
class AESCMACContext : public QCA::MACContext
{
public:
diff -Nru qca2-2.0.3/examples/aes-cmac/aes-cmac.pro qca2-2.1.0/examples/aes-cmac/aes-cmac.pro
--- qca2-2.0.3/examples/aes-cmac/aes-cmac.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/aes-cmac/aes-cmac.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += aes-cmac.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/aes-cmac/CMakeLists.txt qca2-2.1.0/examples/aes-cmac/CMakeLists.txt
--- qca2-2.0.3/examples/aes-cmac/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/aes-cmac/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(aes-cmac_bin_SRCS aes-cmac.cpp)
+
+add_executable(aes-cmac ${aes-cmac_bin_SRCS})
+
+target_link_qca_libraries(aes-cmac)
diff -Nru qca2-2.0.3/examples/base64test/base64test.cpp qca2-2.1.0/examples/base64test/base64test.cpp
--- qca2-2.0.3/examples/base64test/base64test.cpp 2007-04-17 12:01:26.000000000 +0000
+++ qca2-2.1.0/examples/base64test/base64test.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -26,6 +26,10 @@
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
int main(int argc, char **argv)
{
QCoreApplication(argc, argv);
diff -Nru qca2-2.0.3/examples/base64test/base64test.pro qca2-2.1.0/examples/base64test/base64test.pro
--- qca2-2.0.3/examples/base64test/base64test.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/base64test/base64test.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += base64test.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/base64test/CMakeLists.txt qca2-2.1.0/examples/base64test/CMakeLists.txt
--- qca2-2.0.3/examples/base64test/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/base64test/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(base64test_bin_SRCS base64test.cpp)
+
+add_executable(base64test ${base64test_bin_SRCS})
+
+target_link_qca_libraries(base64test)
diff -Nru qca2-2.0.3/examples/certtest/certtest.cpp qca2-2.1.0/examples/certtest/certtest.cpp
--- qca2-2.0.3/examples/certtest/certtest.cpp 2007-04-17 12:01:26.000000000 +0000
+++ qca2-2.1.0/examples/certtest/certtest.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -27,6 +27,10 @@
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
// dump out information about some part of the certificate
// we use this same approach for information about the subject
// of the certificate, and also about the issuer of the certificate
diff -Nru qca2-2.0.3/examples/certtest/certtest.pro qca2-2.1.0/examples/certtest/certtest.pro
--- qca2-2.0.3/examples/certtest/certtest.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/certtest/certtest.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += certtest.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/certtest/CMakeLists.txt qca2-2.1.0/examples/certtest/CMakeLists.txt
--- qca2-2.0.3/examples/certtest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/certtest/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(certtest_bin_SRCS certtest.cpp)
+
+add_executable(certtest ${certtest_bin_SRCS})
+
+target_link_qca_libraries(certtest)
diff -Nru qca2-2.0.3/examples/ciphertest/ciphertest.cpp qca2-2.1.0/examples/ciphertest/ciphertest.cpp
--- qca2-2.0.3/examples/ciphertest/ciphertest.cpp 2009-04-24 17:59:20.000000000 +0000
+++ qca2-2.1.0/examples/ciphertest/ciphertest.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -26,6 +26,10 @@
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
int main(int argc, char **argv)
{
// the Initializer object sets things up, and
diff -Nru qca2-2.0.3/examples/ciphertest/ciphertest.pro qca2-2.1.0/examples/ciphertest/ciphertest.pro
--- qca2-2.0.3/examples/ciphertest/ciphertest.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/ciphertest/ciphertest.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += ciphertest.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/ciphertest/CMakeLists.txt qca2-2.1.0/examples/ciphertest/CMakeLists.txt
--- qca2-2.0.3/examples/ciphertest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/ciphertest/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(ciphertest_bin_SRCS ciphertest.cpp)
+
+add_executable(ciphertest ${ciphertest_bin_SRCS})
+
+target_link_qca_libraries(ciphertest)
diff -Nru qca2-2.0.3/examples/CMakeLists.txt qca2-2.1.0/examples/CMakeLists.txt
--- qca2-2.0.3/examples/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,26 @@
+if(Qt5Core_FOUND)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
+endif()
+add_subdirectory(aes-cmac)
+add_subdirectory(base64test)
+add_subdirectory(certtest)
+add_subdirectory(ciphertest)
+add_subdirectory(cms)
+# this is not meant to be added, because it introduces
+# a dependency on QtGui.
+# add_subdirectory(cmssigner)
+add_subdirectory(eventhandlerdemo)
+add_subdirectory(hashtest)
+add_subdirectory(hextest)
+add_subdirectory(keyloader)
+add_subdirectory(mactest)
+add_subdirectory(md5crypt)
+add_subdirectory(providertest)
+add_subdirectory(publickeyexample)
+add_subdirectory(randomtest)
+add_subdirectory(rsatest)
+add_subdirectory(saslclient)
+add_subdirectory(saslserver)
+add_subdirectory(ssltest)
+add_subdirectory(sslservtest)
+add_subdirectory(tlssocket)
diff -Nru qca2-2.0.3/examples/cms/CMakeLists.txt qca2-2.1.0/examples/cms/CMakeLists.txt
--- qca2-2.0.3/examples/cms/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/cms/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(cmsexample_bin_SRCS cmsexample.cpp)
+
+add_executable(cmsexample ${cmsexample_bin_SRCS})
+
+target_link_qca_libraries(cmsexample)
diff -Nru qca2-2.0.3/examples/cms/cmsexample.cpp qca2-2.1.0/examples/cms/cmsexample.cpp
--- qca2-2.0.3/examples/cms/cmsexample.cpp 2007-04-17 12:01:26.000000000 +0000
+++ qca2-2.1.0/examples/cms/cmsexample.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -26,6 +26,10 @@
#include
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
int main(int argc, char** argv)
{
// the Initializer object sets things up, and
diff -Nru qca2-2.0.3/examples/cms/cms.pro qca2-2.1.0/examples/cms/cms.pro
--- qca2-2.0.3/examples/cms/cms.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/cms/cms.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += cmsexample.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/cmssigner/certitem.cpp qca2-2.1.0/examples/cmssigner/certitem.cpp
--- qca2-2.0.3/examples/cmssigner/certitem.cpp 2007-08-20 15:47:38.000000000 +0000
+++ qca2-2.1.0/examples/cmssigner/certitem.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -24,6 +24,7 @@
#include
#include
#include
+#include
#include "prompter.h"
typedef QMap CertItemIconset;
diff -Nru qca2-2.0.3/examples/cmssigner/cmssigner.pro qca2-2.1.0/examples/cmssigner/cmssigner.pro
--- qca2-2.0.3/examples/cmssigner/cmssigner.pro 2007-08-11 02:44:38.000000000 +0000
+++ qca2-2.1.0/examples/cmssigner/cmssigner.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,22 +0,0 @@
-include(../examples.pri)
-CONFIG -= console
-CONFIG += app_bundle
-QT += gui
-
-include(pkcs11configdlg/pkcs11configdlg.pri)
-
-HEADERS += \
- prompter.h \
- certviewdlg.h \
- keyselectdlg.h \
- certitem.h
-
-SOURCES += \
- prompter.cpp \
- certviewdlg.cpp \
- keyselectdlg.cpp \
- certitem.cpp \
- main.cpp
-
-FORMS += certview.ui keyselect.ui mainwin.ui
-RESOURCES += cmssigner.qrc
diff -Nru qca2-2.0.3/examples/cmssigner/keyselectdlg.cpp qca2-2.1.0/examples/cmssigner/keyselectdlg.cpp
--- qca2-2.0.3/examples/cmssigner/keyselectdlg.cpp 2007-08-09 03:32:54.000000000 +0000
+++ qca2-2.1.0/examples/cmssigner/keyselectdlg.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -24,6 +24,9 @@
#include
#include
#include
+#include
+#include
+#include
#include "ui_keyselect.h"
#define ONLY_SHOW_KEYBUNDLE
diff -Nru qca2-2.0.3/examples/cmssigner/main.cpp qca2-2.1.0/examples/cmssigner/main.cpp
--- qca2-2.0.3/examples/cmssigner/main.cpp 2007-08-20 15:47:38.000000000 +0000
+++ qca2-2.1.0/examples/cmssigner/main.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -22,6 +22,8 @@
#include
#include
#include
+#include
+#include
#include "ui_mainwin.h"
#include "certviewdlg.h"
@@ -29,6 +31,10 @@
#include "pkcs11configdlg/pkcs11configdlg.h"
#include "certitem.h"
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
#define VERSION "1.0.0"
class Icons
diff -Nru qca2-2.0.3/examples/cmssigner/pkcs11configdlg/pkcs11configdlg.cpp qca2-2.1.0/examples/cmssigner/pkcs11configdlg/pkcs11configdlg.cpp
--- qca2-2.0.3/examples/cmssigner/pkcs11configdlg/pkcs11configdlg.cpp 2007-07-21 01:36:20.000000000 +0000
+++ qca2-2.1.0/examples/cmssigner/pkcs11configdlg/pkcs11configdlg.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -24,6 +24,8 @@
#include
#include
#include
+#include
+#include
#include "ui_pkcs11config.h"
//----------------------------------------------------------------------------
diff -Nru qca2-2.0.3/examples/cmssigner/pkcs11configdlg/pkcs11configdlg.pri qca2-2.1.0/examples/cmssigner/pkcs11configdlg/pkcs11configdlg.pri
--- qca2-2.0.3/examples/cmssigner/pkcs11configdlg/pkcs11configdlg.pri 2007-05-18 02:50:05.000000000 +0000
+++ qca2-2.1.0/examples/cmssigner/pkcs11configdlg/pkcs11configdlg.pri 1970-01-01 00:00:00.000000000 +0000
@@ -1,3 +0,0 @@
-HEADERS += $$PWD/pkcs11configdlg.h
-SOURCES += $$PWD/pkcs11configdlg.cpp
-FORMS += $$PWD/pkcs11config.ui
diff -Nru qca2-2.0.3/examples/cmssigner/prompter.cpp qca2-2.1.0/examples/cmssigner/prompter.cpp
--- qca2-2.0.3/examples/cmssigner/prompter.cpp 2007-07-06 01:47:35.000000000 +0000
+++ qca2-2.1.0/examples/cmssigner/prompter.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -24,6 +24,9 @@
#include
#include
#include
+#include
+#include
+#include
class Prompter::Private : public QObject
{
diff -Nru qca2-2.0.3/examples/eventhandlerdemo/CMakeLists.txt qca2-2.1.0/examples/eventhandlerdemo/CMakeLists.txt
--- qca2-2.0.3/examples/eventhandlerdemo/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/eventhandlerdemo/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,7 @@
+set(eventhandlerdemo_bin_SRCS eventhandlerdemo.cpp)
+
+MY_AUTOMOC( eventhandlerdemo_bin_SRCS)
+
+add_executable(eventhandlerdemo ${eventhandlerdemo_bin_SRCS})
+
+target_link_qca_libraries(eventhandlerdemo)
diff -Nru qca2-2.0.3/examples/eventhandlerdemo/eventhandlerdemo.cpp qca2-2.1.0/examples/eventhandlerdemo/eventhandlerdemo.cpp
--- qca2-2.0.3/examples/eventhandlerdemo/eventhandlerdemo.cpp 2009-04-24 17:59:20.000000000 +0000
+++ qca2-2.1.0/examples/eventhandlerdemo/eventhandlerdemo.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -26,6 +26,10 @@
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
/**
We need a class on the client side to handle password requests.
*/
diff -Nru qca2-2.0.3/examples/eventhandlerdemo/eventhandlerdemo.pro qca2-2.1.0/examples/eventhandlerdemo/eventhandlerdemo.pro
--- qca2-2.0.3/examples/eventhandlerdemo/eventhandlerdemo.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/eventhandlerdemo/eventhandlerdemo.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += eventhandlerdemo.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/examples.pri qca2-2.1.0/examples/examples.pri
--- qca2-2.0.3/examples/examples.pri 2009-04-24 21:12:15.000000000 +0000
+++ qca2-2.1.0/examples/examples.pri 1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-include(../app.pri)
-
-# default to console (individual programs can always override this if needed)
-CONFIG += console
-CONFIG -= app_bundle
-QT -= gui
diff -Nru qca2-2.0.3/examples/examples.pro qca2-2.1.0/examples/examples.pro
--- qca2-2.0.3/examples/examples.pro 2008-05-21 21:44:38.000000000 +0000
+++ qca2-2.1.0/examples/examples.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,24 +0,0 @@
-TEMPLATE = subdirs
-
-SUBDIRS += \
- aes-cmac \
- base64test \
- certtest \
- ciphertest \
- cms \
- cmssigner \
- eventhandlerdemo \
- hashtest \
- hextest \
- keyloader \
- mactest \
- md5crypt \
- providertest \
- publickeyexample \
- randomtest \
- rsatest \
- saslclient \
- saslserver \
- ssltest \
- sslservtest \
- tlssocket
diff -Nru qca2-2.0.3/examples/hashtest/CMakeLists.txt qca2-2.1.0/examples/hashtest/CMakeLists.txt
--- qca2-2.0.3/examples/hashtest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/hashtest/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(hashtest_bin_SRCS hashtest.cpp)
+
+add_executable(hashtest ${hashtest_bin_SRCS})
+
+target_link_qca_libraries(hashtest)
diff -Nru qca2-2.0.3/examples/hashtest/hashtest.cpp qca2-2.1.0/examples/hashtest/hashtest.cpp
--- qca2-2.0.3/examples/hashtest/hashtest.cpp 2007-06-13 02:30:43.000000000 +0000
+++ qca2-2.1.0/examples/hashtest/hashtest.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -26,6 +26,10 @@
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
int main(int argc, char **argv)
{
// the Initializer object sets things up, and
@@ -44,7 +48,7 @@
else {
// this shows the "all in one" approach
QString result = QCA::Hash("sha1").hashToString(arg);
- printf("sha1(\"%s\") = [%s]\n", arg.data(), result.toAscii().data());
+ printf("sha1(\"%s\") = [%s]\n", arg.data(), qPrintable(result));
}
// must always check that an algorithm is supported before using it
@@ -66,7 +70,7 @@
QCA::SecureArray resultArray = hashObject.final();
// convert the result into printable hexadecimal.
QString result = QCA::arrayToHex(resultArray.toByteArray());
- printf("md5(\"%s\") = [%s]\n", arg.data(), result.toAscii().data());
+ printf("md5(\"%s\") = [%s]\n", arg.data(), qPrintable(result));
}
return 0;
diff -Nru qca2-2.0.3/examples/hashtest/hashtest.pro qca2-2.1.0/examples/hashtest/hashtest.pro
--- qca2-2.0.3/examples/hashtest/hashtest.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/hashtest/hashtest.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += hashtest.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/hextest/CMakeLists.txt qca2-2.1.0/examples/hextest/CMakeLists.txt
--- qca2-2.0.3/examples/hextest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/hextest/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(hextest_bin_SRCS hextest.cpp)
+
+add_executable(hextest ${hextest_bin_SRCS})
+
+target_link_qca_libraries(hextest)
diff -Nru qca2-2.0.3/examples/hextest/hextest.cpp qca2-2.1.0/examples/hextest/hextest.cpp
--- qca2-2.0.3/examples/hextest/hextest.cpp 2009-04-24 17:59:20.000000000 +0000
+++ qca2-2.1.0/examples/hextest/hextest.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -26,6 +26,10 @@
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
int main(int argc, char **argv)
{
// the Initializer object sets things up, and
diff -Nru qca2-2.0.3/examples/hextest/hextest.pro qca2-2.1.0/examples/hextest/hextest.pro
--- qca2-2.0.3/examples/hextest/hextest.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/hextest/hextest.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += hextest.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/keyloader/CMakeLists.txt qca2-2.1.0/examples/keyloader/CMakeLists.txt
--- qca2-2.0.3/examples/keyloader/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/keyloader/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,7 @@
+set(keyloader_bin_SRCS keyloader.cpp)
+
+MY_AUTOMOC( keyloader_bin_SRCS )
+
+add_executable(keyloader ${keyloader_bin_SRCS})
+
+target_link_qca_libraries(keyloader)
diff -Nru qca2-2.0.3/examples/keyloader/keyloader.cpp qca2-2.1.0/examples/keyloader/keyloader.cpp
--- qca2-2.0.3/examples/keyloader/keyloader.cpp 2007-08-21 09:31:12.000000000 +0000
+++ qca2-2.1.0/examples/keyloader/keyloader.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -27,6 +27,10 @@
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
class PassphraseHandler: public QObject
{
Q_OBJECT
diff -Nru qca2-2.0.3/examples/keyloader/keyloader.pro qca2-2.1.0/examples/keyloader/keyloader.pro
--- qca2-2.0.3/examples/keyloader/keyloader.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/keyloader/keyloader.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += keyloader.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/mactest/CMakeLists.txt qca2-2.1.0/examples/mactest/CMakeLists.txt
--- qca2-2.0.3/examples/mactest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/mactest/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(mactest_bin_SRCS mactest.cpp)
+
+add_executable(mactest ${mactest_bin_SRCS})
+
+target_link_qca_libraries(mactest)
diff -Nru qca2-2.0.3/examples/mactest/mactest.cpp qca2-2.1.0/examples/mactest/mactest.cpp
--- qca2-2.0.3/examples/mactest/mactest.cpp 2009-04-24 17:59:20.000000000 +0000
+++ qca2-2.1.0/examples/mactest/mactest.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -28,6 +28,10 @@
// needed for printf
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
int main(int argc, char **argv)
{
// the Initializer object sets things up, and
diff -Nru qca2-2.0.3/examples/mactest/mactest.pro qca2-2.1.0/examples/mactest/mactest.pro
--- qca2-2.0.3/examples/mactest/mactest.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/mactest/mactest.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += mactest.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/md5crypt/CMakeLists.txt qca2-2.1.0/examples/md5crypt/CMakeLists.txt
--- qca2-2.0.3/examples/md5crypt/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/md5crypt/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,7 @@
+set(md5crypt_bin_SRCS md5crypt.cpp)
+
+add_executable(md5crypt ${md5crypt_bin_SRCS})
+
+target_link_qca_libraries(md5crypt)
+
+#add "crypt" to the libs if you are trying the crypt() equivalent
diff -Nru qca2-2.0.3/examples/md5crypt/md5crypt.cpp qca2-2.1.0/examples/md5crypt/md5crypt.cpp
--- qca2-2.0.3/examples/md5crypt/md5crypt.cpp 2008-04-23 22:50:41.000000000 +0000
+++ qca2-2.1.0/examples/md5crypt/md5crypt.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -30,6 +30,10 @@
#include
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
QString to64 ( long v , int size )
{
diff -Nru qca2-2.0.3/examples/md5crypt/md5crypt.pro qca2-2.1.0/examples/md5crypt/md5crypt.pro
--- qca2-2.0.3/examples/md5crypt/md5crypt.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/md5crypt/md5crypt.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += md5crypt.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/providertest/CMakeLists.txt qca2-2.1.0/examples/providertest/CMakeLists.txt
--- qca2-2.0.3/examples/providertest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/providertest/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(providertest_bin_SRCS providertest.cpp)
+
+add_executable(providertest ${providertest_bin_SRCS})
+
+target_link_qca_libraries(providertest)
diff -Nru qca2-2.0.3/examples/providertest/providertest.cpp qca2-2.1.0/examples/providertest/providertest.cpp
--- qca2-2.0.3/examples/providertest/providertest.cpp 2007-04-17 12:01:26.000000000 +0000
+++ qca2-2.1.0/examples/providertest/providertest.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -26,6 +26,10 @@
#include
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
int main(int argc, char **argv)
{
// the Initializer object sets things up, and
diff -Nru qca2-2.0.3/examples/providertest/providertest.pro qca2-2.1.0/examples/providertest/providertest.pro
--- qca2-2.0.3/examples/providertest/providertest.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/providertest/providertest.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += providertest.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/publickeyexample/CMakeLists.txt qca2-2.1.0/examples/publickeyexample/CMakeLists.txt
--- qca2-2.0.3/examples/publickeyexample/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/publickeyexample/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(publickeyexample_bin_SRCS publickeyexample.cpp)
+
+add_executable(publickeyexample ${publickeyexample_bin_SRCS})
+
+target_link_qca_libraries(publickeyexample)
diff -Nru qca2-2.0.3/examples/publickeyexample/publickeyexample.cpp qca2-2.1.0/examples/publickeyexample/publickeyexample.cpp
--- qca2-2.0.3/examples/publickeyexample/publickeyexample.cpp 2007-04-17 12:01:26.000000000 +0000
+++ qca2-2.1.0/examples/publickeyexample/publickeyexample.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -27,6 +27,9 @@
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
int main(int argc, char** argv)
{
diff -Nru qca2-2.0.3/examples/publickeyexample/publickeyexample.pro qca2-2.1.0/examples/publickeyexample/publickeyexample.pro
--- qca2-2.0.3/examples/publickeyexample/publickeyexample.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/publickeyexample/publickeyexample.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += publickeyexample.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/randomtest/CMakeLists.txt qca2-2.1.0/examples/randomtest/CMakeLists.txt
--- qca2-2.0.3/examples/randomtest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/randomtest/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(randomtest_bin_SRCS randomtest.cpp)
+
+add_executable(randomtest ${randomtest_bin_SRCS})
+
+target_link_qca_libraries(randomtest)
diff -Nru qca2-2.0.3/examples/randomtest/randomtest.cpp qca2-2.1.0/examples/randomtest/randomtest.cpp
--- qca2-2.0.3/examples/randomtest/randomtest.cpp 2009-04-24 17:59:20.000000000 +0000
+++ qca2-2.1.0/examples/randomtest/randomtest.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -27,6 +27,10 @@
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
int main(int argc, char **argv)
{
// the Initializer object sets things up, and
@@ -56,7 +60,7 @@
// To make this viewable, we convert to hexadecimal.
std::cout << "A random 10 byte array (in hex): ";
- std::cout << QCA::Hex().arrayToString(tenBytes).toAscii().data() << std::endl;
+ std::cout << qPrintable(QCA::Hex().arrayToString(tenBytes)) << std::endl;
// Under some circumstances, you may want to create a
// Random object, rather than a static public member function.
diff -Nru qca2-2.0.3/examples/randomtest/randomtest.pro qca2-2.1.0/examples/randomtest/randomtest.pro
--- qca2-2.0.3/examples/randomtest/randomtest.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/randomtest/randomtest.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += randomtest.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/rsatest/CMakeLists.txt qca2-2.1.0/examples/rsatest/CMakeLists.txt
--- qca2-2.0.3/examples/rsatest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/rsatest/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,5 @@
+set(rsatest_bin_SRCS rsatest.cpp)
+
+add_executable(rsatest ${rsatest_bin_SRCS})
+
+target_link_qca_libraries(rsatest)
diff -Nru qca2-2.0.3/examples/rsatest/rsatest.cpp qca2-2.1.0/examples/rsatest/rsatest.cpp
--- qca2-2.0.3/examples/rsatest/rsatest.cpp 2007-08-21 09:31:12.000000000 +0000
+++ qca2-2.1.0/examples/rsatest/rsatest.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -25,6 +25,10 @@
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
int main(int argc, char **argv)
{
// The Initializer object sets things up, and also
diff -Nru qca2-2.0.3/examples/rsatest/rsatest.pro qca2-2.1.0/examples/rsatest/rsatest.pro
--- qca2-2.0.3/examples/rsatest/rsatest.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/rsatest/rsatest.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-SOURCES += rsatest.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/saslclient/CMakeLists.txt qca2-2.1.0/examples/saslclient/CMakeLists.txt
--- qca2-2.0.3/examples/saslclient/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/saslclient/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,8 @@
+set(saslclient_bin_SRCS saslclient.cpp)
+
+MY_AUTOMOC( saslclient_bin_SRCS)
+
+add_executable(saslclient ${saslclient_bin_SRCS})
+
+target_link_qca_libraries(saslclient)
+target_link_libraries(saslclient ${QT_QTNETWORK_LIBRARY})
diff -Nru qca2-2.0.3/examples/saslclient/saslclient.cpp qca2-2.1.0/examples/saslclient/saslclient.cpp
--- qca2-2.0.3/examples/saslclient/saslclient.cpp 2008-05-24 00:21:44.000000000 +0000
+++ qca2-2.1.0/examples/saslclient/saslclient.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -29,6 +29,10 @@
// QtCrypto has the declarations for all of QCA
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
static QString prompt(const QString &s)
{
printf("* %s ", qPrintable(s));
diff -Nru qca2-2.0.3/examples/saslclient/saslclient.pro qca2-2.1.0/examples/saslclient/saslclient.pro
--- qca2-2.0.3/examples/saslclient/saslclient.pro 2008-05-21 21:32:20.000000000 +0000
+++ qca2-2.1.0/examples/saslclient/saslclient.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-QT += network
-
-SOURCES += saslclient.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/saslserver/CMakeLists.txt qca2-2.1.0/examples/saslserver/CMakeLists.txt
--- qca2-2.0.3/examples/saslserver/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/saslserver/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,8 @@
+set(saslserver_bin_SRCS saslserver.cpp)
+
+MY_AUTOMOC( saslserver_bin_SRCS)
+
+add_executable(saslserver ${saslserver_bin_SRCS})
+
+target_link_qca_libraries(saslserver)
+target_link_libraries(saslserver ${QT_QTNETWORK_LIBRARY})
diff -Nru qca2-2.0.3/examples/saslserver/saslserver.cpp qca2-2.1.0/examples/saslserver/saslserver.cpp
--- qca2-2.0.3/examples/saslserver/saslserver.cpp 2008-05-22 00:32:05.000000000 +0000
+++ qca2-2.1.0/examples/saslserver/saslserver.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -29,6 +29,10 @@
// QtCrypto has the declarations for all of QCA
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
static QString socketErrorToString(QAbstractSocket::SocketError x)
{
QString s;
diff -Nru qca2-2.0.3/examples/saslserver/saslserver.pro qca2-2.1.0/examples/saslserver/saslserver.pro
--- qca2-2.0.3/examples/saslserver/saslserver.pro 2008-05-22 00:32:05.000000000 +0000
+++ qca2-2.1.0/examples/saslserver/saslserver.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-QT += network
-
-SOURCES += saslserver.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/sslservtest/CMakeLists.txt qca2-2.1.0/examples/sslservtest/CMakeLists.txt
--- qca2-2.0.3/examples/sslservtest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/sslservtest/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,8 @@
+set(sslservtest_bin_SRCS sslservtest.cpp)
+
+MY_AUTOMOC( sslservtest_bin_SRCS )
+
+add_executable(sslservtest ${sslservtest_bin_SRCS})
+
+target_link_qca_libraries(sslservtest)
+target_link_libraries(sslservtest ${QT_QTNETWORK_LIBRARY})
diff -Nru qca2-2.0.3/examples/sslservtest/sslservtest.cpp qca2-2.1.0/examples/sslservtest/sslservtest.cpp
--- qca2-2.0.3/examples/sslservtest/sslservtest.cpp 2007-07-06 00:38:53.000000000 +0000
+++ qca2-2.1.0/examples/sslservtest/sslservtest.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -29,6 +29,10 @@
#include
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
char pemdata_cert[] =
"-----BEGIN CERTIFICATE-----\n"
"MIICeTCCAeKgAwIBAgIRAKKKnOj6Aarmwf0phApitVAwDQYJKoZIhvcNAQEFBQAw\n"
diff -Nru qca2-2.0.3/examples/sslservtest/sslservtest.pro qca2-2.1.0/examples/sslservtest/sslservtest.pro
--- qca2-2.0.3/examples/sslservtest/sslservtest.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/sslservtest/sslservtest.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-QT += network
-
-SOURCES += sslservtest.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/ssltest/CMakeLists.txt qca2-2.1.0/examples/ssltest/CMakeLists.txt
--- qca2-2.0.3/examples/ssltest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/ssltest/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,8 @@
+set(ssltest_bin_SRCS ssltest.cpp)
+
+MY_AUTOMOC( ssltest_bin_SRCS)
+
+add_executable(ssltest ${ssltest_bin_SRCS})
+
+target_link_qca_libraries(ssltest)
+target_link_libraries(ssltest ${QT_QTNETWORK_LIBRARY})
diff -Nru qca2-2.0.3/examples/ssltest/ssltest.cpp qca2-2.1.0/examples/ssltest/ssltest.cpp
--- qca2-2.0.3/examples/ssltest/ssltest.cpp 2007-07-06 18:57:03.000000000 +0000
+++ qca2-2.1.0/examples/ssltest/ssltest.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -24,6 +24,10 @@
#include
#include
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
char exampleCA_cert[] =
"-----BEGIN CERTIFICATE-----\n"
"MIICSzCCAbSgAwIBAgIBADANBgkqhkiG9w0BAQUFADA4MRMwEQYDVQQDEwpFeGFt\n"
diff -Nru qca2-2.0.3/examples/ssltest/ssltest.pro qca2-2.1.0/examples/ssltest/ssltest.pro
--- qca2-2.0.3/examples/ssltest/ssltest.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/ssltest/ssltest.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-QT += network
-
-SOURCES += ssltest.cpp
-include(../examples.pri)
diff -Nru qca2-2.0.3/examples/tlssocket/CMakeLists.txt qca2-2.1.0/examples/tlssocket/CMakeLists.txt
--- qca2-2.0.3/examples/tlssocket/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/examples/tlssocket/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,9 @@
+set(tlssocket_bin_moc_SRCS tlssocket.cpp)
+set(tlssocket_bin_nonmoc_SRCS main.cpp)
+
+MY_AUTOMOC( tlssocket_bin_moc_SRCS)
+
+add_executable(tlssocket ${tlssocket_bin_moc_SRCS} ${tlssocket_bin_nonmoc_SRCS})
+
+target_link_qca_libraries(tlssocket)
+target_link_libraries(tlssocket ${QT_QTNETWORK_LIBRARY})
diff -Nru qca2-2.0.3/examples/tlssocket/tlssocket.cpp qca2-2.1.0/examples/tlssocket/tlssocket.cpp
--- qca2-2.0.3/examples/tlssocket/tlssocket.cpp 2007-04-17 12:01:26.000000000 +0000
+++ qca2-2.1.0/examples/tlssocket/tlssocket.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -21,6 +21,10 @@
#include "tlssocket.h"
+#ifdef QT_STATICPLUGIN
+#include "import_plugins.h"
+#endif
+
class TLSSocket::Private : public QObject
{
Q_OBJECT
diff -Nru qca2-2.0.3/examples/tlssocket/tlssocket.pro qca2-2.1.0/examples/tlssocket/tlssocket.pro
--- qca2-2.0.3/examples/tlssocket/tlssocket.pro 2007-04-20 20:08:47.000000000 +0000
+++ qca2-2.1.0/examples/tlssocket/tlssocket.pro 1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-QT += network
-
-HEADERS += tlssocket.h
-SOURCES += tlssocket.cpp main.cpp
-
-include(../examples.pri)
diff -Nru qca2-2.0.3/include/QtCrypto/qca_basic.h qca2-2.1.0/include/QtCrypto/qca_basic.h
--- qca2-2.0.3/include/QtCrypto/qca_basic.h 2008-05-16 20:41:50.000000000 +0000
+++ qca2-2.1.0/include/QtCrypto/qca_basic.h 2014-11-06 08:15:45.000000000 +0000
@@ -35,6 +35,13 @@
#include "qca_core.h"
+// Qt5 comes with QStringLiteral for wrapping string literals, which Qt4 does
+// not have. It is needed if the headers are built with QT_NO_CAST_FROM_ASCII.
+// Defining it here as QString::fromUtf8 for convenience.
+#ifndef QStringLiteral
+#define QStringLiteral(str) QString::fromUtf8(str)
+#endif
+
namespace QCA {
/**
@@ -307,11 +314,11 @@
might want to use code like this:
\code
QFile f( "file.dat" );
-if ( f1.open( IO_ReadOnly ) )
+if ( f.open( QIODevice::ReadOnly ) )
{
QCA::Hash hashObj("sha1");
- hashObj.update( &f1 );
- QString output = hashObj.final() ) ),
+ hashObj.update( &f );
+ QByteArray output = hashObj.final().toByteArray();
}
\endcode
*/
@@ -359,7 +366,7 @@
string
This is a convenience method that returns the
- hash of a QSeecureArray as a hexadecimal
+ hash of a SecureArray as a hexadecimal
representation encoded in a QString.
\param array the QByteArray to hash
@@ -587,7 +594,8 @@
CBC, ///< operate in %Cipher Block Chaining mode
CFB, ///< operate in %Cipher FeedBack mode
ECB, ///< operate in Electronic Code Book mode
- OFB ///< operate in Output FeedBack Mode
+ OFB, ///< operate in Output FeedBack Mode
+ CTR, ///< operate in CounTer Mode
};
/**
@@ -928,6 +936,25 @@
SymmetricKey makeKey(const SecureArray &secret, const InitializationVector &salt, unsigned int keyLength, unsigned int iterationCount);
/**
+ Generate the key from a specified secret and salt value
+
+ \note key length is ignored for some functions
+
+ \param secret the secret (password or passphrase)
+ \param salt the salt to use
+ \param keyLength the length of key to return
+ \param msecInterval the maximum time to compute the key, in milliseconds
+ \param iterationCount a pointer to store the number of iteration done for the specified time
+
+ \return the derived key
+ */
+ SymmetricKey makeKey(const SecureArray &secret,
+ const InitializationVector &salt,
+ unsigned int keyLength,
+ int msecInterval,
+ unsigned int *iterationCount);
+
+ /**
Construct the name of the algorithm
You can use this to build a standard name string.
@@ -974,7 +1001,8 @@
\param algorithm the name of the hashing algorithm to use
\param provider the name of the provider to use, if available
*/
- explicit PBKDF1(const QString &algorithm = "sha1", const QString &provider = QString()) : KeyDerivationFunction(withAlgorithm("pbkdf1", algorithm), provider) {}
+ explicit PBKDF1(const QString &algorithm = QStringLiteral("sha1"), const QString &provider = QString())
+ : KeyDerivationFunction(withAlgorithm(QStringLiteral("pbkdf1"), algorithm), provider) {}
};
/**
@@ -996,7 +1024,8 @@
\param algorithm the name of the hashing algorithm to use
\param provider the name of the provider to use, if available
*/
- explicit PBKDF2(const QString &algorithm = "sha1", const QString &provider = QString()) : KeyDerivationFunction(withAlgorithm("pbkdf2", algorithm), provider) {}
+ explicit PBKDF2(const QString &algorithm = QStringLiteral("sha1"), const QString &provider = QString())
+ : KeyDerivationFunction(withAlgorithm(QStringLiteral("pbkdf2"), algorithm), provider) {}
};
}
diff -Nru qca2-2.0.3/include/QtCrypto/qca_core.h qca2-2.1.0/include/QtCrypto/qca_core.h
--- qca2-2.0.3/include/QtCrypto/qca_core.h 2010-11-27 21:14:12.000000000 +0000
+++ qca2-2.1.0/include/QtCrypto/qca_core.h 2014-11-06 08:15:45.000000000 +0000
@@ -33,15 +33,6 @@
#ifndef QCA_CORE_H
#define QCA_CORE_H
-/**
- The current version of %QCA
-
- This provides you a compile time check of the %QCA version.
-
- \sa qcaVersion for a runtime check.
-*/
-#define QCA_VERSION 0x020003
-
#include
#include
#include
@@ -50,16 +41,49 @@
#include "qca_export.h"
#include "qca_support.h"
#include "qca_tools.h"
+#include "qca_version.h"
/**
The current version of %QCA.
- This is equivalent to QCA_VERSION, except it provides
+ This is equivalent to ::QCA_VERSION, except it provides
a runtime check of the version of %QCA that is being used.
*/
QCA_EXPORT int qcaVersion();
/**
+ The current version of %QCA.
+
+ This is equivalent to ::QCA_VERSION_STR, except it provides
+ a runtime check of the version of %QCA that is being used.
+*/
+QCA_EXPORT const char *qcaVersionStr();
+
+/**
+ The current version of %QCA.
+
+ This is equivalent to ::QCA_MAJOR_VERSION, except it provides
+ a runtime check of the version of %QCA that is being used.
+*/
+QCA_EXPORT int qcaMajorVersion();
+
+/**
+ The current version of %QCA.
+
+ This is equivalent to ::QCA_MINOR_VERSION, except it provides
+ a runtime check of the version of %QCA that is being used.
+*/
+QCA_EXPORT int qcaMinorVersion();
+
+/**
+ The current version of %QCA.
+
+ This is equivalent to ::QCA_PATCH_VERSION, except it provides
+ a runtime check of the version of %QCA that is being used.
+*/
+QCA_EXPORT int qcaPatchVersion();
+
+/**
QCA - the Qt Cryptographic Architecture
*/
namespace QCA {
@@ -247,17 +271,34 @@
current plugin providers at a specified priority. If
a provider with the name already exists, this call fails.
+ QCA takes ownership of the provider.
+
\param p a pointer to a Provider object, which must be
set up.
\param priority the priority level to set the provider to
\return true if the provider is added, and false if the
provider is not added (failure)
+ \sa unloadProvider for unloading specified providers
\sa setProviderPriority for a description of the provider priority system
*/
QCA_EXPORT bool insertProvider(Provider *p, int priority = 0);
/**
+ Unload specified provider
+
+ The specified provider is removed from the list of providers
+ and deleted. If no provider with the name is found, this call fails.
+
+ \param name the name of the provider
+ \return true if the provider is unloaded, and false if the provider
+ cannot be found
+
+ \sa insertProvider for adding providers
+*/
+QCA_EXPORT bool unloadProvider(const QString &name);
+
+/**
Change the priority of a specified provider
QCA supports a number of providers, and if a number of providers
@@ -329,6 +370,19 @@
QCA_EXPORT Provider *defaultProvider();
/**
+ Retrieve plugin paths. It consists of:
+ 1. QCA_PLUGIN_PATH environment if set.
+ 2. \c %QCoreApplication::libraryPaths() .
+ 3. Directory where plugins were installed.
+
+ QCA_PLUGIN_PATH is paths list like PATH or QT_PLUGIN_PATH.
+ It uses system path separator. \";\" on Windows and \":\" on Unix.
+
+ This function was introduced in %QCA 2.1.
+*/
+QCA_EXPORT QStringList pluginPaths();
+
+/**
Scan for new plugins
*/
QCA_EXPORT void scanForPlugins();
diff -Nru qca2-2.0.3/include/QtCrypto/qca.h qca2-2.1.0/include/QtCrypto/qca.h
--- qca2-2.0.3/include/QtCrypto/qca.h 2008-05-16 20:41:50.000000000 +0000
+++ qca2-2.1.0/include/QtCrypto/qca.h 2014-11-06 08:15:45.000000000 +0000
@@ -43,5 +43,6 @@
#include "qca_securemessage.h"
#include "qcaprovider.h"
#include "qpipe.h"
+#include "qca_safetimer.h"
#endif
diff -Nru qca2-2.0.3/include/QtCrypto/qcaprovider.h qca2-2.1.0/include/QtCrypto/qcaprovider.h
--- qca2-2.0.3/include/QtCrypto/qcaprovider.h 2008-05-16 20:41:50.000000000 +0000
+++ qca2-2.1.0/include/QtCrypto/qcaprovider.h 2014-11-06 08:15:45.000000000 +0000
@@ -116,7 +116,7 @@
\param p the provider associated with this context
*/
- InfoContext(Provider *p) : BasicContext(p, "info") {}
+ InfoContext(Provider *p) : BasicContext(p, QStringLiteral("info") ) {}
/**
The hash algorithms supported by the provider
@@ -153,7 +153,7 @@
\param p the provider associated with this context
*/
- RandomContext(Provider *p) : BasicContext(p, "random") {}
+ RandomContext(Provider *p) : BasicContext(p, QStringLiteral("random")) {}
/**
Return an array of random bytes
@@ -356,6 +356,21 @@
\param iterationCount the number of iterations of the derivation algorith,
*/
virtual SymmetricKey makeKey(const SecureArray &secret, const InitializationVector &salt, unsigned int keyLength, unsigned int iterationCount) = 0;
+
+ /**
+ Create a key and return it
+
+ \param secret the secret part (typically password)
+ \param salt the salt / initialization vector
+ \param keyLength the length of the key to be produced
+ \param msecInterval the maximum time to compute the key, in milliseconds
+ \param iterationCount a pointer to store the number of iterations of the derivation algorithm,
+ */
+ virtual SymmetricKey makeKey(const SecureArray &secret,
+ const InitializationVector &salt,
+ unsigned int keyLength,
+ int msecInterval,
+ unsigned int *iterationCount) = 0;
};
/**
@@ -377,7 +392,7 @@
\param p the provider associated with this context
*/
- DLGroupContext(Provider *p) : Provider::Context(p, "dlgroup") {}
+ DLGroupContext(Provider *p) : Provider::Context(p, QStringLiteral("dlgroup")) {}
/**
The DLGroupSets supported by this object
@@ -586,7 +601,7 @@
\param p the provider associated with this context
*/
- RSAContext(Provider *p) : PKeyBase(p, "rsa") {}
+ RSAContext(Provider *p) : PKeyBase(p, QStringLiteral("rsa")) {}
/**
Generate an RSA private key
@@ -669,7 +684,7 @@
\param p the provider associated with this context
*/
- DSAContext(Provider *p) : PKeyBase(p, "dsa") {}
+ DSAContext(Provider *p) : PKeyBase(p, QStringLiteral("dsa")) {}
/**
Generate a DSA private key
@@ -739,7 +754,7 @@
\param p the provider associated with this context
*/
- DHContext(Provider *p) : PKeyBase(p, "dh") {}
+ DHContext(Provider *p) : PKeyBase(p, QStringLiteral("dh")) {}
/**
Generate a Diffie-Hellman private key
@@ -815,7 +830,7 @@
\param p the provider associated with this context
*/
- PKeyContext(Provider *p) : BasicContext(p, "pkey") {}
+ PKeyContext(Provider *p) : BasicContext(p, QStringLiteral("pkey")) {}
/**
Returns a list of supported public key types
@@ -1225,7 +1240,7 @@
\param p the provider associated with this context
*/
- CertContext(Provider *p) : CertBase(p, "cert") {}
+ CertContext(Provider *p) : CertBase(p, QStringLiteral("cert")) {}
/**
Create a self-signed certificate based on the given options and
@@ -1318,7 +1333,7 @@
\param p the provider associated with this context
*/
- CSRContext(Provider *p) : CertBase(p, "csr") {}
+ CSRContext(Provider *p) : CertBase(p, QStringLiteral("csr")) {}
/**
Returns true if the provider of this object supports the specified
@@ -1399,7 +1414,7 @@
\param p the provider associated with this context
*/
- CRLContext(Provider *p) : CertBase(p, "crl") {}
+ CRLContext(Provider *p) : CertBase(p, QStringLiteral("crl")) {}
/**
Returns a pointer to the properties of this CRL
@@ -1434,7 +1449,7 @@
\param p the provider associated with this context
*/
- CertCollectionContext(Provider *p) : BasicContext(p, "certcollection") {}
+ CertCollectionContext(Provider *p) : BasicContext(p, QStringLiteral("certcollection")) {}
/**
Create PKCS#7 DER output based on the input certificates and CRLs
@@ -1482,7 +1497,7 @@
\param p the Provider associated with this context
*/
- CAContext(Provider *p) : BasicContext(p, "ca") {}
+ CAContext(Provider *p) : BasicContext(p, QStringLiteral("ca")) {}
/**
Prepare the object for usage
@@ -1559,7 +1574,7 @@
\param p the Provider associated with this context
*/
- PKCS12Context(Provider *p) : BasicContext(p, "pkcs12") {}
+ PKCS12Context(Provider *p) : BasicContext(p, QStringLiteral("pkcs12")) {}
/**
Create PKCS#12 DER output based on a set of input items
@@ -1670,7 +1685,7 @@
\param p the Provider associated with this context
*/
- PGPKeyContext(Provider *p) : BasicContext(p, "pgpkey") {}
+ PGPKeyContext(Provider *p) : BasicContext(p, QStringLiteral("pgpkey")) {}
/**
Returns a pointer to the properties of this key
@@ -1728,7 +1743,7 @@
\param p the Provider associated with this context
*/
- KeyStoreEntryContext(Provider *p) : BasicContext(p, "keystoreentry") {}
+ KeyStoreEntryContext(Provider *p) : BasicContext(p, QStringLiteral("keystoreentry")) {}
/**
Returns the entry type
@@ -1833,7 +1848,7 @@
\param p the Provider associated with this context
*/
- KeyStoreListContext(Provider *p) : Provider::Context(p, "keystorelist") {}
+ KeyStoreListContext(Provider *p) : Provider::Context(p, QStringLiteral("keystorelist")) {}
/**
Starts the keystore provider
@@ -2071,7 +2086,7 @@
\param p the Provider associated with this context
*/
- TLSSessionContext(Provider *p) : BasicContext(p, "tlssession") {}
+ TLSSessionContext(Provider *p) : BasicContext(p, QStringLiteral("tlssession")) {}
};
/**
@@ -2487,7 +2502,7 @@
\param p the Provider associated with this context
*/
- SASLContext(Provider *p) : Provider::Context(p, "sasl") {}
+ SASLContext(Provider *p) : Provider::Context(p, QStringLiteral("sasl")) {}
/**
Reset the object to its initial state
diff -Nru qca2-2.0.3/include/QtCrypto/qca_publickey.h qca2-2.1.0/include/QtCrypto/qca_publickey.h
--- qca2-2.0.3/include/QtCrypto/qca_publickey.h 2008-05-16 20:41:50.000000000 +0000
+++ qca2-2.1.0/include/QtCrypto/qca_publickey.h 2014-11-06 08:15:45.000000000 +0000
@@ -53,12 +53,22 @@
*/
enum EncryptionAlgorithm
{
- EME_PKCS1v15, ///< Block type 2 (PKCS#1, Version 1.5)
- EME_PKCS1_OAEP ///< Optimal asymmetric encryption padding (PKCS#1, Version 2.0)
+ EME_PKCS1v15, ///< Block type 2 (PKCS#1, Version 1.5)
+ EME_PKCS1_OAEP, ///< Optimal asymmetric encryption padding (PKCS#1, Version 2.0)
+ EME_PKCS1v15_SSL, ///< PKCS#1, Version 1.5 with an SSL-specific modification
+ EME_NO_PADDING ///< Raw RSA encryption
};
/**
Signature algorithm variants
+
+ Note that most signature algorithms follow a process of first hashing the
+ plaintext data to be signed, creating a payload format that wraps the hash
+ value (among other things), and then signing the payload with the private
+ key. So, for example, an EMSA3(SHA1) signature outputted by QCA cannot be
+ verified by merely performing RSA and SHA1 operations (e.g.
+ "openssl rsautl -verify" and comparing with sha1sum), because that would not
+ take the EMSA3 payload format into consideration.
*/
enum SignatureAlgorithm
{
@@ -68,7 +78,11 @@
EMSA3_MD5, ///< MD5, with EMSA3 (ie PKCS#1 Version 1.5) encoding (this is the usual RSA algorithm)
EMSA3_MD2, ///< MD2, with EMSA3 (ie PKCS#1 Version 1.5) encoding
EMSA3_RIPEMD160, ///< RIPEMD160, with EMSA3 (ie PKCS#1 Version 1.5) encoding
- EMSA3_Raw ///< EMSA3 without computing a message digest or a DigestInfo encoding (identical to PKCS#11's CKM_RSA_PKCS mechanism)
+ EMSA3_Raw, ///< EMSA3 without computing a message digest or a DigestInfo encoding (identical to PKCS#11's CKM_RSA_PKCS mechanism)
+ EMSA3_SHA224, ///< SHA224, with EMSA3 (ie PKCS#1 Version 1.5) encoding
+ EMSA3_SHA256, ///< SHA256, with EMSA3 (ie PKCS#1 Version 1.5) encoding
+ EMSA3_SHA384, ///< SHA384, with EMSA3 (ie PKCS#1 Version 1.5) encoding
+ EMSA3_SHA512 ///< SHA512, with EMSA3 (ie PKCS#1 Version 1.5) encoding
};
/**
@@ -581,6 +595,13 @@
bool canEncrypt() const;
/**
+ Test if this key can be used for decryption
+
+ \return true if the key can be used for decryption
+ */
+ bool canDecrypt() const;
+
+ /**
Test if the key can be used for verifying signatures
\return true of the key can be used for verification
@@ -604,6 +625,18 @@
SecureArray encrypt(const SecureArray &a, EncryptionAlgorithm alg);
/**
+ Decrypt the message
+
+ \param in the cipher (encrypted) data
+ \param out the plain text data
+ \param alg the algorithm to use
+
+ \note This synchronous operation may require event handling, and so
+ it must not be called from the same thread as an EventHandler.
+ */
+ bool decrypt(const SecureArray &in, SecureArray *out, EncryptionAlgorithm alg);
+
+ /**
Initialise the signature verification process
\param alg the algorithm to use for signing
@@ -850,6 +883,13 @@
bool canDecrypt() const;
/**
+ Test if this key can be used for encryption
+
+ \return true if the key can be used for encryption
+ */
+ bool canEncrypt() const;
+
+ /**
Test if this key can be used for signing
\return true if the key can be used to make a signature
@@ -857,6 +897,14 @@
bool canSign() const;
/**
+ The maximum message size that can be encrypted with a specified
+ algorithm
+
+ \param alg the algorithm to check
+ */
+ int maximumEncryptSize(EncryptionAlgorithm alg) const;
+
+ /**
Decrypt the message
\param in the cipher (encrypted) data
@@ -869,6 +917,14 @@
bool decrypt(const SecureArray &in, SecureArray *out, EncryptionAlgorithm alg);
/**
+ Encrypt a message using a specified algorithm
+
+ \param a the message to encrypt
+ \param alg the algorithm to use
+ */
+ SecureArray encrypt(const SecureArray &a, EncryptionAlgorithm alg);
+
+ /**
Initialise the message signature process
\param alg the algorithm to use for the message signature process
diff -Nru qca2-2.0.3/include/QtCrypto/qca_safetimer.h qca2-2.1.0/include/QtCrypto/qca_safetimer.h
--- qca2-2.0.3/include/QtCrypto/qca_safetimer.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/include/QtCrypto/qca_safetimer.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,70 @@
+/*
+ * qca_safetimer.h - Qt Cryptographic Architecture
+ * Copyright (C) 2014 Ivan Romanov
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#ifndef QCA_SAFETIMER_H
+#define QCA_SAFETIMER_H
+
+#include "qca_export.h"
+#include
+
+class QEvent;
+class QTimerEvent;
+
+namespace QCA {
+
+class QCA_EXPORT SafeTimer : public QObject
+{
+ Q_OBJECT
+public:
+ SafeTimer(QObject *parent = 0);
+ ~SafeTimer();
+
+ int interval() const;
+ bool isActive() const;
+ bool isSingleShot() const;
+ void setInterval(int msec);
+ void setSingleShot(bool singleShot);
+ int timerId() const;
+
+public slots:
+ void start(int msec);
+ void start();
+ void stop();
+
+signals:
+ void timeout();
+
+protected:
+ bool event(QEvent *event);
+ void timerEvent(QTimerEvent *event);
+
+private:
+ // Functions is used internally. Outer world mustn't have access them.
+ void startTimer() {}
+ void killTimer(int) {}
+
+ class Private;
+ Private *d;
+};
+
+}
+
+#endif // QCA_SAFETIMER_H
diff -Nru qca2-2.0.3/include/QtCrypto/qca_securelayer.h qca2-2.1.0/include/QtCrypto/qca_securelayer.h
--- qca2-2.0.3/include/QtCrypto/qca_securelayer.h 2008-05-16 20:41:50.000000000 +0000
+++ qca2-2.1.0/include/QtCrypto/qca_securelayer.h 2014-11-06 08:15:45.000000000 +0000
@@ -783,7 +783,11 @@
\param signal the name of the signal that has been
connected to.
*/
+#if QT_VERSION >= 0x050000
+ void connectNotify(const QMetaMethod &signal);
+#else
void connectNotify(const char *signal);
+#endif
/**
Called when a connection is removed from a particular signal
@@ -791,7 +795,11 @@
\param signal the name of the signal that has been
disconnected from.
*/
+#if QT_VERSION >= 0x050000
+ void disconnectNotify(const QMetaMethod &signal);
+#else
void disconnectNotify(const char *signal);
+#endif
private:
Q_DISABLE_COPY(TLS)
diff -Nru qca2-2.0.3/include/QtCrypto/qca_securemessage.h qca2-2.1.0/include/QtCrypto/qca_securemessage.h
--- qca2-2.0.3/include/QtCrypto/qca_securemessage.h 2008-05-16 20:41:50.000000000 +0000
+++ qca2-2.1.0/include/QtCrypto/qca_securemessage.h 2014-11-06 08:15:45.000000000 +0000
@@ -363,7 +363,10 @@
ErrorEncryptInvalid, ///< encrypting key is invalid in some way
ErrorNeedCard, ///< pgp card is missing
ErrorCertKeyMismatch, ///< certificate and private key don't match
- ErrorUnknown ///< other error
+ ErrorUnknown, ///< other error
+ ErrorSignerRevoked, ///< signing key is revoked
+ ErrorSignatureExpired, ///< signature is expired
+ ErrorEncryptRevoked ///< encrypting key is revoked
};
/**
diff -Nru qca2-2.0.3/include/QtCrypto/qca_version.h.in qca2-2.1.0/include/QtCrypto/qca_version.h.in
--- qca2-2.0.3/include/QtCrypto/qca_version.h.in 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/include/QtCrypto/qca_version.h.in 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,81 @@
+/*
+ * qca_version.h - Qt Cryptographic Architecture
+ * Copyright (C) 2014 Ivan Romanov
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+/**
+ \file qca_version.h
+
+ Header file with %QCA version
+
+ \note You should not use this header directly from an
+ application. You should just use \#include \
+ instead.
+*/
+
+#ifndef QCA_VERSION_H
+#define QCA_VERSION_H
+
+/**
+ The major part of current %QCA version.
+*/
+
+#define QCA_MAJOR_VERSION @QCA_LIB_MAJOR_VERSION@
+
+/**
+ The minor part of current %QCA version.
+*/
+
+#define QCA_MINOR_VERSION @QCA_LIB_MINOR_VERSION@
+
+/**
+ The patch part of current %QCA version.
+*/
+
+#define QCA_PATCH_VERSION @QCA_LIB_PATCH_VERSION@
+
+/**
+ The current version of %QCA as string.
+ */
+
+#define QCA_VERSION_STR "@QCA_LIB_VERSION_STRING@"
+
+/**
+ Can be used like #if (QCA_VERSION >= %QCA_VERSION_CHECK(2, 0, 3))
+
+ \param major part of the version
+ \param minor part of the version
+ \param patch part of the version
+*/
+
+#define QCA_VERSION_CHECK(major, minor, patch) \
+ ((major << 16) | (minor << 8) | (patch))
+
+/**
+ The current version of %QCA
+
+ This provides you a compile time check of the %QCA version.
+
+ \sa qcaVersion for a runtime check.
+*/
+
+#define QCA_VERSION \
+ QCA_VERSION_CHECK(@QCA_LIB_MAJOR_VERSION@, @QCA_LIB_MINOR_VERSION@, @QCA_LIB_PATCH_VERSION@)
+
+#endif // QCA_VERSION_H
diff -Nru qca2-2.0.3/INSTALL qca2-2.1.0/INSTALL
--- qca2-2.0.3/INSTALL 2009-04-24 23:10:25.000000000 +0000
+++ qca2-2.1.0/INSTALL 2014-11-06 08:15:45.000000000 +0000
@@ -1,36 +1,62 @@
Installing QCA
--------------
-QCA requires Qt 4.2 or greater.
+QCA requires Qt 4.7 or greater.
-For Unix/Linux/Mac:
+For Unix/Linux/Mac/Windows:
- ./configure
+ cmake .
make
make install
/sbin/ldconfig, if necessary
-For Windows:
-
- configure
- nmake (or make)
- installwin
-
-
Notes
-----
- - On unix, use --prefix=$PWD to build in-place
+ Use cmake cache entries
-Building from SVN
-------------------
-First, install the 'qconf' program, at least version 1.5. You can download
-the source here:
- http://delta.affinix.com/qconf/
+ CMAKE_INSTALL_PREFIX - must be defined otherwise QCA will be installed
+ in Qt prefix (by default: "")
+ QT4_BUILD - forced Qt4 building (by default: OFF)
+ BUILD_TESTS - build unittests (by default: ON)
+ BUILD_TOOLS - build mozcerts and qcatool (by default: ON)
+ QCA_SUFFIX - suffix will be used for library, qcatool binary,
+ qcatool manpage and qca pkg-config file (by default: "")
+ LIB_SUFFIX - library directory suffix (by default: "")
+ LIB_INSTALL_DIR - path to library directory
+ (by default: ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
+ BUILD_PLUGINS - list plugins to build (botan;ossl;gnupg for example).
+ Also possible values is none, auto or all
+ (by default: "auto")
+ WITH_${PLUGIN}_PLUGIN - to build particular plugin. Can be no, yes or
+ auto (WITH_ossl_PLUGIN=auto for example)
+ DEVELOPER_MODE - mode to enable features for developers. If ON
+ will be used hardcoded path to 'crypto'
+ (by default: OFF)
+ OSX_FRAMEWORK - build an OS X framework (by default: ON)
+ USE_RELATIVE_PATHS - make relocatable package if possible (by default: OFF)
+
+ Finally install paths can be override with:
+
+ QCA_PREFIX_INSTALL_DIR - qca prefix, just a origin to make other paths
+ QCA_PLUGINS_INSTALL_DIR - qt plugins path
+ QCA_BINARY_INSTALL_DIR - qcatool will be installed to
+ QCA_LIBRARY_INSTALL_DIR - qca library will be installed to
+ QCA_FEATURE_INSTALL_DIR - path to qt mkspecs dir
+ QCA_INCLUDE_INSTALL_DIR - path for QtCrypto dir with includes
+ QCA_PRIVATE_INCLUDE_INSTALL_DIR - for future implementation
+ QCA_DOC_INSTALL_DIR - for html documentation
+ QCA_MAN_INSTALL_DIR - for qcatool manpage
+ PKGCONFIG_INSTALL_PREFIX - path to install pkg config file
-Then, go into the QCA source tree and type 'qconf'. You should now have a
-configure program to execute, just like from a normal source package.
+Please report problems to:
+ http://bugs.kde.org
+Official git repo:
+ http://quickgit.kde.org/?p=qca.git
-Please report problems to:
- delta@lists.affinix.com
+KDE Projects page:
+ http://projects.kde.org/projects/kdesupport/qca
+
+Official homepage:
+ http://delta.affinix.com/qca/
diff -Nru qca2-2.0.3/installwin.bat qca2-2.1.0/installwin.bat
--- qca2-2.0.3/installwin.bat 2009-04-24 23:10:25.000000000 +0000
+++ qca2-2.1.0/installwin.bat 1970-01-01 00:00:00.000000000 +0000
@@ -1,17 +0,0 @@
-@echo off
-REM install qmake feature file pointing to the current directory
-
-if not defined QTDIR goto err
-echo QCA_INCDIR = "%CD%\include" > crypto.prf
-echo QCA_LIBDIR = "%CD%\lib" >> crypto.prf
-type crypto.prf.in >> crypto.prf
-copy crypto.prf "%QTDIR%\mkspecs\features"
-
-echo Installed crypto.prf as a qmake feature.
-goto end
-
-:err
-echo Error: QTDIR not set (example: set QTDIR=C:\Qt\4.2.3).
-goto end
-
-:end
diff -Nru qca2-2.0.3/Mainpage.dox qca2-2.1.0/Mainpage.dox
--- qca2-2.0.3/Mainpage.dox 2007-09-02 18:55:35.000000000 +0000
+++ qca2-2.1.0/Mainpage.dox 2014-11-06 08:15:45.000000000 +0000
@@ -14,7 +14,7 @@
application!
%QCA should work everywhere %Qt does, including Windows/Unix/MacOSX. This
- version of %QCA is for Qt4, and requires no Qt3 compatibility code.
+ version of %QCA is for Qt4 or Qt5, and requires no Qt3 compatibility code.
\section features Features
@@ -157,19 +157,20 @@
\subsection qca2dev Current development
- The latest version of the code is available from the KDE Subversion
- server (there is no formal release of the current version at this time). See
-
- http://developer.kde.org/source/anonsvn.html
- for general instructions. You do not need kdelibs or
- arts modules for %QCA - just pull down kdesupport/qca. The plugins
- are in the same tree. Naturally you will need %Qt properly set up
- and configured in order to build and use %QCA.
+ The latest version of the code is available from the KDE Git server
+ (there is no formal release of the current version at this time).
+ Naturally you will need %Qt properly set up and configured in order
+ to build and use %QCA.
- The Subversion code can also be browsed
-
+ The Git code can be browsed
+
via the web
+ Use
+ \verbatim
+ git clone git://anongit.kde.org/qca.git
+ \endverbatim
+ to get the latest sources.
*/
/** \page architecture Architecture
diff -Nru qca2-2.0.3/man/qcatool.1 qca2-2.1.0/man/qcatool.1
--- qca2-2.0.3/man/qcatool.1 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/man/qcatool.1 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,191 @@
+.TH QCATOOL "1" "August 2007" "qcatool 1.0.0" "Qt Cryptographic Architecture (QCA)"
+
+.SH NAME
+qcatool \- command line tool for the Qt Cryptographic Architecture
+
+.SH DESCRIPTION
+qcatool is a command line tool for performing various cryptographic
+operations with the Qt Cryptographic Architecture (QCA). qcatool can
+also be used for testing and debugging QCA.
+
+.SH USAGE
+qcatool has a range of options and commands. You only ever get to
+use one command, but you may use several, one or no options.
+
+.SH OPTIONS
+As noted above, these are all optional, and may be combined.
+.PP
+.TP
+\fB\-\-pass\fR=PASSWORD
+Specify the password to use. This is probably a bad idea except for
+testing, because anyone can read the arguments to a command line
+application.
+.TP
+\fB\-\-newpass\fR=PASSWORD
+Specify the new password to use for password change
+with the \fBkey changepass\fR and \fBkeybundle changepass\fR commands.
+This is probably a bad idea except for
+testing, because anyone can read the arguments to a command line
+application.
+.TP
+\fB\-\-nonroots\fR=CERTIFICATES
+Specify additional certificates, not trusted, but which may be used
+in the trust path if appropriate trust can be established.
+.TP
+\fB\-\-roots\fR=CERTIFICATES
+Specify additional certificates which can be used as trusted (root)
+certificates.
+.TP
+\fB\-\-nosys\fR
+Disable use of the standard root certificates that are provided by
+the operating system.
+.TP
+\fB\-\-noprompt\fR
+Disable prompting for passwords/passphrases. If you do not provide
+the passphrase on the command line (with \fB\-\-pass\fR or \fB\-\-newpass\fR)
+this will cause qcatool to abort the command if a password/passphrase is
+required.
+.TP
+\fB\-\-ordered\fR
+If outputting certificate information fields (Distinguished Name and Subject Alternative Name), show them in same the order that they are present in the certificate rather than in a friendly sorted order.
+.TP
+\fB\-\-debug\fR
+Enable additional output to aid debugging.
+.TP
+\fB\-\-log-file=FILENAME\fR
+Log to the specified file.
+.TP
+\fB\-\-log-level=LEVEL\fR
+Log at the specified level. The log level can be between 0 (none)
+and 8 (most).
+.TP
+\fB\-\-nobundle\fR
+When S/MIME signing, do not bundle the signer's certificate chain inside the signature. This results in a smaller signature output, but requires the recipient to have all of the necessary certificates in order to verify it.
+
+.SH COMMANDS
+.TP
+\fBhelp\fR, \fB\-\-help\fR, \fB\-h\fR
+Output usage (help) information.
+.TP
+\fBversion\fR, \fB\-\-version\fR, \fB\-v\fR
+Output version information.
+.TP
+\fBplugins\fR
+List available plugins. Use the \fB\-\-debug\fR option to get
+more information on plugins which are found and which ones actually
+loaded.
+.TP
+\fBconfig save \fI[provider]\fR
+Save provider configuration. Use this to have the provider's default configuration written to persistent storage, which you can then edit by hand.
+.TP
+\fBconfig edit \fI[provider]\fR
+Edit provider configuration. The changes are written to persistent storage.
+.TP
+\fBkey make rsa|dsa [bits]\fR
+Create a key pair
+.TP
+\fBkey changepass [K]
+Add/change/remove passphrase of a key
+.TP
+\fBcert makereq [K]\fR
+Create certificate request (CSR)
+.TP
+\fBcert makeself [K]\fR
+Create self-signed certificate
+.TP
+\fBcert makereqadv [K]\fR
+Advanced version of 'makereq'
+.TP
+\fBcert makeselfadv [K]\fR
+Advanced version of 'makeself'
+.TP
+\fBcert validate [C]\fR
+Validate certificate
+.TP
+\fBkeybundle make [K] [C]\fR
+Create a keybundle
+.TP
+\fBkeybundle extract [X]\fR
+Extract certificate(s) and key
+.TP
+\fBkeybundle changepass [X]\fR
+Change passphrase of a keybundle
+.TP
+\fBkeystore list-stores\fR
+List all available keystores
+.TP
+\fBkeystore list [storeName]\fR
+List content of a keystore
+.TP
+\fBkeystore monitor\fR
+Monitor for keystore availability
+.TP
+\fBkeystore export [E]\fR
+Export a keystore entry's content
+.TP
+\fBkeystore exportref [E]\fR
+Export a keystore entry reference
+.TP
+\fBkeystore addkb [storeName] [cert.p12]\fR
+Add a keybundle into a keystore
+.TP
+\fBkeystore addpgp [storeName] [key.asc]\fR
+Add a PGP key into a keystore
+.TP
+\fBkeystore remove [E]\fR
+Remove an object from a keystore
+.TP
+\fBshow cert [C]\fR
+Examine a certificate
+.TP
+\fBshow req [req.pem]\fR
+Examine a certificate request (CSR)
+.TP
+\fBshow crl [crl.pem]\fR
+Examine a certificate revocation list
+.TP
+\fBshow kb [X]\fR
+Examine a keybundle
+.TP
+\fBshow pgp [P|S]\fR
+Examine a PGP key
+.TP
+\fBmessage sign pgp|pgpdetach|smime [X|S]\fR
+Sign a message
+.TP
+\fBmessage encrypt pgp|smime [C|P]\fR
+Encrypt a message
+.TP
+\fBmessage signencrypt [S] [P]\fR
+PGP sign & encrypt a message
+.TP
+\fBmessage verify pgp|smime\fR
+Verify a message
+.TP
+\fBmessage decrypt pgp|smime ((X) ...)\fR
+Decrypt a message (S/MIME needs X)
+.TP
+\fBmessage exportcerts\fR
+Export certs from S/MIME message
+
+.SH ARGUMENTS
+The arguments to the commands are as follows.
+
+K = private key.
+
+C = certificate.
+
+X = key bundle.
+
+P = PGP public key.
+
+S = PGP secret key.
+
+E = generic entry.
+
+These must be identified by either a filename or a keystore reference ("store:obj").
+
+.SH AUTHOR
+qcatool was written by Justin Karneges as part of QCA. This manual page
+was written by Brad Hards.
+
diff -Nru qca2-2.0.3/man/qcatool2.1 qca2-2.1.0/man/qcatool2.1
--- qca2-2.0.3/man/qcatool2.1 2007-11-02 22:34:52.000000000 +0000
+++ qca2-2.1.0/man/qcatool2.1 1970-01-01 00:00:00.000000000 +0000
@@ -1,191 +0,0 @@
-.TH QCATOOL "1" "August 2007" "qcatool 1.0.0" "Qt Cryptographic Architecture (QCA)"
-
-.SH NAME
-qcatool \- command line tool for the Qt Cryptographic Architecture
-
-.SH DESCRIPTION
-qcatool is a command line tool for performing various cryptographic
-operations with the Qt Cryptographic Architecture (QCA). qcatool can
-also be used for testing and debugging QCA.
-
-.SH USAGE
-qcatool has a range of options and commands. You only ever get to
-use one command, but you may use several, one or no options.
-
-.SH OPTIONS
-As noted above, these are all optional, and may be combined.
-.PP
-.TP
-\fB\-\-pass\fR=PASSWORD
-Specify the password to use. This is probably a bad idea except for
-testing, because anyone can read the arguments to a command line
-application.
-.TP
-\fB\-\-newpass\fR=PASSWORD
-Specify the new password to use for password change
-with the \fBkey changepass\fR and \fBkeybundle changepass\fR commands.
-This is probably a bad idea except for
-testing, because anyone can read the arguments to a command line
-application.
-.TP
-\fB\-\-nonroots\fR=CERTIFICATES
-Specify additional certificates, not trusted, but which may be used
-in the trust path if appropriate trust can be established.
-.TP
-\fB\-\-roots\fR=CERTIFICATES
-Specify additional certificates which can be used as trusted (root)
-certificates.
-.TP
-\fB\-\-nosys\fR
-Disable use of the standard root certificates that are provided by
-the operating system.
-.TP
-\fB\-\-noprompt\fR
-Disable prompting for passwords/passphrases. If you do not provide
-the passphrase on the command line (with \fB\-\-pass\fR or \fB\-\-newpass\fR)
-this will cause qcatool to abort the command if a password/passphrase is
-required.
-.TP
-\fB\-\-ordered\fR
-If outputting certificate information fields (Distinguished Name and Subject Alternative Name), show them in same the order that they are present in the certificate rather than in a friendly sorted order.
-.TP
-\fB\-\-debug\fR
-Enable additional output to aid debugging.
-.TP
-\fB\-\-log-file=FILENAME\fR
-Log to the specified file.
-.TP
-\fB\-\-log-level=LEVEL\fR
-Log at the specified level. The log level can be between 0 (none)
-and 8 (most).
-.TP
-\fB\-\-nobundle\fR
-When S/MIME signing, do not bundle the signer's certificate chain inside the signature. This results in a smaller signature output, but requires the recipient to have all of the necessary certificates in order to verify it.
-
-.SH COMMANDS
-.TP
-\fBhelp\fR, \fB\-\-help\fR, \fB\-h\fR
-Output usage (help) information.
-.TP
-\fBversion\fR, \fB\-\-version\fR, \fB\-v\fR
-Output version information.
-.TP
-\fBplugins\fR
-List available plugins. Use the \fB\-\-debug\fR option to get
-more information on plugins which are found and which ones actually
-loaded.
-.TP
-\fBconfig save \fI[provider]\fR
-Save provider configuration. Use this to have the provider's default configuration written to persistent storage, which you can then edit by hand.
-.TP
-\fBconfig edit \fI[provider]\fR
-Edit provider configuration. The changes are written to persistent storage.
-.TP
-\fBkey make rsa|dsa [bits]\fR
-Create a key pair
-.TP
-\fBkey changepass [K]
-Add/change/remove passphrase of a key
-.TP
-\fBcert makereq [K]\fR
-Create certificate request (CSR)
-.TP
-\fBcert makeself [K]\fR
-Create self-signed certificate
-.TP
-\fBcert makereqadv [K]\fR
-Advanced version of 'makereq'
-.TP
-\fBcert makeselfadv [K]\fR
-Advanced version of 'makeself'
-.TP
-\fBcert validate [C]\fR
-Validate certificate
-.TP
-\fBkeybundle make [K] [C]\fR
-Create a keybundle
-.TP
-\fBkeybundle extract [X]\fR
-Extract certificate(s) and key
-.TP
-\fBkeybundle changepass [X]\fR
-Change passphrase of a keybundle
-.TP
-\fBkeystore list-stores\fR
-List all available keystores
-.TP
-\fBkeystore list [storeName]\fR
-List content of a keystore
-.TP
-\fBkeystore monitor\fR
-Monitor for keystore availability
-.TP
-\fBkeystore export [E]\fR
-Export a keystore entry's content
-.TP
-\fBkeystore exportref [E]\fR
-Export a keystore entry reference
-.TP
-\fBkeystore addkb [storeName] [cert.p12]\fR
-Add a keybundle into a keystore
-.TP
-\fBkeystore addpgp [storeName] [key.asc]\fR
-Add a PGP key into a keystore
-.TP
-\fBkeystore remove [E]\fR
-Remove an object from a keystore
-.TP
-\fBshow cert [C]\fR
-Examine a certificate
-.TP
-\fBshow req [req.pem]\fR
-Examine a certificate request (CSR)
-.TP
-\fBshow crl [crl.pem]\fR
-Examine a certificate revocation list
-.TP
-\fBshow kb [X]\fR
-Examine a keybundle
-.TP
-\fBshow pgp [P|S]\fR
-Examine a PGP key
-.TP
-\fBmessage sign pgp|pgpdetach|smime [X|S]\fR
-Sign a message
-.TP
-\fBmessage encrypt pgp|smime [C|P]\fR
-Encrypt a message
-.TP
-\fBmessage signencrypt [S] [P]\fR
-PGP sign & encrypt a message
-.TP
-\fBmessage verify pgp|smime\fR
-Verify a message
-.TP
-\fBmessage decrypt pgp|smime ((X) ...)\fR
-Decrypt a message (S/MIME needs X)
-.TP
-\fBmessage exportcerts\fR
-Export certs from S/MIME message
-
-.SH ARGUMENTS
-The arguments to the commands are as follows.
-
-K = private key.
-
-C = certificate.
-
-X = key bundle.
-
-P = PGP public key.
-
-S = PGP secret key.
-
-E = generic entry.
-
-These must be identified by either a filename or a keystore reference ("store:obj").
-
-.SH AUTHOR
-qcatool was written by Justin Karneges as part of QCA. This manual page
-was written by Brad Hards.
-
diff -Nru qca2-2.0.3/plugins/CMakeLists.txt qca2-2.1.0/plugins/CMakeLists.txt
--- qca2-2.0.3/plugins/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,68 @@
+# Use the same path for shared and static plugins
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${QCA_LIB_NAME}/crypto")
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${QCA_LIB_NAME}/crypto")
+
+set(PLUGINS "botan;cyrus-sasl;gcrypt;gnupg;logger;nss;ossl;pkcs11;softstore" CACHE INTERNAL "")
+
+# Initialize WITH_${PLUGIN}_PLUGIN cache variables
+foreach(PLUGIN IN LISTS PLUGINS)
+ set(WITH_${PLUGIN}_PLUGIN "" CACHE STRING "Build ${PLUGIN} plugin")
+ string(TOLOWER "${WITH_${PLUGIN}_PLUGIN}" WITH_${PLUGIN}_PLUGIN)
+endforeach(PLUGIN IN LISTS PLUGINS)
+
+string(REGEX MATCH "^none|all|auto$" NOT_PLUGIN_LIST "${BUILD_PLUGINS}")
+
+if(NOT_PLUGIN_LIST)
+ # BUILD_PLUGINS has "none", "all" or "auto" value
+ foreach(PLUGIN IN LISTS PLUGINS)
+ # If not defined by user use BUILD_PLUGINS value
+ # to decide build or not build the plugin
+ if("${WITH_${PLUGIN}_PLUGIN}" STREQUAL "")
+ if("${BUILD_PLUGINS}" STREQUAL "all")
+ set(WITH_${PLUGIN}_PLUGIN "yes")
+ elseif("${BUILD_PLUGINS}" STREQUAL "auto")
+ set(WITH_${PLUGIN}_PLUGIN "auto")
+ else("${BUILD_PLUGINS}" STREQUAL "all")
+ set(WITH_${PLUGIN}_PLUGIN "no")
+ endif("${BUILD_PLUGINS}" STREQUAL "all")
+ elseif(NOT WITH_${PLUGIN}_PLUGIN)
+ set(WITH_${PLUGIN}_PLUGIN "no")
+ elseif("${WITH_${PLUGIN}_PLUGIN}" STREQUAL "auto")
+ set(WITH_${PLUGIN}_PLUGIN "auto")
+ else("${WITH_${PLUGIN}_PLUGIN}" STREQUAL "")
+ set(WITH_${PLUGIN}_PLUGIN "yes")
+ endif("${WITH_${PLUGIN}_PLUGIN}" STREQUAL "")
+
+ # Build plugin if yes or auto
+ if(WITH_${PLUGIN}_PLUGIN)
+ add_subdirectory("qca-${PLUGIN}")
+ else(WITH_${PLUGIN}_PLUGIN)
+ disable_plugin(${PLUGIN})
+ endif(WITH_${PLUGIN}_PLUGIN)
+ endforeach(PLUGIN IN LISTS PLUGINS)
+else(NOT_PLUGIN_LIST)
+ # BUILD_PLUGINS has list plugins to builds
+ foreach(PLUGIN IN LISTS PLUGINS)
+ list(FIND BUILD_PLUGINS "${PLUGIN}" PLUGIN_INDEX)
+ if(PLUGIN_INDEX GREATER -1)
+ set(WITH_${PLUGIN}_PLUGIN "yes")
+ add_subdirectory("qca-${PLUGIN}")
+ else(PLUGIN_INDEX GREATER -1)
+ disable_plugin(${PLUGIN})
+ endif(PLUGIN_INDEX GREATER -1)
+ endforeach(PLUGIN IN LISTS PLUGINS)
+endif(NOT_PLUGIN_LIST)
+
+message("")
+message("Plugins:")
+foreach(PLUGIN IN LISTS PLUGINS)
+ message(" qca-${PLUGIN} ${WITH_${PLUGIN}_PLUGIN_INTERNAL}")
+endforeach(PLUGIN IN LISTS PLUGINS)
+
+# Currently disabled
+#
+# IF (WIN32)
+# MESSAGE(STATUS "WinCrypto plugin enabled")
+# ADD_SUBDIRECTORY(qca-wincrypto)
+# ENDIF (WIN32)
+
diff -Nru qca2-2.0.3/plugins/qca-botan/CMakeLists.txt qca2-2.1.0/plugins/qca-botan/CMakeLists.txt
--- qca2-2.0.3/plugins/qca-botan/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-botan/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,32 @@
+if(WITH_botan_PLUGIN STREQUAL "yes")
+ find_package(Botan REQUIRED)
+else(WITH_botan_PLUGIN STREQUAL "yes")
+ find_package(Botan)
+endif(WITH_botan_PLUGIN STREQUAL "yes")
+
+if(BOTAN_FOUND)
+ enable_plugin("botan")
+
+ set(QCA_BOTAN_SOURCES qca-botan.cpp)
+ add_definitions(${BOTAN_CFLAGS})
+ my_automoc(QCA_BOTAN_SOURCES)
+ add_library(qca-botan ${PLUGIN_TYPE} ${QCA_BOTAN_SOURCES})
+
+ if(APPLE AND ${PLUGIN_TYPE} STREQUAL "MODULE")
+ set_property(TARGET qca-botan PROPERTY SUFFIX ".dylib")
+ endif()
+
+ target_link_libraries(qca-botan ${QT_QTCORE_LIBRARY} ${QCA_LIB_NAME} ${BOTAN_LIBRARIES})
+
+ if(NOT DEVELOPER_MODE)
+ install(TARGETS qca-botan
+ LIBRARY DESTINATION "${QCA_CRYPTO_INSTALL_DIR}"
+ ARCHIVE DESTINATION "${QCA_CRYPTO_INSTALL_DIR}"
+ RUNTIME DESTINATION "${QCA_CRYPTO_INSTALL_DIR}")
+
+ install_pdb(qca-botan ${QCA_CRYPTO_INSTALL_DIR})
+ endif()
+
+else(BOTAN_FOUND)
+ disable_plugin("botan")
+endif(BOTAN_FOUND)
diff -Nru qca2-2.0.3/plugins/qca-botan/COPYING qca2-2.1.0/plugins/qca-botan/COPYING
--- qca2-2.0.3/plugins/qca-botan/COPYING 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-botan/COPYING 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff -Nru qca2-2.0.3/plugins/qca-botan/qca-botan.cpp qca2-2.1.0/plugins/qca-botan/qca-botan.cpp
--- qca2-2.0.3/plugins/qca-botan/qca-botan.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-botan/qca-botan.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,552 @@
+/*
+ * Copyright (C) 2004 Justin Karneges
+ * Copyright (C) 2004-2006 Brad Hards
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
+#include
+#endif
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,8,0)
+#include
+#endif
+
+#include
+#include
+
+//-----------------------------------------------------------
+class botanRandomContext : public QCA::RandomContext
+{
+public:
+ botanRandomContext(QCA::Provider *p) : RandomContext(p)
+ {
+ }
+
+ Context *clone() const
+ {
+ return new botanRandomContext( *this );
+ }
+
+ QCA::SecureArray nextBytes(int size)
+ {
+ QCA::SecureArray buf(size);
+#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,5,0)
+ Botan::Global_RNG::randomize( (Botan::byte*)buf.data(), buf.size(), Botan::SessionKey );
+#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,7,6)
+ Botan::Global_RNG::randomize( (Botan::byte*)buf.data(), buf.size() );
+#else
+ Botan::AutoSeeded_RNG rng;
+ rng.randomize(reinterpret_cast(buf.data()), buf.size());
+#endif
+ return buf;
+ }
+};
+
+
+//-----------------------------------------------------------
+class BotanHashContext : public QCA::HashContext
+{
+public:
+ BotanHashContext( const QString &hashName, QCA::Provider *p, const QString &type) : QCA::HashContext(p, type)
+ {
+ m_hashObj = Botan::get_hash(hashName.toStdString());
+ }
+
+ ~BotanHashContext()
+ {
+ delete m_hashObj;
+ }
+
+ Context *clone() const
+ {
+ return new BotanHashContext(*this);
+ }
+
+ void clear()
+ {
+ m_hashObj->clear();
+ }
+
+ void update(const QCA::MemoryRegion &a)
+ {
+ m_hashObj->update( (const Botan::byte*)a.data(), a.size() );
+ }
+
+ QCA::MemoryRegion final()
+ {
+#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
+ QCA::SecureArray a( m_hashObj->OUTPUT_LENGTH );
+#else
+ QCA::SecureArray a( m_hashObj->output_length() );
+#endif
+ m_hashObj->final( (Botan::byte *)a.data() );
+ return a;
+ }
+
+private:
+ Botan::HashFunction *m_hashObj;
+};
+
+
+//-----------------------------------------------------------
+class BotanHMACContext : public QCA::MACContext
+{
+public:
+ BotanHMACContext( const QString &hashName, QCA::Provider *p, const QString &type) : QCA::MACContext(p, type)
+ {
+#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,8,0)
+ m_hashObj = new Botan::HMAC(hashName.toStdString());
+#else
+ m_hashObj = new Botan::HMAC(Botan::global_state().algorithm_factory().make_hash_function(hashName.toStdString()));
+#endif
+ if (0 == m_hashObj) {
+ std::cout << "null context object" << std::endl;
+ }
+ }
+
+ ~BotanHMACContext()
+ {
+ }
+
+ void setup(const QCA::SymmetricKey &key)
+ {
+ // this often gets called with an empty key, because that is the default
+ // in the QCA MessageAuthenticationCode constructor. Botan doesn't like
+ // that happening.
+ if (key.size() > 0) {
+ m_hashObj->set_key( (const Botan::byte *)key.data(), key.size() );
+ }
+ }
+
+ Context *clone() const
+ {
+ return new BotanHMACContext(*this);
+ }
+
+ void clear()
+ {
+ m_hashObj->clear();
+ }
+
+ QCA::KeyLength keyLength() const
+ {
+ return anyKeyLength();
+ }
+
+ void update(const QCA::MemoryRegion &a)
+ {
+ m_hashObj->update( (const Botan::byte*)a.data(), a.size() );
+ }
+
+ void final( QCA::MemoryRegion *out)
+ {
+#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
+ QCA::SecureArray sa( m_hashObj->OUTPUT_LENGTH, 0 );
+#else
+ QCA::SecureArray sa( m_hashObj->output_length(), 0 );
+#endif
+ m_hashObj->final( (Botan::byte *)sa.data() );
+ *out = sa;
+ }
+
+protected:
+ Botan::HMAC *m_hashObj;
+};
+
+
+//-----------------------------------------------------------
+class BotanPBKDFContext: public QCA::KDFContext
+{
+public:
+ BotanPBKDFContext( const QString &kdfName, QCA::Provider *p, const QString &type) : QCA::KDFContext(p, type)
+ {
+ m_s2k = Botan::get_s2k(kdfName.toStdString());
+ }
+
+ ~BotanPBKDFContext()
+ {
+ delete m_s2k;
+ }
+
+ Context *clone() const
+ {
+ return new BotanPBKDFContext( *this );
+ }
+
+ QCA::SymmetricKey makeKey(const QCA::SecureArray &secret, const QCA::InitializationVector &salt,
+ unsigned int keyLength, unsigned int iterationCount)
+ {
+#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
+ m_s2k->set_iterations(iterationCount);
+ m_s2k->change_salt((const Botan::byte*)salt.data(), salt.size());
+ std::string secretString(secret.data(), secret.size() );
+ Botan::OctetString key = m_s2k->derive_key(keyLength, secretString);
+#else
+ std::string secretString(secret.data(), secret.size() );
+ Botan::OctetString key = m_s2k->derive_key(keyLength, secretString, (const Botan::byte*)salt.data(), salt.size(), iterationCount);
+#endif
+ QCA::SecureArray retval(QByteArray((const char*)key.begin(), key.length()));
+ return QCA::SymmetricKey(retval);
+ }
+
+ QCA::SymmetricKey makeKey(const QCA::SecureArray &secret,
+ const QCA::InitializationVector &salt,
+ unsigned int keyLength,
+ int msecInterval,
+ unsigned int *iterationCount)
+ {
+ Q_ASSERT(iterationCount != NULL);
+ Botan::OctetString key;
+ QTime timer;
+ std::string secretString(secret.data(), secret.size() );
+
+ *iterationCount = 0;
+#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
+ m_s2k->set_iterations(1);
+ m_s2k->change_salt((const Botan::byte*)salt.data(), salt.size());
+ timer.start();
+ while (timer.elapsed() < msecInterval) {
+ key = m_s2k->derive_key(keyLength, secretString);
+ ++(*iterationCount);
+ }
+#else
+ timer.start();
+ while (timer.elapsed() < msecInterval) {
+ key = m_s2k->derive_key(keyLength,
+ secretString,
+ (const Botan::byte*)salt.data(),
+ salt.size(),
+ 1);
+ ++(*iterationCount);
+ }
+#endif
+ return makeKey(secret, salt, keyLength, *iterationCount);
+ }
+
+protected:
+ Botan::S2K* m_s2k;
+};
+
+
+//-----------------------------------------------------------
+class BotanCipherContext : public QCA::CipherContext
+{
+public:
+ BotanCipherContext( const QString &algo, const QString &mode, const QString &padding,
+ QCA::Provider *p, const QString &type) : QCA::CipherContext(p, type)
+ {
+ m_algoName = algo.toStdString();
+ m_algoMode = mode.toStdString();
+ m_algoPadding = padding.toStdString();
+ }
+
+ void setup(QCA::Direction dir,
+ const QCA::SymmetricKey &key,
+ const QCA::InitializationVector &iv)
+ {
+ try {
+ m_dir = dir;
+ Botan::SymmetricKey keyCopy((Botan::byte*)key.data(), key.size());
+
+ if (iv.size() == 0) {
+ if (QCA::Encode == dir) {
+ m_crypter = new Botan::Pipe(Botan::get_cipher(m_algoName+'/'+m_algoMode+'/'+m_algoPadding,
+ keyCopy, Botan::ENCRYPTION));
+ }
+ else {
+ m_crypter = new Botan::Pipe(Botan::get_cipher(m_algoName+'/'+m_algoMode+'/'+m_algoPadding,
+ keyCopy, Botan::DECRYPTION));
+ }
+ } else {
+ Botan::InitializationVector ivCopy((Botan::byte*)iv.data(), iv.size());
+ if (QCA::Encode == dir) {
+ m_crypter = new Botan::Pipe(Botan::get_cipher(m_algoName+'/'+m_algoMode+'/'+m_algoPadding,
+ keyCopy, ivCopy, Botan::ENCRYPTION));
+ }
+ else {
+ m_crypter = new Botan::Pipe(Botan::get_cipher(m_algoName+'/'+m_algoMode+'/'+m_algoPadding,
+ keyCopy, ivCopy, Botan::DECRYPTION));
+ }
+ }
+ m_crypter->start_msg();
+ } catch (Botan::Exception& e) {
+ std::cout << "caught: " << e.what() << std::endl;
+ }
+ }
+
+ Context *clone() const
+ {
+ return new BotanCipherContext( *this );
+ }
+
+ int blockSize() const
+ {
+ return Botan::block_size_of(m_algoName);
+ }
+
+ bool update(const QCA::SecureArray &in, QCA::SecureArray *out)
+ {
+ m_crypter->write((Botan::byte*)in.data(), in.size());
+ QCA::SecureArray result( m_crypter->remaining() );
+ // Perhaps bytes_read is redundant and can be dropped
+ size_t bytes_read = m_crypter->read((Botan::byte*)result.data(), result.size());
+ result.resize(bytes_read);
+ *out = result;
+ return true;
+ }
+
+ bool final(QCA::SecureArray *out)
+ {
+ m_crypter->end_msg();
+ QCA::SecureArray result( m_crypter->remaining() );
+ // Perhaps bytes_read is redundant and can be dropped
+ size_t bytes_read = m_crypter->read((Botan::byte*)result.data(), result.size());
+ result.resize(bytes_read);
+ *out = result;
+ return true;
+ }
+
+ QCA::KeyLength keyLength() const
+ {
+#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,0)
+ return QCA::KeyLength( Botan::min_keylength_of(m_algoName),
+ Botan::max_keylength_of(m_algoName),
+ Botan::keylength_multiple_of(m_algoName) );
+#else
+ Botan::Algorithm_Factory &af = Botan::global_state().algorithm_factory();
+ Botan::Key_Length_Specification kls(0);
+ if(const Botan::BlockCipher *bc = af.prototype_block_cipher(m_algoName))
+ kls = bc->key_spec();
+ else if(const Botan::StreamCipher *sc = af.prototype_stream_cipher(m_algoName))
+ kls = sc->key_spec();
+ else if(const Botan::MessageAuthenticationCode *mac = af.prototype_mac(m_algoName))
+ kls = mac->key_spec();
+ return QCA::KeyLength( kls.minimum_keylength(),
+ kls.maximum_keylength(),
+ kls.keylength_multiple() );
+#endif
+ }
+
+
+ ~BotanCipherContext()
+ {
+ delete m_crypter;
+ }
+
+protected:
+ QCA::Direction m_dir;
+ std::string m_algoName;
+ std::string m_algoMode;
+ std::string m_algoPadding;
+ Botan::Keyed_Filter *m_cipher;
+ Botan::Pipe *m_crypter;
+};
+
+
+
+//==========================================================
+class botanProvider : public QCA::Provider
+{
+public:
+ void init()
+ {
+ m_init = new Botan::LibraryInitializer;
+ }
+
+ ~botanProvider()
+ {
+ // We should be cleaning up there, but
+ // this causes the unit tests to segfault
+ // delete m_init;
+ }
+
+ int qcaVersion() const
+ {
+ return QCA_VERSION;
+ }
+
+ QString name() const
+ {
+ return "qca-botan";
+ }
+
+ QStringList features() const
+ {
+ QStringList list;
+ list += "random";
+ list += "md2";
+ list += "md4";
+ list += "md5";
+ list += "sha1";
+ list += "sha256";
+ list += "sha384";
+ list += "sha512";
+ list += "ripemd160";
+ list += "hmac(md5)";
+ list += "hmac(sha1)";
+ // HMAC with SHA2 doesn't appear to work correctly in Botan.
+ // list += "hmac(sha256)";
+ // list += "hmac(sha384)";
+ // list += "hmac(sha512)";
+ list += "hmac(ripemd160)";
+ list += "pbkdf1(sha1)";
+ list += "pbkdf1(md2)";
+ list += "pbkdf2(sha1)";
+ list += "aes128-ecb";
+ list += "aes128-cbc";
+ list += "aes128-cfb";
+ list += "aes128-ofb";
+ list += "aes192-ecb";
+ list += "aes192-cbc";
+ list += "aes192-cfb";
+ list += "aes192-ofb";
+ list += "aes256-ecb";
+ list += "aes256-cbc";
+ list += "aes256-cfb";
+ list += "aes256-ofb";
+ list += "des-ecb";
+ list += "des-ecb-pkcs7";
+ list += "des-cbc";
+ list += "des-cbc-pkcs7";
+ list += "des-cfb";
+ list += "des-ofb";
+ list += "tripledes-ecb";
+ list += "blowfish-ecb";
+ list += "blowfish-cbc";
+ list += "blowfish-cbc-pkcs7";
+ list += "blowfish-cfb";
+ list += "blowfish-ofb";
+ return list;
+ }
+
+ Context *createContext(const QString &type)
+ {
+ if ( type == "random" )
+ return new botanRandomContext( this );
+ else if ( type == "md2" )
+ return new BotanHashContext( QString("MD2"), this, type );
+ else if ( type == "md4" )
+ return new BotanHashContext( QString("MD4"), this, type );
+ else if ( type == "md5" )
+ return new BotanHashContext( QString("MD5"), this, type );
+ else if ( type == "sha1" )
+ return new BotanHashContext( QString("SHA-1"), this, type );
+ else if ( type == "sha256" )
+ return new BotanHashContext( QString("SHA-256"), this, type );
+ else if ( type == "sha384" )
+ return new BotanHashContext( QString("SHA-384"), this, type );
+ else if ( type == "sha512" )
+ return new BotanHashContext( QString("SHA-512"), this, type );
+ else if ( type == "ripemd160" )
+ return new BotanHashContext( QString("RIPEMD-160"), this, type );
+ else if ( type == "hmac(md5)" )
+ return new BotanHMACContext( QString("MD5"), this, type );
+ else if ( type == "hmac(sha1)" )
+ return new BotanHMACContext( QString("SHA-1"), this, type );
+ else if ( type == "hmac(sha256)" )
+ return new BotanHMACContext( QString("SHA-256"), this, type );
+ else if ( type == "hmac(sha384)" )
+ return new BotanHMACContext( QString("SHA-384"), this, type );
+ else if ( type == "hmac(sha512)" )
+ return new BotanHMACContext( QString("SHA-512"), this, type );
+ else if ( type == "hmac(ripemd160)" )
+ return new BotanHMACContext( QString("RIPEMD-160"), this, type );
+ else if ( type == "pbkdf1(sha1)" )
+ return new BotanPBKDFContext( QString("PBKDF1(SHA-1)"), this, type );
+ else if ( type == "pbkdf1(md2)" )
+ return new BotanPBKDFContext( QString("PBKDF1(MD2)"), this, type );
+ else if ( type == "pbkdf2(sha1)" )
+ return new BotanPBKDFContext( QString("PBKDF2(SHA-1)"), this, type );
+ else if ( type == "aes128-ecb" )
+ return new BotanCipherContext( QString("AES-128"), QString("ECB"), QString("NoPadding"), this, type );
+ else if ( type == "aes128-cbc" )
+ return new BotanCipherContext( QString("AES-128"), QString("CBC"), QString("NoPadding"), this, type );
+ else if ( type == "aes128-cfb" )
+ return new BotanCipherContext( QString("AES-128"), QString("CFB"), QString("NoPadding"), this, type );
+ else if ( type == "aes128-ofb" )
+ return new BotanCipherContext( QString("AES-128"), QString("OFB"), QString("NoPadding"), this, type );
+ else if ( type == "aes192-ecb" )
+ return new BotanCipherContext( QString("AES-192"), QString("ECB"), QString("NoPadding"), this, type );
+ else if ( type == "aes192-cbc" )
+ return new BotanCipherContext( QString("AES-192"), QString("CBC"), QString("NoPadding"), this, type );
+ else if ( type == "aes192-cfb" )
+ return new BotanCipherContext( QString("AES-192"), QString("CFB"), QString("NoPadding"), this, type );
+ else if ( type == "aes192-ofb" )
+ return new BotanCipherContext( QString("AES-192"), QString("OFB"), QString("NoPadding"), this, type );
+ else if ( type == "aes256-ecb" )
+ return new BotanCipherContext( QString("AES-256"), QString("ECB"), QString("NoPadding"), this, type );
+ else if ( type == "aes256-cbc" )
+ return new BotanCipherContext( QString("AES-256"), QString("CBC"), QString("NoPadding"), this, type );
+ else if ( type == "aes256-cfb" )
+ return new BotanCipherContext( QString("AES-256"), QString("CFB"), QString("NoPadding"), this, type );
+ else if ( type == "aes256-ofb" )
+ return new BotanCipherContext( QString("AES-256"), QString("OFB"), QString("NoPadding"), this, type );
+ else if ( type == "blowfish-ecb" )
+ return new BotanCipherContext( QString("Blowfish"), QString("ECB"), QString("NoPadding"), this, type );
+ else if ( type == "blowfish-cbc" )
+ return new BotanCipherContext( QString("Blowfish"), QString("CBC"), QString("NoPadding"), this, type );
+ else if ( type == "blowfish-cbc-pkcs7" )
+ return new BotanCipherContext( QString("Blowfish"), QString("CBC"), QString("PKCS7"), this, type );
+ else if ( type == "blowfish-cfb" )
+ return new BotanCipherContext( QString("Blowfish"), QString("CFB"), QString("NoPadding"), this, type );
+ else if ( type == "blowfish-ofb" )
+ return new BotanCipherContext( QString("Blowfish"), QString("OFB"), QString("NoPadding"), this, type );
+ else if ( type == "des-ecb" )
+ return new BotanCipherContext( QString("DES"), QString("ECB"), QString("NoPadding"), this, type );
+ else if ( type == "des-ecb-pkcs7" )
+ return new BotanCipherContext( QString("DES"), QString("ECB"), QString("PKCS7"), this, type );
+ else if ( type == "des-cbc" )
+ return new BotanCipherContext( QString("DES"), QString("CBC"), QString("NoPadding"), this, type );
+ else if ( type == "des-cbc-pkcs7" )
+ return new BotanCipherContext( QString("DES"), QString("CBC"), QString("PKCS7"), this, type );
+ else if ( type == "des-cfb" )
+ return new BotanCipherContext( QString("DES"), QString("CFB"), QString("NoPadding"), this, type );
+ else if ( type == "des-ofb" )
+ return new BotanCipherContext( QString("DES"), QString("OFB"), QString("NoPadding"), this, type );
+ else if ( type == "tripledes-ecb" )
+ return new BotanCipherContext( QString("TripleDES"), QString("ECB"), QString("NoPadding"), this, type );
+ else
+ return 0;
+ }
+private:
+ Botan::LibraryInitializer *m_init;
+
+};
+
+class botanPlugin : public QObject, public QCAPlugin
+{
+ Q_OBJECT
+#if QT_VERSION >= 0x050000
+ Q_PLUGIN_METADATA(IID "com.affinix.qca.Plugin/1.0")
+#endif
+ Q_INTERFACES(QCAPlugin)
+public:
+ virtual QCA::Provider *createProvider() { return new botanProvider; }
+};
+
+#include "qca-botan.moc"
+
+#if QT_VERSION < 0x050000
+Q_EXPORT_PLUGIN2(qca_botan, botanPlugin);
+#endif
diff -Nru qca2-2.0.3/plugins/qca-botan/qcextra qca2-2.1.0/plugins/qca-botan/qcextra
--- qca2-2.0.3/plugins/qca-botan/qcextra 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-botan/qcextra 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+cat >extra.pri <
+
+This plugin provides features based on Botan. It implements:
+* TBA
+
+
+Requirements:
+ Botan 1.4.1 or later
+
+Installation procedure:
+ ./configure
+ make
+ su -c "make install"
+
diff -Nru qca2-2.0.3/plugins/qca-cyrus-sasl/CMakeLists.txt qca2-2.1.0/plugins/qca-cyrus-sasl/CMakeLists.txt
--- qca2-2.0.3/plugins/qca-cyrus-sasl/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-cyrus-sasl/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,31 @@
+if(WITH_cyrus-sasl_PLUGIN STREQUAL "yes")
+ find_package(Sasl2 REQUIRED)
+else(WITH_cyrus-sasl_PLUGIN STREQUAL "yes")
+ find_package(Sasl2)
+endif(WITH_cyrus-sasl_PLUGIN STREQUAL "yes")
+
+if(SASL2_FOUND)
+ enable_plugin("cyrus-sasl")
+
+ set(QCA_SASL_SOURCES qca-cyrus-sasl.cpp)
+ include_directories( ${SASL2_INCLUDE_DIR} )
+ my_automoc( QCA_SASL_SOURCES )
+ add_library(qca-cyrus-sasl ${PLUGIN_TYPE} ${QCA_SASL_SOURCES})
+
+ if(APPLE AND ${PLUGIN_TYPE} STREQUAL "MODULE")
+ set_property(TARGET qca-cyrus-sasl PROPERTY SUFFIX ".dylib")
+ endif()
+
+ target_link_libraries(qca-cyrus-sasl ${QT_QTCORE_LIBRARY} ${QCA_LIB_NAME} ${SASL2_LIBRARIES})
+
+ if(NOT DEVELOPER_MODE)
+ install(TARGETS qca-cyrus-sasl
+ LIBRARY DESTINATION "${QCA_CRYPTO_INSTALL_DIR}"
+ ARCHIVE DESTINATION "${QCA_CRYPTO_INSTALL_DIR}"
+ RUNTIME DESTINATION "${QCA_CRYPTO_INSTALL_DIR}")
+
+ install_pdb(qca-cyrus-sasl ${QCA_CRYPTO_INSTALL_DIR})
+ endif()
+else(SASL2_FOUND)
+ disable_plugin("cyrus-sasl")
+endif(SASL2_FOUND)
diff -Nru qca2-2.0.3/plugins/qca-cyrus-sasl/COPYING qca2-2.1.0/plugins/qca-cyrus-sasl/COPYING
--- qca2-2.0.3/plugins/qca-cyrus-sasl/COPYING 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-cyrus-sasl/COPYING 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff -Nru qca2-2.0.3/plugins/qca-cyrus-sasl/qca-cyrus-sasl.cpp qca2-2.1.0/plugins/qca-cyrus-sasl/qca-cyrus-sasl.cpp
--- qca2-2.0.3/plugins/qca-cyrus-sasl/qca-cyrus-sasl.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-cyrus-sasl/qca-cyrus-sasl.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,952 @@
+/*
+ * qca-sasl.cpp - SASL plugin for QCA
+ * Copyright (C) 2003-2007 Justin Karneges
+ * Copyright (C) 2006 Michail Pishchagin
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#include
+#include
+#include
+#include
+
+extern "C"
+{
+#include
+}
+
+#include
+#include
+#include
+
+#define SASL_BUFSIZE 8192
+#define SASL_APP "qca"
+
+using namespace QCA;
+
+namespace saslQCAPlugin {
+
+class saslProvider : public Provider
+{
+public:
+ saslProvider();
+ void init();
+ ~saslProvider();
+ int qcaVersion() const;
+ QString name() const;
+ QString credit() const;
+ QStringList features() const;
+ Context *createContext(const QString &type);
+
+ bool client_init;
+ bool server_init;
+ QString appname;
+};
+
+//----------------------------------------------------------------------------
+// SASLParams
+//----------------------------------------------------------------------------
+
+class SASLParams
+{
+public:
+ class SParams
+ {
+ public:
+ bool user, authzid, pass, realm;
+ };
+
+ SASLParams()
+ {
+ reset();
+ }
+
+ void reset()
+ {
+ resetNeed();
+ resetHave();
+ foreach(char *result, results)
+ delete result;
+ results.clear();
+ }
+
+ void resetNeed()
+ {
+ need.user = false;
+ need.authzid = false;
+ need.pass = false;
+ need.realm = false;
+ }
+
+ void resetHave()
+ {
+ have.user = false;
+ have.authzid = false;
+ have.pass = false;
+ have.realm = false;
+ }
+
+ void setUsername(const QString &s)
+ {
+ have.user = true;
+ user = s;
+ }
+
+ void setAuthzid(const QString &s)
+ {
+ have.authzid = true;
+ authzid = s;
+ }
+
+ void setPassword(const SecureArray &s)
+ {
+ have.pass = true;
+ pass = QString::fromUtf8(s.toByteArray());
+ }
+
+ void setRealm(const QString &s)
+ {
+ have.realm = true;
+ realm = s;
+ }
+
+ void applyInteract(sasl_interact_t *needp)
+ {
+ for(int n = 0; needp[n].id != SASL_CB_LIST_END; ++n) {
+ if(needp[n].id == SASL_CB_AUTHNAME)
+ need.user = true; // yes, I know these
+ if(needp[n].id == SASL_CB_USER)
+ need.authzid = true; // look backwards
+ if(needp[n].id == SASL_CB_PASS)
+ need.pass = true;
+ if(needp[n].id == SASL_CB_GETREALM)
+ need.realm = true;
+ }
+ }
+
+ void extractHave(sasl_interact_t *needp)
+ {
+ for(int n = 0; needp[n].id != SASL_CB_LIST_END; ++n) {
+ if(needp[n].id == SASL_CB_AUTHNAME && have.user)
+ setValue(&needp[n], user);
+ if(needp[n].id == SASL_CB_USER && have.authzid)
+ setValue(&needp[n], authzid);
+ if(needp[n].id == SASL_CB_PASS && have.pass)
+ setValue(&needp[n], pass);
+ if(needp[n].id == SASL_CB_GETREALM && have.realm)
+ setValue(&needp[n], realm);
+ }
+ }
+
+ bool missingAny() const
+ {
+ if((need.user && !have.user) /*|| (need.authzid && !have.authzid)*/ || (need.pass && !have.pass) /*|| (need.realm && !have.realm)*/)
+ return true;
+ return false;
+ }
+
+ SParams missing() const
+ {
+ SParams np = need;
+ if(have.user)
+ np.user = false;
+ if(have.authzid)
+ np.authzid = false;
+ if(have.pass)
+ np.pass = false;
+ if(have.realm)
+ np.realm = false;
+ return np;
+ }
+
+ void setValue(sasl_interact_t *i, const QString &s)
+ {
+ if(i->result)
+ return;
+ QByteArray cs = s.toUtf8();
+ int len = cs.length();
+ char *p = new char[len+1];
+ memcpy(p, cs.data(), len);
+ p[len] = 0;
+ i->result = p;
+ i->len = len;
+
+ // record this
+ results.append(p);
+ }
+
+ QList results;
+ SParams need;
+ SParams have;
+ QString user, authzid, pass, realm;
+};
+
+static QByteArray makeByteArray(const void *in, unsigned int len)
+{
+ QByteArray buf(len, 0);
+ memcpy(buf.data(), in, len);
+ return buf;
+}
+
+static QString addrString(const SASLContext::HostPort &hp)
+{
+ return (hp.addr + ';' + QString::number(hp.port));
+}
+
+//----------------------------------------------------------------------------
+// saslContext
+//----------------------------------------------------------------------------
+
+class saslContext : public SASLContext
+{
+ saslProvider *g;
+
+ // core props
+ QString service, host;
+ QString localAddr, remoteAddr;
+
+ // security props
+ int secflags;
+ int ssf_min, ssf_max;
+ QString ext_authid;
+ int ext_ssf;
+
+ sasl_conn_t *con;
+ sasl_interact_t *need;
+ int maxoutbuf;
+ sasl_callback_t *callbacks;
+
+ // state
+ bool servermode;
+ int step;
+ bool in_sendFirst;
+ QByteArray in_buf;
+ QString in_mech;
+ bool in_useClientInit;
+ QByteArray in_clientInit;
+ QString out_mech;
+ // bool out_useClientInit;
+ // QByteArray out_clientInit;
+ QByteArray out_buf;
+
+ SASLParams params;
+ QString sc_username, sc_authzid;
+ bool ca_flag, ca_done, ca_skip;
+ int last_r;
+
+ int result_ssf;
+ Result result_result;
+ bool result_haveClientInit;
+ QStringList result_mechlist;
+ SASL::AuthCondition result_authCondition;
+ QByteArray result_to_net;
+ QByteArray result_plain;
+ int result_encoded;
+
+private:
+ void resetState()
+ {
+ if(con) {
+ sasl_dispose(&con);
+ con = 0;
+ }
+ need = 0;
+ if(callbacks) {
+ delete callbacks;
+ callbacks = 0;
+ }
+
+ localAddr = "";
+ remoteAddr = "";
+ maxoutbuf = 128;
+ sc_username = "";
+ sc_authzid = "";
+
+ result_authCondition = SASL::AuthFail;
+ result_haveClientInit = false;
+ result_mechlist.clear();
+ result_plain.clear();
+ result_plain.clear();
+ result_plain.clear();
+ result_ssf = 0;
+ }
+
+ void resetParams()
+ {
+ params.reset();
+ secflags = 0;
+ ssf_min = 0;
+ ssf_max = 0;
+ ext_authid = "";
+ ext_ssf = 0;
+ }
+
+ bool setsecprops()
+ {
+ sasl_security_properties_t secprops;
+ secprops.min_ssf = ssf_min;
+ secprops.max_ssf = ssf_max;
+ secprops.maxbufsize = SASL_BUFSIZE;
+ secprops.property_names = NULL;
+ secprops.property_values = NULL;
+ secprops.security_flags = secflags;
+ int r = sasl_setprop(con, SASL_SEC_PROPS, &secprops);
+ if(r != SASL_OK)
+ return false;
+
+ if(!ext_authid.isEmpty()) {
+ const char *authid = ext_authid.toLatin1().data();
+ sasl_ssf_t ssf = ext_ssf;
+ r = sasl_setprop(con, SASL_SSF_EXTERNAL, &ssf);
+ if(r != SASL_OK)
+ return false;
+ r = sasl_setprop(con, SASL_AUTH_EXTERNAL, &authid);
+ if(r != SASL_OK)
+ return false;
+ }
+
+ return true;
+ }
+
+ void setAuthCondition(int r)
+ {
+ //qDebug() << "authcondition: " << r;
+ SASL::AuthCondition x;
+ switch(r) {
+ // common
+ case SASL_NOMECH: x = SASL::NoMechanism; break;
+ case SASL_BADPROT: x = SASL::BadProtocol; break;
+
+ // client
+ case SASL_BADSERV: x = SASL::BadServer; break;
+
+ // server
+ case SASL_BADAUTH: x = SASL::BadAuth; break;
+ case SASL_NOAUTHZ: x = SASL::NoAuthzid; break;
+ case SASL_TOOWEAK: x = SASL::TooWeak; break;
+ case SASL_ENCRYPT: x = SASL::NeedEncrypt; break;
+ case SASL_EXPIRED: x = SASL::Expired; break;
+ case SASL_DISABLED: x = SASL::Disabled; break;
+ case SASL_NOUSER: x = SASL::NoUser; break;
+ case SASL_UNAVAIL: x = SASL::RemoteUnavailable; break;
+
+ default: x = SASL::AuthFail; break;
+ }
+ result_authCondition = x;
+ }
+
+ void getssfparams()
+ {
+ const void *maybe_sff;
+ if( SASL_OK == sasl_getprop( con, SASL_SSF, &maybe_sff ) )
+ result_ssf = *(const int*)maybe_sff;
+
+ const void *maybe_maxoutbuf;
+ if (SASL_OK == sasl_getprop( con, SASL_MAXOUTBUF, &maybe_maxoutbuf ) )
+ maxoutbuf = *(const int*)maybe_maxoutbuf;
+ }
+
+ static int scb_checkauth(sasl_conn_t *, void *context, const char *requested_user, unsigned, const char *auth_identity, unsigned, const char *, unsigned, struct propctx *)
+ {
+ saslContext *that = (saslContext *)context;
+ that->sc_username = auth_identity; // yeah yeah, it looks
+ that->sc_authzid = requested_user; // backwards, but it is right
+ that->ca_flag = true;
+ return SASL_OK;
+ }
+
+ void clientTryAgain()
+ {
+ result_haveClientInit = false;
+
+ if(step == 0) {
+ const char *clientout, *m;
+ unsigned int clientoutlen;
+
+ need = 0;
+ QString list = result_mechlist.join(" ");
+ int r;
+ while(1) {
+ if(need)
+ params.extractHave(need);
+ if(in_sendFirst)
+ r = sasl_client_start(con, list.toLatin1().data(), &need, &clientout, &clientoutlen, &m);
+ else
+ r = sasl_client_start(con, list.toLatin1().data(), &need, NULL, NULL, &m);
+ if(r != SASL_INTERACT)
+ break;
+
+ params.applyInteract(need);
+ if(params.missingAny()) {
+ out_mech = m;
+ result_result = Params;
+ return;
+ }
+ }
+ if(r != SASL_OK && r != SASL_CONTINUE) {
+ setAuthCondition(r);
+ result_result = Error;
+ return;
+ }
+
+ out_mech = m;
+ if(in_sendFirst && clientout) {
+ out_buf = makeByteArray(clientout, clientoutlen);
+ result_haveClientInit = true;
+ }
+
+ ++step;
+
+ if(r == SASL_OK) {
+ getssfparams();
+ result_result = Success;
+ return;
+ }
+ result_result = Continue;
+ return;
+ }
+ else {
+ const char *clientout;
+ unsigned int clientoutlen;
+ int r;
+ while(1) {
+ if(need)
+ params.extractHave(need);
+ //printf("sasl_client_step(con, {%s}, %d, &need, &clientout, &clientoutlen);\n", in_buf.data(), in_buf.size());
+ r = sasl_client_step(con, in_buf.data(), in_buf.size(), &need, &clientout, &clientoutlen);
+ //printf("returned: %d\n", r);
+ if(r != SASL_INTERACT)
+ break;
+
+ params.applyInteract(need);
+ if(params.missingAny()) {
+ result_result = Params;
+ return;
+ }
+ }
+ if(r != SASL_OK && r != SASL_CONTINUE) {
+ setAuthCondition(r);
+ result_result = Error;
+ return;
+ }
+ out_buf = makeByteArray(clientout, clientoutlen);
+ if(r == SASL_OK) {
+ getssfparams();
+ result_result = Success;
+ return;
+ }
+ result_result = Continue;
+ return;
+ }
+ }
+
+ void serverTryAgain()
+ {
+ if(step == 0) {
+ if(!ca_skip) {
+ const char *clientin = 0;
+ unsigned int clientinlen = 0;
+ if(in_useClientInit) {
+ clientin = in_clientInit.data();
+ clientinlen = in_clientInit.size();
+ }
+ const char *serverout;
+ unsigned int serveroutlen;
+ ca_flag = false;
+ int r = sasl_server_start(con, in_mech.toLatin1().data(), clientin, clientinlen, &serverout, &serveroutlen);
+ if(r != SASL_OK && r != SASL_CONTINUE) {
+ setAuthCondition(r);
+ result_result = Error;
+ return;
+ }
+ out_buf = makeByteArray(serverout, serveroutlen);
+ last_r = r;
+ if(ca_flag && !ca_done) {
+ ca_done = true;
+ ca_skip = true;
+ result_result = AuthCheck;
+ return;
+ }
+ }
+ ca_skip = false;
+ ++step;
+
+ if(last_r == SASL_OK) {
+ getssfparams();
+ result_result = Success;
+ return;
+ }
+ result_result = Continue;
+ return;
+ }
+ else {
+ if(!ca_skip) {
+ const char *serverout;
+ unsigned int serveroutlen;
+ int r = sasl_server_step(con, in_buf.data(), in_buf.size(), &serverout, &serveroutlen);
+ if(r != SASL_OK && r != SASL_CONTINUE) {
+ setAuthCondition(r);
+ result_result = Error;
+ return;
+ }
+ if(r == SASL_OK)
+ out_buf.resize(0);
+ else
+ out_buf = makeByteArray(serverout, serveroutlen);
+ last_r = r;
+ if(ca_flag && !ca_done) {
+ ca_done = true;
+ ca_skip = true;
+ result_result = AuthCheck;
+ return;
+ }
+ }
+ ca_skip = false;
+ if(last_r == SASL_OK) {
+ getssfparams();
+ result_result = Success;
+ return;
+ }
+ result_result = Continue;
+ return;
+ }
+ }
+
+ bool sasl_endecode(const QByteArray &in, QByteArray *out, bool enc)
+ {
+ // no security
+ if(result_ssf == 0) {
+ *out = in;
+ return true;
+ }
+
+ int at = 0;
+ out->resize(0);
+ while(1) {
+ int size = in.size() - at;
+ if(size == 0)
+ break;
+ if(size > maxoutbuf)
+ size = maxoutbuf;
+ const char *outbuf;
+ unsigned len;
+ int r;
+ if(enc)
+ r = sasl_encode(con, in.data() + at, size, &outbuf, &len);
+ else
+ r = sasl_decode(con, in.data() + at, size, &outbuf, &len);
+ if(r != SASL_OK)
+ return false;
+ int oldsize = out->size();
+ out->resize(oldsize + len);
+ memcpy(out->data() + oldsize, outbuf, len);
+ at += size;
+ }
+ return true;
+ }
+
+ void doResultsReady()
+ {
+ QMetaObject::invokeMethod(this, "resultsReady", Qt::QueuedConnection);
+ }
+
+public:
+ saslContext(saslProvider *_g)
+ : SASLContext(_g)
+ {
+ result_result = Success;
+ g = _g;
+ con = 0;
+ callbacks = 0;
+
+ reset();
+ }
+
+ ~saslContext()
+ {
+ reset();
+ }
+
+ virtual Provider::Context *clone() const
+ {
+ return 0;
+ }
+
+ virtual Result result() const
+ {
+ return result_result;
+ }
+
+ virtual void reset()
+ {
+ resetState();
+ resetParams();
+ }
+
+ virtual void setup(const QString &_service, const QString &_host, const HostPort *local, const HostPort *remote, const QString &ext_id, int _ext_ssf)
+ {
+ service = _service;
+ host = _host;
+ localAddr = local ? addrString(*local) : "";
+ remoteAddr = remote ? addrString(*remote) : "";
+ ext_authid = ext_id;
+ ext_ssf = _ext_ssf;
+ }
+
+ virtual int ssf() const
+ {
+ return result_ssf;
+ }
+
+ virtual void startClient(const QStringList &mechlist, bool allowClientSendFirst)
+ {
+ resetState();
+
+ in_sendFirst = allowClientSendFirst;
+
+ if(!g->client_init) {
+ sasl_client_init(NULL);
+ g->client_init = true;
+ }
+
+ callbacks = new sasl_callback_t[5];
+
+ callbacks[0].id = SASL_CB_GETREALM;
+ callbacks[0].proc = 0;
+ callbacks[0].context = 0;
+
+ callbacks[1].id = SASL_CB_USER;
+ callbacks[1].proc = 0;
+ callbacks[1].context = 0;
+
+ callbacks[2].id = SASL_CB_AUTHNAME;
+ callbacks[2].proc = 0;
+ callbacks[2].context = 0;
+
+ callbacks[3].id = SASL_CB_PASS;
+ callbacks[3].proc = 0;
+ callbacks[3].context = 0;
+
+ callbacks[4].id = SASL_CB_LIST_END;
+ callbacks[4].proc = 0;
+ callbacks[4].context = 0;
+
+ result_result = Error;
+
+ int r = sasl_client_new(service.toLatin1().data(), host.toLatin1().data(), localAddr.isEmpty() ? 0 : localAddr.toLatin1().data(), remoteAddr.isEmpty() ? 0 : remoteAddr.toLatin1().data(), callbacks, 0, &con);
+ if(r != SASL_OK) {
+ setAuthCondition(r);
+ doResultsReady();
+ return;
+ }
+
+ if(!setsecprops())
+ {
+ doResultsReady();
+ return;
+ }
+
+ result_mechlist = mechlist;
+ servermode = false;
+ step = 0;
+ result_result = Success;
+ clientTryAgain();
+ doResultsReady();
+ return;
+ }
+
+ // TODO: make use of disableServerSendLast
+ virtual void startServer(const QString &realm, bool disableServerSendLast)
+ {
+ Q_UNUSED(disableServerSendLast);
+ resetState();
+
+ g->appname = SASL_APP;
+ if(!g->server_init) {
+ sasl_server_init(NULL, QFile::encodeName(g->appname));
+ g->server_init = true;
+ }
+
+ callbacks = new sasl_callback_t[2];
+
+ callbacks[0].id = SASL_CB_PROXY_POLICY;
+ callbacks[0].proc = (int(*)())scb_checkauth;
+ callbacks[0].context = this;
+
+ callbacks[1].id = SASL_CB_LIST_END;
+ callbacks[1].proc = 0;
+ callbacks[1].context = 0;
+
+ result_result = Error;
+
+ int r = sasl_server_new(service.toLatin1().data(), host.toLatin1().data(), !realm.isEmpty() ? realm.toLatin1().data() : 0, localAddr.isEmpty() ? 0 : localAddr.toLatin1().data(), remoteAddr.isEmpty() ? 0 : remoteAddr.toLatin1().data(), callbacks, 0, &con);
+ if(r != SASL_OK) {
+ setAuthCondition(r);
+ doResultsReady();
+ return;
+ }
+
+ if(!setsecprops())
+ {
+ doResultsReady();
+ return;
+ }
+
+ const char *ml;
+ r = sasl_listmech(con, 0, 0, " ", 0, &ml, 0, 0);
+ if(r != SASL_OK)
+ return;
+ result_mechlist = QString::fromUtf8(ml).split(' ');
+
+ servermode = true;
+ step = 0;
+ ca_done = false;
+ ca_skip = false;
+ result_result = Success;
+ doResultsReady();
+ return;
+ }
+
+ virtual void serverFirstStep(const QString &mech, const QByteArray *clientInit)
+ {
+ in_mech = mech;
+ if(clientInit) {
+ in_useClientInit = true;
+ in_clientInit = *clientInit;
+ }
+ else
+ in_useClientInit = false;
+ serverTryAgain();
+ doResultsReady();
+ }
+
+ virtual SASL::Params clientParams() const
+ {
+ SASLParams::SParams sparams = params.missing();
+ return SASL::Params(sparams.user, sparams.authzid, sparams.pass, sparams.realm);
+ }
+
+ virtual void setClientParams(const QString *user, const QString *authzid, const SecureArray *pass, const QString *realm)
+ {
+ if(user)
+ params.setUsername(*user);
+ if(authzid)
+ params.setAuthzid(*authzid);
+ if(pass)
+ params.setPassword(*pass);
+ if(realm)
+ params.setRealm(*realm);
+ }
+
+ virtual QString username() const
+ {
+ return sc_username;
+ }
+
+ virtual QString authzid() const
+ {
+ return sc_authzid;
+ }
+
+ virtual void nextStep(const QByteArray &from_net)
+ {
+ in_buf = from_net;
+ tryAgain();
+ }
+
+ virtual void tryAgain()
+ {
+ if(servermode)
+ serverTryAgain();
+ else
+ clientTryAgain();
+ doResultsReady();
+ }
+
+ virtual QString mech() const
+ {
+ if (servermode)
+ return in_mech;
+ else
+ return out_mech;
+ }
+
+ virtual QStringList mechlist() const
+ {
+ return result_mechlist;
+ }
+
+ virtual QStringList realmlist() const
+ {
+ // TODO
+ return QStringList();
+ }
+
+ virtual void setConstraints(SASL::AuthFlags f, int minSSF, int maxSSF)
+ {
+ int sf = 0;
+ if( !(f & SASL::AllowPlain) )
+ sf |= SASL_SEC_NOPLAINTEXT;
+ // if( !(f & SASL::AllowActiveVulnerable) ) // TODO
+ // sf |= SASL_SEC_NOACTIVE;
+ // if( !(f & SASL::AllowDictVulnerable) ) // TODO
+ // sf |= SASL_SEC_NODICTIONARY;
+ if( !(f & SASL::AllowAnonymous) )
+ sf |= SASL_SEC_NOANONYMOUS;
+ if( f & SASL::RequireForwardSecrecy )
+ sf |= SASL_SEC_FORWARD_SECRECY;
+ if( f & SASL::RequirePassCredentials )
+ sf |= SASL_SEC_PASS_CREDENTIALS;
+ if( f & SASL::RequireMutualAuth )
+ sf |= SASL_SEC_MUTUAL_AUTH;
+
+ secflags = sf;
+ ssf_min = minSSF;
+ ssf_max = maxSSF;
+ }
+
+ virtual bool waitForResultsReady(int msecs)
+ {
+ // TODO: for now, all operations block anyway
+ Q_UNUSED(msecs);
+ return true;
+ }
+
+ virtual void update(const QByteArray &from_net, const QByteArray &from_app)
+ {
+ bool ok = true;
+ if(!from_app.isEmpty())
+ ok = sasl_endecode(from_app, &result_to_net, true);
+ if(ok && !from_net.isEmpty())
+ ok = sasl_endecode(from_net, &result_plain, false);
+ result_result = ok ? Success : Error;
+ result_encoded = from_app.size();
+
+ //printf("update (from_net=%d, to_net=%d, from_app=%d, to_app=%d)\n", from_net.size(), result_to_net.size(), from_app.size(), result_plain.size());
+
+ doResultsReady();
+ }
+
+ virtual bool haveClientInit() const
+ {
+ return result_haveClientInit;
+ }
+
+ virtual QByteArray stepData() const
+ {
+ return out_buf;
+ }
+
+ virtual QByteArray to_net()
+ {
+ QByteArray a = result_to_net;
+ result_to_net.clear();
+ return a;
+ }
+
+ virtual int encoded() const
+ {
+ return result_encoded;
+ }
+
+ virtual QByteArray to_app()
+ {
+ QByteArray a = result_plain;
+ result_plain.clear();
+ return a;
+ }
+
+ virtual SASL::AuthCondition authCondition() const
+ {
+ return result_authCondition;
+ }
+};
+
+//----------------------------------------------------------------------------
+// saslProvider
+//----------------------------------------------------------------------------
+saslProvider::saslProvider()
+{
+ client_init = false;
+ server_init = false;
+}
+
+void saslProvider::init()
+{
+}
+
+saslProvider::~saslProvider()
+{
+ if(client_init || server_init)
+ sasl_done();
+}
+
+int saslProvider::qcaVersion() const
+{
+ return QCA_VERSION;
+}
+
+QString saslProvider::name() const
+{
+ return "qca-cyrus-sasl";
+}
+
+QString saslProvider::credit() const
+{
+ return QString(); // TODO
+}
+
+QStringList saslProvider::features() const
+{
+ QStringList list;
+ list += "sasl";
+
+ return list;
+}
+
+Provider::Context *saslProvider::createContext(const QString &type)
+{
+ if ( type == "sasl" )
+ return new saslContext( this );
+
+ return 0;
+}
+
+} // namespace saslQCAPlugin
+
+using namespace saslQCAPlugin;
+
+//----------------------------------------------------------------------------
+// saslPlugin
+//----------------------------------------------------------------------------
+
+class saslPlugin : public QObject, public QCAPlugin
+{
+ Q_OBJECT
+#if QT_VERSION >= 0x050000
+ Q_PLUGIN_METADATA(IID "com.affinix.qca.Plugin/1.0")
+#endif
+ Q_INTERFACES(QCAPlugin)
+public:
+ virtual Provider *createProvider() { return new saslProvider; }
+};
+
+#include "qca-cyrus-sasl.moc"
+
+#if QT_VERSION < 0x050000
+Q_EXPORT_PLUGIN2(qca_cyrus_sasl, saslPlugin)
+#endif
diff -Nru qca2-2.0.3/plugins/qca-cyrus-sasl/README qca2-2.1.0/plugins/qca-cyrus-sasl/README
--- qca2-2.0.3/plugins/qca-cyrus-sasl/README 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-cyrus-sasl/README 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,29 @@
+QCA Cyrus SASL plugin version 2.0.0
+-----------------------------------
+Date: October 11th, 2007
+Website: http://delta.affinix.com/qca/
+Mailing List: Delta Project
+
+Author: Justin Karneges
+
+This plugin provides features based on Cyrus SASL version 2.
+
+Requirements:
+ Cyrus SASL 2.x (libsasl2)
+
+Installing
+----------
+
+For Unix/Linux/Mac:
+
+ ./configure
+ make
+ make install
+
+For Windows:
+
+ configwin rd
+ qmake
+ nmake (or make)
+ copy lib\*.dll qtdir\plugins\crypto
+
diff -Nru qca2-2.0.3/plugins/qca-gcrypt/CMakeLists.txt qca2-2.1.0/plugins/qca-gcrypt/CMakeLists.txt
--- qca2-2.0.3/plugins/qca-gcrypt/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gcrypt/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,45 @@
+if(WITH_gcrypt_PLUGIN STREQUAL "yes")
+ find_package(LibGcrypt REQUIRED)
+else(WITH_gcrypt_PLUGIN STREQUAL "yes")
+ find_package(LibGcrypt)
+endif(WITH_gcrypt_PLUGIN STREQUAL "yes")
+
+if(LIBGCRYPT_FOUND)
+ include(CheckTypeSize)
+
+ set(remember_includes ${CMAKE_EXTRA_INCLUDE_FILES})
+ set(remember_defines ${CMAKE_REQUIRED_FLAGS})
+ set(CMAKE_EXTRA_INCLUDE_FILES gcrypt.h)
+ set(CMAKE_REQUIRED_FLAGS ${LIBGCRYPT_CFLAGS})
+ check_type_size(gcry_error_t GCRY_ERROR_T)
+ set(CMAKE_REQUIRED_FLAGS ${remember_defines})
+ set(CMAKE_EXTRA_INCLUDE_FILES ${remember_includes})
+ if(HAVE_GCRY_ERROR_T)
+ enable_plugin("gcrypt")
+
+ set(QCA_GCRYPT_SOURCES qca-gcrypt.cpp)
+ add_definitions(${LIBGCRYPT_CFLAGS})
+ my_automoc(QCA_GCRYPT_SOURCES)
+ add_library(qca-gcrypt ${PLUGIN_TYPE} ${QCA_GCRYPT_SOURCES})
+
+ if(APPLE AND ${PLUGIN_TYPE} STREQUAL "MODULE")
+ set_property(TARGET qca-gcrypt PROPERTY SUFFIX ".dylib")
+ endif()
+
+ target_link_libraries(qca-gcrypt ${QT_QTCORE_LIBRARY} ${QCA_LIB_NAME} ${LIBGCRYPT_LIBRARIES})
+
+ if(NOT DEVELOPER_MODE)
+ install(TARGETS qca-gcrypt
+ LIBRARY DESTINATION "${QCA_CRYPTO_INSTALL_DIR}"
+ ARCHIVE DESTINATION "${QCA_CRYPTO_INSTALL_DIR}"
+ RUNTIME DESTINATION "${QCA_CRYPTO_INSTALL_DIR}")
+
+ install_pdb(qca-gcrypt ${QCA_CRYPTO_INSTALL_DIR})
+ endif()
+ else(HAVE_GCRY_ERROR_T)
+ message(STATUS "libgcrypt seems to be too old")
+ disable_plugin("gcrypt")
+ endif(HAVE_GCRY_ERROR_T)
+else(LIBGCRYPT_FOUND)
+ disable_plugin("gcrypt")
+endif(LIBGCRYPT_FOUND)
diff -Nru qca2-2.0.3/plugins/qca-gcrypt/COPYING qca2-2.1.0/plugins/qca-gcrypt/COPYING
--- qca2-2.0.3/plugins/qca-gcrypt/COPYING 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gcrypt/COPYING 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff -Nru qca2-2.0.3/plugins/qca-gcrypt/pkcs5.c qca2-2.1.0/plugins/qca-gcrypt/pkcs5.c
--- qca2-2.0.3/plugins/qca-gcrypt/pkcs5.c 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gcrypt/pkcs5.c 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,197 @@
+/* pkcs5.c Partial Password-Based Cryptography (PKCS#5) implementation
+ * Copyright (C) 2002 Free Software Foundation, Inc.
+ *
+ * This file 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 file 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#include "gcrypt.h"
+
+/*
+ * 5.2 PBKDF2
+ *
+ * PBKDF2 applies a pseudorandom function (see Appendix B.1 for an
+ * example) to derive keys. The length of the derived key is essentially
+ * unbounded. (However, the maximum effective search space for the
+ * derived key may be limited by the structure of the underlying
+ * pseudorandom function. See Appendix B.1 for further discussion.)
+ * PBKDF2 is recommended for new applications.
+ *
+ * PBKDF2 (P, S, c, dkLen)
+ *
+ * Options: PRF underlying pseudorandom function (hLen
+ * denotes the length in octets of the
+ * pseudorandom function output)
+ *
+ * Input: P password, an octet string
+ * S salt, an octet string
+ * c iteration count, a positive integer
+ * dkLen intended length in octets of the derived
+ * key, a positive integer, at most
+ * (2^32 - 1) * hLen
+ *
+ * Output: DK derived key, a dkLen-octet string
+ */
+
+gcry_error_t
+gcry_pbkdf2 (int PRF, const char *P, size_t Plen, const char *S,
+ size_t Slen, unsigned int c, unsigned int dkLen, char *DK)
+{
+ gcry_md_hd_t prf;
+ gcry_error_t rc;
+ char *U;
+ unsigned int u;
+ unsigned int hLen;
+ unsigned int l;
+ unsigned int r;
+ unsigned char *p;
+ unsigned int i;
+ unsigned int k;
+
+ hLen = gcry_md_get_algo_dlen (PRF);
+ if (hLen == 0)
+ return GPG_ERR_UNSUPPORTED_ALGORITHM;
+
+ if (c == 0)
+ return GPG_ERR_INV_ARG;
+
+ if (dkLen == 0)
+ return GPG_ERR_TOO_SHORT;
+
+ /*
+ *
+ * Steps:
+ *
+ * 1. If dkLen > (2^32 - 1) * hLen, output "derived key too long" and
+ * stop.
+ */
+
+ if (dkLen > 4294967295U)
+ return GPG_ERR_TOO_LARGE;
+
+ /*
+ * 2. Let l be the number of hLen-octet blocks in the derived key,
+ * rounding up, and let r be the number of octets in the last
+ * block:
+ *
+ * l = CEIL (dkLen / hLen) ,
+ * r = dkLen - (l - 1) * hLen .
+ *
+ * Here, CEIL (x) is the "ceiling" function, i.e. the smallest
+ * integer greater than, or equal to, x.
+ */
+
+ l = dkLen / hLen;
+ if (dkLen % hLen)
+ l++;
+ r = dkLen - (l - 1) * hLen;
+
+ /*
+ * 3. For each block of the derived key apply the function F defined
+ * below to the password P, the salt S, the iteration count c, and
+ * the block index to compute the block:
+ *
+ * T_1 = F (P, S, c, 1) ,
+ * T_2 = F (P, S, c, 2) ,
+ * ...
+ * T_l = F (P, S, c, l) ,
+ *
+ * where the function F is defined as the exclusive-or sum of the
+ * first c iterates of the underlying pseudorandom function PRF
+ * applied to the password P and the concatenation of the salt S
+ * and the block index i:
+ *
+ * F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c
+ *
+ * where
+ *
+ * U_1 = PRF (P, S || INT (i)) ,
+ * U_2 = PRF (P, U_1) ,
+ * ...
+ * U_c = PRF (P, U_{c-1}) .
+ *
+ * Here, INT (i) is a four-octet encoding of the integer i, most
+ * significant octet first.
+ *
+ * 4. Concatenate the blocks and extract the first dkLen octets to
+ * produce a derived key DK:
+ *
+ * DK = T_1 || T_2 || ... || T_l<0..r-1>
+ *
+ * 5. Output the derived key DK.
+ *
+ * Note. The construction of the function F follows a "belt-and-
+ * suspenders" approach. The iterates U_i are computed recursively to
+ * remove a degree of parallelism from an opponent; they are exclusive-
+ * ored together to reduce concerns about the recursion degenerating
+ * into a small set of values.
+ *
+ */
+ rc = gcry_md_open (&prf, PRF, GCRY_MD_FLAG_HMAC | GCRY_MD_FLAG_SECURE);
+ if (rc != GPG_ERR_NO_ERROR)
+ return rc;
+
+ U = (char*)gcry_malloc(hLen);
+ if (!U)
+ {
+ rc = GPG_ERR_ENOMEM;
+ goto done;
+ }
+
+ for (i = 1; i <= l; i++)
+ {
+ memset(DK + (i - 1) * hLen, 0, i == l ? r : hLen);
+
+ for (u = 1; u <= c; u++)
+ {
+ gcry_md_reset (prf);
+
+ rc = gcry_md_setkey (prf, P, Plen);
+ if (rc != GPG_ERR_NO_ERROR) {
+ goto done;
+ }
+ if (u == 1)
+ {
+ char tmp[4];
+ gcry_md_write (prf, S, Slen);
+ tmp[0] = (i & 0xff000000) >> 24;
+ tmp[1] = (i & 0x00ff0000) >> 16;
+ tmp[2] = (i & 0x0000ff00) >> 8;
+ tmp[3] = (i & 0x000000ff) >> 0;
+ gcry_md_write (prf, tmp, 4);
+ }
+ else
+ gcry_md_write (prf, U, hLen);
+
+ p = gcry_md_read (prf, PRF);
+ if (p == NULL)
+ {
+ rc = GPG_ERR_CONFIGURATION;
+ goto done;
+ }
+
+ memcpy (U, p, hLen);
+ for (k = 0; k < (i == l ? r : hLen); k++)
+ DK[(i - 1) * hLen + k] ^= U[k];
+ }
+ }
+
+ rc = GPG_ERR_NO_ERROR;
+ done:
+ gcry_md_close (prf);
+ gcry_free(U);
+ return rc;
+}
+
diff -Nru qca2-2.0.3/plugins/qca-gcrypt/qca-gcrypt.cpp qca2-2.1.0/plugins/qca-gcrypt/qca-gcrypt.cpp
--- qca2-2.0.3/plugins/qca-gcrypt/qca-gcrypt.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gcrypt/qca-gcrypt.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,691 @@
+/*
+ * Copyright (C) 2004 Justin Karneges
+ * Copyright (C) 2004-2006 Brad Hards
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+#include
+
+#include
+
+#include
+
+#include
+#include
+#include
+
+namespace gcryptQCAPlugin {
+
+#include "pkcs5.c"
+
+void check_error( const QString &label, gcry_error_t err )
+{
+ // we ignore the case where it is not an error, and
+ // we also don't flag weak keys.
+ if ( ( GPG_ERR_NO_ERROR != err ) && ( GPG_ERR_WEAK_KEY != gpg_err_code(err) ) ) {
+ std::cout << "Failure (" << qPrintable(label) << "): ";
+ std::cout << gcry_strsource(err) << "/";
+ std::cout << gcry_strerror(err) << std::endl;
+ }
+}
+
+class gcryHashContext : public QCA::HashContext
+{
+public:
+ gcryHashContext(int hashAlgorithm, QCA::Provider *p, const QString &type) : QCA::HashContext(p, type)
+ {
+ m_hashAlgorithm = hashAlgorithm;
+ err = gcry_md_open( &context, m_hashAlgorithm, 0 );
+ if ( GPG_ERR_NO_ERROR != err ) {
+ std::cout << "Failure: " ;
+ std::cout << gcry_strsource(err) << "/";
+ std::cout << gcry_strerror(err) << std::endl;
+ }
+ }
+
+ ~gcryHashContext()
+ {
+ gcry_md_close( context );
+ }
+
+ Context *clone() const
+ {
+ return new gcryHashContext(*this);
+ }
+
+ void clear()
+ {
+ gcry_md_reset( context );
+ }
+
+ void update(const QCA::MemoryRegion &a)
+ {
+ gcry_md_write( context, a.data(), a.size() );
+ }
+
+ QCA::MemoryRegion final()
+ {
+ unsigned char *md;
+ QCA::SecureArray a( gcry_md_get_algo_dlen( m_hashAlgorithm ) );
+ md = gcry_md_read( context, m_hashAlgorithm );
+ memcpy( a.data(), md, a.size() );
+ return a;
+ }
+
+protected:
+ gcry_md_hd_t context;
+ gcry_error_t err;
+ int m_hashAlgorithm;
+};
+
+class gcryHMACContext : public QCA::MACContext
+{
+public:
+ gcryHMACContext(int hashAlgorithm, QCA::Provider *p, const QString &type) : QCA::MACContext(p, type)
+ {
+ m_hashAlgorithm = hashAlgorithm;
+ err = gcry_md_open( &context, m_hashAlgorithm, GCRY_MD_FLAG_HMAC );
+ if ( GPG_ERR_NO_ERROR != err ) {
+ std::cout << "Failure: " ;
+ std::cout << gcry_strsource(err) << "/";
+ std::cout << gcry_strerror(err) << std::endl;
+ }
+ }
+
+ ~gcryHMACContext()
+ {
+ gcry_md_close( context );
+ }
+
+ void setup(const QCA::SymmetricKey &key)
+ {
+ gcry_md_setkey( context, key.data(), key.size() );
+ }
+
+ Context *clone() const
+ {
+ return new gcryHMACContext(*this);
+ }
+
+ void clear()
+ {
+ gcry_md_reset( context );
+ }
+
+ QCA::KeyLength keyLength() const
+ {
+ return anyKeyLength();
+ }
+
+ void update(const QCA::MemoryRegion &a)
+ {
+ gcry_md_write( context, a.data(), a.size() );
+ }
+
+ void final( QCA::MemoryRegion *out)
+ {
+ QCA::SecureArray sa( gcry_md_get_algo_dlen( m_hashAlgorithm ), 0 );
+ unsigned char *md;
+ md = gcry_md_read( context, m_hashAlgorithm );
+ memcpy( sa.data(), md, sa.size() );
+ *out = sa;
+ }
+
+protected:
+ gcry_md_hd_t context;
+ gcry_error_t err;
+ int m_hashAlgorithm;
+};
+
+
+class gcryCipherContext : public QCA::CipherContext
+{
+public:
+ gcryCipherContext(int algorithm, int mode, bool pad, QCA::Provider *p, const QString &type) : QCA::CipherContext(p, type)
+ {
+ m_cryptoAlgorithm = algorithm;
+ m_mode = mode;
+ m_pad = pad;
+ }
+
+ void setup(QCA::Direction dir,
+ const QCA::SymmetricKey &key,
+ const QCA::InitializationVector &iv)
+ {
+ m_direction = dir;
+ err = gcry_cipher_open( &context, m_cryptoAlgorithm, m_mode, 0 );
+ check_error( "gcry_cipher_open", err );
+ if ( ( GCRY_CIPHER_3DES == m_cryptoAlgorithm ) && (key.size() == 16) ) {
+ // this is triple DES with two keys, and gcrypt wants three
+ QCA::SymmetricKey keyCopy(key);
+ QCA::SecureArray thirdKey(key);
+ thirdKey.resize(8);
+ keyCopy += thirdKey;
+ err = gcry_cipher_setkey( context, keyCopy.data(), keyCopy.size() );
+ } else {
+ err = gcry_cipher_setkey( context, key.data(), key.size() );
+ }
+ check_error( "gcry_cipher_setkey", err );
+ err = gcry_cipher_setiv( context, iv.data(), iv.size() );
+ check_error( "gcry_cipher_setiv", err );
+ }
+
+ Context *clone() const
+ {
+ return new gcryCipherContext( *this );
+ }
+
+ int blockSize() const
+ {
+ unsigned int blockSize;
+ gcry_cipher_algo_info( m_cryptoAlgorithm, GCRYCTL_GET_BLKLEN, 0, (size_t*)&blockSize );
+ return blockSize;
+ }
+
+ bool update(const QCA::SecureArray &in, QCA::SecureArray *out)
+ {
+ QCA::SecureArray result( in.size() );
+ if (QCA::Encode == m_direction) {
+ err = gcry_cipher_encrypt( context, (unsigned char*)result.data(), result.size(), (unsigned char*)in.data(), in.size() );
+ } else {
+ err = gcry_cipher_decrypt( context, (unsigned char*)result.data(), result.size(), (unsigned char*)in.data(), in.size() );
+ }
+ check_error( "update cipher encrypt/decrypt", err );
+ result.resize( in.size() );
+ *out = result;
+ return true;
+ }
+
+ bool final(QCA::SecureArray *out)
+ {
+ QCA::SecureArray result;
+ if (m_pad) {
+ result.resize( blockSize() );
+ if (QCA::Encode == m_direction) {
+ err = gcry_cipher_encrypt( context, (unsigned char*)result.data(), result.size(), NULL, 0 );
+ } else {
+ err = gcry_cipher_decrypt( context, (unsigned char*)result.data(), result.size(), NULL, 0 );
+ }
+ check_error( "final cipher encrypt/decrypt", err );
+ } else {
+ // just return null
+ }
+ *out = result;
+ return true;
+ }
+
+ QCA::KeyLength keyLength() const
+ {
+ switch (m_cryptoAlgorithm)
+ {
+ case GCRY_CIPHER_DES:
+ return QCA::KeyLength( 8, 8, 1);
+ case GCRY_CIPHER_AES128:
+ return QCA::KeyLength( 16, 16, 1);
+ case GCRY_CIPHER_AES192:
+ return QCA::KeyLength( 24, 24, 1);
+ case GCRY_CIPHER_3DES:
+ // we do two and three key versions
+ return QCA::KeyLength( 16, 24, 8);
+ case GCRY_CIPHER_AES256:
+ return QCA::KeyLength( 32, 32, 1);
+ case GCRY_CIPHER_BLOWFISH:
+ // Don't know - TODO
+ return QCA::KeyLength( 1, 32, 1);
+ default:
+ return QCA::KeyLength( 0, 1, 1);
+ }
+ }
+
+
+protected:
+ gcry_cipher_hd_t context;
+ gcry_error_t err;
+ int m_cryptoAlgorithm;
+ QCA::Direction m_direction;
+ int m_mode;
+ bool m_pad;
+};
+
+
+class pbkdf1Context : public QCA::KDFContext
+{
+public:
+ pbkdf1Context(int algorithm, QCA::Provider *p, const QString &type) : QCA::KDFContext(p, type)
+ {
+ m_hashAlgorithm = algorithm;
+ err = gcry_md_open( &context, m_hashAlgorithm, 0 );
+ if ( GPG_ERR_NO_ERROR != err ) {
+ std::cout << "Failure: " ;
+ std::cout << gcry_strsource(err) << "/";
+ std::cout << gcry_strerror(err) << std::endl;
+ }
+ }
+
+ ~pbkdf1Context()
+ {
+ gcry_md_close( context );
+ }
+
+ Context *clone() const
+ {
+ return new pbkdf1Context( *this );
+ }
+
+ QCA::SymmetricKey makeKey(const QCA::SecureArray &secret, const QCA::InitializationVector &salt,
+ unsigned int keyLength, unsigned int iterationCount)
+ {
+ /* from RFC2898:
+ Steps:
+
+ 1. If dkLen > 16 for MD2 and MD5, or dkLen > 20 for SHA-1, output
+ "derived key too long" and stop.
+ */
+ if ( keyLength > gcry_md_get_algo_dlen(m_hashAlgorithm) ) {
+ std::cout << "derived key too long" << std::endl;
+ return QCA::SymmetricKey();
+ }
+
+ /*
+ 2. Apply the underlying hash function Hash for c iterations to the
+ concatenation of the password P and the salt S, then extract
+ the first dkLen octets to produce a derived key DK:
+
+ T_1 = Hash (P || S) ,
+ T_2 = Hash (T_1) ,
+ ...
+ T_c = Hash (T_{c-1}) ,
+ DK = Tc<0..dkLen-1>
+ */
+ // calculate T_1
+ gcry_md_write( context, secret.data(), secret.size() );
+ gcry_md_write( context, salt.data(), salt.size() );
+ unsigned char *md;
+ md = gcry_md_read( context, m_hashAlgorithm );
+ QCA::SecureArray a( gcry_md_get_algo_dlen( m_hashAlgorithm ) );
+ memcpy( a.data(), md, a.size() );
+
+ // calculate T_2 up to T_c
+ for ( unsigned int i = 2; i <= iterationCount; ++i ) {
+ gcry_md_reset( context );
+ gcry_md_write( context, a.data(), a.size() );
+ md = gcry_md_read( context, m_hashAlgorithm );
+ memcpy( a.data(), md, a.size() );
+ }
+
+ // shrink a to become DK, of the required length
+ a.resize(keyLength);
+
+ /*
+ 3. Output the derived key DK.
+ */
+ return a;
+ }
+
+ QCA::SymmetricKey makeKey(const QCA::SecureArray &secret,
+ const QCA::InitializationVector &salt,
+ unsigned int keyLength,
+ int msecInterval,
+ unsigned int *iterationCount)
+ {
+ Q_ASSERT(iterationCount != NULL);
+ QTime timer;
+
+ /*
+ from RFC2898:
+ Steps:
+
+ 1. If dkLen > 16 for MD2 and MD5, or dkLen > 20 for SHA-1, output
+ "derived key too long" and stop.
+ */
+ if ( keyLength > gcry_md_get_algo_dlen(m_hashAlgorithm) ) {
+ std::cout << "derived key too long" << std::endl;
+ return QCA::SymmetricKey();
+ }
+
+ /*
+ 2. Apply the underlying hash function Hash for M milliseconds
+ to the concatenation of the password P and the salt S, incrementing c,
+ then extract the first dkLen octets to produce a derived key DK:
+
+ time from 0 to M
+ T_1 = Hash (P || S) ,
+ T_2 = Hash (T_1) ,
+ ...
+ T_c = Hash (T_{c-1}) ,
+ when time = 0: stop,
+ DK = Tc<0..dkLen-1>
+ */
+ // calculate T_1
+ gcry_md_write( context, secret.data(), secret.size() );
+ gcry_md_write( context, salt.data(), salt.size() );
+ unsigned char *md;
+ md = gcry_md_read( context, m_hashAlgorithm );
+ QCA::SecureArray a( gcry_md_get_algo_dlen( m_hashAlgorithm ) );
+ memcpy( a.data(), md, a.size() );
+
+ // calculate T_2 up to T_c
+ *iterationCount = 2 - 1; // <- Have to remove 1, unless it computes one
+ timer.start(); // ^ time more than the base function
+ // ^ with the same iterationCount
+ while (timer.elapsed() < msecInterval) {
+ gcry_md_reset( context );
+ gcry_md_write( context, a.data(), a.size() );
+ md = gcry_md_read( context, m_hashAlgorithm );
+ memcpy( a.data(), md, a.size() );
+ ++(*iterationCount);
+ }
+
+ // shrink a to become DK, of the required length
+ a.resize(keyLength);
+
+ /*
+ 3. Output the derived key DK.
+ */
+ return a;
+ }
+
+protected:
+ gcry_md_hd_t context;
+ gcry_error_t err;
+ int m_hashAlgorithm;
+};
+
+
+class pbkdf2Context : public QCA::KDFContext
+{
+public:
+ pbkdf2Context(int algorithm, QCA::Provider *p, const QString &type) : QCA::KDFContext(p, type)
+ {
+ m_algorithm = algorithm;
+ }
+
+ Context *clone() const
+ {
+ return new pbkdf2Context( *this );
+ }
+
+ QCA::SymmetricKey makeKey(const QCA::SecureArray &secret, const QCA::InitializationVector &salt,
+ unsigned int keyLength, unsigned int iterationCount)
+ {
+ QCA::SymmetricKey result(keyLength);
+ gcry_error_t retval = gcry_pbkdf2(m_algorithm, secret.data(), secret.size(),
+ salt.data(), salt.size(),
+ iterationCount, keyLength, result.data());
+ if (retval == GPG_ERR_NO_ERROR) {
+ return result;
+ } else {
+ // std::cout << "got: " << retval << std::endl;
+ return QCA::SymmetricKey();
+ }
+ }
+
+ QCA::SymmetricKey makeKey(const QCA::SecureArray &secret,
+ const QCA::InitializationVector &salt,
+ unsigned int keyLength,
+ int msecInterval,
+ unsigned int *iterationCount)
+ {
+ Q_ASSERT(iterationCount != NULL);
+ QCA::SymmetricKey result(keyLength);
+ QTime timer;
+
+ *iterationCount = 0;
+ timer.start();
+
+ while (timer.elapsed() < msecInterval) {
+ gcry_pbkdf2(m_algorithm,
+ secret.data(),
+ secret.size(),
+ salt.data(),
+ salt.size(),
+ 1,
+ keyLength,
+ result.data());
+ ++(*iterationCount);
+ }
+
+ return makeKey(secret, salt, keyLength, *iterationCount);
+ }
+
+protected:
+ int m_algorithm;
+};
+
+}
+
+extern "C"
+{
+
+static void * qca_func_malloc(size_t n)
+{
+ return qca_secure_alloc(n);
+}
+
+static void * qca_func_secure_malloc(size_t n)
+{
+ return qca_secure_alloc(n);
+}
+
+static void * qca_func_realloc(void *oldBlock, size_t newBlockSize)
+{
+ return qca_secure_realloc(oldBlock, newBlockSize);
+}
+
+static void qca_func_free(void *mem)
+{
+ qca_secure_free(mem);
+}
+
+int qca_func_secure_check (const void *)
+{
+ return (int)QCA::haveSecureMemory();
+}
+} // extern "C"
+
+class gcryptProvider : public QCA::Provider
+{
+public:
+ void init()
+ {
+ if (!gcry_control (GCRYCTL_ANY_INITIALIZATION_P))
+ { /* No other library has already initialized libgcrypt. */
+
+ if (!gcry_check_version (GCRYPT_VERSION) )
+ {
+ std::cout << "libgcrypt is too old (need " << GCRYPT_VERSION;
+ std::cout << ", have " << gcry_check_version(NULL) << ")" << std::endl;
+ }
+ gcry_set_allocation_handler (qca_func_malloc,
+ qca_func_secure_malloc,
+ qca_func_secure_check,
+ qca_func_realloc,
+ qca_func_free);
+ gcry_control (GCRYCTL_INITIALIZATION_FINISHED);
+ }
+ }
+
+ int qcaVersion() const
+ {
+ return QCA_VERSION;
+ }
+
+ QString name() const
+ {
+ return "qca-gcrypt";
+ }
+
+ QStringList features() const
+ {
+ QStringList list;
+ list += "sha1";
+ list += "md4";
+ list += "md5";
+ list += "ripemd160";
+#ifdef GCRY_MD_SHA224
+ list += "sha224";
+#endif
+ list += "sha256";
+ list += "sha384";
+ list += "sha512";
+ list += "hmac(md5)";
+ list += "hmac(sha1)";
+#ifdef GCRY_MD_SHA224
+ list += "hmac(sha224)";
+#endif
+ list += "hmac(sha256)";
+ if ( ! ( NULL == gcry_check_version("1.3.0") ) ) {
+ // 1.2 and earlier have broken implementation
+ list += "hmac(sha384)";
+ list += "hmac(sha512)";
+ }
+ list += "hmac(ripemd160)";
+ list += "aes128-ecb";
+ list += "aes128-cfb";
+ list += "aes128-cbc";
+ list += "aes192-ecb";
+ list += "aes192-cfb";
+ list += "aes192-cbc";
+ list += "aes256-ecb";
+ list += "aes256-cfb";
+ list += "aes256-cbc";
+ list += "blowfish-ecb";
+ list += "blowfish-cbc";
+ list += "blowfish-cfb";
+ list += "tripledes-ecb";
+ list += "des-ecb";
+ list += "des-cbc";
+ list += "des-cfb";
+ if ( ! ( NULL == gcry_check_version("1.3.0") ) ) {
+ // 1.2 branch and earlier doesn't support OFB mode
+ list += "aes128-ofb";
+ list += "aes192-ofb";
+ list += "aes256-ofb";
+ list += "des-ofb";
+ list += "tripledes-ofb";
+ list += "blowfish-ofb";
+ }
+ list += "pbkdf1(sha1)";
+ list += "pbkdf2(sha1)";
+ return list;
+ }
+
+ Context *createContext(const QString &type)
+ {
+ // std::cout << "type: " << qPrintable(type) << std::endl;
+ if ( type == "sha1" )
+ return new gcryptQCAPlugin::gcryHashContext( GCRY_MD_SHA1, this, type );
+ else if ( type == "md4" )
+ return new gcryptQCAPlugin::gcryHashContext( GCRY_MD_MD4, this, type );
+ else if ( type == "md5" )
+ return new gcryptQCAPlugin::gcryHashContext( GCRY_MD_MD5, this, type );
+ else if ( type == "ripemd160" )
+ return new gcryptQCAPlugin::gcryHashContext( GCRY_MD_RMD160, this, type );
+#ifdef GCRY_MD_SHA224
+ else if ( type == "sha224" )
+ return new gcryptQCAPlugin::gcryHashContext( GCRY_MD_SHA224, this, type );
+#endif
+ else if ( type == "sha256" )
+ return new gcryptQCAPlugin::gcryHashContext( GCRY_MD_SHA256, this, type );
+ else if ( type == "sha384" )
+ return new gcryptQCAPlugin::gcryHashContext( GCRY_MD_SHA384, this, type );
+ else if ( type == "sha512" )
+ return new gcryptQCAPlugin::gcryHashContext( GCRY_MD_SHA512, this, type );
+ else if ( type == "hmac(md5)" )
+ return new gcryptQCAPlugin::gcryHMACContext( GCRY_MD_MD5, this, type );
+ else if ( type == "hmac(sha1)" )
+ return new gcryptQCAPlugin::gcryHMACContext( GCRY_MD_SHA1, this, type );
+#ifdef GCRY_MD_SHA224
+ else if ( type == "hmac(sha224)" )
+ return new gcryptQCAPlugin::gcryHMACContext( GCRY_MD_SHA224, this, type );
+#endif
+ else if ( type == "hmac(sha256)" )
+ return new gcryptQCAPlugin::gcryHMACContext( GCRY_MD_SHA256, this, type );
+ else if ( type == "hmac(sha384)" )
+ return new gcryptQCAPlugin::gcryHMACContext( GCRY_MD_SHA384, this, type );
+ else if ( type == "hmac(sha512)" )
+ return new gcryptQCAPlugin::gcryHMACContext( GCRY_MD_SHA512, this, type );
+ else if ( type == "hmac(ripemd160)" )
+ return new gcryptQCAPlugin::gcryHMACContext( GCRY_MD_RMD160, this, type );
+ else if ( type == "aes128-ecb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_ECB, false, this, type );
+ else if ( type == "aes128-cfb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CFB, false, this, type );
+ else if ( type == "aes128-ofb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_OFB, false, this, type );
+ else if ( type == "aes128-cbc" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CBC, false, this, type );
+ else if ( type == "aes192-ecb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_ECB, false, this, type );
+ else if ( type == "aes192-cfb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CFB, false, this, type );
+ else if ( type == "aes192-ofb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_OFB, false, this, type );
+ else if ( type == "aes192-cbc" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CBC, false, this, type );
+ else if ( type == "aes256-ecb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_ECB, false, this, type );
+ else if ( type == "aes256-cfb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CFB, false, this, type );
+ else if ( type == "aes256-ofb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_OFB, false, this, type );
+ else if ( type == "aes256-cbc" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC, false, this, type );
+ else if ( type == "blowfish-ecb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_ECB, false, this, type );
+ else if ( type == "blowfish-cbc" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CBC, false, this, type );
+ else if ( type == "blowfish-cfb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CFB, false, this, type );
+ else if ( type == "blowfish-ofb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_OFB, false, this, type );
+ else if ( type == "tripledes-ecb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_ECB, false, this, type );
+ else if ( type == "tripledes-ofb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_OFB, false, this, type );
+ else if ( type == "des-ecb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_DES, GCRY_CIPHER_MODE_ECB, false, this, type );
+ else if ( type == "des-cbc" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_DES, GCRY_CIPHER_MODE_CBC, false, this, type );
+ else if ( type == "des-cfb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_DES, GCRY_CIPHER_MODE_CFB, false, this, type );
+ else if ( type == "des-ofb" )
+ return new gcryptQCAPlugin::gcryCipherContext( GCRY_CIPHER_DES, GCRY_CIPHER_MODE_OFB, false, this, type );
+ else if ( type == "pbkdf1(sha1)" )
+ return new gcryptQCAPlugin::pbkdf1Context( GCRY_MD_SHA1, this, type );
+ else if ( type == "pbkdf2(sha1)" )
+ return new gcryptQCAPlugin::pbkdf2Context( GCRY_MD_SHA1, this, type );
+ else
+ return 0;
+ }
+};
+
+class gcryptPlugin : public QObject, public QCAPlugin
+{
+ Q_OBJECT
+#if QT_VERSION >= 0x050000
+ Q_PLUGIN_METADATA(IID "com.affinix.qca.Plugin/1.0")
+#endif
+ Q_INTERFACES(QCAPlugin)
+ public:
+ virtual QCA::Provider *createProvider() { return new gcryptProvider; }
+};
+
+#include "qca-gcrypt.moc"
+
+#if QT_VERSION < 0x050000
+Q_EXPORT_PLUGIN2(qca_gcrypt, gcryptPlugin)
+#endif
diff -Nru qca2-2.0.3/plugins/qca-gcrypt/README qca2-2.1.0/plugins/qca-gcrypt/README
--- qca2-2.0.3/plugins/qca-gcrypt/README 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gcrypt/README 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,17 @@
+QCA libgcrypt plugin
+------------------
+Author: Brad Hards
+
+This plugin provides features based on libgcrypt. It implements:
+* Hashing - SHA1, SHA256, SHA384, SHA512
+* Symmetric encryption - AES128
+
+
+Requirements:
+ libgcrypt 1.2.0 or later
+
+Installation procedure:
+ ./configure
+ make
+ su -c "make install"
+
diff -Nru qca2-2.0.3/plugins/qca-gcrypt/TODO qca2-2.1.0/plugins/qca-gcrypt/TODO
--- qca2-2.0.3/plugins/qca-gcrypt/TODO 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gcrypt/TODO 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,8 @@
+Configuration:
+* Add check for libgcrypt support for SHA224
+
+Implementation:
+* Cipher is incomplete - it can't handle cases where
+ data is not provided in blocksize chunks. Needs buffering
+ and padding to be added.
+
diff -Nru qca2-2.0.3/plugins/qca-gnupg/CMakeLists.txt qca2-2.1.0/plugins/qca-gnupg/CMakeLists.txt
--- qca2-2.0.3/plugins/qca-gnupg/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/CMakeLists.txt 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,56 @@
+# QCA GnuPG
+
+enable_plugin("gnupg")
+
+set(QCA_GNUPG_MOC_SOURCES
+ qca-gnupg.cpp
+)
+
+set(QCA_GNUPG_NONMOC_SOURCES
+ gpgop.cpp
+ utils.cpp
+ gpgproc/sprocess.cpp
+ mypgpkeycontext.cpp
+ mykeystoreentry.cpp
+ myopenpgpcontext.cpp
+ mykeystorelist.cpp
+ mymessagecontext.cpp
+ ringwatch.cpp
+ lineconverter.cpp
+ gpgaction.cpp
+ gpgproc/gpgproc.cpp
+)
+
+my_automoc(QCA_GNUPG_MOC_SOURCES)
+
+qt4_wrap_cpp(EXTRA_GNUPG_SOURCES gpgop.h)
+qt4_wrap_cpp(EXTRA_GNUPG_SOURCES gpgop_p.h)
+qt4_wrap_cpp(EXTRA_GNUPG_SOURCES gpgproc/gpgproc.h)
+qt4_wrap_cpp(EXTRA_GNUPG_SOURCES gpgproc/gpgproc_p.h)
+qt4_wrap_cpp(EXTRA_GNUPG_SOURCES gpgproc/sprocess.h)
+qt4_wrap_cpp(EXTRA_GNUPG_SOURCES ringwatch.h)
+qt4_wrap_cpp(EXTRA_GNUPG_SOURCES mykeystorelist.h)
+qt4_wrap_cpp(EXTRA_GNUPG_SOURCES mymessagecontext.h)
+qt4_wrap_cpp(EXTRA_GNUPG_SOURCES gpgaction.h)
+
+add_library(qca-gnupg ${PLUGIN_TYPE} ${QCA_GNUPG_MOC_SOURCES} ${QCA_GNUPG_NONMOC_SOURCES} ${EXTRA_GNUPG_SOURCES})
+
+if(APPLE AND ${PLUGIN_TYPE} STREQUAL "MODULE")
+ set_property(TARGET qca-gnupg PROPERTY SUFFIX ".dylib")
+endif()
+
+include_directories(gpgproc)
+target_link_libraries(qca-gnupg ${QT_QTCORE_LIBRARY} ${QCA_LIB_NAME})
+
+if (WIN32)
+ target_link_libraries(qca-gnupg advapi32)
+endif (WIN32)
+
+if(NOT DEVELOPER_MODE)
+ install(TARGETS qca-gnupg DESTINATION
+ LIBRARY DESTINATION "${QCA_CRYPTO_INSTALL_DIR}"
+ ARCHIVE DESTINATION "${QCA_CRYPTO_INSTALL_DIR}"
+ RUNTIME DESTINATION "${QCA_CRYPTO_INSTALL_DIR}")
+
+ install_pdb(qca-gnupg ${QCA_CRYPTO_INSTALL_DIR})
+endif()
diff -Nru qca2-2.0.3/plugins/qca-gnupg/COPYING qca2-2.1.0/plugins/qca-gnupg/COPYING
--- qca2-2.0.3/plugins/qca-gnupg/COPYING 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/COPYING 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgaction.cpp qca2-2.1.0/plugins/qca-gnupg/gpgaction.cpp
--- qca2-2.0.3/plugins/qca-gnupg/gpgaction.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgaction.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,924 @@
+/*
+ * Copyright (C) 2003-2005 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+// #define GPGOP_DEBUG
+
+#include "gpgaction.h"
+
+#ifdef GPGOP_DEBUG
+#include "stdio.h"
+#endif
+
+namespace gpgQCAPlugin {
+
+static QDateTime getTimestamp(const QString &s)
+{
+ if(s.isEmpty())
+ return QDateTime();
+
+ if(s.contains('T'))
+ {
+ return QDateTime::fromString(s, Qt::ISODate);
+ }
+ else
+ {
+ QDateTime dt;
+ dt.setTime_t(s.toInt());
+ return dt;
+ }
+}
+
+static QByteArray getCString(const QByteArray &a)
+{
+ QByteArray out;
+
+ // convert the "backslash" C-string syntax
+ for(int n = 0; n < a.size(); ++n)
+ {
+ if(a[n] == '\\' && n + 1 < a.size())
+ {
+ ++n;
+ unsigned char c = (unsigned char)a[n];
+ if(c == '\\')
+ {
+ out += '\\';
+ }
+ else if(c == 'x' && n + 2 < a.size())
+ {
+ ++n;
+ QByteArray hex = a.mid(n, 2);
+ ++n; // only skip one, loop will skip the next
+
+ bool ok;
+ uint val = hex.toInt(&ok, 16);
+ if(ok)
+ {
+ out += (unsigned char)val;
+ }
+ else
+ {
+ out += "\\x";
+ out += hex;
+ }
+ }
+ }
+ else
+ {
+ out += a[n];
+ }
+ }
+
+ return out;
+}
+
+static bool stringToKeyList(const QString &outstr, GpgOp::KeyList *_keylist, QString *_keyring)
+{
+ GpgOp::KeyList keyList;
+ QStringList lines = outstr.split('\n');
+
+ if(lines.count() < 1)
+ return false;
+
+ QStringList::ConstIterator it = lines.constBegin();
+
+ // first line is keyring file
+ QString keyring = *(it++);
+
+ // if the second line isn't a divider, we are dealing
+ // with a new version of gnupg that doesn't give us
+ // the keyring file on gpg --list-keys --with-colons
+ if(it == lines.constEnd() || (*it).isEmpty() || (*it).at(0) != '-')
+ {
+ // first line wasn't the keyring name...
+ keyring.clear();
+ // ...so read the first line again
+ it--;
+ }
+ else
+ {
+ // this was the divider line - skip it
+ it++;
+ }
+
+ for(; it != lines.constEnd(); ++it)
+ {
+ QStringList f = (*it).split(':');
+ if(f.count() < 1)
+ continue;
+ QString type = f[0];
+
+ bool key = false; // key or not
+ bool primary = false; // primary key or sub key
+ // bool sec = false; // private key or not
+
+ if(type == "pub")
+ {
+ key = true;
+ primary = true;
+ }
+ else if(type == "sec")
+ {
+ key = true;
+ primary = true;
+ // sec = true;
+ }
+ else if(type == "sub")
+ {
+ key = true;
+ }
+ else if(type == "ssb")
+ {
+ key = true;
+ // sec = true;
+ }
+
+ if(key)
+ {
+ if(primary)
+ {
+ keyList += GpgOp::Key();
+
+ QString trust = f[1];
+ if(trust == "f" || trust == "u")
+ keyList.last().isTrusted = true;
+ }
+
+ int key_type = f[3].toInt();
+ QString caps = f[11];
+
+ GpgOp::KeyItem item;
+ item.bits = f[2].toInt();
+ if(key_type == 1)
+ item.type = GpgOp::KeyItem::RSA;
+ else if(key_type == 16)
+ item.type = GpgOp::KeyItem::ElGamal;
+ else if(key_type == 17)
+ item.type = GpgOp::KeyItem::DSA;
+ else
+ item.type = GpgOp::KeyItem::Unknown;
+ item.id = f[4];
+ item.creationDate = getTimestamp(f[5]);
+ item.expirationDate = getTimestamp(f[6]);
+ if(caps.contains('e'))
+ item.caps |= GpgOp::KeyItem::Encrypt;
+ if(caps.contains('s'))
+ item.caps |= GpgOp::KeyItem::Sign;
+ if(caps.contains('c'))
+ item.caps |= GpgOp::KeyItem::Certify;
+ if(caps.contains('a'))
+ item.caps |= GpgOp::KeyItem::Auth;
+
+ keyList.last().keyItems += item;
+ }
+ else if(type == "uid")
+ {
+ QByteArray uid = getCString(f[9].toUtf8());
+ keyList.last().userIds.append(QString::fromUtf8(uid));
+ }
+ else if(type == "fpr")
+ {
+ QString s = f[9];
+ keyList.last().keyItems.last().fingerprint = s;
+ }
+ }
+
+ if(_keylist)
+ *_keylist = keyList;
+ if(_keyring)
+ *_keyring = keyring;
+
+ return true;
+}
+
+static bool findKeyringFilename(const QString &outstr, QString *_keyring)
+{
+ QStringList lines = outstr.split('\n');
+ if(lines.count() < 1)
+ return false;
+
+ *_keyring = lines[0];
+ return true;
+}
+
+GpgAction::GpgAction(QObject *parent)
+ : QObject(parent)
+ , proc(this)
+ , dtextTimer(this)
+{
+ dtextTimer.setSingleShot(true);
+
+ connect(&proc, SIGNAL(error(gpgQCAPlugin::GPGProc::Error)), SLOT(proc_error(gpgQCAPlugin::GPGProc::Error)));
+ connect(&proc, SIGNAL(finished(int)), SLOT(proc_finished(int)));
+ connect(&proc, SIGNAL(readyReadStdout()), SLOT(proc_readyReadStdout()));
+ connect(&proc, SIGNAL(readyReadStderr()), SLOT(proc_readyReadStderr()));
+ connect(&proc, SIGNAL(readyReadStatusLines()), SLOT(proc_readyReadStatusLines()));
+ connect(&proc, SIGNAL(bytesWrittenStdin(int)), SLOT(proc_bytesWrittenStdin(int)));
+ connect(&proc, SIGNAL(bytesWrittenAux(int)), SLOT(proc_bytesWrittenAux(int)));
+ connect(&proc, SIGNAL(bytesWrittenCommand(int)), SLOT(proc_bytesWrittenCommand(int)));
+ connect(&proc, SIGNAL(debug(const QString &)), SLOT(proc_debug(const QString &)));
+ connect(&dtextTimer, SIGNAL(timeout()), SLOT(t_dtext()));
+
+ reset();
+}
+
+GpgAction::~GpgAction()
+{
+ reset();
+}
+
+void GpgAction::reset()
+{
+ collectOutput = true;
+ allowInput = false;
+ readConv.setup(LineConverter::Read);
+ writeConv.setup(LineConverter::Write);
+ readText = false;
+ writeText = false;
+ useAux = false;
+ passphraseKeyId = QString();
+ signing = false;
+ decryptGood = false;
+ signGood = false;
+ curError = GpgOp::ErrorUnknown;
+ badPassphrase = false;
+ need_submitPassphrase = false;
+ need_cardOkay = false;
+ diagnosticText = QString();
+ dtextTimer.stop();
+
+ output = Output();
+
+ proc.reset();
+}
+
+void GpgAction::start()
+{
+ reset();
+
+ QStringList args;
+ bool extra = false;
+
+ if(input.opt_ascii)
+ args += "--armor";
+
+ if(input.opt_noagent)
+ args += "--no-use-agent";
+
+ if(input.opt_alwaystrust)
+ args += "--always-trust";
+
+ if(!input.opt_pubfile.isEmpty() && !input.opt_secfile.isEmpty())
+ {
+ args += "--no-default-keyring";
+ args += "--keyring";
+ args += input.opt_pubfile;
+ args += "--secret-keyring";
+ args += input.opt_secfile;
+ }
+
+ switch(input.op)
+ {
+ case GpgOp::Check:
+ {
+ args += "--version";
+ readText = true;
+ break;
+ }
+ case GpgOp::SecretKeyringFile:
+ {
+ args += "--list-secret-keys";
+ readText = true;
+ break;
+ }
+ case GpgOp::PublicKeyringFile:
+ {
+ args += "--list-public-keys";
+ readText = true;
+ break;
+ }
+ case GpgOp::SecretKeys:
+ {
+ args += "--fixed-list-mode";
+ args += "--with-colons";
+ args += "--with-fingerprint";
+ args += "--with-fingerprint";
+ args += "--list-secret-keys";
+ readText = true;
+ break;
+ }
+ case GpgOp::PublicKeys:
+ {
+ args += "--fixed-list-mode";
+ args += "--with-colons";
+ args += "--with-fingerprint";
+ args += "--with-fingerprint";
+ args += "--list-public-keys";
+ readText = true;
+ break;
+ }
+ case GpgOp::Encrypt:
+ {
+ args += "--encrypt";
+
+ // recipients
+ for(QStringList::ConstIterator it = input.recip_ids.constBegin(); it != input.recip_ids.constEnd(); ++it)
+ {
+ args += "--recipient";
+ args += QString("0x") + *it;
+ }
+ extra = true;
+ collectOutput = false;
+ allowInput = true;
+ if(input.opt_ascii)
+ readText = true;
+ break;
+ }
+ case GpgOp::Decrypt:
+ {
+ args += "--decrypt";
+ extra = true;
+ collectOutput = false;
+ allowInput = true;
+ if(input.opt_ascii)
+ writeText = true;
+ break;
+ }
+ case GpgOp::Sign:
+ {
+ args += "--default-key";
+ args += QString("0x") + input.signer_id;
+ args += "--sign";
+ extra = true;
+ collectOutput = false;
+ allowInput = true;
+ if(input.opt_ascii)
+ readText = true;
+ signing = true;
+ break;
+ }
+ case GpgOp::SignAndEncrypt:
+ {
+ args += "--default-key";
+ args += QString("0x") + input.signer_id;
+ args += "--sign";
+ args += "--encrypt";
+
+ // recipients
+ for(QStringList::ConstIterator it = input.recip_ids.constBegin(); it != input.recip_ids.constEnd(); ++it)
+ {
+ args += "--recipient";
+ args += QString("0x") + *it;
+ }
+ extra = true;
+ collectOutput = false;
+ allowInput = true;
+ if(input.opt_ascii)
+ readText = true;
+ signing = true;
+ break;
+ }
+ case GpgOp::SignClearsign:
+ {
+ args += "--default-key";
+ args += QString("0x") + input.signer_id;
+ args += "--clearsign";
+ extra = true;
+ collectOutput = false;
+ allowInput = true;
+ if(input.opt_ascii)
+ readText = true;
+ signing = true;
+ break;
+ }
+ case GpgOp::SignDetached:
+ {
+ args += "--default-key";
+ args += QString("0x") + input.signer_id;
+ args += "--detach-sign";
+ extra = true;
+ collectOutput = false;
+ allowInput = true;
+ if(input.opt_ascii)
+ readText = true;
+ signing = true;
+ break;
+ }
+ case GpgOp::Verify:
+ {
+ args += "--verify";
+ args += "-"; //krazy:exclude=doublequote_chars
+ extra = true;
+ allowInput = true;
+ if(input.opt_ascii)
+ writeText = true;
+ break;
+ }
+ case GpgOp::VerifyDetached:
+ {
+ args += "--verify";
+ args += "-"; //krazy:exclude=doublequote_chars
+ args += "-&?";
+ extra = true;
+ allowInput = true;
+ useAux = true;
+ break;
+ }
+ case GpgOp::Import:
+ {
+ args += "--import";
+ readText = true;
+ if(input.opt_ascii)
+ writeText = true;
+ break;
+ }
+ case GpgOp::Export:
+ {
+ args += "--export";
+ args += QString("0x") + input.export_key_id;
+ collectOutput = false;
+ if(input.opt_ascii)
+ readText = true;
+ break;
+ }
+ case GpgOp::DeleteKey:
+ {
+ args += "--batch";
+ args += "--delete-key";
+ args += QString("0x") + input.delete_key_fingerprint;
+ break;
+ }
+ }
+
+#ifdef GPG_PROFILE
+ timer.start();
+ printf("<< launch >>\n");
+#endif
+ proc.start(input.bin, args, extra ? GPGProc::ExtendedMode : GPGProc::NormalMode);
+
+ // detached sig
+ if(input.op == GpgOp::VerifyDetached)
+ {
+ QByteArray a = input.sig;
+ if(input.opt_ascii)
+ {
+ LineConverter conv;
+ conv.setup(LineConverter::Write);
+ a = conv.process(a);
+ }
+ proc.writeStdin(a);
+ proc.closeStdin();
+ }
+
+ // import
+ if(input.op == GpgOp::Import)
+ {
+ QByteArray a = input.inkey;
+ if(writeText)
+ {
+ LineConverter conv;
+ conv.setup(LineConverter::Write);
+ a = conv.process(a);
+ }
+ proc.writeStdin(a);
+ proc.closeStdin();
+ }
+}
+
+#ifdef QPIPE_SECURE
+void GpgAction::submitPassphrase(const QCA::SecureArray &a)
+#else
+ void GpgAction::submitPassphrase(const QByteArray &a)
+#endif
+{
+ if(!need_submitPassphrase)
+ return;
+
+ need_submitPassphrase = false;
+
+#ifdef QPIPE_SECURE
+ QCA::SecureArray b;
+#else
+ QByteArray b;
+#endif
+ // filter out newlines, since that's the delimiter used
+ // to indicate a submitted passphrase
+ b.resize(a.size());
+ int at = 0;
+ for(int n = 0; n < a.size(); ++n)
+ {
+ if(a[n] != '\n')
+ b[at++] = a[n];
+ }
+ b.resize(at);
+
+ // append newline
+ b.resize(b.size() + 1);
+ b[b.size() - 1] = '\n';
+ proc.writeCommand(b);
+}
+
+QByteArray GpgAction::read()
+{
+ if(collectOutput)
+ return QByteArray();
+
+ QByteArray a = proc.readStdout();
+ if(readText)
+ a = readConv.update(a);
+ if(!proc.isActive())
+ a += readConv.final();
+ return a;
+}
+
+void GpgAction::write(const QByteArray &in)
+{
+ if(!allowInput)
+ return;
+
+ QByteArray a = in;
+ if(writeText)
+ a = writeConv.update(in);
+
+ if(useAux)
+ proc.writeAux(a);
+ else
+ proc.writeStdin(a);
+}
+
+void GpgAction::endWrite()
+{
+ if(!allowInput)
+ return;
+
+ if(useAux)
+ proc.closeAux();
+ else
+ proc.closeStdin();
+}
+
+void GpgAction::cardOkay()
+{
+ if(need_cardOkay)
+ {
+ need_cardOkay = false;
+ submitCommand("\n");
+ }
+}
+
+QString GpgAction::readDiagnosticText()
+{
+ QString s = diagnosticText;
+ diagnosticText = QString();
+ return s;
+}
+
+void GpgAction::submitCommand(const QByteArray &a)
+{
+ proc.writeCommand(a);
+}
+
+// since str is taken as a value, it is ok to use the same variable for 'rest'
+QString GpgAction::nextArg(QString str, QString *rest)
+{
+ QString out;
+ int n = str.indexOf(' ');
+ if(n == -1)
+ {
+ if(rest)
+ *rest = QString();
+ return str;
+ }
+ else
+ {
+ if(rest)
+ *rest = str.mid(n + 1);
+ return str.mid(0, n);
+ }
+}
+
+void GpgAction::processStatusLine(const QString &line)
+{
+ appendDiagnosticText("{" + line + "}");
+ ensureDTextEmit();
+
+ if(!proc.isActive())
+ return;
+
+ QString s, rest;
+ s = nextArg(line, &rest);
+
+ if(s == "NODATA")
+ {
+ // only set this if it'll make it better
+ if(curError == GpgOp::ErrorUnknown)
+ curError = GpgOp::ErrorFormat;
+ }
+ else if(s == "UNEXPECTED")
+ {
+ if(curError == GpgOp::ErrorUnknown)
+ curError = GpgOp::ErrorFormat;
+ }
+ else if(s == "EXPKEYSIG")
+ {
+ curError = GpgOp::ErrorSignerExpired;
+ }
+ else if(s == "REVKEYSIG")
+ {
+ curError = GpgOp::ErrorSignerRevoked;
+ }
+ else if(s == "EXPSIG")
+ {
+ curError = GpgOp::ErrorSignatureExpired;
+ }
+ else if(s == "INV_RECP")
+ {
+ int r = nextArg(rest).toInt();
+
+ if(curError == GpgOp::ErrorUnknown)
+ {
+ if(r == 10)
+ curError = GpgOp::ErrorEncryptUntrusted;
+ else if(r == 4)
+ curError = GpgOp::ErrorEncryptRevoked;
+ else if(r == 5)
+ curError = GpgOp::ErrorEncryptExpired;
+ else
+ // due to GnuPG bug #1650
+ //
+ // encrypting to expired and revoked keys will
+ // not specify any reason for failing,
+ // defaulting to this
+ curError = GpgOp::ErrorEncryptInvalid;
+ }
+ }
+ else if(s == "NO_SECKEY")
+ {
+ output.encryptedToId = nextArg(rest);
+
+ if(curError == GpgOp::ErrorUnknown)
+ curError = GpgOp::ErrorDecryptNoKey;
+ }
+ else if(s == "DECRYPTION_OKAY")
+ {
+ decryptGood = true;
+
+ // message could be encrypted with several keys
+ if(curError == GpgOp::ErrorDecryptNoKey)
+ curError = GpgOp::ErrorUnknown;
+ }
+ else if(s == "SIG_CREATED")
+ {
+ signGood = true;
+ }
+ else if(s == "USERID_HINT")
+ {
+ passphraseKeyId = nextArg(rest);
+ }
+ else if(s == "GET_HIDDEN")
+ {
+ QString arg = nextArg(rest);
+ if(arg == "passphrase.enter" || arg == "passphrase.pin.ask")
+ {
+ need_submitPassphrase = true;
+
+ // for signal-safety, emit later
+ QMetaObject::invokeMethod(this, "needPassphrase", Qt::QueuedConnection, Q_ARG(QString, passphraseKeyId));
+ }
+ }
+ else if(s == "GET_LINE")
+ {
+ QString arg = nextArg(rest);
+ if(arg == "cardctrl.insert_card.okay")
+ {
+ need_cardOkay = true;
+
+ QMetaObject::invokeMethod(this, "needCard", Qt::QueuedConnection);
+ }
+ }
+ else if(s == "GET_BOOL")
+ {
+ QString arg = nextArg(rest);
+ if(arg == "untrusted_key.override")
+ submitCommand("no\n");
+ }
+ else if(s == "GOOD_PASSPHRASE")
+ {
+ badPassphrase = false;
+ }
+ else if(s == "BAD_PASSPHRASE")
+ {
+ badPassphrase = true;
+ }
+ else if(s == "GOODSIG")
+ {
+ output.wasSigned = true;
+ output.signerId = nextArg(rest);
+ output.verifyResult = GpgOp::VerifyGood;
+ }
+ else if(s == "BADSIG")
+ {
+ output.wasSigned = true;
+ output.signerId = nextArg(rest);
+ output.verifyResult = GpgOp::VerifyBad;
+ }
+ else if(s == "ERRSIG")
+ {
+ output.wasSigned = true;
+ QStringList list = rest.split(' ', QString::SkipEmptyParts);
+ output.signerId = list[0];
+ output.timestamp = getTimestamp(list[4]);
+ output.verifyResult = GpgOp::VerifyNoKey;
+ }
+ else if(s == "VALIDSIG")
+ {
+ QStringList list = rest.split(' ', QString::SkipEmptyParts);
+ output.timestamp = getTimestamp(list[2]);
+ }
+}
+
+void GpgAction::processResult(int code)
+{
+#ifdef GPG_PROFILE
+ printf("<< launch: %d >>\n", timer.elapsed());
+#endif
+
+ // put stdout and stderr into QStrings
+
+ // FIXME: on Windows gpg returns --with-colons in
+ // utf-8 charset but for -k or -K it uses
+ // console output charset (which may will be differs
+ // then system charse). Will be wait a resolving of
+ // QTBUG-13303 https://bugreports.qt-project.org/browse/QTBUG-13303
+ // After it need to make some changes.
+ QString outstr = QString::fromUtf8(buf_stdout);
+ QString errstr = QString::fromUtf8(buf_stderr);
+
+ if(collectOutput)
+ appendDiagnosticText(QString("stdout: [%1]").arg(outstr));
+ appendDiagnosticText(QString("stderr: [%1]").arg(errstr));
+ ensureDTextEmit();
+
+ if(badPassphrase)
+ {
+ output.errorCode = GpgOp::ErrorPassphrase;
+ }
+ else if(curError != GpgOp::ErrorUnknown)
+ {
+ output.errorCode = curError;
+ }
+ else if(code == 0)
+ {
+ if(input.op == GpgOp::SecretKeyringFile || input.op == GpgOp::PublicKeyringFile)
+ {
+ if(findKeyringFilename(outstr, &output.keyringFile))
+ output.success = true;
+ }
+ else if(input.op == GpgOp::SecretKeys || input.op == GpgOp::PublicKeys)
+ {
+ if(stringToKeyList(outstr, &output.keys, &output.keyringFile))
+ output.success = true;
+ }
+ else
+ output.success = true;
+ }
+ else
+ {
+ // decrypt and sign success based on status only.
+ // this is mainly because gpg uses fatal return
+ // values if there is trouble with gpg-agent, even
+ // though the operation otherwise works.
+
+ if(input.op == GpgOp::Decrypt && decryptGood)
+ output.success = true;
+ if(signing && signGood)
+ output.success = true;
+
+ // gpg will indicate failure for bad sigs, but we don't
+ // consider this to be operation failure.
+
+ bool signedMakesItGood = false;
+ if(input.op == GpgOp::Verify || input.op == GpgOp::VerifyDetached)
+ signedMakesItGood = true;
+
+ if(signedMakesItGood && output.wasSigned)
+ output.success = true;
+ }
+
+ emit finished();
+}
+
+void GpgAction::ensureDTextEmit()
+{
+ if(!dtextTimer.isActive())
+ dtextTimer.start();
+}
+
+void GpgAction::t_dtext()
+{
+ emit readyReadDiagnosticText();
+}
+
+void GpgAction::proc_error(gpgQCAPlugin::GPGProc::Error e)
+{
+ QString str;
+ if(e == GPGProc::FailedToStart)
+ str = "FailedToStart";
+ else if(e == GPGProc::UnexpectedExit)
+ str = "UnexpectedExit";
+ else if(e == GPGProc::ErrorWrite)
+ str = "ErrorWrite";
+
+ appendDiagnosticText(QString("GPG Process Error: %1").arg(str));
+ ensureDTextEmit();
+
+ output.errorCode = GpgOp::ErrorProcess;
+ emit finished();
+}
+
+void GpgAction::proc_finished(int exitCode)
+{
+ appendDiagnosticText(QString("GPG Process Finished: exitStatus=%1").arg(exitCode));
+ ensureDTextEmit();
+
+ processResult(exitCode);
+}
+
+void GpgAction::proc_readyReadStdout()
+{
+ if(collectOutput)
+ {
+ QByteArray a = proc.readStdout();
+ if(readText)
+ a = readConv.update(a);
+ buf_stdout.append(a);
+ }
+ else
+ emit readyRead();
+}
+
+void GpgAction::proc_readyReadStderr()
+{
+ buf_stderr.append(proc.readStderr());
+}
+
+void GpgAction::proc_readyReadStatusLines()
+{
+ QStringList lines = proc.readStatusLines();
+ for(int n = 0; n < lines.count(); ++n)
+ processStatusLine(lines[n]);
+}
+
+void GpgAction::proc_bytesWrittenStdin(int bytes)
+{
+ if(!useAux)
+ {
+ int actual = writeConv.writtenToActual(bytes);
+ emit bytesWritten(actual);
+ }
+}
+
+void GpgAction::proc_bytesWrittenAux(int bytes)
+{
+ if(useAux)
+ {
+ int actual = writeConv.writtenToActual(bytes);
+ emit bytesWritten(actual);
+ }
+}
+
+void GpgAction::proc_bytesWrittenCommand(int)
+{
+ // don't care about this
+}
+
+void GpgAction::proc_debug(const QString &str)
+{
+ appendDiagnosticText("GPGProc: " + str);
+ ensureDTextEmit();
+}
+
+void GpgAction::appendDiagnosticText(const QString &line)
+{
+#ifdef GPGOP_DEBUG
+ printf("%s\n", qPrintable(line));
+#endif
+ diagnosticText += line;
+}
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgaction.h qca2-2.1.0/plugins/qca-gnupg/gpgaction.h
--- qca2-2.0.3/plugins/qca-gnupg/gpgaction.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgaction.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2003-2005 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#pragma once
+
+#include "lineconverter.h"
+#include "qca_safetimer.h"
+#include "gpgop.h"
+#include "gpgproc.h"
+#include
+#include
+#include
+
+#ifdef GPG_PROFILE
+#include
+#endif
+
+namespace gpgQCAPlugin {
+
+class GpgAction : public QObject
+{
+ Q_OBJECT
+public:
+ struct Input
+ {
+ QString bin;
+ GpgOp::Type op;
+ bool opt_ascii, opt_noagent, opt_alwaystrust;
+ QString opt_pubfile, opt_secfile;
+ QStringList recip_ids;
+ QString signer_id;
+ QByteArray sig;
+ QByteArray inkey;
+ QString export_key_id;
+ QString delete_key_fingerprint;
+
+ Input() : opt_ascii(false), opt_noagent(false), opt_alwaystrust(false) {}
+ };
+
+ struct Output
+ {
+ bool success;
+ GpgOp::Error errorCode;
+ GpgOp::KeyList keys;
+ QString keyringFile;
+ QString encryptedToId;
+ bool wasSigned;
+ QString signerId;
+ QDateTime timestamp;
+ GpgOp::VerifyResult verifyResult;
+
+ Output() : success(false), errorCode(GpgOp::ErrorUnknown), wasSigned(false) {}
+ };
+
+ Input input;
+ Output output;
+
+ GpgAction(QObject *parent = 0);
+ ~GpgAction();
+ void reset();
+ void start();
+#ifdef QPIPE_SECURE
+ void submitPassphrase(const QCA::SecureArray &a);
+#else
+ void submitPassphrase(const QByteArray &a);
+#endif
+
+public slots:
+ QByteArray read();
+ void write(const QByteArray &in);
+ void endWrite();
+ void cardOkay();
+ QString readDiagnosticText();
+
+signals:
+ void readyRead();
+ void bytesWritten(int bytes);
+ void finished();
+ void needPassphrase(const QString &keyId);
+ void needCard();
+ void readyReadDiagnosticText();
+
+private:
+ void submitCommand(const QByteArray &a);
+
+ // since str is taken as a value, it is ok to use the same variable for 'rest'
+ QString nextArg(QString str, QString *rest = 0);
+ void processStatusLine(const QString &line);
+ void processResult(int code);
+ void ensureDTextEmit();
+
+ GPGProc proc;
+ bool collectOutput, allowInput;
+ LineConverter readConv, writeConv;
+ bool readText, writeText;
+ QByteArray buf_stdout, buf_stderr;
+ bool useAux;
+ QString passphraseKeyId;
+ bool signing, decryptGood, signGood;
+ GpgOp::Error curError;
+ bool badPassphrase;
+ bool need_submitPassphrase, need_cardOkay;
+ QString diagnosticText;
+ QCA::SafeTimer dtextTimer;
+
+#ifdef GPG_PROFILE
+ QTime timer;
+#endif
+
+private slots:
+ void t_dtext();
+ void proc_error(gpgQCAPlugin::GPGProc::Error e);
+ void proc_finished(int exitCode);
+ void proc_readyReadStdout();
+ void proc_readyReadStderr();
+ void proc_readyReadStatusLines();
+ void proc_bytesWrittenStdin(int bytes);
+ void proc_bytesWrittenAux(int bytes);
+ void proc_bytesWrittenCommand(int);
+ void proc_debug(const QString &str);
+ void appendDiagnosticText(const QString &line);
+};
+
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgop.cpp qca2-2.1.0/plugins/qca-gnupg/gpgop.cpp
--- qca2-2.0.3/plugins/qca-gnupg/gpgop.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgop.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,484 @@
+/*
+ * Copyright (C) 2003-2005 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#include "gpgop_p.h"
+#include "gpgop.h"
+#include "gpgaction.h"
+
+namespace gpgQCAPlugin {
+
+//----------------------------------------------------------------------------
+// GpgOp
+//----------------------------------------------------------------------------
+GpgOp::Private::Private(GpgOp *_q)
+ : QObject(_q)
+ , sync(_q)
+ , q(_q)
+ , act(0)
+ , waiting(false)
+{
+ reset(ResetAll);
+}
+
+GpgOp::Private::~Private()
+{
+ reset(ResetAll);
+}
+
+void GpgOp::Private::reset(ResetMode mode)
+{
+ if(act)
+ {
+ act->disconnect(this);
+ act->setParent(0);
+ act->deleteLater();
+
+ act = 0;
+ }
+
+ if(mode >= ResetSessionAndData)
+ {
+ output = GpgAction::Output();
+ result.clear();
+ diagnosticText = QString();
+ eventList.clear();
+ }
+
+ if(mode >= ResetAll)
+ {
+ opt_ascii = false;
+ opt_noagent = false;
+ opt_alwaystrust = false;
+ opt_pubfile = QString();
+ opt_secfile = QString();
+ }
+}
+
+void GpgOp::Private::make_act(GpgOp::Type _op)
+{
+ reset(ResetSessionAndData);
+
+ op = _op;
+
+ act = new GpgAction(this);
+
+ connect(act, SIGNAL(readyRead()), SLOT(act_readyRead()));
+ connect(act, SIGNAL(bytesWritten(int)), SLOT(act_bytesWritten(int)));
+ connect(act, SIGNAL(needPassphrase(const QString &)), SLOT(act_needPassphrase(const QString &)));
+ connect(act, SIGNAL(needCard()), SLOT(act_needCard()));
+ connect(act, SIGNAL(finished()), SLOT(act_finished()));
+ connect(act, SIGNAL(readyReadDiagnosticText()), SLOT(act_readyReadDiagnosticText()));
+
+ act->input.bin = bin;
+ act->input.op = op;
+ act->input.opt_ascii = opt_ascii;
+ act->input.opt_noagent = opt_noagent;
+ act->input.opt_alwaystrust = opt_alwaystrust;
+ act->input.opt_pubfile = opt_pubfile;
+ act->input.opt_secfile = opt_secfile;
+}
+
+void GpgOp::Private::eventReady(const GpgOp::Event &e)
+{
+ eventList += e;
+ sync.conditionMet();
+}
+
+void GpgOp::Private::eventReady(GpgOp::Event::Type type)
+{
+ GpgOp::Event e;
+ e.type = type;
+ eventReady(e);
+}
+
+void GpgOp::Private::eventReady(GpgOp::Event::Type type, int written)
+{
+ GpgOp::Event e;
+ e.type = type;
+ e.written = written;
+ eventReady(e);
+}
+
+void GpgOp::Private::eventReady(GpgOp::Event::Type type, const QString &keyId)
+{
+ GpgOp::Event e;
+ e.type = type;
+ e.keyId = keyId;
+ eventReady(e);
+}
+
+void GpgOp::Private::act_readyRead()
+{
+ if(waiting)
+ eventReady(GpgOp::Event::ReadyRead);
+ else
+ emit q->readyRead();
+}
+
+void GpgOp::Private::act_bytesWritten(int bytes)
+{
+ if(waiting)
+ eventReady(GpgOp::Event::BytesWritten, bytes);
+ else
+ emit q->bytesWritten(bytes);
+}
+
+void GpgOp::Private::act_needPassphrase(const QString &keyId)
+{
+ if(waiting)
+ eventReady(GpgOp::Event::NeedPassphrase, keyId);
+ else
+ emit q->needPassphrase(keyId);
+}
+
+void GpgOp::Private::act_needCard()
+{
+ if(waiting)
+ eventReady(GpgOp::Event::NeedCard);
+ else
+ emit q->needCard();
+}
+
+void GpgOp::Private::act_readyReadDiagnosticText()
+{
+ QString s = act->readDiagnosticText();
+ //printf("dtext ready: [%s]\n", qPrintable(s));
+ diagnosticText += s;
+
+ if(waiting)
+ eventReady(GpgOp::Event::ReadyReadDiagnosticText);
+ else
+ emit q->readyReadDiagnosticText();
+}
+
+void GpgOp::Private::act_finished()
+{
+#ifdef GPG_PROFILE
+ if(op == GpgOp::Encrypt)
+ printf("<< doEncrypt: %d >>\n", timer.elapsed());
+#endif
+
+ result = act->read();
+ diagnosticText += act->readDiagnosticText();
+ output = act->output;
+
+ QMap errmap;
+ errmap[GpgOp::ErrorProcess] = "ErrorProcess";
+ errmap[GpgOp::ErrorPassphrase] = "ErrorPassphrase";
+ errmap[GpgOp::ErrorFormat] = "ErrorFormat";
+ errmap[GpgOp::ErrorSignerExpired] = "ErrorSignerExpired";
+ errmap[GpgOp::ErrorEncryptExpired] = "ErrorEncryptExpired";
+ errmap[GpgOp::ErrorEncryptUntrusted] = "ErrorEncryptUntrusted";
+ errmap[GpgOp::ErrorEncryptInvalid] = "ErrorEncryptInvalid";
+ errmap[GpgOp::ErrorDecryptNoKey] = "ErrorDecryptNoKey";
+ errmap[GpgOp::ErrorUnknown] = "ErrorUnknown";
+ if(output.success)
+ diagnosticText += "GpgAction success\n";
+ else
+ diagnosticText += QString("GpgAction error: %1\n").arg(errmap[output.errorCode]);
+
+ if(output.wasSigned)
+ {
+ QString s;
+ if(output.verifyResult == GpgOp::VerifyGood)
+ s = "VerifyGood";
+ else if(output.verifyResult == GpgOp::VerifyBad)
+ s = "VerifyBad";
+ else
+ s = "VerifyNoKey";
+ diagnosticText += QString("wasSigned: verifyResult: %1\n").arg(s);
+ }
+
+ //printf("diagnosticText:\n%s", qPrintable(diagnosticText));
+
+ reset(ResetSession);
+
+ if(waiting)
+ eventReady(GpgOp::Event::Finished);
+ else
+ emit q->finished();
+}
+
+GpgOp::GpgOp(const QString &bin, QObject *parent)
+ :QObject(parent)
+{
+ d = new Private(this);
+ d->bin = bin;
+}
+
+GpgOp::~GpgOp()
+{
+ delete d;
+}
+
+void GpgOp::reset()
+{
+ d->reset(ResetAll);
+}
+
+bool GpgOp::isActive() const
+{
+ return (d->act ? true : false);
+}
+
+GpgOp::Type GpgOp::op() const
+{
+ return d->op;
+}
+
+void GpgOp::setAsciiFormat(bool b)
+{
+ d->opt_ascii = b;
+}
+
+void GpgOp::setDisableAgent(bool b)
+{
+ d->opt_noagent = b;
+}
+
+void GpgOp::setAlwaysTrust(bool b)
+{
+ d->opt_alwaystrust = b;
+}
+
+void GpgOp::setKeyrings(const QString &pubfile, const QString &secfile)
+{
+ d->opt_pubfile = pubfile;
+ d->opt_secfile = secfile;
+}
+
+void GpgOp::doCheck()
+{
+ d->make_act(Check);
+ d->act->start();
+}
+
+void GpgOp::doSecretKeyringFile()
+{
+ d->make_act(SecretKeyringFile);
+ d->act->start();
+}
+
+void GpgOp::doPublicKeyringFile()
+{
+ d->make_act(PublicKeyringFile);
+ d->act->start();
+}
+
+void GpgOp::doSecretKeys()
+{
+ d->make_act(SecretKeys);
+ d->act->start();
+}
+
+void GpgOp::doPublicKeys()
+{
+ d->make_act(PublicKeys);
+ d->act->start();
+}
+
+void GpgOp::doEncrypt(const QStringList &recip_ids)
+{
+#ifdef GPG_PROFILE
+ d->timer.start();
+ printf("<< doEncrypt >>\n");
+#endif
+
+ d->make_act(Encrypt);
+ d->act->input.recip_ids = recip_ids;
+ d->act->start();
+}
+
+void GpgOp::doDecrypt()
+{
+ d->make_act(Decrypt);
+ d->act->start();
+}
+
+void GpgOp::doSign(const QString &signer_id)
+{
+ d->make_act(Sign);
+ d->act->input.signer_id = signer_id;
+ d->act->start();
+}
+
+void GpgOp::doSignAndEncrypt(const QString &signer_id, const QStringList &recip_ids)
+{
+ d->make_act(SignAndEncrypt);
+ d->act->input.signer_id = signer_id;
+ d->act->input.recip_ids = recip_ids;
+ d->act->start();
+}
+
+void GpgOp::doSignClearsign(const QString &signer_id)
+{
+ d->make_act(SignClearsign);
+ d->act->input.signer_id = signer_id;
+ d->act->start();
+}
+
+void GpgOp::doSignDetached(const QString &signer_id)
+{
+ d->make_act(SignDetached);
+ d->act->input.signer_id = signer_id;
+ d->act->start();
+}
+
+void GpgOp::doVerify()
+{
+ d->make_act(Verify);
+ d->act->start();
+}
+
+void GpgOp::doVerifyDetached(const QByteArray &sig)
+{
+ d->make_act(VerifyDetached);
+ d->act->input.sig = sig;
+ d->act->start();
+}
+
+void GpgOp::doImport(const QByteArray &in)
+{
+ d->make_act(Import);
+ d->act->input.inkey = in;
+ d->act->start();
+}
+
+void GpgOp::doExport(const QString &key_id)
+{
+ d->make_act(Export);
+ d->act->input.export_key_id = key_id;
+ d->act->start();
+}
+
+void GpgOp::doDeleteKey(const QString &key_fingerprint)
+{
+ d->make_act(DeleteKey);
+ d->act->input.delete_key_fingerprint = key_fingerprint;
+ d->act->start();
+}
+
+#ifdef QPIPE_SECURE
+void GpgOp::submitPassphrase(const QCA::SecureArray &a)
+#else
+void GpgOp::submitPassphrase(const QByteArray &a)
+#endif
+{
+ d->act->submitPassphrase(a);
+}
+
+void GpgOp::cardOkay()
+{
+ d->act->cardOkay();
+}
+
+QByteArray GpgOp::read()
+{
+ if(d->act)
+ {
+ return d->act->read();
+ }
+ else
+ {
+ QByteArray a = d->result;
+ d->result.clear();
+ return a;
+ }
+}
+
+void GpgOp::write(const QByteArray &in)
+{
+ d->act->write(in);
+}
+
+void GpgOp::endWrite()
+{
+ d->act->endWrite();
+}
+
+QString GpgOp::readDiagnosticText()
+{
+ QString s = d->diagnosticText;
+ d->diagnosticText = QString();
+ return s;
+}
+
+GpgOp::Event GpgOp::waitForEvent(int msecs)
+{
+ if(!d->eventList.isEmpty())
+ return d->eventList.takeFirst();
+
+ if(!d->act)
+ return GpgOp::Event();
+
+ d->waiting = true;
+ d->sync.waitForCondition(msecs);
+ d->waiting = false;
+ if(!d->eventList.isEmpty())
+ return d->eventList.takeFirst();
+ else
+ return GpgOp::Event();
+}
+
+bool GpgOp::success() const
+{
+ return d->output.success;
+}
+
+GpgOp::Error GpgOp::errorCode() const
+{
+ return d->output.errorCode;
+}
+
+GpgOp::KeyList GpgOp::keys() const
+{
+ return d->output.keys;
+}
+
+QString GpgOp::keyringFile() const
+{
+ return d->output.keyringFile;
+}
+
+QString GpgOp::encryptedToId() const
+{
+ return d->output.encryptedToId;
+}
+
+bool GpgOp::wasSigned() const
+{
+ return d->output.wasSigned;
+}
+
+QString GpgOp::signerId() const
+{
+ return d->output.signerId;
+}
+
+QDateTime GpgOp::timestamp() const
+{
+ return d->output.timestamp;
+}
+
+GpgOp::VerifyResult GpgOp::verifyResult() const
+{
+ return d->output.verifyResult;
+}
+
+}
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgop.h qca2-2.1.0/plugins/qca-gnupg/gpgop.h
--- qca2-2.0.3/plugins/qca-gnupg/gpgop.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgop.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2003-2005 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#ifndef GPGOP_H
+#define GPGOP_H
+
+#include
+#include "qpipe.h"
+
+namespace gpgQCAPlugin {
+
+class GpgOp : public QObject
+{
+ Q_OBJECT
+public:
+ enum Type
+ {
+ Check, // --version
+ SecretKeyringFile, // --list-secret-keys
+ PublicKeyringFile, // --list-public-keys
+ SecretKeys, // --fixed-list-mode --with-colons --list-secret-keys
+ PublicKeys, // --fixed-list-mode --with-colons --list-public-keys
+ Encrypt, // --encrypt
+ Decrypt, // --decrypt
+ Sign, // --sign
+ SignAndEncrypt, // --sign --encrypt
+ SignClearsign, // --clearsign
+ SignDetached, // --detach-sign
+ Verify, // --verify
+ VerifyDetached, // --verify
+ Import, // --import
+ Export, // --export
+ DeleteKey // --delete-key
+ };
+
+ enum VerifyResult
+ {
+ VerifyGood, // good sig
+ VerifyBad, // bad sig
+ VerifyNoKey // we don't have signer's public key
+ };
+
+ enum Error
+ {
+ ErrorProcess, // startup, process, or ipc error
+ ErrorPassphrase, // passphrase was either wrong or not provided
+ ErrorFormat, // input format was bad
+ ErrorSignerExpired, // signing key is expired
+ ErrorEncryptExpired, // encrypting key is expired
+ ErrorEncryptUntrusted, // encrypting key is untrusted
+ ErrorEncryptInvalid, // encrypting key is invalid in some way
+ ErrorDecryptNoKey, // missing decrypt key
+ ErrorUnknown, // other error
+ ErrorSignerRevoked, // signing key is revoked
+ ErrorSignatureExpired, // signature is expired
+ ErrorEncryptRevoked // encrypting key is revoked
+ };
+
+ class Event
+ {
+ public:
+ enum Type
+ {
+ None,
+ ReadyRead,
+ BytesWritten,
+ Finished,
+ NeedPassphrase,
+ NeedCard,
+ ReadyReadDiagnosticText
+ };
+
+ Type type;
+ int written; // BytesWritten
+ QString keyId; // NeedPassphrase
+
+ Event() : type(None), written(0) {}
+ };
+
+ class KeyItem
+ {
+ public:
+ enum Type
+ {
+ RSA,
+ DSA,
+ ElGamal,
+ Unknown
+ };
+
+ enum Caps
+ {
+ Encrypt = 0x01,
+ Sign = 0x02,
+ Certify = 0x04,
+ Auth = 0x08
+ };
+
+ QString id;
+ Type type;
+ int bits;
+ QDateTime creationDate;
+ QDateTime expirationDate;
+ int caps; // flags OR'd together
+ QString fingerprint;
+
+ KeyItem() : type(Unknown), bits(0), caps(0) {}
+ };
+
+ class Key
+ {
+ public:
+ QList keyItems; // first item is primary
+ QStringList userIds;
+ bool isTrusted;
+
+ Key() : isTrusted(false) {}
+ };
+ typedef QList KeyList;
+
+ explicit GpgOp(const QString &bin, QObject *parent = 0);
+ ~GpgOp();
+
+ void reset();
+
+ bool isActive() const;
+ Type op() const;
+
+ void setAsciiFormat(bool b);
+ void setDisableAgent(bool b);
+ void setAlwaysTrust(bool b);
+ void setKeyrings(const QString &pubfile, const QString &secfile); // for keylists and import
+
+ void doCheck();
+ void doSecretKeyringFile();
+ void doPublicKeyringFile();
+ void doSecretKeys();
+ void doPublicKeys();
+ void doEncrypt(const QStringList &recip_ids);
+ void doDecrypt();
+ void doSign(const QString &signer_id);
+ void doSignAndEncrypt(const QString &signer_id, const QStringList &recip_ids);
+ void doSignClearsign(const QString &signer_id);
+ void doSignDetached(const QString &signer_id);
+ void doVerify();
+ void doVerifyDetached(const QByteArray &sig);
+ void doImport(const QByteArray &in);
+ void doExport(const QString &key_id);
+ void doDeleteKey(const QString &key_fingerprint);
+
+#ifdef QPIPE_SECURE
+ void submitPassphrase(const QCA::SecureArray &a);
+#else
+ void submitPassphrase(const QByteArray &a);
+#endif
+ void cardOkay();
+
+ // for encrypt, decrypt, sign, verify, export
+ QByteArray read();
+ void write(const QByteArray &in);
+ void endWrite();
+
+ QString readDiagnosticText();
+
+ // for synchronous operation
+ Event waitForEvent(int msecs = -1);
+
+ // results
+ bool success() const;
+ Error errorCode() const;
+ KeyList keys() const; // Keys
+ QString keyringFile() const; // KeyringFile
+ QString encryptedToId() const; // Decrypt (for ErrorDecryptNoKey)
+ bool wasSigned() const; // Decrypt
+ QString signerId() const; // Verify
+ QDateTime timestamp() const; // Verify
+ VerifyResult verifyResult() const; // Verify
+
+Q_SIGNALS:
+ void readyRead();
+ void bytesWritten(int bytes);
+ void finished();
+ void needPassphrase(const QString &keyId);
+ void needCard();
+ void readyReadDiagnosticText();
+
+private:
+ class Private;
+ friend class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgop_p.h qca2-2.1.0/plugins/qca-gnupg/gpgop_p.h
--- qca2-2.0.3/plugins/qca-gnupg/gpgop_p.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgop_p.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2003-2005 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#pragma once
+
+#include "gpgop.h"
+#include "gpgaction.h"
+#include
+
+namespace gpgQCAPlugin {
+
+enum ResetMode
+{
+ ResetSession = 0,
+ ResetSessionAndData = 1,
+ ResetAll = 2
+};
+
+class GpgOp::Private : public QObject
+{
+ Q_OBJECT
+public:
+ QCA::Synchronizer sync;
+ GpgOp *q;
+ GpgAction *act;
+ QString bin;
+ GpgOp::Type op;
+ GpgAction::Output output;
+ QByteArray result;
+ QString diagnosticText;
+ QList eventList;
+ bool waiting;
+
+ bool opt_ascii, opt_noagent, opt_alwaystrust;
+ QString opt_pubfile, opt_secfile;
+
+#ifdef GPG_PROFILE
+ QTime timer;
+#endif
+
+ Private(GpgOp *_q);
+ ~Private();
+ void reset(ResetMode mode);
+ void make_act(GpgOp::Type _op);
+ void eventReady(const GpgOp::Event &e);
+ void eventReady(GpgOp::Event::Type type);
+ void eventReady(GpgOp::Event::Type type, int written);
+ void eventReady(GpgOp::Event::Type type, const QString &keyId);
+
+public slots:
+ void act_readyRead();
+ void act_bytesWritten(int bytes);
+ void act_needPassphrase(const QString &keyId);
+ void act_needCard();
+ void act_readyReadDiagnosticText();
+ void act_finished();
+};
+
+} // namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgproc/gpgproc.cpp qca2-2.1.0/plugins/qca-gnupg/gpgproc/gpgproc.cpp
--- qca2-2.0.3/plugins/qca-gnupg/gpgproc/gpgproc.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgproc/gpgproc.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,682 @@
+/*
+ * Copyright (C) 2003-2007 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#include "gpgproc_p.h"
+
+#ifdef Q_OS_MAC
+#define QT_PIPE_HACK
+#endif
+
+
+using namespace QCA;
+
+namespace gpgQCAPlugin {
+
+void releaseAndDeleteLater(QObject *owner, QObject *obj)
+{
+ obj->disconnect(owner);
+ obj->setParent(0);
+ obj->deleteLater();
+}
+
+
+GPGProc::Private::Private(GPGProc *_q)
+ : QObject(_q)
+ , q(_q)
+ , pipeAux(this)
+ , pipeCommand(this)
+ , pipeStatus(this)
+ , startTrigger(this)
+ , doneTrigger(this)
+{
+ qRegisterMetaType("gpgQCAPlugin::GPGProc::Error");
+
+ proc = 0;
+#ifdef QPROC_SIGNAL_RELAY
+ proc_relay = 0;
+#endif
+ startTrigger.setSingleShot(true);
+ doneTrigger.setSingleShot(true);
+
+ connect(&pipeAux.writeEnd(), SIGNAL(bytesWritten(int)), SLOT(aux_written(int)));
+ connect(&pipeAux.writeEnd(), SIGNAL(error(QCA::QPipeEnd::Error)), SLOT(aux_error(QCA::QPipeEnd::Error)));
+ connect(&pipeCommand.writeEnd(), SIGNAL(bytesWritten(int)), SLOT(command_written(int)));
+ connect(&pipeCommand.writeEnd(), SIGNAL(error(QCA::QPipeEnd::Error)), SLOT(command_error(QCA::QPipeEnd::Error)));
+ connect(&pipeStatus.readEnd(), SIGNAL(readyRead()), SLOT(status_read()));
+ connect(&pipeStatus.readEnd(), SIGNAL(error(QCA::QPipeEnd::Error)), SLOT(status_error(QCA::QPipeEnd::Error)));
+ connect(&startTrigger, SIGNAL(timeout()), SLOT(doStart()));
+ connect(&doneTrigger, SIGNAL(timeout()), SLOT(doTryDone()));
+
+ reset(ResetSessionAndData);
+}
+
+GPGProc::Private::~Private()
+{
+ reset(ResetSession);
+}
+
+void GPGProc::Private::closePipes()
+{
+#ifdef QT_PIPE_HACK
+ pipeAux.readEnd().reset();
+ pipeCommand.readEnd().reset();
+ pipeStatus.writeEnd().reset();
+#endif
+
+ pipeAux.reset();
+ pipeCommand.reset();
+ pipeStatus.reset();
+}
+
+void GPGProc::Private::reset(ResetMode mode)
+{
+#ifndef QT_PIPE_HACK
+ closePipes();
+#endif
+
+ if(proc)
+ {
+ proc->disconnect(this);
+
+ if(proc->state() != QProcess::NotRunning)
+ {
+ // Before try to correct end proccess
+ // Terminate if failed
+ proc->close();
+ bool finished = proc->waitForFinished(5000);
+ if (!finished)
+ proc->terminate();
+ }
+
+ proc->setParent(0);
+#ifdef QPROC_SIGNAL_RELAY
+ releaseAndDeleteLater(this, proc_relay);
+ proc_relay = 0;
+ delete proc; // should be safe to do thanks to relay
+#else
+ proc->deleteLater();
+#endif
+ proc = 0;
+ }
+
+#ifdef QT_PIPE_HACK
+ closePipes();
+#endif
+
+ startTrigger.stop();
+ doneTrigger.stop();
+
+ pre_stdin.clear();
+ pre_aux.clear();
+ pre_command.clear();
+ pre_stdin_close = false;
+ pre_aux_close = false;
+ pre_command_close = false;
+
+ need_status = false;
+ fin_process = false;
+ fin_status = false;
+
+ if(mode >= ResetSessionAndData)
+ {
+ statusBuf.clear();
+ statusLines.clear();
+ leftover_stdout.clear();
+ leftover_stderr.clear();
+ error = GPGProc::FailedToStart;
+ exitCode = -1;
+ }
+}
+
+bool GPGProc::Private::setupPipes(bool makeAux)
+{
+ if(makeAux && !pipeAux.create())
+ {
+ closePipes();
+ emit q->debug("Error creating pipeAux");
+ return false;
+ }
+
+#ifdef QPIPE_SECURE
+ if(!pipeCommand.create(true)) // secure
+#else
+ if(!pipeCommand.create())
+#endif
+ {
+ closePipes();
+ emit q->debug("Error creating pipeCommand");
+ return false;
+ }
+
+ if(!pipeStatus.create())
+ {
+ closePipes();
+ emit q->debug("Error creating pipeStatus");
+ return false;
+ }
+
+ return true;
+}
+
+void GPGProc::Private::setupArguments()
+{
+ QStringList fullargs;
+ fullargs += "--no-tty";
+
+ if(mode == ExtendedMode)
+ {
+ fullargs += "--enable-special-filenames";
+
+ fullargs += "--status-fd";
+ fullargs += QString::number(pipeStatus.writeEnd().idAsInt());
+
+ fullargs += "--command-fd";
+ fullargs += QString::number(pipeCommand.readEnd().idAsInt());
+ }
+
+ for(int n = 0; n < args.count(); ++n)
+ {
+ QString a = args[n];
+ if(mode == ExtendedMode && a == "-&?")
+ fullargs += QString("-&") + QString::number(pipeAux.readEnd().idAsInt());
+ else
+ fullargs += a;
+ }
+
+ QString fullcmd = fullargs.join(" ");
+ emit q->debug(QString("Running: [") + bin + ' ' + fullcmd + ']');
+
+ args = fullargs;
+}
+
+void GPGProc::Private::doStart()
+{
+#ifdef Q_OS_WIN
+ // Note: for unix, inheritability is set in SProcess
+ if(pipeAux.readEnd().isValid())
+ pipeAux.readEnd().setInheritable(true);
+ if(pipeCommand.readEnd().isValid())
+ pipeCommand.readEnd().setInheritable(true);
+ if(pipeStatus.writeEnd().isValid())
+ pipeStatus.writeEnd().setInheritable(true);
+#endif
+
+ setupArguments();
+
+ proc->start(bin, args);
+ proc->waitForStarted();
+
+ pipeAux.readEnd().close();
+ pipeCommand.readEnd().close();
+ pipeStatus.writeEnd().close();
+}
+
+void GPGProc::Private::aux_written(int x)
+{
+ emit q->bytesWrittenAux(x);
+}
+
+void GPGProc::Private::aux_error(QCA::QPipeEnd::Error)
+{
+ emit q->debug("Aux: Pipe error");
+ reset(ResetSession);
+ emit q->error(GPGProc::ErrorWrite);
+}
+
+void GPGProc::Private::command_written(int x)
+{
+ emit q->bytesWrittenCommand(x);
+}
+
+void GPGProc::Private::command_error(QCA::QPipeEnd::Error)
+{
+ emit q->debug("Command: Pipe error");
+ reset(ResetSession);
+ emit q->error(GPGProc::ErrorWrite);
+}
+
+void GPGProc::Private::status_read()
+{
+ if(readAndProcessStatusData())
+ emit q->readyReadStatusLines();
+}
+
+void GPGProc::Private::status_error(QCA::QPipeEnd::Error e)
+{
+ if(e == QPipeEnd::ErrorEOF)
+ emit q->debug("Status: Closed (EOF)");
+ else
+ emit q->debug("Status: Closed (gone)");
+
+ fin_status = true;
+ doTryDone();
+}
+
+void GPGProc::Private::proc_started()
+{
+ emit q->debug("Process started");
+
+ // Note: we don't close these here anymore. instead we
+ // do it just after calling proc->start().
+ // close these, we don't need them
+ /*pipeAux.readEnd().close();
+ pipeCommand.readEnd().close();
+ pipeStatus.writeEnd().close();*/
+
+ // do the pre* stuff
+ if(!pre_stdin.isEmpty())
+ {
+ proc->write(pre_stdin);
+ pre_stdin.clear();
+ }
+ if(!pre_aux.isEmpty())
+ {
+ pipeAux.writeEnd().write(pre_aux);
+ pre_aux.clear();
+ }
+ if(!pre_command.isEmpty())
+ {
+#ifdef QPIPE_SECURE
+ pipeCommand.writeEnd().writeSecure(pre_command);
+#else
+ pipeCommand.writeEnd().write(pre_command);
+#endif
+ pre_command.clear();
+ }
+
+ if(pre_stdin_close)
+ {
+ proc->waitForBytesWritten();
+ proc->closeWriteChannel();
+ }
+
+ if(pre_aux_close)
+ pipeAux.writeEnd().close();
+ if(pre_command_close)
+ pipeCommand.writeEnd().close();
+}
+
+void GPGProc::Private::proc_readyReadStandardOutput()
+{
+ emit q->readyReadStdout();
+}
+
+void GPGProc::Private::proc_readyReadStandardError()
+{
+ emit q->readyReadStderr();
+}
+
+void GPGProc::Private::proc_bytesWritten(qint64 lx)
+{
+ int x = (int)lx;
+ emit q->bytesWrittenStdin(x);
+}
+
+void GPGProc::Private::proc_finished(int x)
+{
+ emit q->debug(QString("Process finished: %1").arg(x));
+ exitCode = x;
+
+ fin_process = true;
+ fin_process_success = true;
+
+ if(need_status && !fin_status)
+ {
+ pipeStatus.readEnd().finalize();
+ fin_status = true;
+ if(readAndProcessStatusData())
+ {
+ doneTrigger.start();
+ emit q->readyReadStatusLines();
+ return;
+ }
+ }
+
+ doTryDone();
+}
+
+void GPGProc::Private::proc_error(QProcess::ProcessError x)
+{
+ QMap errmap;
+ errmap[QProcess::FailedToStart] = "FailedToStart";
+ errmap[QProcess::Crashed] = "Crashed";
+ errmap[QProcess::Timedout] = "Timedout";
+ errmap[QProcess::WriteError] = "WriteError";
+ errmap[QProcess::ReadError] = "ReadError";
+ errmap[QProcess::UnknownError] = "UnknownError";
+
+ emit q->debug(QString("Process error: %1").arg(errmap[x]));
+
+ if(x == QProcess::FailedToStart)
+ error = GPGProc::FailedToStart;
+ else if(x == QProcess::WriteError)
+ error = GPGProc::ErrorWrite;
+ else
+ error = GPGProc::UnexpectedExit;
+
+ fin_process = true;
+ fin_process_success = false;
+
+#ifdef QT_PIPE_HACK
+ // If the process fails to start, then the ends of the pipes
+ // intended for the child process are still open. Some Mac
+ // users experience a lockup if we close our ends of the pipes
+ // when the child's ends are still open. If we ensure the
+ // child's ends are closed, we prevent this lockup. I have no
+ // idea why the problem even happens or why this fix should
+ // work.
+ pipeAux.readEnd().reset();
+ pipeCommand.readEnd().reset();
+ pipeStatus.writeEnd().reset();
+#endif
+
+ if(need_status && !fin_status)
+ {
+ pipeStatus.readEnd().finalize();
+ fin_status = true;
+ if(readAndProcessStatusData())
+ {
+ doneTrigger.start();
+ emit q->readyReadStatusLines();
+ return;
+ }
+ }
+
+ doTryDone();
+}
+
+void GPGProc::Private::doTryDone()
+{
+ if(!fin_process)
+ return;
+
+ if(need_status && !fin_status)
+ return;
+
+ emit q->debug("Done");
+
+ // get leftover data
+ proc->setReadChannel(QProcess::StandardOutput);
+ leftover_stdout = proc->readAll();
+
+ proc->setReadChannel(QProcess::StandardError);
+ leftover_stderr = proc->readAll();
+
+ reset(ResetSession);
+ if(fin_process_success)
+ emit q->finished(exitCode);
+ else
+ emit q->error(error);
+}
+
+bool GPGProc::Private::readAndProcessStatusData()
+{
+ QByteArray buf = pipeStatus.readEnd().read();
+ if(buf.isEmpty())
+ return false;
+
+ return processStatusData(buf);
+}
+
+// return true if there are newly parsed lines available
+bool GPGProc::Private::processStatusData(const QByteArray &buf)
+{
+ statusBuf.append(buf);
+
+ // extract all lines
+ QStringList list;
+ while(1)
+ {
+ int n = statusBuf.indexOf('\n');
+ if(n == -1)
+ break;
+
+ // extract the string from statusbuf
+ ++n;
+ char *p = (char *)statusBuf.data();
+ QByteArray cs(p, n);
+ int newsize = statusBuf.size() - n;
+ memmove(p, p + n, newsize);
+ statusBuf.resize(newsize);
+
+ // convert to string without newline
+ QString str = QString::fromUtf8(cs);
+ str.truncate(str.length() - 1);
+
+ // ensure it has a proper header
+ if(str.left(9) != "[GNUPG:] ")
+ continue;
+
+ // take it off
+ str = str.mid(9);
+
+ // add to the list
+ list += str;
+ }
+
+ if(list.isEmpty())
+ return false;
+
+ statusLines += list;
+ return true;
+}
+
+GPGProc::GPGProc(QObject *parent)
+:QObject(parent)
+{
+ d = new Private(this);
+}
+
+GPGProc::~GPGProc()
+{
+ delete d;
+}
+
+void GPGProc::reset()
+{
+ d->reset(ResetAll);
+}
+
+bool GPGProc::isActive() const
+{
+ return (d->proc ? true : false);
+}
+
+void GPGProc::start(const QString &bin, const QStringList &args, Mode mode)
+{
+ if(isActive())
+ d->reset(ResetSessionAndData);
+
+ if(mode == ExtendedMode)
+ {
+ if(!d->setupPipes(args.contains("-&?")))
+ {
+ d->error = FailedToStart;
+
+ // emit later
+ QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(gpgQCAPlugin::GPGProc::Error, d->error));
+ return;
+ }
+
+ d->need_status = true;
+
+ emit debug("Pipe setup complete");
+ }
+
+ d->proc = new SProcess(d);
+
+#ifdef Q_OS_UNIX
+ QList plist;
+ if(d->pipeAux.readEnd().isValid())
+ plist += d->pipeAux.readEnd().id();
+ if(d->pipeCommand.readEnd().isValid())
+ plist += d->pipeCommand.readEnd().id();
+ if(d->pipeStatus.writeEnd().isValid())
+ plist += d->pipeStatus.writeEnd().id();
+ d->proc->setInheritPipeList(plist);
+#endif
+
+ // enable the pipes we want
+ if(d->pipeAux.writeEnd().isValid())
+ d->pipeAux.writeEnd().enable();
+ if(d->pipeCommand.writeEnd().isValid())
+ d->pipeCommand.writeEnd().enable();
+ if(d->pipeStatus.readEnd().isValid())
+ d->pipeStatus.readEnd().enable();
+
+#ifdef QPROC_SIGNAL_RELAY
+ d->proc_relay = new QProcessSignalRelay(d->proc, d);
+ connect(d->proc_relay, SIGNAL(started()), d, SLOT(proc_started()));
+ connect(d->proc_relay, SIGNAL(readyReadStandardOutput()), d, SLOT(proc_readyReadStandardOutput()));
+ connect(d->proc_relay, SIGNAL(readyReadStandardError()), d, SLOT(proc_readyReadStandardError()));
+ connect(d->proc_relay, SIGNAL(bytesWritten(qint64)), d, SLOT(proc_bytesWritten(qint64)));
+ connect(d->proc_relay, SIGNAL(finished(int)), d, SLOT(proc_finished(int)));
+ connect(d->proc_relay, SIGNAL(error(QProcess::ProcessError)), d, SLOT(proc_error(QProcess::ProcessError)));
+#else
+ connect(d->proc, SIGNAL(started()), d, SLOT(proc_started()));
+ connect(d->proc, SIGNAL(readyReadStandardOutput()), d, SLOT(proc_readyReadStandardOutput()));
+ connect(d->proc, SIGNAL(readyReadStandardError()), d, SLOT(proc_readyReadStandardError()));
+ connect(d->proc, SIGNAL(bytesWritten(qint64)), d, SLOT(proc_bytesWritten(qint64)));
+ connect(d->proc, SIGNAL(finished(int)), d, SLOT(proc_finished(int)));
+ connect(d->proc, SIGNAL(error(QProcess::ProcessError)), d, SLOT(proc_error(QProcess::ProcessError)));
+#endif
+
+ d->bin = bin;
+ d->args = args;
+ d->mode = mode;
+ d->startTrigger.start();
+}
+
+QByteArray GPGProc::readStdout()
+{
+ if(d->proc)
+ {
+ d->proc->setReadChannel(QProcess::StandardOutput);
+ return d->proc->readAll();
+ }
+ else
+ {
+ QByteArray a = d->leftover_stdout;
+ d->leftover_stdout.clear();
+ return a;
+ }
+}
+
+QByteArray GPGProc::readStderr()
+{
+ if(d->proc)
+ {
+ d->proc->setReadChannel(QProcess::StandardError);
+ return d->proc->readAll();
+ }
+ else
+ {
+ QByteArray a = d->leftover_stderr;
+ d->leftover_stderr.clear();
+ return a;
+ }
+}
+
+QStringList GPGProc::readStatusLines()
+{
+ QStringList out = d->statusLines;
+ d->statusLines.clear();
+ return out;
+}
+
+void GPGProc::writeStdin(const QByteArray &a)
+{
+ if(!d->proc || a.isEmpty())
+ return;
+
+ if(d->proc->state() == QProcess::Running)
+ d->proc->write(a);
+ else
+ d->pre_stdin += a;
+}
+
+void GPGProc::writeAux(const QByteArray &a)
+{
+ if(!d->proc || a.isEmpty())
+ return;
+
+ if(d->proc->state() == QProcess::Running)
+ d->pipeAux.writeEnd().write(a);
+ else
+ d->pre_aux += a;
+}
+
+#ifdef QPIPE_SECURE
+void GPGProc::writeCommand(const SecureArray &a)
+#else
+void GPGProc::writeCommand(const QByteArray &a)
+#endif
+{
+ if(!d->proc || a.isEmpty())
+ return;
+
+ if(d->proc->state() == QProcess::Running)
+#ifdef QPIPE_SECURE
+ d->pipeCommand.writeEnd().writeSecure(a);
+#else
+ d->pipeCommand.writeEnd().write(a);
+#endif
+ else
+ d->pre_command += a;
+}
+
+void GPGProc::closeStdin()
+{
+ if(!d->proc)
+ return;
+
+ if(d->proc->state() == QProcess::Running)
+ {
+ d->proc->waitForBytesWritten();
+ d->proc->closeWriteChannel();
+ }
+ else
+ {
+ d->pre_stdin_close = true;
+ }
+}
+
+void GPGProc::closeAux()
+{
+ if(!d->proc)
+ return;
+
+ if(d->proc->state() == QProcess::Running)
+ d->pipeAux.writeEnd().close();
+ else
+ d->pre_aux_close = true;
+}
+
+void GPGProc::closeCommand()
+{
+ if(!d->proc)
+ return;
+
+ if(d->proc->state() == QProcess::Running)
+ d->pipeCommand.writeEnd().close();
+ else
+ d->pre_command_close = true;
+}
+
+}
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgproc/gpgproc.h qca2-2.1.0/plugins/qca-gnupg/gpgproc/gpgproc.h
--- qca2-2.0.3/plugins/qca-gnupg/gpgproc/gpgproc.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgproc/gpgproc.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2003-2005 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#ifndef GPGPROC_H
+#define GPGPROC_H
+
+#include "qpipe.h"
+
+namespace gpgQCAPlugin {
+
+// GPGProc - executes gpg and provides access to all 6 channels. NormalMode
+// enables stdout, stderr, and stdin. ExtendedMode has those 3 plus status
+// aux, and command. The aux channel is connected to the '-&?' argument.
+// The debug() signal, as well as stderr, can be used for diagnostic text.
+class GPGProc : public QObject
+{
+ Q_OBJECT
+public:
+ enum Error { FailedToStart, UnexpectedExit, ErrorWrite };
+ enum Mode { NormalMode, ExtendedMode };
+ GPGProc(QObject *parent = 0);
+ ~GPGProc();
+
+ void reset();
+
+ bool isActive() const;
+ void start(const QString &bin, const QStringList &args, Mode m = ExtendedMode);
+
+ QByteArray readStdout();
+ QByteArray readStderr();
+ QStringList readStatusLines();
+ void writeStdin(const QByteArray &a);
+ void writeAux(const QByteArray &a);
+#ifdef QPIPE_SECURE
+ void writeCommand(const QCA::SecureArray &a);
+#else
+ void writeCommand(const QByteArray &a);
+#endif
+ void closeStdin();
+ void closeAux();
+ void closeCommand();
+
+Q_SIGNALS:
+ void error(gpgQCAPlugin::GPGProc::Error error);
+ void finished(int exitCode);
+ void readyReadStdout();
+ void readyReadStderr();
+ void readyReadStatusLines();
+ void bytesWrittenStdin(int bytes);
+ void bytesWrittenAux(int bytes);
+ void bytesWrittenCommand(int bytes);
+ void debug(const QString &str); // not signal-safe
+
+private:
+ class Private;
+ friend class Private;
+ Private *d;
+};
+
+}
+
+#endif
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgproc/gpgproc_p.h qca2-2.1.0/plugins/qca-gnupg/gpgproc/gpgproc_p.h
--- qca2-2.0.3/plugins/qca-gnupg/gpgproc/gpgproc_p.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgproc/gpgproc_p.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2003-2007 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#pragma once
+
+#define QPROC_SIGNAL_RELAY
+
+#include "qpipe.h"
+#include "sprocess.h"
+#include "gpgproc.h"
+#include
+
+namespace gpgQCAPlugin {
+
+class QProcessSignalRelay : public QObject
+{
+ Q_OBJECT
+public:
+ QProcessSignalRelay(QProcess *proc, QObject *parent = 0)
+ :QObject(parent)
+ {
+ qRegisterMetaType("QProcess::ProcessError");
+ connect(proc, SIGNAL(started()), SLOT(proc_started()), Qt::QueuedConnection);
+ connect(proc, SIGNAL(readyReadStandardOutput()), SLOT(proc_readyReadStandardOutput()), Qt::QueuedConnection);
+ connect(proc, SIGNAL(readyReadStandardError()), SLOT(proc_readyReadStandardError()), Qt::QueuedConnection);
+ connect(proc, SIGNAL(bytesWritten(qint64)), SLOT(proc_bytesWritten(qint64)), Qt::QueuedConnection);
+ connect(proc, SIGNAL(finished(int)), SLOT(proc_finished(int)), Qt::QueuedConnection);
+ connect(proc, SIGNAL(error(QProcess::ProcessError)), SLOT(proc_error(QProcess::ProcessError)), Qt::QueuedConnection);
+ }
+
+signals:
+ void started();
+ void readyReadStandardOutput();
+ void readyReadStandardError();
+ void bytesWritten(qint64);
+ void finished(int);
+ void error(QProcess::ProcessError);
+
+public slots:
+ void proc_started()
+ {
+ emit started();
+ }
+
+ void proc_readyReadStandardOutput()
+ {
+ emit readyReadStandardOutput();
+ }
+
+ void proc_readyReadStandardError()
+ {
+ emit readyReadStandardError();
+ }
+
+ void proc_bytesWritten(qint64 x)
+ {
+ emit bytesWritten(x);
+ }
+
+ void proc_finished(int x)
+ {
+ emit finished(x);
+ }
+
+ void proc_error(QProcess::ProcessError x)
+ {
+ emit error(x);
+ }
+};
+
+enum ResetMode
+{
+ ResetSession = 0,
+ ResetSessionAndData = 1,
+ ResetAll = 2
+};
+
+class GPGProc::Private : public QObject
+{
+ Q_OBJECT
+public:
+ GPGProc *q;
+ QString bin;
+ QStringList args;
+ GPGProc::Mode mode;
+ SProcess *proc;
+#ifdef QPROC_SIGNAL_RELAY
+ QProcessSignalRelay *proc_relay;
+#endif
+ QCA::QPipe pipeAux, pipeCommand, pipeStatus;
+ QByteArray statusBuf;
+ QStringList statusLines;
+ GPGProc::Error error;
+ int exitCode;
+ QCA::SafeTimer startTrigger, doneTrigger;
+
+ QByteArray pre_stdin, pre_aux;
+#ifdef QPIPE_SECURE
+ QCA::SecureArray pre_command;
+#else
+ QByteArray pre_command;
+#endif
+ bool pre_stdin_close, pre_aux_close, pre_command_close;
+
+ bool need_status, fin_process, fin_process_success, fin_status;
+ QByteArray leftover_stdout;
+ QByteArray leftover_stderr;
+
+ Private(GPGProc *_q);
+ ~Private();
+ void closePipes();
+ void reset(ResetMode mode);
+ bool setupPipes(bool makeAux);
+ void setupArguments();
+
+public slots:
+ void doStart();
+ void aux_written(int x);
+ void aux_error(QCA::QPipeEnd::Error);
+ void command_written(int x);
+ void command_error(QCA::QPipeEnd::Error);
+ void status_read();
+ void status_error(QCA::QPipeEnd::Error e);
+ void proc_started();
+ void proc_readyReadStandardOutput();
+ void proc_readyReadStandardError();
+ void proc_bytesWritten(qint64 lx);
+ void proc_finished(int x);
+ void proc_error(QProcess::ProcessError x);
+ void doTryDone();
+
+private:
+ bool readAndProcessStatusData();
+ // return true if there are newly parsed lines available
+ bool processStatusData(const QByteArray &buf);
+
+
+};
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgproc/README qca2-2.1.0/plugins/qca-gnupg/gpgproc/README
--- qca2-2.0.3/plugins/qca-gnupg/gpgproc/README 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgproc/README 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,8 @@
+GPGProc launches a single instance of GPG and provides a friendly API to
+work with all six possible pipe channels. Theoretically, it should be
+possible to build any GPG front end with it, even though qca-gnupg uses it
+for only a handful of operations. If you are writing a Qt-based GPG front
+end, please use this class.
+
+GPGProc works on both Windows and Unix platforms.
+
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgproc/sprocess.cpp qca2-2.1.0/plugins/qca-gnupg/gpgproc/sprocess.cpp
--- qca2-2.0.3/plugins/qca-gnupg/gpgproc/sprocess.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgproc/sprocess.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2003-2005 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#include "sprocess.h"
+
+#ifdef Q_OS_UNIX
+# include
+# include
+#endif
+
+namespace gpgQCAPlugin {
+
+//----------------------------------------------------------------------------
+// SProcess
+//----------------------------------------------------------------------------
+SProcess::SProcess(QObject *parent)
+:QProcess(parent)
+{
+}
+
+SProcess::~SProcess()
+{
+}
+
+#ifdef Q_OS_UNIX
+void SProcess::setInheritPipeList(const QList &list)
+{
+ pipeList = list;
+}
+
+void SProcess::setupChildProcess()
+{
+ // set the pipes to be inheritable
+ for(int n = 0; n < pipeList.count(); ++n)
+ ::fcntl(pipeList[n], F_SETFD, (::fcntl(pipeList[n], F_GETFD) & ~FD_CLOEXEC));
+}
+#endif
+
+}
diff -Nru qca2-2.0.3/plugins/qca-gnupg/gpgproc/sprocess.h qca2-2.1.0/plugins/qca-gnupg/gpgproc/sprocess.h
--- qca2-2.0.3/plugins/qca-gnupg/gpgproc/sprocess.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/gpgproc/sprocess.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2003-2005 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#ifndef SPROCESS_H
+#define SPROCESS_H
+
+#include
+
+namespace gpgQCAPlugin {
+
+class SProcess : public QProcess
+{
+ Q_OBJECT
+public:
+ SProcess(QObject *parent = 0);
+ ~SProcess();
+
+#ifdef Q_OS_UNIX
+ void setInheritPipeList(const QList &);
+
+protected:
+ virtual void setupChildProcess();
+
+private:
+ QList pipeList;
+#endif
+};
+
+}
+
+#endif
diff -Nru qca2-2.0.3/plugins/qca-gnupg/lineconverter.cpp qca2-2.1.0/plugins/qca-gnupg/lineconverter.cpp
--- qca2-2.0.3/plugins/qca-gnupg/lineconverter.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/lineconverter.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2003-2005 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#include "lineconverter.h"
+
+namespace gpgQCAPlugin {
+
+void LineConverter::setup(LineConverter::Mode m)
+{
+ state = Normal;
+ mode = m;
+ prebytes = 0;
+ list.clear();
+}
+
+QByteArray LineConverter::update(const QByteArray &buf)
+{
+ if(mode == Read)
+ {
+ // Convert buf to UNIX line ending style
+ // If buf ends with '\r' set state to Partival
+
+ QByteArray out;
+
+ if(state == Normal)
+ {
+ out = buf;
+ }
+ else
+ {
+ out.resize(buf.size() + 1);
+ out[0] = '\r';
+ memcpy(out.data() + 1, buf.data(), buf.size());
+ }
+
+ int n = 0;
+ while(1)
+ {
+ n = out.indexOf('\r', n);
+ // not found
+ if(n == -1)
+ {
+ break;
+ }
+ // found, not last character
+ if(n < (buf.size() - 1))
+ {
+ // found windows line ending "\r\n"
+ if(out[n + 1] == '\n')
+ {
+ // clip out the '\r'
+ memmove(out.data() + n, out.data() + n + 1, out.size() - n - 1);
+ out.resize(out.size() - 1);
+ }
+ }
+ // found, last character
+ else
+ {
+ state = Partial;
+ break;
+ }
+ ++n;
+ }
+
+ return out;
+ }
+ else
+ {
+ // On Windows use DOS line ending style.
+ // On UNIX don't do any convertation. Return buf as is.
+#ifdef Q_OS_WIN
+ QByteArray out;
+ int prev = 0;
+ int at = 0;
+
+ while(1)
+ {
+ int n = buf.indexOf('\n', at);
+ if(n == -1)
+ break;
+
+ int chunksize = n - at;
+ int oldsize = out.size();
+ out.resize(oldsize + chunksize + 2);
+ memcpy(out.data() + oldsize, buf.data() + at, chunksize);
+ memcpy(out.data() + oldsize + chunksize, "\r\n", 2);
+
+ list.append(prebytes + n + 1 - prev);
+ prebytes = 0;
+ prev = n;
+
+ at = n + 1;
+ }
+ if(at < buf.size())
+ {
+ int chunksize = buf.size() - at;
+ int oldsize = out.size();
+ out.resize(oldsize + chunksize);
+ memcpy(out.data() + oldsize, buf.data() + at, chunksize);
+ }
+
+ prebytes += buf.size() - prev;
+ return out;
+#else
+ return buf;
+#endif
+ }
+}
+
+QByteArray LineConverter::final()
+{
+ if(mode == Read)
+ {
+ QByteArray out;
+ if(state == Partial)
+ {
+ out.resize(1);
+ out[0] = '\n';
+ }
+ return out;
+ }
+ else
+ {
+ return QByteArray();
+ }
+}
+
+QByteArray LineConverter::process(const QByteArray &buf)
+{
+ return update(buf) + final();
+}
+
+int LineConverter::writtenToActual(int bytes)
+{
+#ifdef Q_OS_WIN
+ int n = 0;
+ int counter = bytes;
+ while(counter > 0)
+ {
+ if(!list.isEmpty() && bytes >= list.first())
+ {
+ ++n;
+ counter -= list.takeFirst();
+ }
+ else
+ {
+ if(list.isEmpty())
+ prebytes -= counter;
+ else
+ list.first() -= counter;
+
+ if(prebytes < 0)
+ {
+ bytes += prebytes;
+ prebytes = 0;
+ }
+
+ break;
+ }
+ }
+ return bytes - n;
+#else
+ return bytes;
+#endif
+}
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/lineconverter.h qca2-2.1.0/plugins/qca-gnupg/lineconverter.h
--- qca2-2.0.3/plugins/qca-gnupg/lineconverter.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/lineconverter.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2003-2005 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#pragma once
+
+#include
+#include
+
+namespace gpgQCAPlugin {
+
+class LineConverter
+{
+public:
+ enum Mode { Read, Write };
+
+ void setup(Mode m);
+ QByteArray update(const QByteArray &buf);
+ QByteArray final();
+ QByteArray process(const QByteArray &buf);
+ int writtenToActual(int bytes);
+
+private:
+ enum State { Normal, Partial };
+ Mode mode;
+ State state;
+ int prebytes;
+ QList list;
+};
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/mykeystoreentry.cpp qca2-2.1.0/plugins/qca-gnupg/mykeystoreentry.cpp
--- qca2-2.0.3/plugins/qca-gnupg/mykeystoreentry.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/mykeystoreentry.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2003-2008 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "mykeystoreentry.h"
+#include "utils.h"
+
+using namespace QCA;
+
+namespace gpgQCAPlugin
+{
+
+MyKeyStoreEntry::MyKeyStoreEntry(const PGPKey &_pub, const PGPKey &_sec, Provider *p) : KeyStoreEntryContext(p)
+{
+ pub = _pub;
+ sec = _sec;
+ if(!sec.isNull())
+ item_type = KeyStoreEntry::TypePGPSecretKey;
+ else
+ item_type = KeyStoreEntry::TypePGPPublicKey;
+}
+
+MyKeyStoreEntry::MyKeyStoreEntry(const MyKeyStoreEntry &from) : KeyStoreEntryContext(from)
+{
+}
+
+MyKeyStoreEntry::~MyKeyStoreEntry()
+{
+}
+
+Provider::Context *MyKeyStoreEntry::clone() const
+{
+ return new MyKeyStoreEntry(*this);
+}
+
+KeyStoreEntry::Type MyKeyStoreEntry::type() const
+{
+ return item_type;
+}
+
+QString MyKeyStoreEntry::name() const
+{
+ return pub.primaryUserId();
+}
+
+QString MyKeyStoreEntry::id() const
+{
+ return pub.keyId();
+}
+
+QString MyKeyStoreEntry::storeId() const
+{
+ return _storeId;
+}
+
+QString MyKeyStoreEntry::storeName() const
+{
+ return _storeName;
+}
+
+PGPKey MyKeyStoreEntry::pgpSecretKey() const
+{
+ return sec;
+}
+
+PGPKey MyKeyStoreEntry::pgpPublicKey() const
+{
+ return pub;
+}
+
+QString MyKeyStoreEntry::serialize() const
+{
+ // we only serialize the key id. this means the keyring
+ // must be available to restore the data
+ QStringList out;
+ out += escape_string("qca-gnupg-1");
+ out += escape_string(pub.keyId());
+ return out.join(":");
+}
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/mykeystoreentry.h qca2-2.1.0/plugins/qca-gnupg/mykeystoreentry.h
--- qca2-2.0.3/plugins/qca-gnupg/mykeystoreentry.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/mykeystoreentry.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2003-2008 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#pragma once
+
+#include "qcaprovider.h"
+
+namespace gpgQCAPlugin
+{
+
+class MyKeyStoreList;
+
+class MyKeyStoreEntry : public QCA::KeyStoreEntryContext
+{
+public:
+ QCA::KeyStoreEntry::Type item_type;
+ QCA::PGPKey pub, sec;
+ QString _storeId, _storeName;
+
+ MyKeyStoreEntry(const QCA::PGPKey &_pub, const QCA::PGPKey &_sec, QCA::Provider *p);
+ MyKeyStoreEntry(const MyKeyStoreEntry &from);
+ ~MyKeyStoreEntry();
+
+ // reimplemented Provider::Context
+ QCA::Provider::Context *clone() const;
+
+ // reimplemented KeyStoreEntryContext
+ QCA::KeyStoreEntry::Type type() const;
+ QString name() const;
+ QString id() const;
+ QString storeId() const;
+ QString storeName() const;
+ QCA::PGPKey pgpSecretKey() const;
+ QCA::PGPKey pgpPublicKey() const;
+ QString serialize() const;
+};
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/mykeystorelist.cpp qca2-2.1.0/plugins/qca-gnupg/mykeystorelist.cpp
--- qca2-2.0.3/plugins/qca-gnupg/mykeystorelist.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/mykeystorelist.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,484 @@
+/*
+ * Copyright (C) 2003-2008 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "mykeystorelist.h"
+#include "utils.h"
+#include "mypgpkeycontext.h"
+#include
+#include
+
+using namespace QCA;
+
+namespace gpgQCAPlugin
+{
+
+Q_GLOBAL_STATIC(QMutex, ksl_mutex)
+
+static MyKeyStoreList *keyStoreList = 0;
+MyKeyStoreList::MyKeyStoreList(Provider *p)
+ : KeyStoreListContext(p)
+ , initialized(false)
+ , gpg(find_bin(), this)
+ , pubdirty(false)
+ , secdirty(false)
+ , ringWatch(this)
+{
+ QMutexLocker locker(ksl_mutex());
+ keyStoreList = this;
+
+ connect(&gpg, SIGNAL(finished()), SLOT(gpg_finished()));
+ connect(&ringWatch, SIGNAL(changed(const QString &)), SLOT(ring_changed(const QString &)));
+}
+
+MyKeyStoreList::~MyKeyStoreList()
+{
+ QMutexLocker locker(ksl_mutex());
+ keyStoreList = 0;
+}
+
+Provider::Context *MyKeyStoreList::clone() const
+{
+ return 0;
+}
+
+QString MyKeyStoreList::name(int) const
+{
+ return "GnuPG Keyring";
+}
+
+KeyStore::Type MyKeyStoreList::type(int) const
+{
+ return KeyStore::PGPKeyring;
+}
+
+QString MyKeyStoreList::storeId(int) const
+{
+ return "qca-gnupg";
+}
+
+QList MyKeyStoreList::keyStores()
+{
+ // we just support one fixed keyring, if any
+ QList list;
+ if(initialized)
+ list += 0;
+ return list;
+}
+
+void MyKeyStoreList::start()
+{
+ // kick start our init procedure:
+ // ensure gpg is installed
+ // obtain keyring file names for monitoring
+ // cache initial keyrings
+
+ init_step = 0;
+ gpg.doCheck();
+}
+
+bool MyKeyStoreList::isReadOnly(int) const
+{
+ return false;
+}
+
+QList MyKeyStoreList::entryTypes(int) const
+{
+ QList list;
+ list += KeyStoreEntry::TypePGPSecretKey;
+ list += KeyStoreEntry::TypePGPPublicKey;
+ return list;
+}
+
+QList MyKeyStoreList::entryList(int)
+{
+ QMutexLocker locker(&ringMutex);
+
+ QList out;
+
+ foreach(const GpgOp::Key &pkey, pubkeys)
+ {
+ PGPKey pub, sec;
+
+ QString id = pkey.keyItems.first().id;
+
+ MyPGPKeyContext *kc = new MyPGPKeyContext(provider());
+ // not secret, in keyring
+ kc->set(pkey, false, true, pkey.isTrusted);
+ pub.change(kc);
+
+ // optional
+ sec = getSecKey(id, pkey.userIds);
+
+ MyKeyStoreEntry *c = new MyKeyStoreEntry(pub, sec, provider());
+ c->_storeId = storeId(0);
+ c->_storeName = name(0);
+ out.append(c);
+ }
+
+ return out;
+}
+
+KeyStoreEntryContext *MyKeyStoreList::entry(int, const QString &entryId)
+{
+ QMutexLocker locker(&ringMutex);
+
+ PGPKey pub = getPubKey(entryId);
+ if(pub.isNull())
+ return 0;
+
+ // optional
+ PGPKey sec = getSecKey(entryId, static_cast(pub.context())->_props.userIds);
+
+ MyKeyStoreEntry *c = new MyKeyStoreEntry(pub, sec, provider());
+ c->_storeId = storeId(0);
+ c->_storeName = name(0);
+ return c;
+}
+
+KeyStoreEntryContext *MyKeyStoreList::entryPassive(const QString &serialized)
+{
+ QMutexLocker locker(&ringMutex);
+
+ QStringList parts = serialized.split(':');
+ if(parts.count() < 2)
+ return 0;
+ if(unescape_string(parts[0]) != "qca-gnupg-1")
+ return 0;
+
+ QString entryId = unescape_string(parts[1]);
+ if(entryId.isEmpty())
+ return 0;
+
+ PGPKey pub = getPubKey(entryId);
+ if(pub.isNull())
+ return 0;
+
+ // optional
+ PGPKey sec = getSecKey(entryId, static_cast(pub.context())->_props.userIds);
+
+ MyKeyStoreEntry *c = new MyKeyStoreEntry(pub, sec, provider());
+ c->_storeId = storeId(0);
+ c->_storeName = name(0);
+ return c;
+}
+
+// TODO: cache should reflect this change immediately
+QString MyKeyStoreList::writeEntry(int, const PGPKey &key)
+{
+ const MyPGPKeyContext *kc = static_cast(key.context());
+ QByteArray buf = kc->toBinary();
+
+ GpgOp gpg(find_bin());
+ gpg.doImport(buf);
+ gpg_waitForFinished(&gpg);
+ gpg_keyStoreLog(gpg.readDiagnosticText());
+ if(!gpg.success())
+ return QString();
+
+ return kc->_props.keyId;
+}
+
+// TODO: cache should reflect this change immediately
+bool MyKeyStoreList::removeEntry(int, const QString &entryId)
+{
+ ringMutex.lock();
+ PGPKey pub = getPubKey(entryId);
+ ringMutex.unlock();
+
+ const MyPGPKeyContext *kc = static_cast(pub.context());
+ QString fingerprint = kc->_props.fingerprint;
+
+ GpgOp gpg(find_bin());
+ gpg.doDeleteKey(fingerprint);
+ gpg_waitForFinished(&gpg);
+ gpg_keyStoreLog(gpg.readDiagnosticText());
+ return gpg.success();
+}
+
+MyKeyStoreList *MyKeyStoreList::instance()
+{
+ QMutexLocker locker(ksl_mutex());
+ return keyStoreList;
+}
+
+void MyKeyStoreList::ext_keyStoreLog(const QString &str)
+{
+ if(str.isEmpty())
+ return;
+
+ // FIXME: collect and emit in one pass
+ QMetaObject::invokeMethod(this, "diagnosticText", Qt::QueuedConnection, Q_ARG(QString, str));
+}
+
+PGPKey MyKeyStoreList::getPubKey(const QString &keyId) const
+{
+ int at = -1;
+ for(int n = 0; n < pubkeys.count(); ++n)
+ {
+ if(pubkeys[n].keyItems.first().id == keyId)
+ {
+ at = n;
+ break;
+ }
+ }
+ if(at == -1)
+ return PGPKey();
+
+ const GpgOp::Key &pkey = pubkeys[at];
+
+ PGPKey pub;
+ MyPGPKeyContext *kc = new MyPGPKeyContext(provider());
+ // not secret, in keyring
+ kc->set(pkey, false, true, pkey.isTrusted);
+ pub.change(kc);
+
+ return pub;
+}
+
+PGPKey MyKeyStoreList::getSecKey(const QString &keyId, const QStringList &userIdsOverride) const
+{
+ Q_UNUSED(userIdsOverride);
+
+ int at = -1;
+ for(int n = 0; n < seckeys.count(); ++n)
+ {
+ if(seckeys[n].keyItems.first().id == keyId)
+ {
+ at = n;
+ break;
+ }
+ }
+ if(at == -1)
+ return PGPKey();
+
+ const GpgOp::Key &skey = seckeys[at];
+
+ PGPKey sec;
+ MyPGPKeyContext *kc = new MyPGPKeyContext(provider());
+ // secret, in keyring, trusted
+ kc->set(skey, true, true, true);
+ //kc->_props.userIds = userIdsOverride;
+ sec.change(kc);
+
+ return sec;
+}
+
+PGPKey MyKeyStoreList::publicKeyFromId(const QString &keyId)
+{
+ QMutexLocker locker(&ringMutex);
+
+ int at = -1;
+ for(int n = 0; n < pubkeys.count(); ++n)
+ {
+ const GpgOp::Key &pkey = pubkeys[n];
+ for(int k = 0; k < pkey.keyItems.count(); ++k)
+ {
+ const GpgOp::KeyItem &ki = pkey.keyItems[k];
+ if(ki.id == keyId)
+ {
+ at = n;
+ break;
+ }
+ }
+ if(at != -1)
+ break;
+ }
+ if(at == -1)
+ return PGPKey();
+
+ const GpgOp::Key &pkey = pubkeys[at];
+
+ PGPKey pub;
+ MyPGPKeyContext *kc = new MyPGPKeyContext(provider());
+ // not secret, in keyring
+ kc->set(pkey, false, true, pkey.isTrusted);
+ pub.change(kc);
+
+ return pub;
+}
+
+PGPKey MyKeyStoreList::secretKeyFromId(const QString &keyId)
+{
+ QMutexLocker locker(&ringMutex);
+
+ int at = -1;
+ for(int n = 0; n < seckeys.count(); ++n)
+ {
+ const GpgOp::Key &skey = seckeys[n];
+ for(int k = 0; k < skey.keyItems.count(); ++k)
+ {
+ const GpgOp::KeyItem &ki = skey.keyItems[k];
+ if(ki.id == keyId)
+ {
+ at = n;
+ break;
+ }
+ }
+ if(at != -1)
+ break;
+ }
+ if(at == -1)
+ return PGPKey();
+
+ const GpgOp::Key &skey = seckeys[at];
+
+ PGPKey sec;
+ MyPGPKeyContext *kc = new MyPGPKeyContext(provider());
+ // secret, in keyring, trusted
+ kc->set(skey, true, true, true);
+ sec.change(kc);
+
+ return sec;
+}
+
+void MyKeyStoreList::gpg_finished()
+{
+ gpg_keyStoreLog(gpg.readDiagnosticText());
+
+ if(!initialized)
+ {
+ // any steps that fail during init, just give up completely
+ if(!gpg.success())
+ {
+ ringWatch.clear();
+ emit busyEnd();
+ return;
+ }
+
+ // check
+ if(init_step == 0)
+ {
+ // obtain keyring file names for monitoring
+ init_step = 1;
+ gpg.doSecretKeyringFile();
+ }
+ // secret keyring filename
+ else if(init_step == 1)
+ {
+ secring = QFileInfo(gpg.keyringFile()).canonicalFilePath();
+
+ if(!secring.isEmpty())
+ {
+ ringWatch.add(secring);
+ }
+
+ // obtain keyring file names for monitoring
+ init_step = 2;
+ gpg.doPublicKeyringFile();
+ }
+ // public keyring filename
+ else if(init_step == 2)
+ {
+ pubring = QFileInfo(gpg.keyringFile()).canonicalFilePath();
+ if(!pubring.isEmpty())
+ {
+ ringWatch.add(pubring);
+ }
+
+ // cache initial keyrings
+ init_step = 3;
+ gpg.doSecretKeys();
+ }
+ else if(init_step == 3)
+ {
+ ringMutex.lock();
+ seckeys = gpg.keys();
+ ringMutex.unlock();
+
+ // cache initial keyrings
+ init_step = 4;
+ gpg.doPublicKeys();
+ }
+ else if(init_step == 4)
+ {
+ ringMutex.lock();
+ pubkeys = gpg.keys();
+ ringMutex.unlock();
+
+ initialized = true;
+ handleDirtyRings();
+ emit busyEnd();
+ }
+ }
+ else
+ {
+ if(!gpg.success())
+ return;
+
+ GpgOp::Type op = gpg.op();
+ if(op == GpgOp::SecretKeys)
+ {
+ ringMutex.lock();
+ seckeys = gpg.keys();
+ ringMutex.unlock();
+
+ secdirty = false;
+ }
+ else if(op == GpgOp::PublicKeys)
+ {
+ ringMutex.lock();
+ pubkeys = gpg.keys();
+ ringMutex.unlock();
+
+ pubdirty = false;
+ }
+
+ if(!secdirty && !pubdirty)
+ {
+ emit storeUpdated(0);
+ return;
+ }
+
+ handleDirtyRings();
+ }
+}
+
+void MyKeyStoreList::ring_changed(const QString &filePath)
+{
+ ext_keyStoreLog(QString("ring_changed: [%1]\n").arg(filePath));
+
+ if(filePath == secring)
+ sec_changed();
+ else if(filePath == pubring)
+ pub_changed();
+}
+
+void MyKeyStoreList::pub_changed()
+{
+ pubdirty = true;
+ handleDirtyRings();
+}
+
+void MyKeyStoreList::sec_changed()
+{
+ secdirty = true;
+ handleDirtyRings();
+}
+
+void MyKeyStoreList::handleDirtyRings()
+{
+ if(!initialized || gpg.isActive())
+ return;
+
+ if(secdirty)
+ gpg.doSecretKeys();
+ else if(pubdirty)
+ gpg.doPublicKeys();
+}
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/mykeystorelist.h qca2-2.1.0/plugins/qca-gnupg/mykeystorelist.h
--- qca2-2.0.3/plugins/qca-gnupg/mykeystorelist.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/mykeystorelist.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2003-2008 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#pragma once
+
+#include "ringwatch.h"
+#include "gpgop.h"
+#include "qcaprovider.h"
+#include "mykeystoreentry.h"
+#include
+
+namespace gpgQCAPlugin
+{
+
+class MyKeyStoreList : public QCA::KeyStoreListContext
+{
+ Q_OBJECT
+public:
+ int init_step;
+ bool initialized;
+ GpgOp gpg;
+ GpgOp::KeyList pubkeys, seckeys;
+ QString pubring, secring;
+ bool pubdirty, secdirty;
+ RingWatch ringWatch;
+ QMutex ringMutex;
+
+ MyKeyStoreList(QCA::Provider *p);
+ ~MyKeyStoreList();
+
+ // reimplemented Provider::Context
+ QCA::Provider::Context *clone() const;
+
+ // reimplemented KeyStoreListContext
+ QString name(int) const;
+ QCA::KeyStore::Type type(int) const;
+ QString storeId(int) const;
+ QList keyStores();
+
+ void start();
+
+ bool isReadOnly(int) const;
+
+ QList entryTypes(int) const;
+ QList entryList(int);
+ QCA::KeyStoreEntryContext *entry(int, const QString &entryId);
+ QCA::KeyStoreEntryContext *entryPassive(const QString &serialized);
+ QString writeEntry(int, const QCA::PGPKey &key);
+ bool removeEntry(int, const QString &entryId);
+
+ static MyKeyStoreList *instance();
+ void ext_keyStoreLog(const QString &str);
+
+ QCA::PGPKey getPubKey(const QString &keyId) const;
+ QCA::PGPKey getSecKey(const QString &keyId, const QStringList &userIdsOverride) const;
+ QCA::PGPKey publicKeyFromId(const QString &keyId);
+ QCA::PGPKey secretKeyFromId(const QString &keyId);
+
+private slots:
+ void gpg_finished();
+ void ring_changed(const QString &filePath);
+
+private:
+ void pub_changed();
+ void sec_changed();
+ void handleDirtyRings();
+};
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/mymessagecontext.cpp qca2-2.1.0/plugins/qca-gnupg/mymessagecontext.cpp
--- qca2-2.0.3/plugins/qca-gnupg/mymessagecontext.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/mymessagecontext.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,436 @@
+/*
+ * Copyright (C) 2003-2008 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "mymessagecontext.h"
+#include "utils.h"
+#include "mypgpkeycontext.h"
+#include "mykeystorelist.h"
+
+using namespace QCA;
+
+namespace gpgQCAPlugin
+{
+
+MyMessageContext::MyMessageContext(MyOpenPGPContext *_sms, Provider *p)
+ : MessageContext(p, "pgpmsg")
+ , sms(_sms)
+ , op(Sign)
+ , signMode(SecureMessage::Detached)
+ , format(SecureMessage::Ascii)
+ , wrote(0)
+ , ok(false)
+ , wasSigned(false)
+ , op_err(GpgOp::ErrorUnknown), gpg(find_bin()) ,_finished(false)
+{
+ connect(&gpg, SIGNAL(readyRead()), SLOT(gpg_readyRead()));
+ connect(&gpg, SIGNAL(bytesWritten(int)), SLOT(gpg_bytesWritten(int)));
+ connect(&gpg, SIGNAL(finished()), SLOT(gpg_finished()));
+ connect(&gpg, SIGNAL(needPassphrase(const QString &)), SLOT(gpg_needPassphrase(const QString &)));
+ connect(&gpg, SIGNAL(needCard()), SLOT(gpg_needCard()));
+ connect(&gpg, SIGNAL(readyReadDiagnosticText()), SLOT(gpg_readyReadDiagnosticText()));
+
+ connect(&asker, SIGNAL(responseReady()), SLOT(asker_responseReady()));
+ connect(&tokenAsker, SIGNAL(responseReady()), SLOT(tokenAsker_responseReady()));
+}
+
+Provider::Context *MyMessageContext::clone() const
+{
+ return 0;
+}
+
+bool MyMessageContext::canSignMultiple() const
+{
+ return false;
+}
+
+SecureMessage::Type MyMessageContext::type() const
+{
+ return SecureMessage::OpenPGP;
+}
+
+void MyMessageContext::reset()
+{
+ wrote = 0;
+ ok = false;
+ wasSigned = false;
+}
+
+void MyMessageContext::setupEncrypt(const SecureMessageKeyList &keys)
+{
+ recipIds.clear();
+ for(int n = 0; n < keys.count(); ++n)
+ recipIds += keys[n].pgpPublicKey().keyId();
+}
+
+void MyMessageContext::setupSign(const SecureMessageKeyList &keys, SecureMessage::SignMode m, bool, bool)
+{
+ signerId = keys.first().pgpSecretKey().keyId();
+ signMode = m;
+}
+
+void MyMessageContext::setupVerify(const QByteArray &detachedSig)
+{
+ sig = detachedSig;
+}
+
+void MyMessageContext::start(SecureMessage::Format f, Operation op)
+{
+ _finished = false;
+ format = f;
+ this->op = op;
+
+ if(getProperty("pgp-always-trust").toBool())
+ gpg.setAlwaysTrust(true);
+
+ if(format == SecureMessage::Ascii)
+ gpg.setAsciiFormat(true);
+ else
+ gpg.setAsciiFormat(false);
+
+ if(op == Encrypt)
+ {
+ gpg.doEncrypt(recipIds);
+ }
+ else if(op == Decrypt)
+ {
+ gpg.doDecrypt();
+ }
+ else if(op == Sign)
+ {
+ if(signMode == SecureMessage::Message)
+ {
+ gpg.doSign(signerId);
+ }
+ else if(signMode == SecureMessage::Clearsign)
+ {
+ gpg.doSignClearsign(signerId);
+ }
+ else // SecureMessage::Detached
+ {
+ gpg.doSignDetached(signerId);
+ }
+ }
+ else if(op == Verify)
+ {
+ if(!sig.isEmpty())
+ gpg.doVerifyDetached(sig);
+ else
+ gpg.doDecrypt();
+ }
+ else if(op == SignAndEncrypt)
+ {
+ gpg.doSignAndEncrypt(signerId, recipIds);
+ }
+}
+
+void MyMessageContext::update(const QByteArray &in)
+{
+ gpg.write(in);
+ //this->in.append(in);
+}
+
+QByteArray MyMessageContext::read()
+{
+ QByteArray a = out;
+ out.clear();
+ return a;
+}
+
+int MyMessageContext::written()
+{
+ int x = wrote;
+ wrote = 0;
+ return x;
+}
+
+void MyMessageContext::end()
+{
+ gpg.endWrite();
+}
+
+void MyMessageContext::seterror()
+{
+ gpg.reset();
+ _finished = true;
+ ok = false;
+ op_err = GpgOp::ErrorUnknown;
+}
+
+void MyMessageContext::complete()
+{
+ _finished = true;
+
+ dtext = gpg.readDiagnosticText();
+
+ ok = gpg.success();
+ if(ok)
+ {
+ if(op == Sign && signMode == SecureMessage::Detached)
+ sig = gpg.read();
+ else
+ out = gpg.read();
+ }
+
+ if(ok)
+ {
+ if(gpg.wasSigned())
+ {
+ QString signerId = gpg.signerId();
+ QDateTime ts = gpg.timestamp();
+ GpgOp::VerifyResult vr = gpg.verifyResult();
+
+ SecureMessageSignature::IdentityResult ir;
+ Validity v;
+ if(vr == GpgOp::VerifyGood)
+ {
+ ir = SecureMessageSignature::Valid;
+ v = ValidityGood;
+ }
+ else if(vr == GpgOp::VerifyBad)
+ {
+ ir = SecureMessageSignature::InvalidSignature;
+ v = ValidityGood; // good key, bad sig
+ }
+ else // GpgOp::VerifyNoKey
+ {
+ ir = SecureMessageSignature::NoKey;
+ v = ErrorValidityUnknown;
+ }
+
+ SecureMessageKey key;
+ PGPKey pub = publicKeyFromId(signerId);
+ if(pub.isNull())
+ {
+ MyPGPKeyContext *kc = new MyPGPKeyContext(provider());
+ kc->_props.keyId = signerId;
+ pub.change(kc);
+ }
+ key.setPGPPublicKey(pub);
+
+ signer = SecureMessageSignature(ir, v, key, ts);
+ wasSigned = true;
+ }
+ }
+ else
+ op_err = gpg.errorCode();
+}
+
+bool MyMessageContext::finished() const
+{
+ return _finished;
+}
+
+bool MyMessageContext::waitForFinished(int msecs)
+{
+ // FIXME
+ Q_UNUSED(msecs);
+ MyKeyStoreList *keyStoreList = MyKeyStoreList::instance();
+
+ while(1)
+ {
+ // TODO: handle token prompt events
+
+ GpgOp::Event e = gpg.waitForEvent(-1);
+ if(e.type == GpgOp::Event::NeedPassphrase)
+ {
+ // TODO
+
+ QString keyId;
+ PGPKey sec = secretKeyFromId(e.keyId);
+ if(!sec.isNull())
+ keyId = sec.keyId();
+ else
+ keyId = e.keyId;
+ QStringList out;
+ out += escape_string("qca-gnupg-1");
+ out += escape_string(keyId);
+ QString serialized = out.join(":");
+
+ KeyStoreEntry kse;
+ KeyStoreEntryContext *c = keyStoreList->entryPassive(serialized);
+ if(c)
+ kse.change(c);
+
+ asker.ask(Event::StylePassphrase, KeyStoreInfo(KeyStore::PGPKeyring, keyStoreList->storeId(0), keyStoreList->name(0)), kse, 0);
+ asker.waitForResponse();
+
+ if(!asker.accepted())
+ {
+ seterror();
+ return true;
+ }
+
+ gpg.submitPassphrase(asker.password());
+ }
+ else if(e.type == GpgOp::Event::NeedCard)
+ {
+ tokenAsker.ask(KeyStoreInfo(KeyStore::PGPKeyring, keyStoreList->storeId(0), keyStoreList->name(0)), KeyStoreEntry(), 0);
+
+ if(!tokenAsker.accepted())
+ {
+ seterror();
+ return true;
+ }
+
+ gpg.cardOkay();
+ }
+ else if(e.type == GpgOp::Event::Finished)
+ break;
+ }
+
+ complete();
+ return true;
+}
+
+bool MyMessageContext::success() const
+{
+ return ok;
+}
+
+SecureMessage::Error MyMessageContext::errorCode() const
+{
+ SecureMessage::Error e = SecureMessage::ErrorUnknown;
+ if(op_err == GpgOp::ErrorProcess)
+ e = SecureMessage::ErrorUnknown;
+ else if(op_err == GpgOp::ErrorPassphrase)
+ e = SecureMessage::ErrorPassphrase;
+ else if(op_err == GpgOp::ErrorFormat)
+ e = SecureMessage::ErrorFormat;
+ else if(op_err == GpgOp::ErrorSignerExpired)
+ e = SecureMessage::ErrorSignerExpired;
+ else if(op_err == GpgOp::ErrorSignerRevoked)
+ e = SecureMessage::ErrorSignerRevoked;
+ else if(op_err == GpgOp::ErrorSignatureExpired)
+ e = SecureMessage::ErrorSignatureExpired;
+ else if(op_err == GpgOp::ErrorEncryptExpired)
+ e = SecureMessage::ErrorEncryptExpired;
+ else if(op_err == GpgOp::ErrorEncryptRevoked)
+ e = SecureMessage::ErrorEncryptRevoked;
+ else if(op_err == GpgOp::ErrorEncryptUntrusted)
+ e = SecureMessage::ErrorEncryptUntrusted;
+ else if(op_err == GpgOp::ErrorEncryptInvalid)
+ e = SecureMessage::ErrorEncryptInvalid;
+ else if(op_err == GpgOp::ErrorDecryptNoKey)
+ e = SecureMessage::ErrorUnknown;
+ else if(op_err == GpgOp::ErrorUnknown)
+ e = SecureMessage::ErrorUnknown;
+ return e;
+}
+
+QByteArray MyMessageContext::signature() const
+{
+ return sig;
+}
+
+QString MyMessageContext::hashName() const
+{
+ // TODO
+ return "sha1";
+}
+
+SecureMessageSignatureList MyMessageContext::signers() const
+{
+ SecureMessageSignatureList list;
+ if(ok && wasSigned)
+ list += signer;
+ return list;
+}
+
+QString MyMessageContext::diagnosticText() const
+{
+ return dtext;
+}
+
+void MyMessageContext::gpg_readyRead()
+{
+ emit updated();
+}
+
+void MyMessageContext::gpg_bytesWritten(int bytes)
+{
+ wrote += bytes;
+}
+
+void MyMessageContext::gpg_finished()
+{
+ complete();
+ emit updated();
+}
+
+void MyMessageContext::gpg_needPassphrase(const QString &in_keyId)
+{
+ // FIXME: copied from above, clean up later
+
+ QString keyId;
+ PGPKey sec = secretKeyFromId(in_keyId);
+ if(!sec.isNull())
+ keyId = sec.keyId();
+ else
+ keyId = in_keyId;
+ //emit keyStoreList->storeNeedPassphrase(0, 0, keyId);
+ QStringList out;
+ out += escape_string("qca-gnupg-1");
+ out += escape_string(keyId);
+ QString serialized = out.join(":");
+
+ KeyStoreEntry kse;
+ MyKeyStoreList *keyStoreList = MyKeyStoreList::instance();
+ KeyStoreEntryContext *c = keyStoreList->entryPassive(serialized);
+ if(c)
+ kse.change(c);
+
+ asker.ask(Event::StylePassphrase, KeyStoreInfo(KeyStore::PGPKeyring, keyStoreList->storeId(0), keyStoreList->name(0)), kse, 0);
+}
+
+void MyMessageContext::gpg_needCard()
+{
+ MyKeyStoreList *keyStoreList = MyKeyStoreList::instance();
+ tokenAsker.ask(KeyStoreInfo(KeyStore::PGPKeyring, keyStoreList->storeId(0), keyStoreList->name(0)), KeyStoreEntry(), 0);
+}
+
+void MyMessageContext::gpg_readyReadDiagnosticText()
+{
+ // TODO ?
+}
+
+void MyMessageContext::asker_responseReady()
+{
+ if(!asker.accepted())
+ {
+ seterror();
+ emit updated();
+ return;
+ }
+
+ SecureArray a = asker.password();
+ gpg.submitPassphrase(a);
+}
+
+void MyMessageContext::tokenAsker_responseReady()
+{
+ if(!tokenAsker.accepted())
+ {
+ seterror();
+ emit updated();
+ return;
+ }
+
+ gpg.cardOkay();
+}
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/mymessagecontext.h qca2-2.1.0/plugins/qca-gnupg/mymessagecontext.h
--- qca2-2.0.3/plugins/qca-gnupg/mymessagecontext.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/mymessagecontext.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2003-2008 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#pragma once
+
+#include "qcaprovider.h"
+#include "gpgop.h"
+
+namespace gpgQCAPlugin
+{
+
+class MyOpenPGPContext;
+
+class MyMessageContext : public QCA::MessageContext
+{
+ Q_OBJECT
+public:
+ MyOpenPGPContext *sms;
+
+ QString signerId;
+ QStringList recipIds;
+ QCA::MessageContext::Operation op;
+ QCA::SecureMessage::SignMode signMode;
+ QCA::SecureMessage::Format format;
+ QByteArray in, out, sig;
+ int wrote;
+ bool ok, wasSigned;
+ GpgOp::Error op_err;
+ QCA::SecureMessageSignature signer;
+ GpgOp gpg;
+ bool _finished;
+ QString dtext;
+
+ QCA::PasswordAsker asker;
+ QCA::TokenAsker tokenAsker;
+
+ MyMessageContext(MyOpenPGPContext *_sms, QCA::Provider *p);
+
+ // reimplemented Provider::Context
+ QCA::Provider::Context *clone() const;
+
+ // reimplemented MessageContext
+ bool canSignMultiple() const;
+ QCA::SecureMessage::Type type() const;
+ void reset();
+ void setupEncrypt(const QCA::SecureMessageKeyList &keys);
+ void setupSign(const QCA::SecureMessageKeyList &keys, QCA::SecureMessage::SignMode m, bool, bool);
+ void setupVerify(const QByteArray &detachedSig);
+ void start(QCA::SecureMessage::Format f, QCA::MessageContext::Operation op);
+ void update(const QByteArray &in);
+ QByteArray read();
+ int written();
+ void end();
+ bool finished() const;
+ bool waitForFinished(int msecs);
+ bool success() const;
+ QCA::SecureMessage::Error errorCode() const;
+ QByteArray signature() const;
+ QString hashName() const;
+ QCA::SecureMessageSignatureList signers() const;
+ QString diagnosticText() const;
+
+ void seterror();
+ void complete();
+
+private slots:
+ void gpg_readyRead();
+ void gpg_bytesWritten(int bytes);
+ void gpg_finished();
+ void gpg_needPassphrase(const QString &in_keyId);
+ void gpg_needCard();
+ void gpg_readyReadDiagnosticText();
+ void asker_responseReady();
+ void tokenAsker_responseReady();
+};
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/myopenpgpcontext.cpp qca2-2.1.0/plugins/qca-gnupg/myopenpgpcontext.cpp
--- qca2-2.0.3/plugins/qca-gnupg/myopenpgpcontext.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/myopenpgpcontext.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2003-2008 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "myopenpgpcontext.h"
+#include "mymessagecontext.h"
+
+using namespace QCA;
+
+namespace gpgQCAPlugin
+{
+
+MyOpenPGPContext::MyOpenPGPContext(QCA::Provider *p)
+ : SMSContext(p, "openpgp")
+{
+ // TODO
+}
+
+Provider::Context *MyOpenPGPContext::clone() const
+{
+ return 0;
+}
+
+MessageContext *MyOpenPGPContext::createMessage()
+{
+ return new MyMessageContext(this, provider());
+}
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/myopenpgpcontext.h qca2-2.1.0/plugins/qca-gnupg/myopenpgpcontext.h
--- qca2-2.0.3/plugins/qca-gnupg/myopenpgpcontext.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/myopenpgpcontext.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2003-2008 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#pragma once
+
+#include "qcaprovider.h"
+
+namespace gpgQCAPlugin
+{
+
+class MyOpenPGPContext : public QCA::SMSContext
+{
+public:
+ MyOpenPGPContext(QCA::Provider *p);
+
+ // reimplemented Provider::Context
+ QCA::Provider::Context *clone() const;
+
+ // reimplemented SMSContext
+ QCA::MessageContext *createMessage();
+};
+
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/mypgpkeycontext.cpp qca2-2.1.0/plugins/qca-gnupg/mypgpkeycontext.cpp
--- qca2-2.0.3/plugins/qca-gnupg/mypgpkeycontext.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/mypgpkeycontext.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,218 @@
+#include "mypgpkeycontext.h"
+#include "utils.h"
+#include "gpgop.h"
+#include
+#include
+
+using namespace QCA;
+
+namespace gpgQCAPlugin
+{
+
+MyPGPKeyContext::MyPGPKeyContext(Provider *p)
+ : PGPKeyContext(p)
+{
+ // zero out the props
+ _props.isSecret = false;
+ _props.inKeyring = true;
+ _props.isTrusted = false;
+}
+
+Provider::Context *MyPGPKeyContext::clone() const
+{
+ return new MyPGPKeyContext(*this);
+}
+
+const PGPKeyContextProps *MyPGPKeyContext::props() const
+{
+ return &_props;
+}
+
+QByteArray MyPGPKeyContext::toBinary() const
+{
+ if(_props.inKeyring)
+ {
+ GpgOp gpg(find_bin());
+ gpg.setAsciiFormat(false);
+ gpg.doExport(_props.keyId);
+ gpg_waitForFinished(&gpg);
+ gpg_keyStoreLog(gpg.readDiagnosticText());
+ if(!gpg.success())
+ return QByteArray();
+ return gpg.read();
+ }
+ else
+ return cacheExportBinary;
+}
+
+ConvertResult MyPGPKeyContext::fromBinary(const QByteArray &a)
+{
+ GpgOp::Key key;
+ bool sec = false;
+
+ // temporary keyrings
+ QString pubname, secname;
+
+ QTemporaryFile pubtmp(QDir::tempPath() + QLatin1String("/qca_gnupg_tmp.XXXXXX.gpg"));
+ if(!pubtmp.open())
+ return ErrorDecode;
+
+ QTemporaryFile sectmp(QDir::tempPath() + QLatin1String("/qca_gnupg_tmp.XXXXXX.gpg"));
+ if(!sectmp.open())
+ return ErrorDecode;
+
+ pubname = pubtmp.fileName();
+ secname = sectmp.fileName();
+
+ // we turn off autoRemove so that we can close the files
+ // without them getting deleted
+ pubtmp.setAutoRemove(false);
+ sectmp.setAutoRemove(false);
+ pubtmp.close();
+ sectmp.close();
+
+ // import key into temporary keyring
+ GpgOp gpg(find_bin());
+ gpg.setKeyrings(pubname, secname);
+ gpg.doImport(a);
+ gpg_waitForFinished(&gpg);
+ gpg_keyStoreLog(gpg.readDiagnosticText());
+ // comment this out. apparently gpg will report failure for
+ // an import if there are trust issues, even though the
+ // key actually did get imported
+ /*if(!gpg.success())
+ {
+ cleanup_temp_keyring(pubname);
+ cleanup_temp_keyring(secname);
+ return ErrorDecode;
+ }*/
+
+ // now extract the key from gpg like normal
+
+ // is it a public key?
+ gpg.doPublicKeys();
+ gpg_waitForFinished(&gpg);
+ gpg_keyStoreLog(gpg.readDiagnosticText());
+ if(!gpg.success())
+ {
+ cleanup_temp_keyring(pubname);
+ cleanup_temp_keyring(secname);
+ return ErrorDecode;
+ }
+
+ GpgOp::KeyList pubkeys = gpg.keys();
+ if(!pubkeys.isEmpty())
+ {
+ key = pubkeys.first();
+ }
+ else
+ {
+ // is it a secret key?
+ gpg.doSecretKeys();
+ gpg_waitForFinished(&gpg);
+ gpg_keyStoreLog(gpg.readDiagnosticText());
+ if(!gpg.success())
+ {
+ cleanup_temp_keyring(pubname);
+ cleanup_temp_keyring(secname);
+ return ErrorDecode;
+ }
+
+ GpgOp::KeyList seckeys = gpg.keys();
+ if(!seckeys.isEmpty())
+ {
+ key = seckeys.first();
+ sec = true;
+ }
+ else
+ {
+ // no keys found
+ cleanup_temp_keyring(pubname);
+ cleanup_temp_keyring(secname);
+ return ErrorDecode;
+ }
+ }
+
+ // export binary/ascii and cache
+
+ gpg.setAsciiFormat(false);
+ gpg.doExport(key.keyItems.first().id);
+ gpg_waitForFinished(&gpg);
+ gpg_keyStoreLog(gpg.readDiagnosticText());
+ if(!gpg.success())
+ {
+ cleanup_temp_keyring(pubname);
+ cleanup_temp_keyring(secname);
+ return ErrorDecode;
+ }
+ cacheExportBinary = gpg.read();
+
+ gpg.setAsciiFormat(true);
+ gpg.doExport(key.keyItems.first().id);
+ gpg_waitForFinished(&gpg);
+ gpg_keyStoreLog(gpg.readDiagnosticText());
+ if(!gpg.success())
+ {
+ cleanup_temp_keyring(pubname);
+ cleanup_temp_keyring(secname);
+ return ErrorDecode;
+ }
+ cacheExportAscii = QString::fromLocal8Bit(gpg.read());
+
+ // all done
+
+ cleanup_temp_keyring(pubname);
+ cleanup_temp_keyring(secname);
+
+ set(key, sec, false, false);
+ return ConvertGood;
+}
+
+QString MyPGPKeyContext::toAscii() const
+{
+ if(_props.inKeyring)
+ {
+ GpgOp gpg(find_bin());
+ gpg.setAsciiFormat(true);
+ gpg.doExport(_props.keyId);
+ gpg_waitForFinished(&gpg);
+ gpg_keyStoreLog(gpg.readDiagnosticText());
+ if(!gpg.success())
+ return QString();
+ return QString::fromLocal8Bit(gpg.read());
+ }
+ else
+ {
+ return cacheExportAscii;
+ }
+}
+
+ConvertResult MyPGPKeyContext::fromAscii(const QString &s)
+{
+ // GnuPG does ascii/binary detection for imports, so for
+ // simplicity we consider an ascii import to just be a
+ // binary import that happens to be comprised of ascii
+ return fromBinary(s.toLocal8Bit());
+}
+
+void MyPGPKeyContext::set(const GpgOp::Key &i, bool isSecret, bool inKeyring, bool isTrusted)
+{
+ const GpgOp::KeyItem &ki = i.keyItems.first();
+
+ _props.keyId = ki.id;
+ _props.userIds = i.userIds;
+ _props.isSecret = isSecret;
+ _props.creationDate = ki.creationDate;
+ _props.expirationDate = ki.expirationDate;
+ _props.fingerprint = ki.fingerprint.toLower();
+ _props.inKeyring = inKeyring;
+ _props.isTrusted = isTrusted;
+}
+
+void MyPGPKeyContext::cleanup_temp_keyring(const QString &name)
+{
+ QFile::remove(name);
+ QFile::remove(name + '~'); // remove possible backup file
+}
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/mypgpkeycontext.h qca2-2.1.0/plugins/qca-gnupg/mypgpkeycontext.h
--- qca2-2.0.3/plugins/qca-gnupg/mypgpkeycontext.h 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/mypgpkeycontext.h 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2003-2008 Justin Karneges
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#pragma once
+
+#include "qcaprovider.h"
+#include "ringwatch.h"
+#include "gpgop.h"
+
+namespace gpgQCAPlugin
+{
+
+class MyPGPKeyContext : public QCA::PGPKeyContext
+{
+public:
+ QCA::PGPKeyContextProps _props;
+
+ // keys loaded externally (not from the keyring) need to have these
+ // values cached, since we can't extract them later
+ QByteArray cacheExportBinary;
+ QString cacheExportAscii;
+
+ MyPGPKeyContext(QCA::Provider *p);
+
+ // reimplemented Provider::Context
+ QCA::Provider::Context *clone() const;
+
+ // reimplemented PGPKeyContext
+ const QCA::PGPKeyContextProps *props() const;
+
+ QByteArray toBinary() const;
+ QCA::ConvertResult fromBinary(const QByteArray &a);
+
+ QString toAscii() const;
+ QCA::ConvertResult fromAscii(const QString &s);
+
+ void set(const GpgOp::Key &i, bool isSecret, bool inKeyring, bool isTrusted);
+ static void cleanup_temp_keyring(const QString &name);
+};
+
+} // end namespace gpgQCAPlugin
diff -Nru qca2-2.0.3/plugins/qca-gnupg/qca-gnupg.cpp qca2-2.1.0/plugins/qca-gnupg/qca-gnupg.cpp
--- qca2-2.0.3/plugins/qca-gnupg/qca-gnupg.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qca2-2.1.0/plugins/qca-gnupg/qca-gnupg.cpp 2014-11-06 08:15:45.000000000 +0000
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2003-2008 Justin Karneges