diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-10-04 12:18:35 +0200 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-10-04 12:18:35 +0200 |
| commit | 4f2c980343b321e7fccf48190c32bfb4bca426f4 (patch) | |
| tree | e08d299dc9da1976c8924207f9cbfbc8bd06709a | |
| parent | ad3d46b0b6ca285bbaf1540e9805714addfeb9af (diff) | |
| download | cmix-4f2c980343b321e7fccf48190c32bfb4bca426f4.tar.gz cmix-4f2c980343b321e7fccf48190c32bfb4bca426f4.tar.bz2 cmix-4f2c980343b321e7fccf48190c32bfb4bca426f4.zip | |
Added a bignum library to abstract possible implementations.
| -rw-r--r-- | CMakeLists.txt | 1 | ||||
| -rw-r--r-- | CMakeModules/bignum_implementations.cmake | 3 | ||||
| -rw-r--r-- | CMakeModules/get_target_name.cmake | 8 | ||||
| -rw-r--r-- | CMakeModules/implementations.cmake | 20 | ||||
| -rw-r--r-- | libcmix-bignum/CMakeLists.txt | 33 | ||||
| -rw-r--r-- | libcmix-bignum/bignum.h | 40 | ||||
| -rw-r--r-- | libcmix-bignum/gmp/CMakeLists.txt | 18 | ||||
| -rw-r--r-- | libcmix-bignum/gmp/gmp_bignum.c | 49 | ||||
| -rw-r--r-- | libcmix-bignum/null/CMakeLists.txt | 15 | ||||
| -rw-r--r-- | libcmix-bignum/null/null_bignum.c | 9 | ||||
| -rw-r--r-- | libcmix-crypto/curve25519/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | node/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | node/node.cpp | 40 |
14 files changed, 208 insertions, 42 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index a27da23..7e285f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,7 @@ if(DOXYGEN_FOUND) ) endif(DOXYGEN_FOUND) +add_subdirectory(libcmix-bignum) add_subdirectory(libcmix-crypto) add_subdirectory(libcmix) diff --git a/CMakeModules/bignum_implementations.cmake b/CMakeModules/bignum_implementations.cmake new file mode 100644 index 0000000..4db7d78 --- /dev/null +++ b/CMakeModules/bignum_implementations.cmake @@ -0,0 +1,3 @@ +include(implementations) + +DefineImplementations("") diff --git a/CMakeModules/get_target_name.cmake b/CMakeModules/get_target_name.cmake index 6e7c6fd..90d585d 100644 --- a/CMakeModules/get_target_name.cmake +++ b/CMakeModules/get_target_name.cmake @@ -1,10 +1,10 @@ function(get_target_name target_name) -get_filename_component(implementation ${CMAKE_CURRENT_LIST_DIR} NAME) -get_filename_component(implementation_path ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) -get_filename_component(algorithm ${implementation_path} NAME) + get_filename_component(implementation ${CMAKE_CURRENT_LIST_DIR} NAME) + get_filename_component(implementation_path ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) + get_filename_component(algorithm ${implementation_path} NAME) -set(${target_name} "${algorithm}-${implementation}" PARENT_SCOPE) + set(${target_name} "${algorithm}-${implementation}" PARENT_SCOPE) endfunction(get_target_name) diff --git a/CMakeModules/implementations.cmake b/CMakeModules/implementations.cmake index aa6a8bf..cfab7e2 100644 --- a/CMakeModules/implementations.cmake +++ b/CMakeModules/implementations.cmake @@ -5,7 +5,7 @@ function(DefineImplementations prefix) set(implementations "") foreach(child ${children}) IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${prefix}/${child}) - LIST(APPEND implementations ${child}) + LIST(APPEND implementations ${child}) ENDIF() ENDFOREACH() @@ -15,9 +15,21 @@ function(DefineImplementations prefix) message(FATAL_ERROR "Cannot call DefineImplementations with an empty implementations list.") endif() + get_filename_component(lib ${CMAKE_CURRENT_SOURCE_DIR} NAME) + string(REGEX REPLACE "-" "_" lib ${lib}) + list(GET implementations 0 default) - set(${prefix}_implementations ${implementations} PARENT_SCOPE) - set(${prefix}_implementation "${default}" CACHE STRING "${prefix} implementation chosen at configure time") - set_property(CACHE ${prefix}_implementation PROPERTY STRINGS ${implementations}) + + if ("${prefix}" STREQUAL "") + set(prefix "") + else() + set(prefix "${prefix}_") + string(REGEX REPLACE "/" "_" prefix ${prefix}) + endif() + + + set(${lib}_${prefix}implementations ${implementations} PARENT_SCOPE) + set(${lib}_${prefix}implementation "${default}" CACHE STRING "${lib} implementation chosen at configure time") + set_property(CACHE ${lib}_${prefix}implementation PROPERTY STRINGS ${implementations}) endfunction(DefineImplementations) diff --git a/libcmix-bignum/CMakeLists.txt b/libcmix-bignum/CMakeLists.txt new file mode 100644 index 0000000..2cadc87 --- /dev/null +++ b/libcmix-bignum/CMakeLists.txt @@ -0,0 +1,33 @@ + +add_library(cmix-bignum-interface INTERFACE) + +target_include_directories(cmix-bignum-interface + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} +) + +set(interface_sources + ${CMAKE_CURRENT_SOURCE_DIR}/bignum.h +) + +target_sources(cmix-bignum-interface + INTERFACE ${interface_sources} +) + +include(bignum_implementations) +foreach(impl ${libcmix_bignum_implementations}) + add_subdirectory(${impl}) +endforeach() + +add_library(cmix-bignum INTERFACE) + +target_include_directories(cmix-bignum + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} +) + +target_sources(cmix-bignum + INTERFACE ${interface_sources} +) + +target_link_libraries(cmix-bignum + INTERFACE libcmix-bignum-${libcmix_bignum_implementation} +) diff --git a/libcmix-bignum/bignum.h b/libcmix-bignum/bignum.h new file mode 100644 index 0000000..02efcf7 --- /dev/null +++ b/libcmix-bignum/bignum.h @@ -0,0 +1,40 @@ +#pragma once + +#include <stddef.h> +#include <stdlib.h> + +#ifdef __cplusplus +extern "C" { +#endif + +enum bignum_error { + NoError = 0, + error = -1 +}; + +struct Bignum { + unsigned char* data; + size_t len; +}; + +struct Bignum allocate_bignum(size_t len) { + return (struct Bignum){ + (unsigned char*) malloc(len), + len + }; +} + +void free_bignum(struct Bignum* b) { + free(b->data); + b->data = 0; + b->len = 0; +} + +extern enum bignum_error get_curve25519_mod(struct Bignum* result); + +extern enum bignum_error multiply_mod(struct Bignum* result, struct Bignum const lh, struct Bignum const rh, struct Bignum const mod); + + +#ifdef __cplusplus +} +#endif
\ No newline at end of file diff --git a/libcmix-bignum/gmp/CMakeLists.txt b/libcmix-bignum/gmp/CMakeLists.txt new file mode 100644 index 0000000..44b99ad --- /dev/null +++ b/libcmix-bignum/gmp/CMakeLists.txt @@ -0,0 +1,18 @@ +include(get_target_name) + +get_target_name(target_name) + +find_package(gmp REQUIRED) + +add_library(${target_name} SHARED + gmp_bignum.c +) + +target_compile_options(${target_name} + PRIVATE -std=c99 +) + +target_link_libraries(${target_name} + PRIVATE cmix-bignum-interface + PRIVATE gmp +) diff --git a/libcmix-bignum/gmp/gmp_bignum.c b/libcmix-bignum/gmp/gmp_bignum.c new file mode 100644 index 0000000..cc40b48 --- /dev/null +++ b/libcmix-bignum/gmp/gmp_bignum.c @@ -0,0 +1,49 @@ +#include "bignum.h" + +#include "gmp.h" + +void from_bignum(mpz_t i, struct Bignum b) { + mpz_import(i, b.len, -1, 1, 0, 0, b.data); +} + +void to_bignum(struct Bignum* b, mpz_t i) { + mpz_export(b->data, &b->len, -1, 1, 0, 0, i); +} + +enum bignum_error get_curve25519_mod(struct Bignum* result) { + mpz_t mod; + mpz_init(mod); + mpz_ui_pow_ui(mod, 2, 255); + mpz_sub_ui(mod, mod, 19); + + to_bignum(result, mod); + return NoError; +} + +enum bignum_error multiply_mod(struct Bignum* result, struct Bignum const lh, struct Bignum const rh, struct Bignum const mod) { + mpz_t lh_; + mpz_init(lh_); + from_bignum(lh_, lh); + + mpz_t rh_; + mpz_init(rh_); + from_bignum(rh_, rh); + + mpz_t result_; + mpz_init(result_); + mpz_mul(result_, lh_, rh_); + + mpz_t mod_; + mpz_init(mod_); + from_bignum(mod_, mod); + mpz_mod(result_, result_, mod_); + + to_bignum(result, result_); + + mpz_clear(result_); + mpz_clear(lh_); + mpz_clear(rh_); + mpz_clear(mod_); + + return NoError; +} diff --git a/libcmix-bignum/null/CMakeLists.txt b/libcmix-bignum/null/CMakeLists.txt new file mode 100644 index 0000000..319590c --- /dev/null +++ b/libcmix-bignum/null/CMakeLists.txt @@ -0,0 +1,15 @@ +include(get_target_name) + +get_target_name(target_name) + +add_library(${target_name} SHARED + null_bignum.c +) + +target_compile_options(${target_name} + PRIVATE -std=c99 +) + +target_link_libraries(${target_name} + PRIVATE cmix-bignum-interface +) diff --git a/libcmix-bignum/null/null_bignum.c b/libcmix-bignum/null/null_bignum.c new file mode 100644 index 0000000..3b45132 --- /dev/null +++ b/libcmix-bignum/null/null_bignum.c @@ -0,0 +1,9 @@ +#include "bignum.h" + +extern enum bignum_error get_curve25519_mod(struct Bignum* result) { + return NoError; +} + +extern enum bignum_error multiply_mod(struct Bignum* result, struct Bignum const lh, struct Bignum const rh, struct Bignum const mod) { + return NoError; +} diff --git a/libcmix-crypto/curve25519/CMakeLists.txt b/libcmix-crypto/curve25519/CMakeLists.txt index afcc1b4..847c26c 100644 --- a/libcmix-crypto/curve25519/CMakeLists.txt +++ b/libcmix-crypto/curve25519/CMakeLists.txt @@ -1,4 +1,3 @@ - add_library(curve25519-interface INTERFACE) target_include_directories(curve25519-interface @@ -13,7 +12,7 @@ target_link_libraries(curve25519-interface INTERFACE cmix-crypto-interface ) -foreach(impl ${curve25519_implementations}) +foreach(impl ${libcmix_crypto_curve25519_implementations}) add_subdirectory(${impl}) endforeach() @@ -27,7 +26,7 @@ target_include_directories(curve25519-implementation target_link_libraries(curve25519-implementation PUBLIC curve25519-interface - PUBLIC curve25519-${curve25519_implementation} + PUBLIC curve25519-${libcmix_crypto_curve25519_implementation} ) diff --git a/libcmix-crypto/elgamal/CMakeLists.txt b/libcmix-crypto/elgamal/CMakeLists.txt index b92e5ae..8ee9a11 100644 --- a/libcmix-crypto/elgamal/CMakeLists.txt +++ b/libcmix-crypto/elgamal/CMakeLists.txt @@ -12,7 +12,7 @@ target_link_libraries(elgamal-interface INTERFACE cmix-crypto-interface ) -foreach(impl ${elgamal_implementations}) +foreach(impl ${libcmix_crypto_elgamal_implementations}) add_subdirectory(${impl}) endforeach() @@ -26,5 +26,5 @@ target_include_directories(elgamal-implementation target_link_libraries(elgamal-implementation PUBLIC elgamal-interface - PUBLIC elgamal-${elgamal_implementation} + PUBLIC elgamal-${libcmix_crypto_elgamal_implementation} ) diff --git a/node/CMakeLists.txt b/node/CMakeLists.txt index 6fe0ef7..9151cbc 100644 --- a/node/CMakeLists.txt +++ b/node/CMakeLists.txt @@ -1,7 +1,5 @@ find_package(Boost COMPONENTS system program_options REQUIRED) -find_package(gmp REQUIRED) - add_executable(node main.cpp node.hpp node.cpp @@ -25,8 +23,7 @@ target_link_libraries(node PRIVATE Boost::system PRIVATE log PRIVATE cmix + PRIVATE cmix-bignum PRIVATE cmix-network PRIVATE cmix-protobuf - PRIVATE gmpxx - PRIVATE gmp ) diff --git a/node/node.cpp b/node/node.cpp index 53dd30c..c9f6b14 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -2,7 +2,7 @@ #include "logging.hpp" -#include "gmpxx.h" +#include "bignum.h" #include <iostream> @@ -87,36 +87,26 @@ void Node::handle_initialization(const cmix_proto::Initialization& init) start_precomputation(); } else { - mpz_t shared; - mpz_init(shared); - mpz_import(shared, init.public_share().size(), -1, 1, 0, 0, init.public_share().data()); + Bignum shared = allocate_bignum(init.public_share().size()); + std::copy_n(init.public_share().data(), init.public_share().size(), shared.data); + Bignum my_share{keypair.pub, keypair.pub_len}; + Bignum mod = allocate_bignum(keypair.pub_len); + Bignum new_shared = allocate_bignum(keypair.pub_len); - mpz_t my_share; - mpz_init(my_share); - mpz_import(my_share, keypair.pub_len, -1, 1, 0, 0, keypair.pub); - - mpz_mul(shared, shared, my_share); - - mpz_t mod; - mpz_init(mod); - mpz_set_ui(mod, 2); - mpz_pow_ui(mod, mod, 255); - mpz_sub_ui(mod, mod, 19); - - mpz_mod(shared, shared, mod); - - std::vector<uint8_t> new_shared(keypair.pub_len, '\0'); - size_t size; - mpz_export(new_shared.data(), &size, -1, 1, 0, 0, shared); + if(multiply_mod(&new_shared, shared, my_share, mod) != NoError) { + BOOST_LOG_TRIVIAL(fatal) << "Group multiplication failed"; + throw std::runtime_error("Group multiplication failed"); + } cmix_proto::Initialization init; - init.set_public_share(new_shared.data(), new_shared.size()); + init.set_public_share(new_shared.data, new_shared.len); next_node.send(init); + + free_bignum(&shared); + free_bignum(&mod); + free_bignum(&new_shared); - mpz_clear(shared); - mpz_clear(my_share); - mpz_clear(mod); } } |
