summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorweidai <weidai11@users.noreply.github.com>2004-04-29 16:00:39 +0000
committerweidai <weidai11@users.noreply.github.com>2004-04-29 16:00:39 +0000
commitafb08eb452e78d288db14004948bbfd8a26c5922 (patch)
tree230a162876fc2fca3a4924b96cd92773b6600e77
parent5fc752d268152ac25a0cb36517ec960a4fddd61c (diff)
downloadcryptopp-git-afb08eb452e78d288db14004948bbfd8a26c5922.tar.gz
add CFB mode FIPS variant
-rw-r--r--dlltest.cpp16
-rw-r--r--modes.h15
-rw-r--r--strciphr.cpp2
-rw-r--r--strciphr.h9
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'};
diff --git a/modes.h b/modes.h
index ed3f1b0a..66b66384 100644
--- a/modes.h
+++ b/modes.h
@@ -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();
diff --git a/strciphr.h b/strciphr.h
index eb1d22fe..15d2bb33 100644
--- a/strciphr.h
+++ b/strciphr.h
@@ -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>