00001 #ifndef SST_AES_H
00002 #define SST_AES_H
00003
00004 #include <openssl/aes.h>
00005
00006 class QByteArray;
00007
00008 namespace SST {
00009
00010 class AES
00011 {
00012 private:
00013 AES_KEY aeskey;
00014
00015 public:
00016 enum Mode {
00017 CbcEncrypt,
00018 CbcDecrypt,
00019 CtrEncrypt = CbcEncrypt,
00020 CtrDecrypt = CbcEncrypt,
00021 };
00022
00023
00024 AES &setEncryptKey(const void *key, int bits);
00025 AES &setEncryptKey(const QByteArray &key);
00026
00027 AES &setDecryptKey(const void *key, int bits);
00028 AES &setDecryptKey(const QByteArray &key);
00029
00030 inline AES() { }
00031 inline AES(const AES &other) { aeskey = other.aeskey; }
00032 inline AES(const QByteArray &key, Mode mode)
00033 { mode == CbcEncrypt ? setEncryptKey(key)
00034 : setDecryptKey(key); }
00035
00036
00037
00038
00039
00040
00041
00042 void cbcEncrypt(const void *in, void *out, int size, void *ivec) const;
00043 void cbcDecrypt(const void *in, void *out, int size, void *ivec) const;
00044
00045
00046
00047
00048 QByteArray cbcEncrypt(const QByteArray &in) const;
00049 QByteArray cbcDecrypt(const QByteArray &in) const;
00050
00051
00052
00053 inline void ctrEncrypt(const void *in, void *out, int size,
00054 void *ivec, void *ctr, unsigned int &num) const
00055 { AES_ctr128_encrypt((const quint8*)in, (quint8*)out, size,
00056 &aeskey, (quint8*)ivec, (quint8*)ctr, &num); }
00057 inline void ctrDecrypt(const void *in, void *out, int size,
00058 void *ivec, void *ctr, unsigned int &num) const
00059 { AES_ctr128_encrypt((const quint8*)in, (quint8*)out, size,
00060 &aeskey, (quint8*)ivec, (quint8*)ctr, &num); }
00061
00062 inline void ctrEncrypt(const void *in, void *out, int size,
00063 void *ivec) const
00064 { quint8 ctr[AES_BLOCK_SIZE]; unsigned num = 0;
00065 ctrEncrypt(in, out, size, ivec, ctr, num); }
00066 inline void ctrDecrypt(const void *in, void *out, int size,
00067 void *ivec) const
00068 { quint8 ctr[AES_BLOCK_SIZE]; unsigned num = 0;
00069 ctrDecrypt(in, out, size, ivec, ctr, num); }
00070 };
00071
00072 }
00073
00074 #endif // SST_AES_H