Thanks for reporting this. I've fixed this in SVN r463. -------------------------------------------------- From: "Mouse" <[email protected]> Sent: Saturday, April 04, 2009 7:38 PM To: "Crypto++ Users" <[email protected]> Subject: Re: 5.6.0 - Can't link Rijndael encryption code on Mac OS X
> > Problem appears related to -DCRYPTOPP_DISABLE_ASM flag that does not > get stored in the config.h file. > > GNUmakefile ensures that on Mac OS X (where gas is v1.38) library is > compiled with -DCRYPTOPP_DISABLE_ASM. I omitted this flag when > compiling my code, and until 5.6.0 all was well. In 5.6.0 rijndael.h > got dependency on assembly code (extra function AdvancedProcessBlock, > unless CRYPTOPP_DISABLE_ASM is specified). The library (compiled with > DISABLE_ASM) obviously doesn't have that reference. > > Solutions are: > > - Ensure that I compile my code with the same flags as GNUmakefile > sets. It would work, but it's ugly. > - Manually stick #define CRYPTOPP_DISABLE_ASM in config.h. It would > work, that's what I'll do on my machine. > - Somehow make sure that rijndael.h (or config,.h or cryptlib.h) file > (s) figure out the situation. I'd like it, but I don't hold my > breath. :-) > > On Apr 4, 10:10 pm, Mouse <[email protected]> wrote: >> Any code I tried that uses AES encryption, fails to link (but the code >> that uses decryption is fine - go figure). Other primitives don't seem >> to cause problems. Code stopped linking with the move from 5.5.2 to >> 5.6.0. It applies only to the code that uses AES encryption (CBC in my >> case), AES decryption does not seem to be affected. Replacing AES with >> e.g. MARS also cures the problem - the issue is definitely with the >> new code for AES/Rijndael in 5.6.0. >> >> Mac OS X 10.5.6 Leopard, gcc-4.2.1 (tried with 4.0.1 with the same >> result). Everything works fine with 5.5.2. >> >> Here's the command line and the error messages: >> >> $ g++ -I/usr/include/cryptopp -o t1 t1.cpp -lcryptopp -lstdc++ >> Undefined symbols: >> "CryptoPP::Rijndael::Enc::AdvancedProcessBlocks(unsigned char >> const*, unsigned char const*, unsigned char*, unsigned long, unsigned >> int) const", referenced from: >> vtable for CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, >> CryptoPP::Rijndael::Enc>in ccYwjfFL.o >> vtable for CryptoPP::ClonableImpl<CryptoPP::BlockCipherFinal< >> (CryptoPP::CipherDir)0, CryptoPP::Rijndael::Enc>, >> CryptoPP::Rijndael::Enc>in ccYwjfFL.o >> "non-virtual thunk to CryptoPP::Rijndael::Enc::AdvancedProcessBlocks >> (unsigned char const*, unsigned char const*, unsigned char*, unsigned >> long, unsigned int) const", referenced from: >> vtable for CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, >> CryptoPP::Rijndael::Enc>in ccYwjfFL.o >> vtable for CryptoPP::ClonableImpl<CryptoPP::BlockCipherFinal< >> (CryptoPP::CipherDir)0, CryptoPP::Rijndael::Enc>, >> CryptoPP::Rijndael::Enc>in ccYwjfFL.o >> ld: symbol(s) not found >> collect2: ld returned 1 exit status >> >> Here's the actual code taken from the FAQ Web page >> <http://www.cryptopp.com/fom-serve/cache/79.html> (lest people think that >> it's >> my code that's at fault :-): >> >> #include <iostream> >> #include <iomanip> >> >> #include "modes.h" >> #include "aes.h" >> #include "filters.h" >> >> int main(int argc, char* argv[]) { >> >> // >> // Key and IV setup >> // >> byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ], iv >> [ CryptoPP::AES::BLOCKSIZE ]; >> memset( key, 0x00, CryptoPP::AES::DEFAULT_KEYLENGTH ); >> memset( iv, 0x00, CryptoPP::AES::BLOCKSIZE ); >> >> // >> // String and Sink setup >> // >> std::string plaintext = "Now is the time for all good men to come >> to the aide..."; >> std::string ciphertext; >> std::string decryptedtext; >> >> // >> // Dump Plain Text >> // >> std::cout << "Plain Text (" << plaintext.size() << " bytes)" << >> std::endl; >> std::cout << plaintext; >> std::cout << std::endl << std::endl; >> >> // >> // Create Cipher Text >> // >> CryptoPP::AES::Encryption aesEncryption(key, >> CryptoPP::AES::DEFAULT_KEYLENGTH); >> CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption >> ( aesEncryption, iv ); >> >> CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, >> new CryptoPP::StringSink( ciphertext ) ); >> stfEncryptor.Put( reinterpret_cast<const unsigned char*> >> ( plaintext.c_str() ), plaintext.length() + 1 ); >> stfEncryptor.MessageEnd(); >> >> // >> // Dump Cipher Text >> // >> std::cout << "Cipher Text (" << ciphertext.size() << " bytes)" << >> std::endl; >> >> for( int i = 0; i < ciphertext.size(); i++ ) { >> >> std::cout << "0x" << std::hex << (0xFF & static_cast<byte> >> (ciphertext[i])) << " "; >> } >> >> std::cout << std::endl << std::endl; >> >> // >> // Decrypt >> // >> CryptoPP::AES::Decryption aesDecryption(key, >> CryptoPP::AES::DEFAULT_KEYLENGTH); >> CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption >> ( aesDecryption, iv ); >> >> CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, >> new CryptoPP::StringSink( decryptedtext ) ); >> stfDecryptor.Put( reinterpret_cast<const unsigned char*> >> ( ciphertext.c_str() ), ciphertext.size() ); >> stfDecryptor.MessageEnd(); >> >> // >> // Dump Decrypted Text >> // >> std::cout << "Decrypted Text: " << std::endl; >> std::cout << decryptedtext; >> std::cout << std::endl << std::endl; >> >> return 0; >> >> } > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the "Crypto++ Users" Google Group. To unsubscribe, send an email to [email protected]. More information about Crypto++ and this group is available at http://www.cryptopp.com. -~----------~----~----~----~------~----~------~--~---
