AusweisApp2/src/aidl/PskManager.cpp

90 lines
2.2 KiB
C++
Raw Normal View History

2017-07-03 09:30:10 +02:00
/*!
* PskManager.cpp
*
* \copyright Copyright (c) 2016 Governikus GmbH & Co. KG
*/
#include "PskManager.h"
#include "Randomizer.h"
#include <QCryptographicHash>
#include <QDateTime>
#include <QGlobalStatic>
#include <QMutexLocker>
using namespace governikus;
Q_GLOBAL_STATIC(PskManager, instance)
PskManager & PskManager::getInstance()
{
return *instance;
}
2017-07-03 09:33:28 +02:00
QByteArray PskManager::generatePsk(const QByteArray& pClientPartialPsk)
2017-07-03 09:30:10 +02:00
{
const static int TIMESTAMP_BYTE_COUNT = 64 / 8;
const static int RANDOM_BYTE_COUNT = 256;
2017-07-03 09:33:28 +02:00
const QMutexLocker locker(&mPskMutex);
2017-07-03 09:30:10 +02:00
QByteArray timeStampBytes;
timeStampBytes.reserve(TIMESTAMP_BYTE_COUNT);
qint64 timeStamp = QDateTime::currentMSecsSinceEpoch();
for (int i = 0; i < TIMESTAMP_BYTE_COUNT; i++)
{
2017-07-03 09:33:28 +02:00
timeStampBytes += static_cast<char>(timeStamp & 0xFF);
2017-07-03 09:30:10 +02:00
timeStamp >>= 8;
}
QByteArray randomBytes;
randomBytes.reserve(RANDOM_BYTE_COUNT);
Randomizer& randomizer = Randomizer::getInstance();
mSecureRandomPsk = randomizer.isSecureRandom();
std::mt19937& generator = randomizer.getGenerator();
for (int i = 0; i < RANDOM_BYTE_COUNT; i += 4)
{
2017-07-03 09:33:28 +02:00
const auto randomNumber = generator();
randomBytes += static_cast<char>(randomNumber & 0xFF);
randomBytes += static_cast<char>((randomNumber >> 8) & 0xFF);
randomBytes += static_cast<char>((randomNumber >> 16) & 0xFF);
randomBytes += static_cast<char>((randomNumber >> 24) & 0xFF);
2017-07-03 09:30:10 +02:00
}
QByteArray mServerInputBytes;
mServerInputBytes.reserve(TIMESTAMP_BYTE_COUNT + RANDOM_BYTE_COUNT);
mServerInputBytes += timeStampBytes;
mServerInputBytes += randomBytes;
2017-07-03 09:33:28 +02:00
auto clientPartialPsk = pClientPartialPsk.trimmed();
if (clientPartialPsk.startsWith("0x"))
2017-07-03 09:30:10 +02:00
{
clientPartialPsk = clientPartialPsk.mid(2, -1);
}
2017-07-03 09:33:28 +02:00
const auto& clientInputBytes = QByteArray::fromHex(clientPartialPsk);
2017-07-03 09:30:10 +02:00
QCryptographicHash hashFunction(QCryptographicHash::Sha256);
hashFunction.addData(mServerInputBytes);
hashFunction.addData(clientInputBytes);
2017-07-03 09:33:28 +02:00
mPsk = hashFunction.result().toHex();
return mPsk;
2017-07-03 09:30:10 +02:00
}
QByteArray PskManager::getPsk()
{
2017-07-03 09:33:28 +02:00
const QMutexLocker locker(&mPskMutex);
2017-07-03 09:30:10 +02:00
return mPsk;
}
bool PskManager::isSecureRandomPsk()
{
2017-07-03 09:33:28 +02:00
const QMutexLocker locker(&mPskMutex);
2017-07-03 09:30:10 +02:00
return mSecureRandomPsk;
}