xca/lib/pkcs11.h
Christian Hohnstaedt 928ff6458c Improve and fix qDeleteAll()
qDeleteAll() does not clear the QList.
Add it, if necessary.

Use dynamic_cast where appropriate
2020-03-20 16:29:42 +01:00

204 lines
4.8 KiB
C++

/* vi: set sw=4 ts=4:
*
* Copyright (C) 2009 - 2011 Christian Hohnstaedt.
*
* All rights reserved.
*/
#ifndef __XCA_PKCS11_H
#define __XCA_PKCS11_H
#include "pkcs11_lib.h"
#include "opensc-pkcs11.h"
#include <QStringList>
#include <QString>
#include <QList>
#include <ltdl.h>
#include "pk11_attribute.h"
#include "func.h"
void waitcursor(int start, int line);
#define WAITCURSOR_START waitcursor(1, __LINE__);
#define WAITCURSOR_END waitcursor(0, __LINE__);
extern char segv_data[1024];
#define CALL_P11_C(l, func, ...) do { \
snprintf(segv_data, sizeof segv_data, "Crashed in %s in %s from %s:%d\n" \
"This looks like a bug in the PKC#11 library and not in XCA\n", \
#func, CCHAR((l)->filename()), __func__, __LINE__); \
if (IS_GUI_APP) \
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); \
rv = l->ptr()->func(__VA_ARGS__); \
segv_data[0] = 0; \
if (IS_GUI_APP) \
QApplication::restoreOverrideCursor(); \
ign_openssl_error(); \
} while(0);
class tkInfo
{
private:
CK_TOKEN_INFO token_info;
public:
tkInfo()
{
memset(&token_info, 0, sizeof token_info);
}
tkInfo(const CK_TOKEN_INFO *ti)
{
set(ti);
}
tkInfo(const tkInfo &tk)
{
set(&tk.token_info);
}
void set(const CK_TOKEN_INFO *ti)
{
memcpy(&token_info, ti, sizeof(token_info));
// sanitize strings
for (int i=0; i<32; i++) {
if (token_info.label[i] == 0)
token_info.label[i] = ' ';
if (token_info.manufacturerID[i] == 0)
token_info.manufacturerID[i] = ' ';
}
for (int i=0; i<16; i++) {
if (token_info.model[i] == 0)
token_info.model[i] = ' ';
if (token_info.serialNumber[i] == 0)
token_info.serialNumber[i] = ' ';
}
}
QString label() const
{
return UTF8QSTRING(token_info.label, 32);
}
QString manufacturerID() const
{
return UTF8QSTRING(token_info.manufacturerID, 32);
}
QString model() const
{
return UTF8QSTRING(token_info.model, 16);
}
QString serial() const
{
return ASCIIQSTRING(token_info.serialNumber, 16);
}
bool protAuthPath() const
{
return !!(token_info.flags & CKF_PROTECTED_AUTHENTICATION_PATH);
}
bool tokenInitialized() const
{
return !!(token_info.flags & CKF_TOKEN_INITIALIZED);
}
QString pinInfo() const
{
return QObject::tr("Required PIN size: %1 - %2").
arg(token_info.ulMinPinLen).
arg(token_info.ulMaxPinLen);
}
};
class pkcs11
{
friend class pk11_attribute;
friend class pk11_attr_ulong;
friend class pk11_attr_data;
private:
static pkcs11_lib_list libs;
slotid p11slot;
CK_SESSION_HANDLE session;
CK_OBJECT_HANDLE p11obj;
public:
pkcs11();
~pkcs11();
static bool loaded()
{
foreach(pkcs11_lib *l, libs) {
if (l->isLoaded())
return true;
}
return false;
}
static pkcs11_lib *load_lib(const QString &fname);
static pkcs11_lib *get_lib(const QString &fname)
{
return libs.get_lib(fname);
}
static bool remove_lib(QString fname)
{
return libs.remove_lib(fname);
}
static void remove_libs()
{
qDeleteAll(libs);
libs.clear();
}
static void reload_libs(const QString &libnames);
static pkcs11_lib_list get_libs()
{
return libs;
}
CK_RV tokenInfo(slotid slot, tkInfo *tkinfo);
tkInfo tokenInfo(slotid slot);
tkInfo tokenInfo()
{
return tokenInfo(p11slot);
}
QString driverInfo(slotid slot)
{
return slot.lib->driverInfo();
}
slotidList getSlotList()
{
return libs.getSlotList();
}
bool selectToken(slotid *slot, QWidget *w);
void changePin(slotid slot, bool so);
void initPin(slotid slot);
void initToken(slotid slot, unsigned char *pin,
int pinlen, QString label);
QList<CK_MECHANISM_TYPE> mechanismList(slotid slot);
void mechanismInfo(slotid slot, CK_MECHANISM_TYPE m,
CK_MECHANISM_INFO *info);
void startSession(slotid slot, bool rw = false);
/* Session based functions */
void loadAttribute(pk11_attribute &attribute,
CK_OBJECT_HANDLE object);
void storeAttribute(pk11_attribute &attribute,
CK_OBJECT_HANDLE object);
QList<CK_OBJECT_HANDLE> objectList(pk11_attlist &atts);
QString tokenLogin(QString name, bool so, bool force=false);
void getRandom();
void logout();
bool needsLogin(bool so);
void login(unsigned char *pin, unsigned long pinlen, bool so);
void setPin(unsigned char *oldPin, unsigned long oldPinLen,
unsigned char *pin, unsigned long pinLen);
CK_OBJECT_HANDLE createObject(pk11_attlist &attrs);
pk11_attr_data findUniqueID(unsigned long oclass);
pk11_attr_data generateKey(QString name,
unsigned long ec_rsa_mech, unsigned long bits, int nid);
int deleteObjects(QList<CK_OBJECT_HANDLE> objects);
EVP_PKEY *getPrivateKey(EVP_PKEY *pub, CK_OBJECT_HANDLE obj);
int encrypt(int flen, const unsigned char *from,
unsigned char *to, int tolen, unsigned long m);
int decrypt(int flen, const unsigned char *from,
unsigned char *to, int tolen, unsigned long m);
};
#endif