add CFB mode FIPS variant
parent
5fc752d268
commit
afb08eb452
16
dlltest.cpp
16
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'};
|
||||
|
|
|
|||
15
modes.h
15
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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue