diff options
Diffstat (limited to 'libcmix-bignum')
| -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 |
6 files changed, 164 insertions, 0 deletions
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; +} |
