diff options
author | weidai <weidai11@users.noreply.github.com> | 2004-04-29 16:00:39 +0000 |
---|---|---|
committer | weidai <weidai11@users.noreply.github.com> | 2004-04-29 16:00:39 +0000 |
commit | afb08eb452e78d288db14004948bbfd8a26c5922 (patch) | |
tree | 230a162876fc2fca3a4924b96cd92773b6600e77 | |
parent | 5fc752d268152ac25a0cb36517ec960a4fddd61c (diff) | |
download | cryptopp-git-afb08eb452e78d288db14004948bbfd8a26c5922.tar.gz |
add CFB mode FIPS variant
-rw-r--r-- | dlltest.cpp | 16 | ||||
-rw-r--r-- | modes.h | 15 | ||||
-rw-r--r-- | strciphr.cpp | 2 | ||||
-rw-r--r-- | strciphr.h | 9 |
4 files changed, 34 insertions, 8 deletions
diff --git a/dlltest.cpp b/dlltest.cpp index a8b28133..ed9337a0 100644 --- a/dlltest.cpp +++ b/dlltest.cpp @@ -60,20 +60,20 @@ void FIPS140_SampleApplication() byte ciphertext[24]; byte decrypted[24]; - CFB_Mode<DES_EDE3>::Encryption encryption_DES_EDE3_CBC; - encryption_DES_EDE3_CBC.SetKeyWithIV(key, sizeof(key), iv); - encryption_DES_EDE3_CBC.ProcessString(ciphertext, plaintext, 24); + CFB_FIPS_Mode<DES_EDE3>::Encryption encryption_DES_EDE3_CFB; + encryption_DES_EDE3_CFB.SetKeyWithIV(key, sizeof(key), iv); + encryption_DES_EDE3_CFB.ProcessString(ciphertext, plaintext, 23); - CFB_Mode<DES_EDE3>::Decryption decryption_DES_EDE3_CBC; - decryption_DES_EDE3_CBC.SetKeyWithIV(key, sizeof(key), iv); - decryption_DES_EDE3_CBC.ProcessString(decrypted, ciphertext, 24); + CFB_FIPS_Mode<DES_EDE3>::Decryption decryption_DES_EDE3_CFB; + decryption_DES_EDE3_CFB.SetKeyWithIV(key, sizeof(key), iv); + decryption_DES_EDE3_CFB.ProcessString(decrypted, ciphertext, 24); if (memcmp(plaintext, decrypted, 24) != 0) { - cerr << "DES-EDE3-CBC Encryption/decryption failed.\n"; + cerr << "DES-EDE3-CFB Encryption/decryption failed.\n"; abort(); } - cout << "3. DES-EDE3-CBC Encryption/decryption succeeded.\n"; + cout << "3. DES-EDE3-CFB Encryption/decryption succeeded.\n"; // hash const byte message[] = {'a', 'b', 'c'}; @@ -328,6 +328,21 @@ struct CFB_Mode_ExternalCipher : public CipherModeDocumentation typedef CipherModeFinalTemplate_ExternalCipher<ConcretePolicyHolder<Empty, CFB_DecryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> > > > Decryption; }; +//! CFB mode FIPS variant, requiring full block plaintext according to FIPS 800-38A +template <class CIPHER> +struct CFB_FIPS_Mode : public CipherModeDocumentation +{ + typedef CipherModeFinalTemplate_CipherHolder<CPP_TYPENAME CIPHER::Encryption, ConcretePolicyHolder<Empty, CFB_RequireFullDataBlocks<CFB_EncryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> > > > > Encryption; + typedef CipherModeFinalTemplate_CipherHolder<CPP_TYPENAME CIPHER::Encryption, ConcretePolicyHolder<Empty, CFB_RequireFullDataBlocks<CFB_DecryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> > > > > Decryption; +}; + +//! CFB mode FIPS variant, requiring full block plaintext according to FIPS 800-38A, external cipher +struct CFB_FIPS_Mode_ExternalCipher : public CipherModeDocumentation +{ + typedef CipherModeFinalTemplate_ExternalCipher<ConcretePolicyHolder<Empty, CFB_RequireFullDataBlocks<CFB_EncryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> > > > > Encryption; + typedef CipherModeFinalTemplate_ExternalCipher<ConcretePolicyHolder<Empty, CFB_RequireFullDataBlocks<CFB_DecryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> > > > > Decryption; +}; + CRYPTOPP_DLL_TEMPLATE_CLASS AdditiveCipherTemplate<AbstractPolicyHolder<AdditiveCipherAbstractPolicy, OFB_ModePolicy> >; //! OFB mode diff --git a/strciphr.cpp b/strciphr.cpp index 3394b204..4cb71c69 100644 --- a/strciphr.cpp +++ b/strciphr.cpp @@ -119,6 +119,8 @@ void CFB_CipherTemplate<BASE>::Resynchronize(const byte *iv) template <class BASE> void CFB_CipherTemplate<BASE>::ProcessData(byte *outString, const byte *inString, unsigned int length) { + assert(length % MandatoryBlockSize() == 0); + PolicyInterface &policy = AccessPolicy(); unsigned int bytesPerIteration = policy.GetBytesPerIteration(); unsigned int alignment = policy.GetAlignment(); @@ -251,10 +251,19 @@ class CRYPTOPP_NO_VTABLE CFB_DecryptionTemplate : public CFB_CipherTemplate<BASE void CombineMessageAndShiftRegister(byte *output, byte *reg, const byte *message, unsigned int length); }; +template <class BASE> +class CFB_RequireFullDataBlocks : public BASE +{ +public: + unsigned int MandatoryBlockSize() const {return OptimalBlockSize();} +}; + +/* CRYPTOPP_DLL_TEMPLATE_CLASS AbstractPolicyHolder<CFB_CipherAbstractPolicy, SymmetricCipher>; CRYPTOPP_DLL_TEMPLATE_CLASS CFB_CipherTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, SymmetricCipher> >; CRYPTOPP_DLL_TEMPLATE_CLASS CFB_EncryptionTemplate<>; CRYPTOPP_DLL_TEMPLATE_CLASS CFB_DecryptionTemplate<>; +*/ template <class BASE, class INFO = BASE> class SymmetricCipherFinal : public AlgorithmImpl<SimpleKeyingInterfaceImpl<BASE, INFO>, INFO> |