diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-10-27 09:25:53 +0200 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-10-27 09:25:53 +0200 |
| commit | 25db9ff8a4cfb4b98aeeaae360e8c718b9c5e20c (patch) | |
| tree | 079ea63fcc874506072a91b13d2612b510cf158e /scratchpad/scratchpad.c | |
| parent | 9eaf47d5dfa56ca79ae903aabfc2cf52bdfb981e (diff) | |
| download | cmix-25db9ff8a4cfb4b98aeeaae360e8c718b9c5e20c.tar.gz cmix-25db9ff8a4cfb4b98aeeaae360e8c718b9c5e20c.tar.bz2 cmix-25db9ff8a4cfb4b98aeeaae360e8c718b9c5e20c.zip | |
Adds libgcrypt implementation for elgamal in multiplicative group.
Also adapts the API to both handle sodium and gcrypt libraries.
Diffstat (limited to 'scratchpad/scratchpad.c')
| -rw-r--r-- | scratchpad/scratchpad.c | 151 |
1 files changed, 126 insertions, 25 deletions
diff --git a/scratchpad/scratchpad.c b/scratchpad/scratchpad.c index c0730fd..aadf3f0 100644 --- a/scratchpad/scratchpad.c +++ b/scratchpad/scratchpad.c @@ -2,14 +2,125 @@ #include "cmix.h" #include "message.h" -#include "curve25519.h" +#include "api.h" + +#include <gcrypt.h> #include <stdio.h> #include <string.h> +void cmix_buffer_scratch(); +void crypto_api_scratch(); +void gcrypt_scratch(); + int main(int argc, char* argv[]) { + gcrypt_scratch(); - struct Api api = get_curve25519_implementation(); + return 0; +} + +void check(gcry_error_t error) { + if (error) { + fprintf (stderr, "Error: %s/%s\n", gcry_strsource (error), gcry_strerror (error)); + exit(1); + } +} + +void print_sexp(gcry_sexp_t exp) { + size_t required_size = gcry_sexp_sprint(exp, GCRYSEXP_FMT_ADVANCED, NULL, 0); //passing NULL as the buffer will return the size needed. + + char* str = (char *) malloc(sizeof(char)*required_size); + + gcry_sexp_sprint(exp, GCRYSEXP_FMT_ADVANCED, str, 2000); //So we ignore the size here. + + printf("size = %zu\n", required_size); + for(size_t i = 0; i < required_size; i++) + printf("%c", str[i]); + printf("\n"); + + free(str); +} + +void gcrypt_scratch() { + + if (!gcry_check_version (GCRYPT_VERSION)) { + fprintf(stderr, "libgcrypt version mismatch\n"); + exit(-1); + } + + gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN); + gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0); + gcry_control (GCRYCTL_RESUME_SECMEM_WARN); + gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); + + size_t parse_error_offset; + gcry_error_t error; + + gcry_sexp_t key_generator; + error = gcry_sexp_build(&key_generator, &parse_error_offset, "(genkey (%s (nbits %s)))", "elg", "2048"); + check(error); + + gcry_sexp_t key_pair; + error = gcry_pk_genkey(&key_pair, key_generator); + check(error); + + gcry_sexp_t pub_key = gcry_sexp_find_token(key_pair, "public-key", 0); + gcry_sexp_t sec_key = gcry_sexp_find_token(key_pair, "private-key", 0); + + char message_string[] = "hello world!"; + + gcry_sexp_t message; + error = gcry_sexp_build(&message, &parse_error_offset, "(data (flags %s) (value %b))", "raw", sizeof(message_string), message_string); + check(error); + + gcry_sexp_t cipher; + error = gcry_pk_encrypt(&cipher, message, pub_key); + check(error); + + gcry_sexp_t raw_cipher; + raw_cipher = gcry_sexp_find_token(cipher, "elg", 0); + + gcry_sexp_t decryption_sexpr; + error = gcry_sexp_build(&decryption_sexpr, &parse_error_offset, "(enc-val (flags %s) %S)", "raw", raw_cipher); + check(error); + + gcry_sexp_t plain_sexpr; + error = gcry_pk_decrypt(&plain_sexpr, decryption_sexpr, sec_key); + check(error); + + print_sexp(plain_sexpr); + + gcry_sexp_release(key_generator); + gcry_sexp_release(key_pair); + gcry_sexp_release(pub_key); + gcry_sexp_release(sec_key); + gcry_sexp_release(message); + gcry_sexp_release(cipher); + gcry_sexp_release(raw_cipher); + gcry_sexp_release(decryption_sexpr); + gcry_sexp_release(plain_sexpr); +} + +void cmix_buffer_scratch() { + struct CmixBufferImpl buffer_impl = get_cmix_Curve25519_buffer_implementation(); + char* buffer = buffer_impl.allocate_cmix_buffer(3); + + int message_size = buffer_impl.message_length(); + + for(int i=0; i < 3; i++) { + buffer[i*message_size] = 'h'; + } + + for(int i=0; i < 3; i++) { + putc(buffer[i*message_size], stdout); + putc('\n', stdout); + } + + buffer_impl.deallocate_cmix_buffer(buffer); +} + +void crypto_api_scratch() { + struct Api api = get_implementation(); struct KeyPair pair1 = api.create_key_pair(); struct KeyPair pair2 = api.create_key_pair(); @@ -17,34 +128,24 @@ int main(int argc, char* argv[]) { struct SharedKey sk1 = api.derive_shared_key(pair1, pair2.pub, false); struct SharedKey sk2 = api.derive_shared_key(pair2, pair1.pub, true); - if(memcmp(sk1.shared, sk2.shared, sk1.shared_len) != 0) { + char* buffer1; + size_t len1; + api.get_key_array(&buffer1, &len1, sk1.shared); + + char* buffer2; + size_t len2; + api.get_key_array(&buffer2, &len2, sk2.shared); + + if(len1 == len2 && memcmp(buffer1, buffer2, len1) != 0) { exit(-1); } else { printf("Yoepie!"); } - api.free_key_pair(pair1); - api.free_key_pair(pair2); - - api.free_shared_key(sk1); - api.free_shared_key(sk2); + api.free_key_pair(&pair1); + api.free_key_pair(&pair2); - -// struct CmixBufferImpl buffer_impl = get_cmix_Curve25519_buffer_implementation(); -// char* buffer = buffer_impl.allocate_cmix_buffer(3); - -// int message_size = buffer_impl.message_length(); - -// for(int i=0; i < 3; i++) { -// buffer[i*message_size] = 'h'; -// } + api.free_shared_key(&sk1); + api.free_shared_key(&sk2); -// for(int i=0; i < 3; i++) { -// putc(buffer[i*message_size], stdout); -// putc('\n', stdout); -// } - -// buffer_impl.deallocate_cmix_buffer(buffer); - - return 0; } |
