keysmith/autotests/oath/hotp-algorithm.cpp

91 lines
2.3 KiB
C++

/*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-FileCopyrightText: 2020 Johan Ouwerkerk <jm.ouwerkerk@gmail.com>
*/
#include "oath/oath.h"
#include <QTest>
#include <QtDebug>
class HotpAlgorithmTest: public QObject
{
Q_OBJECT
private Q_SLOTS:
void rfcTestVector(void);
void rfcTestVector_data(void);
};
void define_test_case(quint64 counter, bool checksum, const char * expected)
{
static const QString testCase(QLatin1String("%1 (%2) ... %3"));
QTest::newRow(qPrintable(testCase.arg(counter).arg(checksum ? QLatin1String("with checksum") : QLatin1String("without checksum")).arg(QLatin1String(expected))))
<< counter << checksum << QString(QLatin1String(expected));
}
/*
* (Static) test vector params obtained from RFC-4226
* https://tools.ietf.org/html/rfc4226#page-32
*/
static QByteArray secret("12345678901234567890");
static uint tokenLength = 6;
void HotpAlgorithmTest::rfcTestVector(void)
{
QFETCH(quint64, counter);
QFETCH(bool, checksum);
std::optional<oath::Algorithm> uut = oath::Algorithm::usingDynamicTruncation(QCryptographicHash::Sha1, tokenLength, checksum);
QVERIFY2(uut, "should be able to construct the algorithm using settings of the RFC test vector");
QByteArray copy(secret);
std::optional<QString> result = uut->compute(counter, copy.data(), copy.size());
QVERIFY2(result, "token should be computed successfully");
QTEST(*result, "rfc-test-vector");
}
void HotpAlgorithmTest::rfcTestVector_data(void)
{
static const char * corpus[20] {
"755224",
"287082",
"359152",
"969429",
"338314",
"254676",
"287922",
"162583",
"399871",
"520489",
/*
* same as the first batch (from RFC test samples), but with manually added Luhn checksum:
*/
"7552243",
"2870822",
"3591526",
"9694290",
"3383148",
"2546760",
"2879229",
"1625839",
"3998713",
"5204896"
};
QTest::addColumn<quint64>("counter");
QTest::addColumn<bool>("checksum");
QTest::addColumn<QString>("rfc-test-vector");
for (quint64 k = 0; k < 20; ++k) {
define_test_case(k % 10ULL, k >= 10, corpus[k]);
}
}
QTEST_APPLESS_MAIN(HotpAlgorithmTest)
#include "hotp-algorithm.moc"