00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef WINCAPICRYPTOSYMMETRICKEY_INCLUDE
00032 #define WINCAPICRYPTOSYMMETRICKEY_INCLUDE
00033
00034 #include <xsec/framework/XSECDefs.hpp>
00035 #include <xsec/enc/XSECCryptoSymmetricKey.hpp>
00036
00037 #if defined (HAVE_WINCAPI)
00038
00039 #if !defined(_WIN32_WINNT)
00040 # define _WIN32_WINNT 0x0400
00041 #endif
00042
00043 #include <wincrypt.h>
00044
00045 #define WINCAPI_MAX_BLOCK_SIZE 32
00046
00058 class DSIG_EXPORT WinCAPICryptoSymmetricKey : public XSECCryptoSymmetricKey {
00059
00060 public :
00061
00064
00076 WinCAPICryptoSymmetricKey(HCRYPTPROV prov, XSECCryptoSymmetricKey::SymmetricKeyType type);
00077
00085 virtual ~WinCAPICryptoSymmetricKey();
00086
00088
00091
00096 virtual const XMLCh * getProviderName();
00097
00106 virtual XSECCryptoKey * clone();
00107
00109
00112
00121 SymmetricKeyType getSymmetricKeyType(void);
00122
00134 void setKey(const unsigned char * key, unsigned int keyLen);
00135
00152 virtual bool decryptInit(bool doPad = true,
00153 SymmetricKeyMode mode = MODE_CBC,
00154 const unsigned char * iv = NULL);
00155
00180 virtual unsigned int decrypt(const unsigned char * inBuf,
00181 unsigned char * plainBuf,
00182 unsigned int inLength,
00183 unsigned int maxOutLength);
00184
00204 virtual unsigned int decryptFinish(unsigned char * plainBuf,
00205 unsigned int maxOutLength);
00206
00222 virtual bool encryptInit(bool doPad = true,
00223 SymmetricKeyMode mode = MODE_CBC,
00224 const unsigned char * iv = NULL);
00225
00246 virtual unsigned int encrypt(const unsigned char * inBuf,
00247 unsigned char * cipherBuf,
00248 unsigned int inLength,
00249 unsigned int maxOutLength);
00250
00272 virtual unsigned int encryptFinish(unsigned char * plainBuf,
00273 unsigned int maxOutLength);
00274
00276
00279
00298 static HCRYPTKEY createWindowsKey(const unsigned char * key,
00299 unsigned int keyLen,
00300 XSECCryptoSymmetricKey::SymmetricKeyType type,
00301 HCRYPTPROV * prov);
00302
00303
00304
00305 private:
00306
00307
00308
00309 WinCAPICryptoSymmetricKey();
00310 WinCAPICryptoSymmetricKey(const WinCAPICryptoSymmetricKey &);
00311 WinCAPICryptoSymmetricKey & operator= (const WinCAPICryptoSymmetricKey &);
00312
00313 int decryptCtxInit(const unsigned char * iv);
00314 void encryptCtxInit(const unsigned char * iv);
00315
00316
00317 SymmetricKeyType m_keyType;
00318 SymmetricKeyMode m_keyMode;
00319 safeBuffer m_keyBuf;
00320 unsigned int m_keyLen;
00321 bool m_initialised;
00322 bool m_doPad;
00323
00324 unsigned char m_lastBlock[WINCAPI_MAX_BLOCK_SIZE];
00325 unsigned int m_bytesInLastBlock;
00326 unsigned int m_blockSize;
00327 unsigned int m_ivSize;
00328
00329 HCRYPTPROV m_p;
00330 HCRYPTKEY m_k;
00331
00332 };
00333
00334 #endif
00335 #endif