GithubHelp home page GithubHelp logo

nilfoundation / crypto3-multiprecision Goto Github PK

View Code? Open in Web Editor NEW
6.0 11.0 9.0 23.19 MB

Cryptography-Enhanced Multiprecision for =nil; Crypto3 C++ Cryptography Suite.

CMake 2.11% C++ 97.89%
cryptography cpp multiprecision crypto3

crypto3-multiprecision's Introduction

=nil; Foundation's Multiprecision Library

The Multiprecision Library provides optimal arithmetic operations over a finite field, using Montgomery and Barret reductions.

Support, bugs and feature requests

Bugs and feature requests can be reported through the Gitub issue tracker.

You can submit your changes through a pull request.

Development

Clone the module repository project:

git clone https://github.com/nilfoundation/crypto3-multiprecision
cd crypto3-multiprecision
git submodule update --init
mkdir build && cmake ..

Running tests

Dependencies

External

  • Boost (>= 1.73). Because boost::config doesn't have BOOST_IF_CONSTEXPR definition before 1.73 version.

crypto3-multiprecision's People

Contributors

ahamez avatar andreymlashkin avatar antonbikineev avatar beman avatar ckormanyos avatar eldiener avatar emfrias avatar glenfe avatar grafikrobot avatar iluvmagick avatar ipavrus avatar jasoncoombs avatar jhunold avatar jzmaddock avatar lastique avatar luannet avatar madhur4127 avatar martun avatar mclow avatar nathompson avatar nemothenoone avatar nkaskov avatar pabristow avatar pavelkryukov avatar raffienficiaud avatar rinat229 avatar sk0m0r0h avatar tinko92 avatar zerg1996 avatar zerotypos-found avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

crypto3-multiprecision's Issues

Generalize modular adaptor internals

Review of ressol

Ressol implementation seems to have a bug. Incorrect Shanks-Tonnelli algorithm implementation could be a reason.

Test data:
modulus = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
a = 0x6650aa44bf64a7e4a62402a88eed89b9c269af6839db7142cb40bb0b6f558063
expected_a_sqrt = 0xbb53444d14f93d9305e2e4d3e3a76639c20aa9f2a87483c6aba0ffb9bf31e48
produced_a_sqrt = 0xf44acbbb2eb06c26cfa1d1b2c1c5899c63df5560d578b7c39545f003640cdde7

Remove ASM code from multiprecision.

We made a decision to remove ASM code from multiprecision. In some cases it was slightly faster than the C++ code, but in another machines it was significantly slower. We do not intend to support it on all compilers and environments for now, so removing it.

Modular negation is broken

Current negate implementation is

constexpr void negate() {
    m_base.negate();
    eval_add(m_base, this->mod_data().get_mod().backend());
}

which breaks the invariant when m_base is zero by getting the value to be the modulus.
This should fix NilFoundation/crypto3-algebra#128.

Monty inverse

Review monty inverse algorithm and extended/inverse euclidean algorithm. Implement for different backends, not only for cpp_int_backend.

gcc 12.x support

There is a compilation issue with the newer versions of gcc (tested 12.2).

