building TrueCrypt from source
As there are no existing TrueCrypt for GNU Linux/Sparc, we had to do this ourselves. However, the buildprocess is not pretty and for some reason one just *has* to build all that wxWidget stuff, although I don't intend to manage crypto devices with my mouse, sigh. Oh, and there were quite a few build errors but thanks to Kano we finally succeeded. Here it goes, the whole shebang for TrueCrypt-6.1a:
# apt-get install libfuse-dev pkg-config # mkdir /usr/local/include/pkcs11-v2-20 # cd /usr/local/include/pkcs11-v2-20 # for i in pkcs11.h pkcs11f.h pkcs11t.h; do \ wget ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-11/v2-20/$i; done # for i in `pwd`/*h; do (ln -s $i /usr/include); done # cd /usr/local/src # wget http://prdownloads.sourceforge.net/wxwindows/wxWidgets-2.8.9.tar.bz2 # tar -xjf wxWidgets-2.8.9.tar.bz2 # cd ~/dev/truecrypt-6.1-source # make NOGUI=1 WX_ROOT=/usr/local/src/wxWidgets-2.8.9 wxbuild # make NOGUI=1 WXSTATIC=1 [....hours later on this box....] # file Main/truecrypt Main/truecrypt: ELF 32-bit MSB executable, SPARC, version 1 (SYSV), dynamically linked (uses shared libs), strippedNote: it's really important to get v2.20 of the PKCS11 header files, the current version did not work. Also, Debian/Etch comes with libwxgtk2.[46]-dev - the build failed and I really had to get the 2.8 version. Update: Although the build worked, truecrypt doesn't. Rebuilding with DEBUG=1 DEBUGGER=1 NOSTRIP=1 made gdb(1) spit out all the gory details:
stanley# gdb /usr/local/sbin/truecrypt GNU gdb 6.4.90-debian This GDB was configured as "sparc-linux-gnu"...Using host libthread_db library "/lib/v9/libthread_db.so.1". (gdb) run --create /dev/loop0 --encryption=AES --filesystem=fat \ --hash=ripemd-160 --keyfiles=/root/stanley.key \ --protect-hidden=no --volume-type=normal \ --random-source=/dev/urandom Starting program: /usr/local/sbin/truecrypt --create /dev/loop0 \ --encryption=AES --filesystem=fat --hash=ripemd-160 \ --keyfiles=/root/stanley.key --protect-hidden=no \ --volume-type=normal --random-source=/dev/urandom [Thread debugging using libthread_db enabled] [New Thread 16384 (LWP 32604)] Enter password: WARNING: Short passwords are easy to crack using brute force techniques! We recommend choosing a password consisting of more than 20 characters. Are you sure you want to use a short password? (y=Yes/n=No) [No]: y Re-enter password: Program received signal SIGBUS, Bus error. [Switching to Thread 16384 (LWP 32604)] 0x001598c8 in TrueCrypt::Endian::Big (x=@0x3a9df4) \ at /root/truecrypt-6.1-source/Platform/Memory.h:99 99 return x; (gdb) bt #0 0x001598c8 in TrueCrypt::Endian::Big (x=@0x3a9df4) \ at /root/truecrypt-6.1-source/Platform/Memory.h:99 #1 0x00168e08 in TrueCrypt::EncryptionTest::TestXtsAES () \ at EncryptionTest.cpp:429 #2 0x0016bd30 in TrueCrypt::EncryptionTest::TestAll () \ at EncryptionTest.cpp:24 #3 0x000c57e8 in TrueCrypt::VolumeCreator::CreateVolume \ (this=0xfff55078, options=@0xfff555e0) \ at VolumeCreator.cpp:179 #4 0x00058434 in TrueCrypt::TextUserInterface::CreateVolume \ (this=0x4c43f8, options=@0xfff55888, randomSourcePath=@0x5395ac) \ at TextUserInterface.cpp:769 #5 0x0007efa8 in TrueCrypt::UserInterface::ProcessCommandLine \ (this=0x4c43f8) \ at UserInterface.cpp:973 #6 0x00048ed4 in TrueCrypt::TextUserInterface::OnRun \ (this=0x4c43f8) \ at TextUserInterface.cpp:1141 #7 0x002bd634 in wxEntry (argc=@0x4a9510, argv=0x4b3948) \ at /usr/local/src/wxWidgets-2.8.9/src/common/init.cpp:460 #8 0x002bd774 in wxEntry (argc=@0xfff55c14, argv=0xfff55c94) \ at /usr/local/src/wxWidgets-2.8.9/src/common/init.cpp:472 #9 0x000ada54 in main (argc=10, argv=0xfff55c94) at Unix/Main.cpp:84 (gdb) bt all No symbol "all" in current context.Hm, but even running truecrypt --test was showing the same behaviour: TestXtsAES just fails to work. However, when trying to create the volume with another cipher, it still crashes at TestXtsAES, because VolumeCreator::CreateVolume always calls EncryptionTest::TestAll before actually creating the volume. Commenting out this call in VolumeCreator.cpp:179, recompiling and trying to create the volume with the Twofish cipher gives:
Program received signal SIGBUS, Bus error. [Switching to Thread 16384 (LWP 7980)] 0x001c508c in RMD160Transform (digest=0xffcfc730, data=0xffcfc6ef) \ at ../Crypto/Rmd160.c:192 192 X[i] = LE32 (data[i]); Current language: auto; currently cWow, now it fails at the hashing algorithm. When using SHA-512 instead of ripemd-160, it still crashes:
Program received signal SIGBUS, Bus error. [Switching to Thread 16384 (LWP 7991)] 0x0019ea6c in TrueCrypt::VolumeHeader::SerializeEntry...and that's it. Still SIGBUS for truecrypt, and -ENOSKILL for me, for not knowing C++ at all. Looks like truecrypt just wasn't meant to be run on big endian platforms. Damn.\ (this=0x516df0, entry=@0xffde8840, header=@0xffde8960, offset=@0xffde8850) \ at VolumeHeader.cpp:286 286 *reinterpret_cast \ (header.Get() + offset - sizeof (T)) = Endian::Big (entry);