00001 00022 #ifndef dsDES_h 00023 #define dsDES_h 00024 00025 #include <dsCypher.h> 00026 00027 00028 class dsDES : public dsBlockCypher 00029 { 00030 dsCypher_word32_t _esk[32*3]; /* DES encryption subkeys */ 00031 dsCypher_word32_t _dsk[32*3]; /* DES decryption subkeys */ 00032 00033 static const dsCypher_word32_t dsDES::SB1[64]; 00034 static const dsCypher_word32_t dsDES::SB2[64]; 00035 static const dsCypher_word32_t dsDES::SB3[64]; 00036 static const dsCypher_word32_t dsDES::SB4[64]; 00037 static const dsCypher_word32_t dsDES::SB5[64]; 00038 static const dsCypher_word32_t dsDES::SB6[64]; 00039 static const dsCypher_word32_t dsDES::SB7[64]; 00040 static const dsCypher_word32_t dsDES::SB8[64]; 00041 00042 /* PC1: left and right halves bit-swap */ 00043 static const dsCypher_word32_t dsDES::LHs[16]; 00044 static const dsCypher_word32_t dsDES::RHs[16]; 00045 00046 bool _3des; //Triple des mode, automatically turned on 00047 //if user supply 128 or 192 bit key 00048 00055 void doSetKey(dsCypher_word32_t *sk,const dsCypher_byte_t *p_key); 00056 void doEncryptAndDecryptBlock(const dsCypher_word32_t *subkey, const dsCypher_word32_t *inBlock, dsCypher_word32_t *outBlock); 00057 00058 00059 public: 00060 00061 /* dsCypher interfaces */ 00062 00067 virtual void setKey(const dsCypher_byte_t *p_key, dsCypher_word32_t p_keyLen, keyMode km = dsCypher::kmBOTH) dsCypher_SECTION; 00068 00072 virtual void encryptBlock(const dsCypher_word32_t *inBlock, dsCypher_word32_t *outBlock) dsCypher_SECTION; 00073 virtual void decryptBlock(const dsCypher_word32_t *inBlock, dsCypher_word32_t *outBlock) dsCypher_SECTION; 00074 00075 dsDES(const dsCypher_byte_t *p_key, dsCypher_word32_t p_keyLen); 00076 dsDES(); 00077 00078 #ifdef WITH_TEST_VECTORS 00079 virtual const dsCypher_byte_t * testExpectedResult( cmMODES p_mode ); 00080 virtual const dsCypher_word32_t testExpectedResultLen( cmMODES p_mode ); 00081 00082 virtual const dsCypher_byte_t * testKey(); 00083 virtual const dsCypher_word32_t testKeyLen(); 00084 00085 virtual const char *testAlgName(); 00086 #endif 00087 }; 00088 00089 00090 #endif 00091