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 ciphertext[24];
|
||||||
byte decrypted[24];
|
byte decrypted[24];
|
||||||
|
|
||||||
CFB_Mode<DES_EDE3>::Encryption encryption_DES_EDE3_CBC;
|
CFB_FIPS_Mode<DES_EDE3>::Encryption encryption_DES_EDE3_CFB;
|
||||||
encryption_DES_EDE3_CBC.SetKeyWithIV(key, sizeof(key), iv);
|
encryption_DES_EDE3_CFB.SetKeyWithIV(key, sizeof(key), iv);
|
||||||
encryption_DES_EDE3_CBC.ProcessString(ciphertext, plaintext, 24);
|
encryption_DES_EDE3_CFB.ProcessString(ciphertext, plaintext, 23);
|
||||||
|
|
||||||
CFB_Mode<DES_EDE3>::Decryption decryption_DES_EDE3_CBC;
|
CFB_FIPS_Mode<DES_EDE3>::Decryption decryption_DES_EDE3_CFB;
|
||||||
decryption_DES_EDE3_CBC.SetKeyWithIV(key, sizeof(key), iv);
|
decryption_DES_EDE3_CFB.SetKeyWithIV(key, sizeof(key), iv);
|
||||||
decryption_DES_EDE3_CBC.ProcessString(decrypted, ciphertext, 24);
|
decryption_DES_EDE3_CFB.ProcessString(decrypted, ciphertext, 24);
|
||||||
|
|
||||||
if (memcmp(plaintext, decrypted, 24) != 0)
|
if (memcmp(plaintext, decrypted, 24) != 0)
|
||||||
{
|
{
|
||||||
cerr << "DES-EDE3-CBC Encryption/decryption failed.\n";
|
cerr << "DES-EDE3-CFB Encryption/decryption failed.\n";
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
cout << "3. DES-EDE3-CBC Encryption/decryption succeeded.\n";
|
cout << "3. DES-EDE3-CFB Encryption/decryption succeeded.\n";
|
||||||
|
|
||||||
// hash
|
// hash
|
||||||
const byte message[] = {'a', 'b', 'c'};
|
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;
|
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> >;
|
CRYPTOPP_DLL_TEMPLATE_CLASS AdditiveCipherTemplate<AbstractPolicyHolder<AdditiveCipherAbstractPolicy, OFB_ModePolicy> >;
|
||||||
|
|
||||||
//! OFB mode
|
//! OFB mode
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,8 @@ void CFB_CipherTemplate<BASE>::Resynchronize(const byte *iv)
|
||||||
template <class BASE>
|
template <class BASE>
|
||||||
void CFB_CipherTemplate<BASE>::ProcessData(byte *outString, const byte *inString, unsigned int length)
|
void CFB_CipherTemplate<BASE>::ProcessData(byte *outString, const byte *inString, unsigned int length)
|
||||||
{
|
{
|
||||||
|
assert(length % MandatoryBlockSize() == 0);
|
||||||
|
|
||||||
PolicyInterface &policy = AccessPolicy();
|
PolicyInterface &policy = AccessPolicy();
|
||||||
unsigned int bytesPerIteration = policy.GetBytesPerIteration();
|
unsigned int bytesPerIteration = policy.GetBytesPerIteration();
|
||||||
unsigned int alignment = policy.GetAlignment();
|
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);
|
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 AbstractPolicyHolder<CFB_CipherAbstractPolicy, SymmetricCipher>;
|
||||||
CRYPTOPP_DLL_TEMPLATE_CLASS CFB_CipherTemplate<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_EncryptionTemplate<>;
|
||||||
CRYPTOPP_DLL_TEMPLATE_CLASS CFB_DecryptionTemplate<>;
|
CRYPTOPP_DLL_TEMPLATE_CLASS CFB_DecryptionTemplate<>;
|
||||||
|
*/
|
||||||
|
|
||||||
template <class BASE, class INFO = BASE>
|
template <class BASE, class INFO = BASE>
|
||||||
class SymmetricCipherFinal : public AlgorithmImpl<SimpleKeyingInterfaceImpl<BASE, INFO>, INFO>
|
class SymmetricCipherFinal : public AlgorithmImpl<SimpleKeyingInterfaceImpl<BASE, INFO>, INFO>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue