00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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