argon2

Implementation of argon2 (i, d, id) algorithms with CPU dispatching

Github星跟踪图

Argonishche

Build Status

Overview

The library comprises an implementation of Argon2 (i, d, id) and Blake2B algorithms that features the following:

  • C++14 interface
  • constexpr and partial templates to get rid of useless branches
  • SSE2, SSSE3, SSE4.1, AVX2 optimized implementations of Argon2 and Blake2B
  • Runtime CPU dispatching (a partiular implementation is chosen runtime depending on SIMD extentions available in the CPU)
  • OpenMP for multithreading in contrast to pthread in the Argon2 reference implementation
  • In contrast to the Argon2 reference implementation the library uses SIMD-optimized Blake2B

How to use

#include <argonishche.h>

uint32_t tcost = 1;     /* one pass */
uint32_t mcost = 32;    /* in KB */
uint32_t threads = 1;   /* one thread version */
bool runTest = false; /* by default factory runs a quick runtime test; pass 'false' to disable it */

argonishche::Argon2Factory afactory(runTest);
std::unique_ptr<argonishche::Argon2Base> argon2 = afactory.Create(argonishche::Argon2Type::Argon2_d, tcost, mcost, threads, key, keylen);
argon2->Hash(input, insize, salt, saltsize, out, outlen);
bool result = argon2->Verify(pwd, pwdlen, salt, saltlen, hash, hashlen, aad, addlen);

argonishche::Blake2BFactory bfactory(runTest);
uint32_t outlen = 32;
std::unique_ptr<argonishche::Blake2Base> blake2b = bfactory.Create(outlen, key, keylen);
blake2b->Update(in, inlen);
blake2b->Final(out, outlen);

There are also HashWithCustomMemory and VerifyWithCustomMemory methods to which you can pass a memory area to use it for computations and to save a little on memory allocation. GetMemorySize method returns the size of memory area that required for a particular instance.

Benchmark results

On my OS X 10.11, MacBook Pro (Early 2015, Core i5 2,7 GHz, 16 GB 1867 MHz DDR3) for (Argon2_d, 1, 2048, 1) it gives:, Implementation, Speed per one core (H/s), ------------------------------, --------------------------, REF (x64 w/o optimizations), 458.51, SSE2, 665.17, SSSE3, 743.86, SSE4.1, 723.41, AVX2, 1120.14, On Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz for (Argon2_d, 1, 2048, 1) it gives:, Implementation, Speed per one core (H/s), ------------------------------, --------------------------, REF (x64 w/o optimizations), 423.9, SSE2, 663.42, SSSE3, 715.33, SSE4.1, 720.12, AVX2, 1130.36, # How to add your own Argon2 configuration

The library uses constexpr to calculate some values at compile time. mcost value is a template variable, so the library doesn't support arbitrary mcost values except for predefined ones (in practise you usually don't need it).

To add a new mcost value just modify the file internal/proxy/proxy_macros.h and add appropriate ARGON2_INSTANCE_DECL declaration.

cmake options

You can use the following cmake options:, Option, Default value, Description, ---------------------, --------------, ----------------------------------------------, BUILD_WITH_OPENMP, ON, Use OpenMP if it's available, BUILD_TESTS, ON, Build library tests, BUILD_BENCHMARK, ON, Build openssl speed like benchmarking tool, # Testing with Intel SDE

One of the tests is intended to run under Intel SDE emulator. Make sure you have SDE in your PATH and run test_sde.sh <build_folder>/test/test_sde.

Other documentation

argonishche.h contains some Doxygen comments so Doxygen can be used to generate documentation.

About the name

Just "Argon" and Russian suffix "-ищ" (-ishch). In Russian suffix "-ищ" (-ishch) means something that is bigger than ordinary and that scares small children. In this case - something that is bigger than Argon :)

Acknowledgements

This project uses some ideas and pieces of code from the following projects licensed under CC0:

And it wouldn't be possible to make the library without work of the following people:

  • Alex Biryukov, Daniel Dinu, Dmitry Khovratovich who designed Argon2 algorithm
  • Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn, Christian Winnerlein who designed Blake2 algorithm

I'm also thankful to Igor Klevanets for his fruitful feedback and code reviews.

主要指标

概览
名称与所有者yandex/argon2
主编程语言C++
编程语言CMake (语言数: 3)
平台
许可证BSD 3-Clause "New" or "Revised" License
所有者活动
创建于2017-07-06 22:23:03
推送于2021-06-02 05:06:21
最后一次提交2020-05-03 22:25:36
发布数0
用户参与
星数81
关注者数6
派生数15
提交数6
已启用问题?
问题数0
打开的问题数0
拉请求数1
打开的拉请求数1
关闭的拉请求数0
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?