➜  lorem-ipsum-cli git:(1-implement-data-transfer-workflow) ✗ make -C ${ZKLLVM_BUILD:-build} circuit_transpiler -j$(nproc) | tee build_log.log
make: Entering directory '/home/hgedia/Development/nil/lorem-ipsum-cli/build'
[ 50%] Building CXX object bin/circuit_transpiler/CMakeFiles/circuit_transpiler.dir/src/main.cpp.o
In file included from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/multiprecision/include/nil/crypto3/multiprecision/cpp_int.hpp:2725,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/algebra/include/nil/crypto3/algebra/fields/detail/exponentiation.hpp:33,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/algebra/include/nil/crypto3/algebra/fields/detail/element/fp.hpp:29,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/algebra/include/nil/crypto3/algebra/fields/pallas/base_field.hpp:29,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/algebra/include/nil/crypto3/algebra/curves/detail/pallas/types.hpp:29,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/algebra/include/nil/crypto3/algebra/curves/pallas.hpp:29,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/bin/circuit_transpiler/src/main.cpp:6:
/home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/algebra/include/nil/crypto3/algebra/fields/pallas/base_field.hpp:58:81:   in 'constexpr' expansion of 'nil::crypto3::multiprecision::modular_params<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >(nil::crypto3::algebra::fields::pallas_base_field::modulus)'
/home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/multiprecision/include/nil/crypto3/multiprecision/modular/modular_params_fixed.hpp:62:68:   in 'constexpr' expansion of '((nil::crypto3::multiprecision::modular_params<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >*)this)->nil::crypto3::multiprecision::modular_params<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::m_mod_obj.nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::modular_functions_fixed((* & m))'
/home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/multiprecision/include/nil/crypto3/multiprecision/modular/modular_functions_fixed.hpp:304:35:   in 'constexpr' expansion of '((nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >*)this)->nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::initialize(nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >((* & m), 0))'
/home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/multiprecision/include/nil/crypto3/multiprecision/modular/modular_functions_fixed.hpp:269:50:   in 'constexpr' expansion of '((nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >*)this)->nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::initialize_barrett_params()'
/home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/multiprecision/include/nil/crypto3/multiprecision/modular/modular_functions_fixed.hpp:219:36:   in 'constexpr' expansion of 'nil::crypto3::multiprecision::backends::eval_divide<511, 511, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void, 255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void>(((nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >*)this)->nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::m_barrett_mu, (*(const nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void>*)(&((nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >*)this)->nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::m_mod.nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::backend())))'
/home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/multiprecision/include/nil/crypto3/multiprecision/cpp_int/divide.hpp:494:32:   in 'constexpr' expansion of 'nil::crypto3::multiprecision::backends::eval_divide<511, 511, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void, 511, 511, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void, 255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void>((* & result), a, (* & b))'
/home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/multiprecision/include/nil/crypto3/multiprecision/cpp_int/divide.hpp:425:43:   in 'constexpr' expansion of 'nil::crypto3::multiprecision::backends::divide_unsigned_helper<cpp_int_backend<511, 511, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void>, cpp_int_backend<511, 511, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void>, cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >((& result), (* & a), (* & b), r)'
/home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/multiprecision/include/nil/crypto3/multiprecision/cpp_int/divide.hpp:19:40: error: '(((void*)(& a)) == ((void*)(& nil::crypto3::algebra::fields::pallas_base_field::modulus_params.nil::crypto3::multiprecision::modular_params<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::m_mod_obj.nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<255, 255, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::m_barrett_mu)))' is not a constant expression
   19 |                     if (((void*)result == (void*)&x) || ((void*)&r == (void*)&x)) {
      |                         ~~~~~~~~~~~~~~~^~~~~~~~~~~~~
In file included from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/hash/include/nil/crypto3/hash/detail/keccak/keccak_functions.hpp:38,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/hash/include/nil/crypto3/hash/keccak.hpp:32,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/zk/include/nil/crypto3/zk/transcript/fiat_shamir.hpp:35,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/zk/include/nil/crypto3/zk/commitments/detail/polynomial/basic_fri.hpp:43,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/marshalling/zk/include/nil/crypto3/marshalling/zk/types/commitments/fri.hpp:45,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/marshalling/zk/include/nil/crypto3/marshalling/zk/types/commitments/lpc.hpp:44,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/libs/crypto3/marshalling/zk/include/nil/crypto3/marshalling/zk/types/placeholder/proof.hpp:43,
                 from /home/hgedia/Development/nil/lorem-ipsum-cli/bin/circuit_transpiler/src/main.cpp:15:

This code compiles on version 11.3 gcc and seems related to constant expressions. This was found on lorem-ipsum-cli repo.

Steps to re-create

  1. install 12.3 version of gcc
  2. clone lorem-ipsum repository
  3. cmake with compiler path if multiple cmake -G "Unix Makefiles" -B ${ZKLLVM_BUILD:-build} -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ .
  4. build transpiler make -C ${ZKLLVM_BUILD:-build} circuit_transpiler -j$(nproc)

Warning: unsupported size for integer register

Step

git clone --recursive [email protected]:NilFoundation/ton-voting-protocol.git ever-voting-protocol
cd ever-voting-protocol
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make cli

Out

[100%] Building CXX object bin/cli/CMakeFiles/cli.dir/src/main.cpp.o
In file included from /src/ever-voting-protocol/libs/multiprecision/include/nil/crypto3/multiprecision/modular/modular_functions_fixed.hpp:14,
                 from /src/ever-voting-protocol/libs/multiprecision/include/nil/crypto3/multiprecision/cpp_int/eval_jacobi.hpp:15,
                 from /src/ever-voting-protocol/libs/multiprecision/include/nil/crypto3/multiprecision/cpp_int.hpp:2660,
                 from /src/ever-voting-protocol/libs/multiprecision/include/nil/crypto3/multiprecision/cpp_bin_float.hpp:9,
                 from /src/ever-voting-protocol/libs/algebra/include/nil/crypto3/algebra/random_element.hpp:32,
                 from /src/ever-voting-protocol/bin/cli/src/detail/r1cs_examples.hpp:34,
                 from /src/ever-voting-protocol/bin/cli/src/main.cpp:31:
/src/ever-voting-protocol/libs/multiprecision/include/nil/crypto3/multiprecision/modular/asm_functions.hpp: In function ‘bool nil::crypto3::multiprecision::backends::reduce_limb_asm(const size_t&, Limb1*, const Limb2*, const Limb3&) [with Limb1 = long long unsigned int; Limb2 = long long unsigned int; Limb3 = __int128 unsigned]’:
/src/ever-voting-protocol/libs/multiprecision/include/nil/crypto3/multiprecision/modular/asm_functions.hpp:95:17: warning: unsupported size for integer register
   95 |                 }
      |                 ^
[100%] Linking CXX executable cli
[100%] Built target cli

Fix the constexpr compile issue on GCC 13

When compiling zk on CGG 13 I get the following error:

/home/martun/nil/solana-consensus-proof/libs/multiprecision/include/nil/crypto3/multiprecision/cpp_int/divide.hpp:19:40: error: ‘(((void*)(& a)) == ((void*)(& nil::crypto3::algebra::fields::bls12_base_field<381>::modulus_params.nil::crypto3::multiprecision::modular_params<nil::crypto3::multiprecision::backends::cpp_int_backend<381, 381, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::m_mod_obj.nil::crypto3::multiprecision::backends::modular_functions_fixed<nil::crypto3::multiprecision::backends::cpp_int_backend<381, 381, nil::crypto3::multiprecision::signed_magnitude, nil::crypto3::multiprecision::unchecked, void> >::m_barrett_mu)))’ is not a constant expression
   19 |                     if (((void*)result == (void*)&x) || ((void*)&r == (void*)&x)) {
      |                         ~~~~~~~~~~~~~~~^~~~~~~~~~~~~

Rename targets and include directories

Since the fork of Boost.Multiprecision has officially happened, it is required to rename directories and change target names to nil:: and nil/-prefixed ones to avoid target selection confusion.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.