mirror of
https://github.com/QuasarApp/qca.git
synced 2025-05-07 16:29: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;
|
||||
|
||||
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
|
||||
//----------------------------------------------------------------------------
|
||||
@ -73,6 +95,42 @@ public:
|
||||
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
|
||||
//----------------------------------------------------------------------------
|
||||
@ -80,8 +138,20 @@ class TestRSAContext : public RSAContext
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
bool priv;
|
||||
TestKeyStore *store;
|
||||
|
||||
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
|
||||
{
|
||||
return false;
|
||||
return priv;
|
||||
}
|
||||
|
||||
virtual bool canExport() const
|
||||
@ -112,6 +182,7 @@ public:
|
||||
|
||||
virtual void convertToPublic()
|
||||
{
|
||||
priv = false;
|
||||
}
|
||||
|
||||
virtual int bits() const
|
||||
@ -119,6 +190,37 @@ public:
|
||||
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)
|
||||
{
|
||||
Q_UNUSED(bits);
|
||||
@ -143,12 +245,12 @@ public:
|
||||
|
||||
virtual BigInteger n() const
|
||||
{
|
||||
return BigInteger();
|
||||
return BigInteger(QString(key_n_dec));
|
||||
}
|
||||
|
||||
virtual BigInteger e() const
|
||||
{
|
||||
return BigInteger();
|
||||
return BigInteger(QString(key_e_dec));
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
delete _key;
|
||||
@ -253,12 +363,16 @@ public:
|
||||
|
||||
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
|
||||
{
|
||||
return QString();
|
||||
return QString(cert_pem);
|
||||
}
|
||||
|
||||
virtual ConvertResult fromDER(const QByteArray &a)
|
||||
@ -293,9 +407,11 @@ public:
|
||||
|
||||
virtual PKeyContext *subjectPublicKey() const
|
||||
{
|
||||
TestPKeyContext *kc = new TestPKeyContext(provider());
|
||||
kc->setKey(new TestRSAContext(provider()));
|
||||
return kc;
|
||||
TestRSAContext *rsa1 = new TestRSAContext(provider());
|
||||
rsa1->priv = false;
|
||||
TestPKeyContext *kc1 = new TestPKeyContext(provider());
|
||||
kc1->setKey(rsa1);
|
||||
return kc1;
|
||||
}
|
||||
|
||||
virtual bool isIssuerOf(const CertContext *other) const
|
||||
@ -332,7 +448,7 @@ class TestKeyStoreEntryContext : public KeyStoreEntryContext
|
||||
public:
|
||||
QString _id, _name, _storeId, _storeName;
|
||||
KeyBundle kb;
|
||||
bool avail;
|
||||
TestKeyStore *store;
|
||||
|
||||
TestKeyStoreEntryContext(Provider *p) :
|
||||
KeyStoreEntryContext(p)
|
||||
@ -371,12 +487,12 @@ public:
|
||||
|
||||
virtual bool isAvailable() const
|
||||
{
|
||||
return avail;
|
||||
return store->avail;
|
||||
}
|
||||
|
||||
virtual QString serialize() const
|
||||
{
|
||||
return QString();
|
||||
return QString("qca-test-1/fake_serialized");
|
||||
}
|
||||
|
||||
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
|
||||
//----------------------------------------------------------------------------
|
||||
@ -449,13 +529,17 @@ public:
|
||||
cc1->_props.subject += CertificateInfoPair(CertificateInfoType(CommonName), "Test Cert 1");
|
||||
pub1.change(cc1);
|
||||
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);
|
||||
|
||||
TestKeyStore ks1;
|
||||
ks1.storeId = "store1";
|
||||
ks1.name = "Test Store 1";
|
||||
ks1.certs += cert1;
|
||||
ks1.avail = false;
|
||||
data.stores += ks1;
|
||||
|
||||
TestKeyStore ks2;
|
||||
@ -464,6 +548,8 @@ public:
|
||||
ks2.readOnly = false;
|
||||
data.stores += ks2;
|
||||
|
||||
rsa1->store = &data.stores[0];
|
||||
|
||||
connect(&t, SIGNAL(timeout()), SLOT(do_step()));
|
||||
}
|
||||
|
||||
@ -560,14 +646,27 @@ public:
|
||||
kse->_storeId = store.storeId;
|
||||
kse->_storeName = store.name;
|
||||
kse->kb = store.certs[n];
|
||||
kse->avail = store.avail;
|
||||
kse->store = &store;
|
||||
out += kse;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user