Sorry..deleted that just before your reply appeared. On further consideration I also realized that although I just got some code to work, I shouldn't assume it's a non-issue till the cross-validation you discussed was done. But apologies in advanve if this is a non-issue.
So first, my original post, followed by new code that appears to work:
Threefish-1024 IV specification issue/doumentaion...or bug?
There appears to be a problem setting the longer IV required for
threefish-1024. My code (modified from code on the wiki) works
for -256 but nothing I've tried works for -1024.
The problem might be in documentation of something specific to
threefish-1024, though it might be related to
threefish.h:
41: CRYPTOPP_CONSTANT(IV_LENGTH=32)
which is described as NOT_RESYNCHRONIZABLE [though I don't know
whether this is in the sense pertaining to IV length] and is not
varied for different cases as the keylength is nearby.
But the benchmark suggests there's a way around this if it's not
misreporting.
Crypto++ 6.0.0 Benchmarks
Threefish/CTR (1024-bit key) 61 25.2 0.918 1469
Here's what I get with similar code for threefish-256 and
threefish-1024:
$ ./threefish256try
IV_LENGTH: 32
Algorithm:
Threefish/CTR
Maximum Key Size:
128 bytes
Plain Text (12 bytes)
'Hello World.'
Recovered Text:
'Hello World.'
$ ./threefish1024try
IV_LENGTH: 128
terminate called after throwing an instance of 'CryptoPP::InvalidArgument'
what(): Threefish/CTR: IV length 32 is less than the minimum of 128
Aborted (core dumped)
==============================
code for 1024:
// threefish1024try.cpp
//based on
//
https://web.archive.org/web/20150315102342/http://www.cryptopp.com/fom-serve/cache/79.html//2006-Jan-21 11:08am jason entry
// g++ -g3 -O2 -Wall -Wextra threefish1024try.cpp -o threefish1024try -I/usr/local/include/cryptopp -L/usr/local/lib -lcryptopp
#include <iostream>
//#include <iomanip>
// Crypto++ Includes
#include "cryptlib.h"
#include "modes.h" // xxx_Mode< >
#include "filters.h" // StringSource and
#include "threefish.h"
#define CIPHER_MODE CTR_Mode
#define CIPHER Threefish
#define BLOCKSIZE 128
#define IV_LENGTH 128
// using namespace CryptoPP;
int main(int argc, char* argv[]) {
std::cout << "IV_LENGTH: " << IV_LENGTH << std::endl;
CryptoPP::byte key[ CryptoPP::CIPHER::MAX_KEYLENGTH ],
iv[ IV_LENGTH ];
::memset( key, 0x01, CryptoPP::CIPHER::MAX_KEYLENGTH );
::memset( iv, 0x01, IV_LENGTH );
// Message M
std::string PlainText = "Hello World.";
// Cipher Text Sink
std::string CipherText;
// Encryptor
CryptoPP::CTR_Mode<CryptoPP::Threefish >::Encryption
Encryptor( key, CryptoPP::CIPHER::MAX_KEYLENGTH, iv );
// Encryption
CryptoPP::StringSource( PlainText, true,
new CryptoPP::StreamTransformationFilter( Encryptor,
new CryptoPP::StringSink( CipherText )
) // StreamTransformationFilter
); // StringSource
///////////////////////////////////////
// DMZ //
///////////////////////////////////////
// Recovered Text Sink
std::string RecoveredText;
// Decryptor
CryptoPP::CIPHER_MODE<CryptoPP::CIPHER >::Decryption
Decryptor( key, CryptoPP::CIPHER::MAX_KEYLENGTH, iv );
// Decryption
CryptoPP::StringSource( CipherText, true,
new CryptoPP::StreamTransformationFilter( Decryptor,
new CryptoPP::StringSink( RecoveredText )
) // StreamTransformationFilter
); // StringSource
//////////////////////////////////////////
// Output //
//////////////////////////////////////////
std::cout << "Algorithm:" << std::endl;
std::cout << " " << Encryptor.AlgorithmName() << std::endl;
std::cout << "Maximum Key Size:" << std::endl;
std::cout << " " << Encryptor.MaxKeyLength() << " bytes" << std::endl;
std::cout << std::endl;
std::cout << "Plain Text (" << PlainText.length() << " bytes)" << std::endl;
std::cout << " '" << PlainText << "'" << std::endl;
std::cout << std::endl;
std::cout << "Recovered Text:" << std::endl;
std::cout << " '" << RecoveredText << "'" << std::endl;
std::cout << std::endl;
return 0;
}
==============================
==============================
Result for new code:
$ ./threefish1024try2IV_LENGTH: 128
Algorithm:
Threefish/CTR
Maximum Key Size:
128 bytes
Plain Text (12 bytes)
'Hello World.'
Recovered Text:
'Hello World.'
==============================
new code:
// threefish1024try2.cpp
//based on
//
https://web.archive.org/web/20150315102342/http://www.cryptopp.com/fom-serve/cache/79.html//2006-Jan-21 11:08am jason entry
// g++ -g3 -O2 -Wall -Wextra threefish1024try2.cpp -o threefish1024try2 -I/usr/local/include/cryptopp -L/usr/local/lib -lcryptopp
#include <iostream>
//#include <iomanip>
// Crypto++ Includes
#include "cryptlib.h"
#include "modes.h" // xxx_Mode< >
#include "filters.h" // StringSource and
#include "threefish.h"
#define CIPHER_MODE CTR_Mode
#define CIPHER Threefish
#define BLOCKSIZE 128
#define KEY_LENGTH 128
#define IV_LENGTH 128
// using namespace CryptoPP;
int main(int argc, char* argv[]) {
std::cout << "IV_LENGTH: " << IV_LENGTH << std::endl;
CryptoPP::byte key[ CryptoPP::CIPHER::MAX_KEYLENGTH ],
iv[ IV_LENGTH ];
::memset( key, 0x01, CryptoPP::CIPHER::MAX_KEYLENGTH );
::memset( iv, 0x01, IV_LENGTH );
// Message M
std::string PlainText = "Hello World.";
// Cipher Text Sink
std::string CipherText;
// Encryptor
CryptoPP::CTR_Mode<CryptoPP::Threefish >::Encryption
Encryptor; //( key, CryptoPP::CIPHER::MAX_KEYLENGTH, iv, IV_LENGTH );
Encryptor.SetKeyWithIV(key, KEY_LENGTH, iv, IV_LENGTH);
// Encryptor.SetKeyWithIV(key, key.size(), iv, iv.size());
// Encryption
CryptoPP::StringSource( PlainText, true,
new CryptoPP::StreamTransformationFilter( Encryptor,
new CryptoPP::StringSink( CipherText )
) // StreamTransformationFilter
); // StringSource
///////////////////////////////////////
// DMZ //
///////////////////////////////////////
// Recovered Text Sink
std::string RecoveredText;
// Decryptor
CryptoPP::CIPHER_MODE<CryptoPP::CIPHER >::Decryption
Decryptor;//( key, CryptoPP::CIPHER::MAX_KEYLENGTH, iv, IV_LENGTH );
Decryptor.SetKeyWithIV(key, KEY_LENGTH, iv, IV_LENGTH);
// Decryption
CryptoPP::StringSource( CipherText, true,
new CryptoPP::StreamTransformationFilter( Decryptor,
new CryptoPP::StringSink( RecoveredText )
) // StreamTransformationFilter
); // StringSource
//////////////////////////////////////////
// Output //
//////////////////////////////////////////
std::cout << "Algorithm:" << std::endl;
std::cout << " " << Encryptor.AlgorithmName() << std::endl;
std::cout << "Maximum Key Size:" << std::endl;
std::cout << " " << Encryptor.MaxKeyLength() << " bytes" << std::endl;
std::cout << std::endl;
std::cout << "Plain Text (" << PlainText.length() << " bytes)" << std::endl;
std::cout << " '" << PlainText << "'" << std::endl;
std::cout << std::endl;
std::cout << "Recovered Text:" << std::endl;
std::cout << " '" << RecoveredText << "'" << std::endl;
std::cout << std::endl;
return 0;
}