diff options
Diffstat (limited to 'src/hash.cc')
-rw-r--r-- | src/hash.cc | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/hash.cc b/src/hash.cc new file mode 100644 index 0000000..5b67d92 --- /dev/null +++ b/src/hash.cc @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * hash.cc + * + * Sun Jul 5 10:37:32 CEST 2020 + * Copyright 2020 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Munia. + * + * Munia is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Munia is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Munia; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "hash.h" + +#include <cstdint> +#include <vector> + +#include <argon2.h> + +std::string getEncoded(const Salt& salt, const std::string& password) +{ + constexpr std::size_t hashlen = 32u; + constexpr std::uint32_t t_cost = 10; // 10-pass computation + constexpr std::uint32_t m_cost = (1 << 16); // 64 mebibytes memory usage + constexpr std::uint32_t parallelism = 1; // number of threads and lanes + + auto encodedlen = argon2_encodedlen(t_cost, m_cost, parallelism, + salt.size(), hashlen, Argon2_i); + std::vector<char> encoded(encodedlen, '\0'); + auto ret = argon2i_hash_encoded(t_cost, m_cost, parallelism, + password.data(), password.length(), + salt.data(), salt.size(), + hashlen, + encoded.data(), encoded.size()); + if(ret != ARGON2_OK) + { + throw "Argon2 encoding error."; + } + + // convert vector<char> to string + std::string s; + s.reserve(encoded.size()); + for(const auto& e : encoded) + { + s += e; + } + + return s; +} + +bool verifyEncoded(const std::string& encoded, const std::string& password) +{ + auto ret = argon2i_verify(encoded.data(), password.data(), password.length()); + return ret == ARGON2_OK; +} |