Thanks for reporting this bug. Here's a patch to fix it.

On Thu, Aug 26, 2004 at 12:08:42PM +0200, Gerardo Maiorano wrote:
> Hello,
> I write a simple test code for WAKE_CFB Symmetric Encryption Algorithm, and if 
> the input file length
> is not multiple of word size (4 byte), i got a segmentation fault signal.
> -----------------------------------------------------------------------------------------------------
> #include <cryptopp/files.h>
> #include <cryptopp/filters.h>
> #include <cryptopp/osrng.h>
> #include <cryptopp/wake.h>
> using namespace CryptoPP;
> using namespace std;
> int main()
> {
> � � try
> � � {
> � � � � AutoSeededRandomPool rng;
> � � � � WAKE_CFB<>::Encryption encoder;
> � � � � SecByteBlock sbbKey(encoder.DefaultKeyLength());
> � � � � rng.GenerateBlock(sbbKey.begin(), sbbKey.size());
> � � � � encoder.SetKey(sbbKey, sbbKey.size());
> � � � � FileSource("sample.txt", true, new StreamTransformationFilter(encoder, 
> new FileSink("sample.dat")));
> � � }
> � � catch (const CryptoPP::Exception &e)
> � � {
> � � � � cout << "\nCryptoPP::Exception caught: " << e.what() << endl;
> � � � � return 1;
> � � }
> � � catch (const std::exception &e)
> � � {
> � � � � cout << "\nstd::exception caught: " << e.what() << endl;
> � � � � return 2;
> � � }
> � � return 0;
> }
> -----------------------------------------------------------------------------------------------------------
> Here is reported all the info that i was collect:
> 
> uname -a: Linux artu 2.6.5-7.104-default #1 Wed Jul 28 16:42:13 UTC 2004 i686 
> i686 i386 GNU/Linux
> 
> gcc -v : �Reading specs from /usr/lib/gcc-lib/i586-suse-linux/3.3.3/specs
> Configured with: ../configure --enable-threads=posix --prefix=/usr 
> --with-local-prefix=/usr/local --infodir=/usr/share/info 
> --mandir=/usr/share/man --enable-languages=c,c++,f77,objc,java,ada 
> --disable-checking --libdir=/usr/lib --enable-libgcj 
> --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib 
> --with-system-zlib --enable-shared --enable-__cxa_atexit i586-suse-linux
> Thread model: posix
> gcc version 3.3.3 (SuSE Linux)
> 
> gdb output:
> Program received signal SIGSEGV, Segmentation fault.
> 0x08124755 in CryptoPP::CFB_CipherConcretePolicy<unsigned int, 1u, 
> CryptoPP::CFB_CipherAbstractPolicy>::RegisterOutput<CryptoPP::EnumToType<CryptoPP::ByteOrder,
>  
> 1> >::operator() (this=0xbfffe8e0, [EMAIL PROTECTED]) at 
> strciphr.h:192
> 192 � � � � � � � � � � � � � � � � � � WordType ct = *(const WordType 
> *)m_input ^ registerWord;
> 
> stack trace:
> #0 �0x08124755 in CryptoPP::CFB_CipherConcretePolicy<unsigned int, 1u, 
> CryptoPP::CFB_CipherAbstractPolicy>::RegisterOutput<CryptoPP::EnumToType<CryptoPP::ByteOrder,
>  
> 1> >::operator() (this=0xbfffe8e0, [EMAIL PROTECTED]) at 
> strciphr.h:192
> #1 �0x08123e87 in 
> CryptoPP::WAKE_Policy<CryptoPP::EnumToType<CryptoPP::ByteOrder, 1> >::Iterate 
> (this=0xbfffed1c,
> � � output=0x0, input=0x0, dir=ENCRYPTION, iterationCount=0) at wake.cpp:82
> #2 �0x0804b50c in CryptoPP::CFB_CipherConcretePolicy<unsigned int, 1u, 
> CryptoPP::CFB_CipherAbstractPolicy>::TransformRegister (this=0xbfffed1c) at 
> strciphr.h:174
> #3 �0x0806b368 in 
> CryptoPP::CFB_CipherTemplate<CryptoPP::AbstractPolicyHolder<CryptoPP::CFB_CipherAbstractPolicy,
>  
> CryptoPP::SimpleKeyedTransformation<CryptoPP::StreamTransformation> > 
> >::ProcessData (this=0xbfffed10,
> � � outString=0x81c7bb0 "\n{��, inString=0x81c7bb0 "\n{��, length=1) 
> at strciphr.cpp:169
> #4 �0x080cc1f4 in CryptoPP::StreamTransformation::ProcessString 
> (this=0xbfffed10,
> � � inoutString=0x81c7808 "�224\213^\0323\\\200\201\025vI 
> \220\"^\017�\022\021\036\f3L((nV", length=937)
> � � at cryptlib.h:490
> #5 �0x080c9e96 in CryptoPP::StreamTransformationFilter::NextPutModifiable 
> (this=0x81c3290,
> � � inString=0x81c7808 "�224\213^\0323\\\200\201\025vI 
> \220\"^\017�\022\021\036\f3L((nV", length=937)
> � � at filters.cpp:558
> #6 �0x080cc8aa in CryptoPP::FilterWithBufferedInput::NextPutMaybeModifiable 
> (this=0x81c3290,
> � � inString=0x81c7808 "�224\213^\0323\\\200\201\025vI 
> \220\"^\017�\022\021\036\f3L((nV", length=937,
> � � modifiable=true) at filters.h:183
> #7 �0x080c8c38 in CryptoPP::FilterWithBufferedInput::PutMaybeModifiable 
> (this=0x81c3290,
> � � inString=0x81c7808 "�224\213^\0323\\\200\201\025vI 
> \220\"^\017�\022\021\036\f3L((nV", length=937,
> � � messageEnd=0, blocking=true, modifiable=true) at filters.cpp:325
> #8 �0x080cc805 in CryptoPP::FilterWithBufferedInput::PutModifiable2 
> (this=0x81c3290,
> � � inString=0x81c7808 "�224\213^\0323\\\200\201\025vI 
> \220\"^\017�\022\021\036\f3L((nV", length=937,
> � � messageEnd=0, blocking=true) at filters.h:145
> #9 �0x080500d0 in CryptoPP::BufferedTransformation::ChannelPutModifiable2 
> (this=0x81c3290, [EMAIL PROTECTED],
> � � begin=0x81c7808 "�224\213^\0323\\\200\201\025vI 
> \220\"^\017�\022\021\036\f3L((nV", length=937, messageEnd=0,
> � � blocking=true) at cryptlib.cpp:226
> #10 0x080c6372 in CryptoPP::FileStore::TransferTo2 (this=0xbfffecc4, 
> [EMAIL PROTECTED], [EMAIL PROTECTED],
> � � [EMAIL PROTECTED], blocking=true) at files.cpp:76
> #11 0x0805093c in CryptoPP::BufferedTransformation::TransferMessagesTo2 
> (this=0xbfffecc4, [EMAIL PROTECTED],
> � � [EMAIL PROTECTED], [EMAIL PROTECTED], blocking=true) at 
> cryptlib.cpp:370
> #12 0x08050b66 in CryptoPP::BufferedTransformation::TransferAllTo2 
> (this=0xbfffecc4, [EMAIL PROTECTED],
> � � [EMAIL PROTECTED], blocking=true) at cryptlib.cpp:416
> #13 0x0804c37a in CryptoPP::SourceTemplate<CryptoPP::FileStore>::PumpAll2 
> (this=0xbfffecb0, blocking=true)
> � � at filters.h:677
> #14 0x0804c8c0 in CryptoPP::Source::PumpAll (this=0xbfffecb0) at filters.h:648
> #15 0x0804b9ad in CryptoPP::Source::SourceInitialize (this=0xbfffecb0, 
> pumpAll=true, [EMAIL PROTECTED])
> � �at filters.h:659
> #16 0x0804ad52 in FileSource (this=0xbfffecb0, filename=0x812d00b 
> "sample.txt", pumpAll=true, attachment=0x81c3290,
> � � binary=true) at files.h:61
> #17 0x0804a53e in main () at TestWake.cpp:19
> 
> Best Regards.
> - 
> Gerardo Maiorano
Index: strciphr.h
===================================================================
RCS file: /cvsroot/cryptopp/c5/strciphr.h,v
retrieving revision 1.10
diff -c -c -r1.10 strciphr.h
*** strciphr.h  22 Jul 2004 00:51:57 -0000      1.10
--- strciphr.h  3 Sep 2004 04:35:13 -0000
***************
*** 189,199 ****
  
                        if (m_dir == ENCRYPTION)
                        {
!                               WordType ct = *(const WordType *)m_input ^ 
registerWord;
!                               registerWord = ct;
!                               *(WordType*)m_output = ct;
!                               m_input += sizeof(WordType);
!                               m_output += sizeof(WordType);
                        }
                        else
                        {
--- 189,204 ----
  
                        if (m_dir == ENCRYPTION)
                        {
!                               if (m_input == NULL)
!                                       assert(m_output == NULL);
!                               else
!                               {
!                                       WordType ct = *(const WordType *)m_input ^ 
registerWord;
!                                       registerWord = ct;
!                                       *(WordType*)m_output = ct;
!                                       m_input += sizeof(WordType);
!                                       m_output += sizeof(WordType);
!                               }
                        }
                        else
                        {

Reply via email to