mirror of
https://github.com/QuasarApp/qca.git
synced 2025-05-11 10:19:33 +00:00
fix bugs, support bogus signatures
svn path=/trunk/kdesupport/qca/; revision=677775
This commit is contained in:
parent
d39b4a033f
commit
7eb8318c68
@ -22,6 +22,28 @@
|
|||||||
|
|
||||||
using namespace QCA;
|
using namespace QCA;
|
||||||
|
|
||||||
|
static char cert_pem[] =
|
||||||
|
"-----BEGIN CERTIFICATE-----\n"
|
||||||
|
"MIIBsTCCAVugAwIBAgIBADANBgkqhkiG9w0BAQUFADA4MRQwEgYDVQQDEwtUZXN0\n"
|
||||||
|
"IENlcnQgMTELMAkGA1UEBhMCVVMxEzARBgNVBAoTClRlc3QgT3JnIDEwHhcNMDcw\n"
|
||||||
|
"NjE5MjAzOTI4WhcNMTIwNjE5MjAzOTI4WjA4MRQwEgYDVQQDEwtUZXN0IENlcnQg\n"
|
||||||
|
"MTELMAkGA1UEBhMCVVMxEzARBgNVBAoTClRlc3QgT3JnIDEwXDANBgkqhkiG9w0B\n"
|
||||||
|
"AQEFAANLADBIAkEA3645RS/xBlWnjju6moaRYQuIDo7fwM+GxhE91HECLAg3Hnkr\n"
|
||||||
|
"I+qx96VXd006olOn8MrkbjSqcTJ4LcDaCGI1YwIDAQABo1AwTjAdBgNVHQ4EFgQU\n"
|
||||||
|
"nm5lNkkblHdoB0gLeh8mB6Ed+TMwDwYDVR0TAQH/BAUwAwIBADAcBgNVHREEFTAT\n"
|
||||||
|
"gRF0ZXN0MUBleGFtcGxlLmNvbTANBgkqhkiG9w0BAQUFAANBAFTtXtwfYcJZBsXJ\n"
|
||||||
|
"+Ckm9qbg7qR/XRERDzeR0yhHZE7F/jU5YQv7+iJL4l95iH9PkZNOk15Tu/Kzzekx\n"
|
||||||
|
"6CTXzKA=\n"
|
||||||
|
"-----END CERTIFICATE-----";
|
||||||
|
|
||||||
|
static char key_n_dec[] =
|
||||||
|
"1171510158037441543813157379806833168225785177834459013412026750"
|
||||||
|
"9262193808059395366696241600386200064326196137137376912654785051"
|
||||||
|
"560621331316573341676090723";
|
||||||
|
|
||||||
|
static char key_e_dec[] =
|
||||||
|
"65537";
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
// TestProvider
|
// TestProvider
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@ -73,6 +95,42 @@ public:
|
|||||||
Context *createContext(const QString &type);
|
Context *createContext(const QString &type);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
// TestData
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
class TestKeyStore
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int contextId;
|
||||||
|
KeyStore::Type type;
|
||||||
|
QString storeId;
|
||||||
|
QString name;
|
||||||
|
bool readOnly;
|
||||||
|
bool avail; // for simplicity, all items share this global toggle
|
||||||
|
|
||||||
|
QList<KeyBundle> certs;
|
||||||
|
|
||||||
|
TestKeyStore() :
|
||||||
|
contextId(-1),
|
||||||
|
type(KeyStore::SmartCard),
|
||||||
|
readOnly(true),
|
||||||
|
avail(true)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class TestData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int context_at;
|
||||||
|
QList<TestKeyStore> stores;
|
||||||
|
|
||||||
|
TestData() :
|
||||||
|
context_at(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
// TestRSAContext
|
// TestRSAContext
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@ -80,8 +138,20 @@ class TestRSAContext : public RSAContext
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
bool priv;
|
||||||
|
TestKeyStore *store;
|
||||||
|
|
||||||
TestRSAContext(Provider *p) :
|
TestRSAContext(Provider *p) :
|
||||||
RSAContext(p)
|
RSAContext(p),
|
||||||
|
priv(true),
|
||||||
|
store(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
TestRSAContext(const TestRSAContext &from) :
|
||||||
|
RSAContext(from),
|
||||||
|
priv(from.priv),
|
||||||
|
store(from.store)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,7 +172,7 @@ public:
|
|||||||
|
|
||||||
virtual bool isPrivate() const
|
virtual bool isPrivate() const
|
||||||
{
|
{
|
||||||
return false;
|
return priv;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool canExport() const
|
virtual bool canExport() const
|
||||||
@ -112,6 +182,7 @@ public:
|
|||||||
|
|
||||||
virtual void convertToPublic()
|
virtual void convertToPublic()
|
||||||
{
|
{
|
||||||
|
priv = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int bits() const
|
virtual int bits() const
|
||||||
@ -119,6 +190,37 @@ public:
|
|||||||
return 2048;
|
return 2048;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void startSign(SignatureAlgorithm alg, SignatureFormat format)
|
||||||
|
{
|
||||||
|
Q_UNUSED(alg);
|
||||||
|
Q_UNUSED(format);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void update(const MemoryRegion &in)
|
||||||
|
{
|
||||||
|
Q_UNUSED(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual QByteArray endSign()
|
||||||
|
{
|
||||||
|
if(!store)
|
||||||
|
return QByteArray();
|
||||||
|
|
||||||
|
while(store->contextId == -1 || !store->avail)
|
||||||
|
{
|
||||||
|
KeyStoreInfo info(store->type, store->storeId, store->name);
|
||||||
|
KeyStoreEntry entry;
|
||||||
|
|
||||||
|
TokenAsker asker;
|
||||||
|
asker.ask(info, entry, 0);
|
||||||
|
asker.waitForResponse();
|
||||||
|
if(!asker.accepted())
|
||||||
|
return QByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
return "foobar";
|
||||||
|
}
|
||||||
|
|
||||||
virtual void createPrivate(int bits, int exp, bool block)
|
virtual void createPrivate(int bits, int exp, bool block)
|
||||||
{
|
{
|
||||||
Q_UNUSED(bits);
|
Q_UNUSED(bits);
|
||||||
@ -143,12 +245,12 @@ public:
|
|||||||
|
|
||||||
virtual BigInteger n() const
|
virtual BigInteger n() const
|
||||||
{
|
{
|
||||||
return BigInteger();
|
return BigInteger(QString(key_n_dec));
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual BigInteger e() const
|
virtual BigInteger e() const
|
||||||
{
|
{
|
||||||
return BigInteger();
|
return BigInteger(QString(key_e_dec));
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual BigInteger p() const
|
virtual BigInteger p() const
|
||||||
@ -182,6 +284,14 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TestPKeyContext(const TestPKeyContext &from) :
|
||||||
|
PKeyContext(from),
|
||||||
|
_key(0)
|
||||||
|
{
|
||||||
|
if(from._key)
|
||||||
|
_key = (TestRSAContext *)from._key->clone();
|
||||||
|
}
|
||||||
|
|
||||||
~TestPKeyContext()
|
~TestPKeyContext()
|
||||||
{
|
{
|
||||||
delete _key;
|
delete _key;
|
||||||
@ -253,12 +363,16 @@ public:
|
|||||||
|
|
||||||
virtual QByteArray toDER() const
|
virtual QByteArray toDER() const
|
||||||
{
|
{
|
||||||
return QByteArray();
|
QStringList lines = toPEM().split('\n');
|
||||||
|
lines.removeFirst();
|
||||||
|
lines.removeLast();
|
||||||
|
QString enc = lines.join("");
|
||||||
|
return Base64().stringToArray(enc).toByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual QString toPEM() const
|
virtual QString toPEM() const
|
||||||
{
|
{
|
||||||
return QString();
|
return QString(cert_pem);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ConvertResult fromDER(const QByteArray &a)
|
virtual ConvertResult fromDER(const QByteArray &a)
|
||||||
@ -293,9 +407,11 @@ public:
|
|||||||
|
|
||||||
virtual PKeyContext *subjectPublicKey() const
|
virtual PKeyContext *subjectPublicKey() const
|
||||||
{
|
{
|
||||||
TestPKeyContext *kc = new TestPKeyContext(provider());
|
TestRSAContext *rsa1 = new TestRSAContext(provider());
|
||||||
kc->setKey(new TestRSAContext(provider()));
|
rsa1->priv = false;
|
||||||
return kc;
|
TestPKeyContext *kc1 = new TestPKeyContext(provider());
|
||||||
|
kc1->setKey(rsa1);
|
||||||
|
return kc1;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool isIssuerOf(const CertContext *other) const
|
virtual bool isIssuerOf(const CertContext *other) const
|
||||||
@ -332,7 +448,7 @@ class TestKeyStoreEntryContext : public KeyStoreEntryContext
|
|||||||
public:
|
public:
|
||||||
QString _id, _name, _storeId, _storeName;
|
QString _id, _name, _storeId, _storeName;
|
||||||
KeyBundle kb;
|
KeyBundle kb;
|
||||||
bool avail;
|
TestKeyStore *store;
|
||||||
|
|
||||||
TestKeyStoreEntryContext(Provider *p) :
|
TestKeyStoreEntryContext(Provider *p) :
|
||||||
KeyStoreEntryContext(p)
|
KeyStoreEntryContext(p)
|
||||||
@ -371,12 +487,12 @@ public:
|
|||||||
|
|
||||||
virtual bool isAvailable() const
|
virtual bool isAvailable() const
|
||||||
{
|
{
|
||||||
return avail;
|
return store->avail;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual QString serialize() const
|
virtual QString serialize() const
|
||||||
{
|
{
|
||||||
return QString();
|
return QString("qca-test-1/fake_serialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual KeyBundle keyBundle() const
|
virtual KeyBundle keyBundle() const
|
||||||
@ -390,42 +506,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
// TestData
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
class TestKeyStore
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
int contextId;
|
|
||||||
KeyStore::Type type;
|
|
||||||
QString storeId;
|
|
||||||
QString name;
|
|
||||||
bool readOnly;
|
|
||||||
bool avail;
|
|
||||||
|
|
||||||
QList<KeyBundle> certs;
|
|
||||||
|
|
||||||
TestKeyStore() :
|
|
||||||
contextId(-1),
|
|
||||||
type(KeyStore::SmartCard),
|
|
||||||
readOnly(true),
|
|
||||||
avail(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class TestData
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
int context_at;
|
|
||||||
QList<TestKeyStore> stores;
|
|
||||||
|
|
||||||
TestData() :
|
|
||||||
context_at(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
// TestKeyStoreListContext
|
// TestKeyStoreListContext
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@ -449,13 +529,17 @@ public:
|
|||||||
cc1->_props.subject += CertificateInfoPair(CertificateInfoType(CommonName), "Test Cert 1");
|
cc1->_props.subject += CertificateInfoPair(CertificateInfoType(CommonName), "Test Cert 1");
|
||||||
pub1.change(cc1);
|
pub1.change(cc1);
|
||||||
PrivateKey sec1;
|
PrivateKey sec1;
|
||||||
sec1.change(new TestPKeyContext(provider()));
|
TestRSAContext *rsa1 = new TestRSAContext(provider());
|
||||||
|
TestPKeyContext *kc1 = new TestPKeyContext(provider());
|
||||||
|
kc1->setKey(rsa1);
|
||||||
|
sec1.change(kc1);
|
||||||
cert1.setCertificateChainAndKey(pub1, sec1);
|
cert1.setCertificateChainAndKey(pub1, sec1);
|
||||||
|
|
||||||
TestKeyStore ks1;
|
TestKeyStore ks1;
|
||||||
ks1.storeId = "store1";
|
ks1.storeId = "store1";
|
||||||
ks1.name = "Test Store 1";
|
ks1.name = "Test Store 1";
|
||||||
ks1.certs += cert1;
|
ks1.certs += cert1;
|
||||||
|
ks1.avail = false;
|
||||||
data.stores += ks1;
|
data.stores += ks1;
|
||||||
|
|
||||||
TestKeyStore ks2;
|
TestKeyStore ks2;
|
||||||
@ -464,6 +548,8 @@ public:
|
|||||||
ks2.readOnly = false;
|
ks2.readOnly = false;
|
||||||
data.stores += ks2;
|
data.stores += ks2;
|
||||||
|
|
||||||
|
rsa1->store = &data.stores[0];
|
||||||
|
|
||||||
connect(&t, SIGNAL(timeout()), SLOT(do_step()));
|
connect(&t, SIGNAL(timeout()), SLOT(do_step()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -560,14 +646,27 @@ public:
|
|||||||
kse->_storeId = store.storeId;
|
kse->_storeId = store.storeId;
|
||||||
kse->_storeName = store.name;
|
kse->_storeName = store.name;
|
||||||
kse->kb = store.certs[n];
|
kse->kb = store.certs[n];
|
||||||
kse->avail = store.avail;
|
kse->store = &store;
|
||||||
|
out += kse;
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual KeyStoreEntryContext *entryPassive(const QString &serialized)
|
virtual KeyStoreEntryContext *entryPassive(const QString &serialized)
|
||||||
{
|
{
|
||||||
Q_UNUSED(serialized);
|
if(serialized == "qca-test-1/fake_serialized")
|
||||||
|
{
|
||||||
|
TestKeyStore &store = data.stores[0];
|
||||||
|
TestKeyStoreEntryContext *kse = new TestKeyStoreEntryContext(provider());
|
||||||
|
kse->_id = QString::number(0);
|
||||||
|
kse->_name = store.certs[0].certificateChain().primary().commonName();
|
||||||
|
kse->_storeId = store.storeId;
|
||||||
|
kse->_storeName = store.name;
|
||||||
|
kse->kb = store.certs[0];
|
||||||
|
kse->store = &store;
|
||||||
|
return kse;
|
||||||
|
}
|
||||||
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user