# qca_publickey.h

Go to the documentation of this file.

    00001 /*
    00002  * qca_publickey.h - Qt Cryptographic Architecture
    00003  * Copyright (C) 2003-2007  Justin Karneges <justin@affinix.com>
    00004  * Copyright (C) 2004,2005  Brad Hards <bradh@frogmouth.net>
    00005  *
    00006  * This library is free software; you can redistribute it and/or
    00007  * modify it under the terms of the GNU Lesser General Public
    00008  * License as published by the Free Software Foundation; either
    00009  * version 2.1 of the License, or (at your option) any later version.
    00010  *
    00011  * This library is distributed in the hope that it will be useful,
    00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00014  * Lesser General Public License for more details.
    00015  *
    00016  * You should have received a copy of the GNU Lesser General Public
    00017  * License along with this library; if not, write to the Free Software
    00018  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    00019  * 02110-1301  USA
    00020  *
    00021  */
    00022
    00033 #ifndef QCA_PUBLICKEY_H
    00034 #define QCA_PUBLICKEY_H
    00035
    00036 #include <QObject>
    00037 #include "qca_core.h"
    00038
    00039 namespace QCA {
    00040
    00041 class PublicKey;
    00042 class PrivateKey;
    00043 class KeyGenerator;
    00044 class RSAPublicKey;
    00045 class RSAPrivateKey;
    00046 class DSAPublicKey;
    00047 class DSAPrivateKey;
    00048 class DHPublicKey;
    00049 class DHPrivateKey;
    00050
    00054 enum EncryptionAlgorithm
    00055 {
    00056         EME_PKCS1v15,
    00057         EME_PKCS1_OAEP
    00058 };
    00059
    00063 enum SignatureAlgorithm
    00064 {
    00065         SignatureUnknown,
    00066         EMSA1_SHA1,
    00067         EMSA3_SHA1,
    00068         EMSA3_MD5,
    00069         EMSA3_MD2,
    00070         EMSA3_RIPEMD160,
    00071         EMSA3_Raw
    00072 };
    00073
    00077 enum SignatureFormat
    00078 {
    00079         DefaultFormat,
    00080         IEEE_1363,
    00081         DERSequence
    00082 };
    00083
    00087 enum PBEAlgorithm
    00088 {
    00089         PBEDefault,
    00090         PBES2_DES_SHA1,
    00091         PBES2_TripleDES_SHA1,
    00092         PBES2_AES128_SHA1,
    00093         PBES2_AES192_SHA1,
    00094         PBES2_AES256_SHA1
    00095 };
    00096
    00103 enum ConvertResult
    00104 {
    00105         ConvertGood,
    00106         ErrorDecode,
    00107         ErrorPassphrase,
    00108         ErrorFile
    00109 };
    00110
    00119 enum DLGroupSet
    00120 {
    00121         DSA_512,
    00122         DSA_768,
    00123         DSA_1024,
    00124         IETF_768,
    00125         IETF_1024,
    00126         IETF_1536,
    00127         IETF_2048,
    00128         IETF_3072,
    00129         IETF_4096,
    00130         IETF_6144,
    00131         IETF_8192
    00132
    00133 };
    00134
    00147 QCA_EXPORT QByteArray emsa3Encode(const QString &hashName, const QByteArray &digest, int size = -1);
    00148
    00156 class QCA_EXPORT DLGroup
    00157 {
    00158 public:
    00159         DLGroup();
    00160
    00168         DLGroup(const BigInteger &p, const BigInteger &q, const BigInteger &g);
    00169
    00176         DLGroup(const BigInteger &p, const BigInteger &g);
    00177
    00183         DLGroup(const DLGroup &from);
    00184         ~DLGroup();
    00185
    00191         DLGroup & operator=(const DLGroup &from);
    00192
    00199         static QList<DLGroupSet> supportedGroupSets(const QString &provider = QString());
    00200
    00204         bool isNull() const;
    00205
    00209         BigInteger p() const;
    00210
    00214         BigInteger q() const;
    00215
    00219         BigInteger g() const;
    00220
    00221 private:
    00222         class Private;
    00223         Private *d;
    00224 };
    00225
    00235 class QCA_EXPORT PKey : public Algorithm
    00236 {
    00237 public:
    00241         enum Type {
    00242                 RSA,
    00243                 DSA,
    00244                 DH
    00245         };
    00246
    00250         PKey();
    00251
    00257         PKey(const PKey &from);
    00258
    00259         ~PKey();
    00260
    00266         PKey & operator=(const PKey &from);
    00267
    00299         static QList<Type> supportedTypes(const QString &provider = QString());
    00300
    00330         static QList<Type> supportedIOTypes(const QString &provider = QString());
    00331
    00337         bool isNull() const;
    00338
    00344         Type type() const;
    00345
    00349         int bitSize() const;
    00350
    00354         bool isRSA() const;
    00355
    00359         bool isDSA() const;
    00360
    00364         bool isDH() const;
    00365
    00369         bool isPublic() const;
    00370
    00374         bool isPrivate() const;
    00375
    00380         bool canExport() const;
    00381
    00385         bool canKeyAgree() const;
    00386
    00393         PublicKey toPublicKey() const;
    00394
    00398         PrivateKey toPrivateKey() const;
    00399
    00405         bool operator==(const PKey &a) const;
    00406
    00412         bool operator!=(const PKey &a) const;
    00413
    00414 protected:
    00421         PKey(const QString &type, const QString &provider);
    00422
    00428         void set(const PKey &k);
    00429
    00439         RSAPublicKey toRSAPublicKey() const;
    00440
    00450         RSAPrivateKey toRSAPrivateKey() const;
    00451
    00461         DSAPublicKey toDSAPublicKey() const;
    00462
    00472         DSAPrivateKey toDSAPrivateKey() const;
    00473
    00483         DHPublicKey toDHPublicKey() const;
    00484
    00494         DHPrivateKey toDHPrivateKey() const;
    00495
    00496 private:
    00497         void assignToPublic(PKey *dest) const;
    00498         void assignToPrivate(PKey *dest) const;
    00499
    00500         class Private;
    00501         Private *d;
    00502 };
    00503
    00512 class QCA_EXPORT PublicKey : public PKey
    00513 {
    00514 public:
    00518         PublicKey();
    00519
    00525         PublicKey(const PrivateKey &k);
    00526
    00534         PublicKey(const QString &fileName);
    00535
    00541         PublicKey(const PublicKey &from);
    00542
    00543         ~PublicKey();
    00544
    00550         PublicKey & operator=(const PublicKey &from);
    00551
    00558         RSAPublicKey toRSA() const;
    00559
    00566         DSAPublicKey toDSA() const;
    00567
    00574         DHPublicKey toDH() const;
    00575
    00581         bool canEncrypt() const;
    00582
    00588         bool canVerify() const;
    00589
    00596         int maximumEncryptSize(EncryptionAlgorithm alg) const;
    00597
    00604         SecureArray encrypt(const SecureArray &a, EncryptionAlgorithm alg);
    00605
    00612         void startVerify(SignatureAlgorithm alg, SignatureFormat format = DefaultFormat);
    00613
    00619         void update(const MemoryRegion &a);
    00620
    00646         bool validSignature(const QByteArray &sig);
    00647
    00661         bool verifyMessage(const MemoryRegion &a, const QByteArray &sig, SignatureAlgorithm alg, SignatureFormat format = DefaultFormat);
    00662
    00666         QByteArray toDER() const;
    00667
    00676         QString toPEM() const;
    00677
    00689         bool toPEMFile(const QString &fileName) const;
    00690
    00713         static PublicKey fromDER(const QByteArray &a, ConvertResult *result = 0, const QString &provider = QString());
    00714
    00740         static PublicKey fromPEM(const QString &s, ConvertResult *result = 0, const QString &provider = QString());
    00741
    00769         static PublicKey fromPEMFile(const QString &fileName, ConvertResult *result = 0, const QString &provider = QString());
    00770
    00771 protected:
    00778         PublicKey(const QString &type, const QString &provider);
    00779
    00780 private:
    00781         class Private;
    00782         Private *d;
    00783 };
    00784
    00793 class QCA_EXPORT PrivateKey : public PKey
    00794 {
    00795 public:
    00799         PrivateKey();
    00800
    00812         explicit PrivateKey(const QString &fileName, const SecureArray &passphrase = SecureArray());
    00813
    00819         PrivateKey(const PrivateKey &from);
    00820
    00821         ~PrivateKey();
    00822
    00828         PrivateKey & operator=(const PrivateKey &from);
    00829
    00833         RSAPrivateKey toRSA() const;
    00834
    00838         DSAPrivateKey toDSA() const;
    00839
    00843         DHPrivateKey toDH() const;
    00844
    00850         bool canDecrypt() const;
    00851
    00857         bool canSign() const;
    00858
    00869         bool decrypt(const SecureArray &in, SecureArray *out, EncryptionAlgorithm alg);
    00870
    00880         void startSign(SignatureAlgorithm alg, SignatureFormat format = DefaultFormat);
    00881
    00890         void update(const MemoryRegion &a);
    00891
    00898         QByteArray signature();
    00899
    00912         QByteArray signMessage(const MemoryRegion &a, SignatureAlgorithm alg, SignatureFormat format = DefaultFormat);
    00913
    00919         SymmetricKey deriveKey(const PublicKey &theirs);
    00920
    00928         static QList<PBEAlgorithm> supportedPBEAlgorithms(const QString &provider = QString());
    00929
    00940         SecureArray toDER(const SecureArray &passphrase = SecureArray(), PBEAlgorithm pbe = PBEDefault) const;
    00941
    00954         QString toPEM(const SecureArray &passphrase = SecureArray(), PBEAlgorithm pbe = PBEDefault) const;
    00955
    00972         bool toPEMFile(const QString &fileName, const SecureArray &passphrase = SecureArray(), PBEAlgorithm pbe = PBEDefault) const;
    00973
    00992         static PrivateKey fromDER(const SecureArray &a, const SecureArray &passphrase = SecureArray(), ConvertResult *result = 0, const QString &provider = QString());
    00993
    01012         static PrivateKey fromPEM(const QString &s, const SecureArray &passphrase = SecureArray(), ConvertResult *result = 0, const QString &provider = QString());
    01013
    01036         static PrivateKey fromPEMFile(const QString &fileName, const SecureArray &passphrase = SecureArray(), ConvertResult *result = 0, const QString &provider = QString());
    01037
    01038 protected:
    01046         PrivateKey(const QString &type, const QString &provider);
    01047
    01048 private:
    01049         class Private;
    01050         Private *d;
    01051 };
    01052
    01064 class QCA_EXPORT KeyGenerator : public QObject
    01065 {
    01066         Q_OBJECT
    01067 public:
    01073         KeyGenerator(QObject *parent = 0);
    01074
    01075         ~KeyGenerator();
    01076
    01085         bool blockingEnabled() const;
    01086
    01095         void setBlockingEnabled(bool b);
    01096
    01102         bool isBusy() const;
    01103
    01120         PrivateKey createRSA(int bits, int exp = 65537, const QString &provider = QString());
    01121
    01137         PrivateKey createDSA(const DLGroup &domain, const QString &provider = QString());
    01138
    01153         PrivateKey createDH(const DLGroup &domain, const QString &provider = QString());
    01154
    01161         PrivateKey key() const;
    01162
    01171         DLGroup createDLGroup(QCA::DLGroupSet set, const QString &provider = QString());
    01172
    01176         DLGroup dlGroup() const;
    01177
    01178 Q_SIGNALS:
    01184         void finished();
    01185
    01186 private:
    01187         Q_DISABLE_COPY(KeyGenerator)
    01188
    01189         class Private;
    01190         friend class Private;
    01191         Private *d;
    01192 };
    01193
    01202 class QCA_EXPORT RSAPublicKey : public PublicKey
    01203 {
    01204 public:
    01208         RSAPublicKey();
    01209
    01218         RSAPublicKey(const BigInteger &n, const BigInteger &e, const QString &provider = QString());
    01219
    01225         RSAPublicKey(const RSAPrivateKey &k);
    01226
    01234         BigInteger n() const;
    01235
    01242         BigInteger e() const;
    01243 };
    01244
    01253 class QCA_EXPORT RSAPrivateKey : public PrivateKey
    01254 {
    01255 public:
    01259         RSAPrivateKey();
    01260
    01272         RSAPrivateKey(const BigInteger &n, const BigInteger &e, const BigInteger &p, const BigInteger &q, const BigInteger &d, const QString &provider = QString());
    01273
    01281         BigInteger n() const;
    01282
    01289         BigInteger e() const;
    01290
    01294         BigInteger p() const;
    01295
    01300         BigInteger q() const;
    01301
    01305         BigInteger d() const;
    01306 };
    01307
    01316 class QCA_EXPORT DSAPublicKey : public PublicKey
    01317 {
    01318 public:
    01322         DSAPublicKey();
    01323
    01332         DSAPublicKey(const DLGroup &domain, const BigInteger &y, const QString &provider = QString());
    01333
    01339         DSAPublicKey(const DSAPrivateKey &k);
    01340
    01344         DLGroup domain() const;
    01345
    01349         BigInteger y() const;
    01350 };
    01351
    01360 class QCA_EXPORT DSAPrivateKey : public PrivateKey
    01361 {
    01362 public:
    01366         DSAPrivateKey();
    01367
    01377         DSAPrivateKey(const DLGroup &domain, const BigInteger &y, const BigInteger &x, const QString &provider = QString());
    01378
    01382         DLGroup domain() const;
    01383
    01387         BigInteger y() const;
    01388
    01392         BigInteger x() const;
    01393 };
    01394
    01403 class QCA_EXPORT DHPublicKey : public PublicKey
    01404 {
    01405 public:
    01409         DHPublicKey();
    01410
    01419         DHPublicKey(const DLGroup &domain, const BigInteger &y, const QString &provider = QString());
    01420
    01426         DHPublicKey(const DHPrivateKey &k);
    01427
    01431         DLGroup domain() const;
    01432
    01436         BigInteger y() const;
    01437 };
    01438
    01447 class QCA_EXPORT DHPrivateKey : public PrivateKey
    01448 {
    01449 public:
    01453         DHPrivateKey();
    01454
    01464         DHPrivateKey(const DLGroup &domain, const BigInteger &y, const BigInteger &x, const QString &provider = QString());
    01465
    01469         DLGroup domain() const;
    01470
    01474         BigInteger y() const;
    01475
    01479         BigInteger x() const;
    01480 };
    01482 }
    01483
    01484 #endif