xca/lib/pki_key.h
2019-03-18 06:25:20 +01:00

115 lines
2.8 KiB
C++

/*
* Copyright (C) 2001 - 2015 Christian Hohnstaedt.
*
* All rights reserved.
*/
#ifndef __PKI_KEY_H
#define __PKI_KEY_H
#include <QString>
#include <QProgressBar>
#include <openssl/rsa.h>
#include <openssl/bn.h>
#include <openssl/pem.h>
#include <openssl/evp.h>
#include "pki_base.h"
#include "builtin_curves.h"
#define MAX_KEY_LENGTH 4096
#define VIEW_public_keys_type 6
#define VIEW_public_keys_len 7
#define VIEW_public_keys_public 8
class pki_key: public pki_base
{
Q_OBJECT
public:
enum passType { ptCommon, ptPrivate, ptBogus, ptPin };
protected:
enum passType ownPass;
int key_size;
bool isPub;
EVP_PKEY *key;
QString BN2QString(const BIGNUM *bn) const;
QString BNoneLine(BIGNUM *bn) const;
QByteArray SSH2publicQByteArray(bool raw=false) const;
QByteArray X509_PUBKEY_public_key() const;
void PEM_file_comment(XFile &file) const;
private:
BIGNUM *ssh_key_data2bn(QByteArray *ba) const;
void ssh_key_check_chunk(QByteArray *ba, const char *expect) const;
QByteArray ssh_key_next_chunk(QByteArray *ba) const;
void ssh_key_QBA2data(const QByteArray &ba,
QByteArray *data) const;
void ssh_key_bn2data(const BIGNUM *bn, QByteArray *data) const;
mutable int useCount; // usage counter
public:
pki_key(const QString name = "");
pki_key(const pki_key *pk);
virtual ~pki_key();
static builtin_curves builtinCurves;
void autoIntName();
QString length() const;
QString comboText() const;
QString getKeyTypeString(void) const;
virtual EVP_PKEY *decryptKey() const = 0;
virtual bool isToken();
virtual QString getTypeString(void) const;
virtual QList<int> possibleHashNids();
QString getMsg(msg_type msg) const;
void writePublic(XFile &file, bool pem) const;
bool compare(const pki_base *ref) const;
int getKeyType() const;
bool isPrivKey() const;
bool verify(EVP_PKEY *pkey) const;
virtual bool verify_priv(EVP_PKEY *pkey) const;
int getUcount() const;
void setUcount(int c)
{
useCount = c;
}
enum passType getOwnPass(void)
{
return ownPass;
}
EVP_PKEY *getPubKey()
{
return key;
}
bool isPubKey() const
{
return isPub;
}
BIO *pem(BIO *, int);
QVariant column_data(const dbheader *hd) const;
QString modulus() const;
QString pubEx() const;
QString subprime() const;
QString pubkey() const;
int ecParamNid() const;
QString ecPubKey() const;
BIGNUM *ecPubKeyBN() const;
void d2i(QByteArray &ba);
void d2i_old(QByteArray &ba, int type);
QByteArray i2d() const;
EVP_PKEY *load_ssh2_key(XFile &file);
void writeSSH2public(XFile &file) const;
QString fingerprint(const QString &format) const;
bool SSH2_compatible() const;
void resetUcount()
{
useCount = -1;
}
QSqlError insertSqlData();
QSqlError deleteSqlData();
void restoreSql(const QSqlRecord &rec);
};
Q_DECLARE_METATYPE(pki_key *);
#endif