2004-12-30 09:37:08 +00:00
|
|
|
/**
|
|
|
|
* kdfunittest.cpp
|
|
|
|
*
|
|
|
|
* Copyright (C) 2004 Brad Hards <bradh@frogmouth.net>
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
*
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
#include "kdfunittest.h"
|
2005-01-01 05:11:34 +00:00
|
|
|
#include <QtCrypto>
|
2004-12-30 09:37:08 +00:00
|
|
|
|
|
|
|
struct kdfTestValues {
|
|
|
|
QCString secret; // usually a password or passphrase
|
|
|
|
QCString output; // the key you get back
|
|
|
|
QCString salt; // a salt or initialisation vector
|
|
|
|
unsigned int outputLength; // if the algo supports variable length keys, len
|
|
|
|
unsigned int iterationCount; // number of iterations
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// These are from Botan's test suite
|
|
|
|
static struct kdfTestValues pbkdf1TestValues[] = {
|
|
|
|
{ "66746C6B6662786474626A62766C6C7662776977",
|
|
|
|
"768B277DC970F912DBDD3EDAD48AD2F065D25",
|
|
|
|
"40AC5837560251C275AF5E30A6A3074E57CED38E", 19, 6 },
|
|
|
|
|
|
|
|
{ "786E736F736D6B766867677A7370636E63706F63",
|
|
|
|
"4D90E846A4B6AAA02AC548014A00E97E506B2AFB",
|
|
|
|
"7008A9DC1B9A81470A2360275C19DAB77F716824", 20, 6 },
|
|
|
|
|
|
|
|
{ "6F74696C71776C756B717473",
|
|
|
|
"71ED1A995E693EFCD33155935E800037DA74EA28",
|
|
|
|
"CCFC44C09339040E55D3F7F76CA6EF838FDE928717241DEB9AC1A4EF45A27711", 20, 2001 },
|
|
|
|
|
|
|
|
{ "6B7A6E657166666C6274767374686E6663746166",
|
|
|
|
"F345FB8FBD880206B650266661F6",
|
|
|
|
"8108883FC04A01FEB10661651516425DAD1C93E0", 14, 10000 },
|
|
|
|
|
|
|
|
{ "716B78686C7170656D7868796B6D7975636A626F",
|
|
|
|
"2D54DFED0C7EF7D20B0945BA414A",
|
|
|
|
"BC8BC53D4604977C3ADB1D19C15E87B77A84C2F6", 14, 10000 },
|
|
|
|
|
|
|
|
{ 0, 0, 0, 0, 0 }
|
|
|
|
};
|
|
|
|
|
|
|
|
KDFUnitTest::KDFUnitTest()
|
|
|
|
: Tester()
|
|
|
|
{
|
|
|
|
QCA::init();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KDFUnitTest::allTests()
|
|
|
|
{
|
|
|
|
pbkdf1Tests();
|
|
|
|
pbkdf2Tests();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KDFUnitTest::pbkdf1Tests()
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!QCA::isSupported("pbkdf1(sha1)"))
|
|
|
|
SKIP("PBKDF version 1 with SHA1 not supported");
|
|
|
|
else {
|
|
|
|
for (int n = 0; pbkdf1TestValues[n].secret; n++) {
|
|
|
|
QSecureArray password = QCA::hexToArray( pbkdf1TestValues[n].secret );
|
|
|
|
QCA::InitializationVector salt( QCA::hexToArray( pbkdf1TestValues[n].salt) );
|
|
|
|
QCA::SymmetricKey key = QCA::PBKDF1().makeKey( password,
|
|
|
|
salt,
|
|
|
|
pbkdf1TestValues[n].outputLength,
|
|
|
|
pbkdf1TestValues[n].iterationCount);
|
|
|
|
CHECK( QCA::arrayToHex( key ), QString( pbkdf1TestValues[n].output ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KDFUnitTest::pbkdf2Tests()
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!QCA::isSupported("pbkdf2(sha1)"))
|
|
|
|
SKIP("PBKDF version 2 with SHA1 not supported");
|
|
|
|
else {
|
|
|
|
#if 0
|
|
|
|
QCString salt("what do ya want for nothing?");
|
|
|
|
QCString password("Jefe");
|
|
|
|
int iterations = 1000;
|
|
|
|
|
|
|
|
QByteArray passwordOut = QCA::PBKDF2::makeKey (password, salt, iterations, 16);
|
|
|
|
CHECK( QCA::arrayToHex(passwordOut), QString( "6349e09cb6b8c1485cfa9780ee3264df" ) );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|