diff options
-rw-r--r-- | .gitmodules | 3 | ||||
m--------- | argon2 | 0 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | src/Makefile.am | 27 | ||||
-rw-r--r-- | src/hash.cc | 70 | ||||
-rw-r--r-- | src/hash.h | 35 | ||||
-rw-r--r-- | src/muniapwd.cc | 73 | ||||
-rw-r--r-- | src/salt.cc | 53 | ||||
-rw-r--r-- | src/salt.h | 35 |
9 files changed, 296 insertions, 1 deletions
diff --git a/.gitmodules b/.gitmodules index 49cc647..bb7ff44 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "src/ws/marked"] path = src/ws/marked url = https://github.com/markedjs/marked.git +[submodule "argon2"] + path = argon2 + url = https://github.com/P-H-C/phc-winner-argon2 diff --git a/argon2 b/argon2 new file mode 160000 +Subproject cd5dd359960cea3962ace607d4915da7da5cf18 diff --git a/configure.ac b/configure.ac index 41440bc..83fd306 100644 --- a/configure.ac +++ b/configure.ac @@ -3,6 +3,7 @@ AC_INIT([munia], [0.1.0]) AC_CONFIG_SRCDIR([src/muniad.cc]) AM_INIT_AUTOMAKE +LT_INIT AM_SILENT_RULES([yes]) diff --git a/src/Makefile.am b/src/Makefile.am index c8a6560..750fb7c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,19 @@ SUBDIRS = ws -bin_PROGRAMS = muniad muniacli +noinst_LTLIBRARIES = libargon2.la + +bin_PROGRAMS = muniad muniacli muniapwd + +libargon2_la_CFLAGS = \ + -DARGON2_NO_THREADS -I$(top_srcdir)/argon2/include + +libargon2_la_SOURCES = \ + $(top_srcdir)/argon2/src/argon2.c \ + $(top_srcdir)/argon2/src/core.c \ + $(top_srcdir)/argon2/src/blake2/blake2b.c \ + $(top_srcdir)/argon2/src/thread.c \ + $(top_srcdir)/argon2/src/encoding.c \ + $(top_srcdir)/argon2/src/ref.c muniad_LDADD = $(LIBWEBSOCKETS_LIBS) $(EXPAT_LIBS) @@ -29,6 +42,18 @@ muniacli_CXXFLAGS = $(LIBWEBSOCKETS_CFLAGS) -I$(top_srcdir)/hugin muniacli_SOURCES = \ muniacli.cc +muniapwd_LDADD = libargon2.la + +muniapwd_CXXFLAGS = \ + -std=c++11 \ + $(LIBWEBSOCKETS_CFLAGS) \ + -I$(top_srcdir)/argon2/include + +muniapwd_SOURCES = \ + muniapwd.cc \ + salt.cc \ + hash.cc + EXTRA_DIST = \ connectionhandler.h \ errorcodes.h \ 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; +} diff --git a/src/hash.h b/src/hash.h new file mode 100644 index 0000000..6f73f97 --- /dev/null +++ b/src/hash.h @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * hash.h + * + * 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. + */ +#pragma once + +#include <string> + +#include "salt.h" + +std::string getEncoded(const Salt& salt, const std::string& password); +bool verifyEncoded(const std::string& encoded, const std::string& password); diff --git a/src/muniapwd.cc b/src/muniapwd.cc new file mode 100644 index 0000000..26b8eeb --- /dev/null +++ b/src/muniapwd.cc @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * muniapwd.cc + * + * Sun Jul 5 09:22:22 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 <unistd.h> + +#include "salt.h" +#include "hash.h" + +int main(int argc, char* argv[]) +{ + if(argc != 2) + { + printf("Usage: %s <username>\n", argv[0]); + return 1; + } + + const char* user = argv[1]; + + std::string password = getpass("Type password: "); + std::string passwordAgain = getpass("Type password (again): "); + if(password != passwordAgain) + { + printf("Passwords don't match.\n"); + return 1; + } + + try + { + auto encoded = getEncoded(getSalt(), password); + printf("%s:%s\n", user, encoded.data()); + + if(verifyEncoded(encoded, password)) + { + printf("Verification ok\n"); + } + else + { + printf("Verification failed\n"); + return 1; + } + } + catch(char* msg) + { + printf("Error: %s\n", msg); + return 1; + } + + return 0; +} diff --git a/src/salt.cc b/src/salt.cc new file mode 100644 index 0000000..46eb94a --- /dev/null +++ b/src/salt.cc @@ -0,0 +1,53 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * salt.cc + * + * Sun Jul 5 14:34:25 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 "salt.h" + +#define _GNU_SOURCE 1 +#include <linux/random.h> +#include <sys/syscall.h> +#include <sys/types.h> +#include <unistd.h> +//#include <errno.h> + +Salt getSalt() +{ + Salt salt(16, '\0'); + + auto ret = syscall(SYS_getrandom, salt.data(), salt.size(), 1); + if(ret == -1) + { + throw "Could not get random bytes for salt"; // strerror(errno)); + } + + if(ret != (int)salt.size()) + { + throw "Not enough entropy."; + } + + return salt; +} diff --git a/src/salt.h b/src/salt.h new file mode 100644 index 0000000..0982b46 --- /dev/null +++ b/src/salt.h @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * salt.h + * + * Sun Jul 5 14:34:25 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. + */ +#pragma once + +#include <vector> +#include <cstdint> + +using Salt = std::vector<std::uint8_t>; + +Salt getSalt(); |