qca/include/QtCrypto/qca_securemessage.h
Justin Karneges 504373adfc implementing securemessage
svn path=/trunk/kdesupport/qca/; revision=409940
2005-05-06 07:13:23 +00:00

230 lines
5.6 KiB
C++

/*
* qca_securemessage.h - Qt Cryptographic Architecture
* Copyright (C) 2003-2005 Justin Karneges <justin@affinix.com>
* Copyright (C) 2004,2005 Brad Hards <bradh@frogmouth.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef QCA_SECUREMESSAGE_H
#define QCA_SECUREMESSAGE_H
#include <QObject>
#include "qca_core.h"
#include "qca_publickey.h"
#include "qca_cert.h"
class QDateTime;
namespace QCA
{
class SecureMessageSystem;
class SecureMessageKey
{
public:
enum Type
{
None,
PGP,
X509
};
SecureMessageKey();
SecureMessageKey(const SecureMessageKey &from);
~SecureMessageKey();
SecureMessageKey & operator=(const SecureMessageKey &from);
Type type() const;
// pgp
PGPKey pgpPublicKey() const;
PGPKey pgpSecretKey() const;
void setPGPPublicKey(const PGPKey &pub);
void setPGPSecretKey(const PGPKey &sec);
// x509
CertificateChain x509CertificateChain() const;
PrivateKey x509PrivateKey() const;
void setX509CertificateChain(const CertificateChain &c);
void setX509PrivateKey(const PrivateKey &k);
// generic
bool havePrivate() const;
QString name() const; // pgp = primary user id, x509 = common name
private:
class Private;
QSharedDataPointer<Private> d;
};
typedef QList<SecureMessageKey> SecureMessageKeyList;
class SecureMessageSignature
{
public:
enum IdentityResult
{
Valid, // indentity is verified, matches signature
InvalidSignature, // valid key provided, but signature failed
InvalidKey, // invalid key provided
NoKey // identity unknown
};
SecureMessageSignature();
SecureMessageSignature(IdentityResult r, Validity v, const SecureMessageKey &key, const QDateTime &ts);
SecureMessageSignature(const SecureMessageSignature &from);
~SecureMessageSignature();
SecureMessageSignature & operator=(const SecureMessageSignature &from);
IdentityResult identityResult() const;
Validity keyValidity() const;
SecureMessageKey key() const;
QDateTime timestamp() const;
private:
class Private;
QSharedDataPointer<Private> d;
};
typedef QList<SecureMessageSignature> SecureMessageSignatureList;
class SecureMessage : public QObject, public Algorithm
{
Q_OBJECT
public:
enum Type
{
OpenPGP,
SMIME
};
enum SignMode
{
Message,
Clearsign,
Detached
};
enum Order
{
EncryptThenSign,
SignThenEncrypt
};
/**
Formats for secure messages
*/
enum Format
{
Binary, ///< DER/binary
Ascii ///< PEM/ascii-armored
};
/**
Errors for secure messages
*/
enum Error
{
ErrorPassphrase, ///< passphrase was either wrong or not provided
ErrorFormat, ///< input format was bad
ErrorSignerExpired, ///< signing key is expired
ErrorSignerInvalid, ///< signing key is invalid in some way
ErrorEncryptExpired, ///< encrypting key is expired
ErrorEncryptInvalid, ///< encrypting key is invalid in some way
ErrorUnknown ///< other error
};
SecureMessage(SecureMessageSystem *system);
~SecureMessage();
Type type() const;
bool canSignMultiple() const; // PGP can't sign multiple
bool canClearsign() const; // S/MIME can't clearsign
void reset();
void setEnableBundleSigner(bool); // Bundle S/MIME certificate chain (default true)
void setFormat(Format f); // (default Binary)
void setRecipient(const SecureMessageKey &key);
void setRecipients(const SecureMessageKeyList &keys);
void setSigner(const SecureMessageKey &key);
void setSigners(const SecureMessageKeyList &keys);
void startEncrypt();
void startDecrypt();
void startSign(SignMode m = Message);
void startVerify(const QSecureArray &detachedSig = QSecureArray());
void startEncryptAndSign(Order o = EncryptThenSign);
void startDecryptAndVerify(Order o = EncryptThenSign);
void update(const QSecureArray &in);
QSecureArray read();
int bytesAvailable() const;
void end();
bool waitForFinished();
bool success() const;
Error errorCode() const;
// sign
QSecureArray signature() const;
// verify
bool verifySuccess() const;
SecureMessageSignature signer() const;
SecureMessageSignatureList signers() const;
QString diagnosticText() const;
signals:
void readyRead();
void finished();
public:
class Private;
private:
friend class Private;
Private *d;
};
class SecureMessageSystem : public QObject, public Algorithm
{
Q_OBJECT
public:
~SecureMessageSystem();
protected:
SecureMessageSystem(QObject *parent, const QString &type, const QString &provider);
};
class OpenPGP : public SecureMessageSystem
{
Q_OBJECT
public:
OpenPGP(QObject *parent = 0, const QString &provider = QString());
~OpenPGP();
};
class SMIME : public SecureMessageSystem
{
Q_OBJECT
public:
SMIME(QObject *parent = 0, const QString &provider = QString());
~SMIME();
void setTrustedCertificates(const CertificateCollection &trusted);
void setPrivateKeys(const QList<PrivateKey> &keys);
};
}
#endif