xca/lib/pk11_attribute.h
Christian Hohnstaedt 993da2d474 Use C++11 initializers for all non-static class members
When XCA started in 2002, there were no C++ initializers.
Drop explicit initializers from the constructors.

 - Fix indentations of section declarators.
 - Replace NULL by nullptr when feasible.
 - Sort private section: properties first, then methods.
2023-10-08 22:19:18 +02:00

262 lines
5.2 KiB
C++

/* vi: set sw=4 ts=4:
*
* Copyright (C) 2009 - 2010 Christian Hohnstaedt.
*
* All rights reserved.
*/
#ifndef __PKI_PKCS11_ATTRIBUTE_H
#define __PKI_PKCS11_ATTRIBUTE_H
#include <QString>
#include <stdlib.h>
#include <openssl/bn.h>
#include "opensc-pkcs11.h"
#include "exception.h"
#define UTF8QSTRING(x,s) QString::fromUtf8((const char*)(x), s).trimmed()
#define ASCIIQSTRING(x,s) QString::fromLatin1((const char*)(x), s).trimmed()
class pk11_attlist;
class pk11_attribute
{
friend class pk11_attlist;
protected:
CK_ATTRIBUTE attr{};
public:
pk11_attribute(unsigned long type)
{
attr.type = type;
}
virtual ~pk11_attribute() { }
const CK_ATTRIBUTE *getAttribute() const
{
return &attr;
}
unsigned long type() const
{
return attr.type;
}
QByteArray getData() const
{
return QByteArray((char*)attr.pValue, attr.ulValueLen);
}
virtual void store(const slotid &slot,
CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj);
virtual void load(const slotid &slot,
CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj);
bool cmp(const pk11_attribute &other) const
{
return (attr.type == other.attr.type) &&
(attr.ulValueLen == other.attr.ulValueLen) &&
!memcmp(attr.pValue, other.attr.pValue,
attr.ulValueLen);
}
bool operator == (const pk11_attribute &other) const
{
return cmp(other);
}
};
class pk11_attr_bool: public pk11_attribute
{
protected:
unsigned char value;
public:
pk11_attr_bool(unsigned long type, bool v = false)
:pk11_attribute(type)
{
attr.pValue = &value;
attr.ulValueLen = sizeof(value);
setValue(v);
}
pk11_attr_bool(const pk11_attr_bool &p)
:pk11_attribute(p.type())
{
attr.pValue = &value;
attr.ulValueLen = sizeof(value);
setValue(p.value);
}
bool getValue() const
{
return value ? true : false;
}
void setValue(unsigned long v)
{
value = v ? 1 : 0;
}
};
class pk11_attr_ulong: public pk11_attribute
{
protected:
unsigned long value;
public:
pk11_attr_ulong(unsigned long type, unsigned long v = 0)
:pk11_attribute(type)
{
attr.pValue = &value;
attr.ulValueLen = sizeof(value);
setValue(v);
}
pk11_attr_ulong(const pk11_attr_ulong &p)
:pk11_attribute(p.type())
{
attr.pValue = &value;
attr.ulValueLen = sizeof(value);
setValue(p.value);
}
unsigned long getValue() const
{
return value;
}
void setValue(unsigned long v)
{
value = v;
}
};
class pk11_attr_data: public pk11_attribute
{
public:
pk11_attr_data() :pk11_attribute(0) { }
pk11_attr_data(unsigned long type, const unsigned char *v = NULL,
unsigned long len = 0) :pk11_attribute(type)
{
setValue(v, len);
}
pk11_attr_data(const pk11_attr_data &p)
:pk11_attribute(p.type())
{
const unsigned char *ptr;
unsigned long size = p.getValue(&ptr);
setValue(ptr, size);
}
pk11_attr_data(unsigned long type, QByteArray ba)
:pk11_attribute(type)
{
setValue((const unsigned char *)ba.constData(), ba.size());
}
pk11_attr_data(unsigned long type, BIGNUM *bn, bool consume=true)
:pk11_attribute(type)
{
setBignum(bn, consume);
}
pk11_attr_data(unsigned long type, const BIGNUM *bn)
:pk11_attribute(type)
{
setConstBignum(bn);
}
pk11_attr_data(unsigned long type, unsigned long value)
:pk11_attribute(type)
{
setULong(value);
}
void setULong(unsigned long value)
{
BIGNUM *bn = BN_new();
Q_CHECK_PTR(bn);
BN_set_word(bn, value);
setBignum(bn, true);
}
unsigned long getValue(const unsigned char **ptr) const
{
*ptr = (const unsigned char*)attr.pValue;
return attr.ulValueLen;
}
~pk11_attr_data()
{
if (attr.pValue) {
memset(attr.pValue, 0, attr.ulValueLen);
free(attr.pValue);
}
}
QString getText() const
{
unsigned long len = attr.ulValueLen;
char *p = (char*)attr.pValue;
/* Fixup 0 padded attributes, returned by some broken
libs like OpenLimit */
while (p[len-1] == 0 && len > 0)
len--;
return UTF8QSTRING(attr.pValue, len);
}
BIGNUM *getBignum() const
{
return BN_bin2bn((unsigned char*)attr.pValue,
attr.ulValueLen, NULL);
}
void setBignum(BIGNUM *bn, bool consume=true);
void setConstBignum(const BIGNUM *bn);
void load(const slotid &slot,
CK_SESSION_HANDLE sess, CK_OBJECT_HANDLE obj);
void setValue(const unsigned char *ptr, unsigned long len);
pk11_attr_data &operator = (const pk11_attr_data &p)
{
const unsigned char *ptr;
unsigned long size = p.getValue(&ptr);
attr.type = p.attr.type;
setValue(ptr, size);
return *this;
}
};
class pk11_attlist {
private:
CK_ATTRIBUTE *attributes;
unsigned long attlen;
unsigned long alloc_len;
void init()
{
attlen = 0;
alloc_len = 0;
attributes = NULL;
}
public:
pk11_attlist()
{
init();
}
pk11_attlist(const pk11_attlist &a);
pk11_attlist(const pk11_attribute &a)
{
init();
addAttribute(a);
}
~pk11_attlist();
unsigned long get(CK_ATTRIBUTE **attp)
{
*attp = attributes;
return attlen;
}
void addAttribute(const pk11_attribute &a);
pk11_attlist &operator << (const pk11_attribute &a)
{
addAttribute(a);
return *this;
}
CK_ATTRIBUTE *getAttributes() {
return attributes;
}
unsigned long length() {
return attlen;
}
pk11_attlist &operator = (const pk11_attlist &a)
{
copy(a);
return *this;
}
void copy(const pk11_attlist &a);
void reset();
};
#endif