Main Page | Class Hierarchy | Class List | File List | Class Members

/Users/baford/proj/netsteria/sst/lib/aes.h

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         // Key setup
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         // CBC-mode encryption and decryption
00038 
00039         // "Raw" functions.  Cleartext buffers can be any size,
00040         // but encrypted data is padded to AES_BLOCK_SIZE.
00041         // The supplied initialization vector is updated in-place.
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         // Higher-level functions - create and prepend random 16-byte IV.
00046         // cbcEncrypt pads input to a multiple of AES_BLOCK_SIZE;
00047         // cbcDecrypt does NOT strip this padding.
00048         QByteArray cbcEncrypt(const QByteArray &in) const;
00049         QByteArray cbcDecrypt(const QByteArray &in) const;
00050 
00051 
00052         // Encrypt/decrypt in counter mode.
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 } // namespace SST
00073 
00074 #endif  // SST_AES_H

Generated on Wed Mar 28 11:48:05 2007 for SST by doxygen 1.3.4