mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 11:08:02 -06:00
* wolfCrypt as crypto backend for VeraCrypt * Refactor to use EncryptionModeWolfCryptXTS class
125 lines
5.1 KiB
C++
125 lines
5.1 KiB
C++
/*
|
|
Derived from source code of TrueCrypt 7.1a, which is
|
|
Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed
|
|
by the TrueCrypt License 3.0.
|
|
|
|
Modifications and additions to the original source code (contained in this file)
|
|
and all other portions of this file are Copyright (c) 2013-2017 IDRIX
|
|
and are governed by the Apache License 2.0 the full text of which is
|
|
contained in the file License.txt included in VeraCrypt binary and source
|
|
code distribution packages.
|
|
*/
|
|
|
|
#include "Common/Pkcs5.h"
|
|
#include "Pkcs5Kdf.h"
|
|
#include "VolumePassword.h"
|
|
|
|
namespace VeraCrypt
|
|
{
|
|
Pkcs5Kdf::Pkcs5Kdf ()
|
|
{
|
|
}
|
|
|
|
Pkcs5Kdf::~Pkcs5Kdf ()
|
|
{
|
|
}
|
|
|
|
void Pkcs5Kdf::DeriveKey (const BufferPtr &key, const VolumePassword &password, int pim, const ConstBufferPtr &salt) const
|
|
{
|
|
DeriveKey (key, password, salt, GetIterationCount(pim));
|
|
}
|
|
|
|
shared_ptr <Pkcs5Kdf> Pkcs5Kdf::GetAlgorithm (const wstring &name)
|
|
{
|
|
foreach (shared_ptr <Pkcs5Kdf> kdf, GetAvailableAlgorithms())
|
|
{
|
|
if (kdf->GetName() == name)
|
|
return kdf;
|
|
}
|
|
throw ParameterIncorrect (SRC_POS);
|
|
}
|
|
|
|
shared_ptr <Pkcs5Kdf> Pkcs5Kdf::GetAlgorithm (const Hash &hash)
|
|
{
|
|
foreach (shared_ptr <Pkcs5Kdf> kdf, GetAvailableAlgorithms())
|
|
{
|
|
if (typeid (*kdf->GetHash()) == typeid (hash))
|
|
return kdf;
|
|
}
|
|
|
|
throw ParameterIncorrect (SRC_POS);
|
|
}
|
|
|
|
Pkcs5KdfList Pkcs5Kdf::GetAvailableAlgorithms ()
|
|
{
|
|
Pkcs5KdfList l;
|
|
|
|
l.push_back (shared_ptr <Pkcs5Kdf> (new Pkcs5HmacSha512 ()));
|
|
l.push_back (shared_ptr <Pkcs5Kdf> (new Pkcs5HmacSha256 ()));
|
|
#ifndef WOLFCRYPT_BACKEND
|
|
l.push_back (shared_ptr <Pkcs5Kdf> (new Pkcs5HmacBlake2s ()));
|
|
l.push_back (shared_ptr <Pkcs5Kdf> (new Pkcs5HmacWhirlpool ()));
|
|
l.push_back (shared_ptr <Pkcs5Kdf> (new Pkcs5HmacStreebog ()));
|
|
#endif
|
|
return l;
|
|
}
|
|
|
|
void Pkcs5Kdf::ValidateParameters (const BufferPtr &key, const VolumePassword &password, const ConstBufferPtr &salt, int iterationCount) const
|
|
{
|
|
if (key.Size() < 1 || password.Size() < 1 || salt.Size() < 1 || iterationCount < 1)
|
|
throw ParameterIncorrect (SRC_POS);
|
|
}
|
|
|
|
#ifndef WOLFCRYPT_BACKEND
|
|
void Pkcs5HmacBlake2s_Boot::DeriveKey (const BufferPtr &key, const VolumePassword &password, const ConstBufferPtr &salt, int iterationCount) const
|
|
{
|
|
ValidateParameters (key, password, salt, iterationCount);
|
|
derive_key_blake2s ((char *) password.DataPtr(), (int) password.Size(), (char *) salt.Get(), (int) salt.Size(), iterationCount, (char *) key.Get(), (int) key.Size());
|
|
}
|
|
|
|
void Pkcs5HmacBlake2s::DeriveKey (const BufferPtr &key, const VolumePassword &password, const ConstBufferPtr &salt, int iterationCount) const
|
|
{
|
|
ValidateParameters (key, password, salt, iterationCount);
|
|
derive_key_blake2s ((char *) password.DataPtr(), (int) password.Size(), (char *) salt.Get(), (int) salt.Size(), iterationCount, (char *) key.Get(), (int) key.Size());
|
|
}
|
|
#endif
|
|
|
|
void Pkcs5HmacSha256_Boot::DeriveKey (const BufferPtr &key, const VolumePassword &password, const ConstBufferPtr &salt, int iterationCount) const
|
|
{
|
|
ValidateParameters (key, password, salt, iterationCount);
|
|
derive_key_sha256 ((char *) password.DataPtr(), (int) password.Size(), (char *) salt.Get(), (int) salt.Size(), iterationCount, (char *) key.Get(), (int) key.Size());
|
|
}
|
|
|
|
void Pkcs5HmacSha256::DeriveKey (const BufferPtr &key, const VolumePassword &password, const ConstBufferPtr &salt, int iterationCount) const
|
|
{
|
|
ValidateParameters (key, password, salt, iterationCount);
|
|
derive_key_sha256 ((char *) password.DataPtr(), (int) password.Size(), (char *) salt.Get(), (int) salt.Size(), iterationCount, (char *) key.Get(), (int) key.Size());
|
|
}
|
|
|
|
void Pkcs5HmacSha512::DeriveKey (const BufferPtr &key, const VolumePassword &password, const ConstBufferPtr &salt, int iterationCount) const
|
|
{
|
|
ValidateParameters (key, password, salt, iterationCount);
|
|
derive_key_sha512 ((char *) password.DataPtr(), (int) password.Size(), (char *) salt.Get(), (int) salt.Size(), iterationCount, (char *) key.Get(), (int) key.Size());
|
|
}
|
|
|
|
#ifndef WOLFCRYPT_BACKEND
|
|
void Pkcs5HmacWhirlpool::DeriveKey (const BufferPtr &key, const VolumePassword &password, const ConstBufferPtr &salt, int iterationCount) const
|
|
{
|
|
ValidateParameters (key, password, salt, iterationCount);
|
|
derive_key_whirlpool ((char *) password.DataPtr(), (int) password.Size(), (char *) salt.Get(), (int) salt.Size(), iterationCount, (char *) key.Get(), (int) key.Size());
|
|
}
|
|
|
|
void Pkcs5HmacStreebog::DeriveKey (const BufferPtr &key, const VolumePassword &password, const ConstBufferPtr &salt, int iterationCount) const
|
|
{
|
|
ValidateParameters (key, password, salt, iterationCount);
|
|
derive_key_streebog ((char *) password.DataPtr(), (int) password.Size(), (char *) salt.Get(), (int) salt.Size(), iterationCount, (char *) key.Get(), (int) key.Size());
|
|
}
|
|
|
|
void Pkcs5HmacStreebog_Boot::DeriveKey (const BufferPtr &key, const VolumePassword &password, const ConstBufferPtr &salt, int iterationCount) const
|
|
{
|
|
ValidateParameters (key, password, salt, iterationCount);
|
|
derive_key_streebog ((char *) password.DataPtr(), (int) password.Size(), (char *) salt.Get(), (int) salt.Size(), iterationCount, (char *) key.Get(), (int) key.Size());
|
|
}
|
|
#endif
|
|
}
|