aboutsummaryrefslogtreecommitdiff
path: root/libcmix-crypto/curve25519
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-09-02 15:29:09 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2016-09-02 15:29:09 +0200
commit4f13051f763cab3d431847305eff913e4bf9d77a (patch)
treebb20393d714ede1a0200653e2bddbbb694b56f16 /libcmix-crypto/curve25519
parentdffdb1388991c5b5688139bfa093c8581a0f3a36 (diff)
downloadcmix-4f13051f763cab3d431847305eff913e4bf9d77a.tar.gz
cmix-4f13051f763cab3d431847305eff913e4bf9d77a.tar.bz2
cmix-4f13051f763cab3d431847305eff913e4bf9d77a.zip
Changed to api to be less repetative in use.
Diffstat (limited to 'libcmix-crypto/curve25519')
-rw-r--r--libcmix-crypto/curve25519/CMakeLists.txt12
-rw-r--r--libcmix-crypto/curve25519/curve25519.c12
-rw-r--r--libcmix-crypto/curve25519/curve25519.h9
-rw-r--r--libcmix-crypto/curve25519/null/CMakeLists.txt17
-rw-r--r--libcmix-crypto/curve25519/null/null_curve25519.c25
-rw-r--r--libcmix-crypto/curve25519/sodium/CMakeLists.txt9
-rw-r--r--libcmix-crypto/curve25519/sodium/libsodium_curve25519.c55
7 files changed, 127 insertions, 12 deletions
diff --git a/libcmix-crypto/curve25519/CMakeLists.txt b/libcmix-crypto/curve25519/CMakeLists.txt
index dc29c4d..ba79d87 100644
--- a/libcmix-crypto/curve25519/CMakeLists.txt
+++ b/libcmix-crypto/curve25519/CMakeLists.txt
@@ -10,17 +10,23 @@ target_sources(curve25519-interface
)
target_link_libraries(curve25519-interface
- INTERFACE cmix-crypto
+ INTERFACE cmix-crypto-interface
)
foreach(impl ${curve25519_implementations})
add_subdirectory(${impl})
endforeach()
-add_library(curve25519-implementation INTERFACE)
+add_library(curve25519-implementation
+ curve25519.h curve25519.c
+)
+
+target_include_directories(curve25519-implementation
+ PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
+)
target_link_libraries(curve25519-implementation
- INTERFACE curve25519-${curve25519_implementation}
+ PUBLIC curve25519-${curve25519_implementation}
)
diff --git a/libcmix-crypto/curve25519/curve25519.c b/libcmix-crypto/curve25519/curve25519.c
new file mode 100644
index 0000000..824daf9
--- /dev/null
+++ b/libcmix-crypto/curve25519/curve25519.c
@@ -0,0 +1,12 @@
+
+#include "curve25519.h"
+
+struct Api get_curve25519_implementation()
+{
+ return (struct Api) {
+ &curve25519_create_keypair,
+ &curve25519_keypair_deleter,
+ &curve25519_derive_shared_key,
+ &curve25519_shared_key_deleter
+ };
+}
diff --git a/libcmix-crypto/curve25519/curve25519.h b/libcmix-crypto/curve25519/curve25519.h
index 319e693..ef466a3 100644
--- a/libcmix-crypto/curve25519/curve25519.h
+++ b/libcmix-crypto/curve25519/curve25519.h
@@ -4,11 +4,18 @@
extern "C" {
#endif
-#include "keypair.h"
+#include "api.h"
#include <stdlib.h>
+
extern struct KeyPair curve25519_create_keypair();
+extern void curve25519_keypair_deleter(struct KeyPair p);
+
+extern struct SharedKey curve25519_derive_shared_key(struct KeyPair pair, unsigned char* pub_key, bool swap_pub_order);
+extern void curve25519_shared_key_deleter(struct SharedKey s);
+
+struct Api get_curve25519_implementation();
#ifdef __cplusplus
}
diff --git a/libcmix-crypto/curve25519/null/CMakeLists.txt b/libcmix-crypto/curve25519/null/CMakeLists.txt
new file mode 100644
index 0000000..bf30adc
--- /dev/null
+++ b/libcmix-crypto/curve25519/null/CMakeLists.txt
@@ -0,0 +1,17 @@
+include(get_target_name)
+
+get_target_name(target_name)
+
+add_library(${target_name} SHARED
+ null_curve25519.c
+)
+
+target_compile_options(${target_name}
+ PRIVATE -std=c99
+)
+
+target_link_libraries(${target_name}
+ INTERFACE cmix-crypto
+ PRIVATE curve25519-interface
+ PUBLIC sodium
+)
diff --git a/libcmix-crypto/curve25519/null/null_curve25519.c b/libcmix-crypto/curve25519/null/null_curve25519.c
new file mode 100644
index 0000000..317455f
--- /dev/null
+++ b/libcmix-crypto/curve25519/null/null_curve25519.c
@@ -0,0 +1,25 @@
+
+#include "api.h"
+
+#include <stddef.h>
+#include <stdbool.h>
+
+void curve25519_keypair_deleter(struct KeyPair p) {}
+
+struct KeyPair curve25519_create_keypair() {
+ return (struct KeyPair){
+ NULL,
+ NULL,
+ 0,
+ 0
+ };
+}
+
+void curve25519_shared_key_deleter(struct SharedKey s) {}
+
+struct SharedKey curve25519_derive_shared_key(struct KeyPair pair, unsigned char* pub_key, bool swap_pub_order) {
+ return (struct SharedKey){
+ NULL,
+ 0
+ };
+}
diff --git a/libcmix-crypto/curve25519/sodium/CMakeLists.txt b/libcmix-crypto/curve25519/sodium/CMakeLists.txt
index 213a49f..7679a88 100644
--- a/libcmix-crypto/curve25519/sodium/CMakeLists.txt
+++ b/libcmix-crypto/curve25519/sodium/CMakeLists.txt
@@ -2,9 +2,9 @@ include(get_target_name)
get_target_name(target_name)
-include(ImportSodium)
+find_package(sodium REQUIRED CONFIG)
-add_library(${target_name}
+add_library(${target_name} SHARED
libsodium_curve25519.c
)
@@ -13,6 +13,7 @@ target_compile_options(${target_name}
)
target_link_libraries(${target_name}
- PUBLIC curve25519-interface
- PUBLIC Sodium
+ INTERFACE cmix-crypto
+ PRIVATE curve25519-interface
+ PUBLIC sodium
)
diff --git a/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c b/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c
index 8fd087a..59e9258 100644
--- a/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c
+++ b/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c
@@ -12,9 +12,12 @@ void init() {
}
}
-void sodium_curve25519_keypair_deleter(struct KeyPair* p) {
- sodium_free(p->sec);
- free(p->pub);
+void curve25519_keypair_deleter(struct KeyPair p) {
+ sodium_free(p.sec);
+ free(p.pub);
+
+ p.sec = NULL;
+ p.pub = NULL;
}
struct KeyPair curve25519_create_keypair() {
@@ -26,5 +29,49 @@ struct KeyPair curve25519_create_keypair() {
randombytes_buf(sec, crypto_box_SECRETKEYBYTES);
crypto_scalarmult_base(pub, sec);
- return (struct KeyPair){sec, pub, crypto_box_SECRETKEYBYTES, crypto_box_PUBLICKEYBYTES, &sodium_curve25519_keypair_deleter};
+ return (struct KeyPair){
+ sec,
+ pub,
+ crypto_box_SECRETKEYBYTES,
+ crypto_box_PUBLICKEYBYTES
+ };
+}
+
+void curve25519_shared_key_deleter(struct SharedKey s) {
+ sodium_free(s.shared);
+
+ s.shared = NULL;
+}
+
+struct SharedKey curve25519_derive_shared_key(struct KeyPair pair, unsigned char* pub_key, bool swap_pub_order) {
+ init();
+
+ unsigned char* shared = (unsigned char*) sodium_malloc(crypto_generichash_BYTES);
+
+ crypto_generichash_state h;
+
+ unsigned char* scalarmult_q = (unsigned char*) sodium_malloc(crypto_scalarmult_BYTES);
+
+ if (crypto_scalarmult(scalarmult_q, pair.sec, pub_key) != 0) {
+ exit(-1);
+ }
+
+ crypto_generichash_init(&h, NULL, 0U, crypto_generichash_BYTES);
+ crypto_generichash_update(&h, scalarmult_q, crypto_scalarmult_BYTES);
+ if(swap_pub_order) {
+ crypto_generichash_update(&h, pub_key, crypto_box_PUBLICKEYBYTES);
+ crypto_generichash_update(&h, pair.pub, crypto_box_PUBLICKEYBYTES);
+ } else {
+ crypto_generichash_update(&h, pair.pub, crypto_box_PUBLICKEYBYTES);
+ crypto_generichash_update(&h, pub_key, crypto_box_PUBLICKEYBYTES);
+ }
+ crypto_generichash_final(&h, shared, crypto_generichash_BYTES);
+
+ sodium_free(scalarmult_q);
+
+ return (struct SharedKey){
+ shared,
+ crypto_generichash_BYTES
+ };
}
+