Skip to content

Commit

Permalink
Clean up and optimize Frodo implementation (#60)
Browse files Browse the repository at this point in the history
  • Loading branch information
aparent authored and dstebila committed Dec 8, 2016
1 parent 36ae6bf commit c538294
Show file tree
Hide file tree
Showing 10 changed files with 251 additions and 431 deletions.
4 changes: 2 additions & 2 deletions Makefile
Expand Up @@ -47,7 +47,7 @@ endif

all: links lib tests

objs/%.o: src/%.c
objs/%.o: src/%.c | links
@mkdir -p $(@D)
$(CC) -c $(CFLAGS) $(INCLUDES) $< -o $@

Expand Down Expand Up @@ -95,7 +95,7 @@ $(KEX_RLWE_MSRLN16_OBJS): $(KEX_RLWE_MSRLN16_HEADERS)

# KEX_LWE_FRODO
KEX_LWE_FRODO_OBJS := $(addprefix objs/kex_lwe_frodo/, lwe.o kex_lwe_frodo.o lwe_noise.o)
KEX_LWE_FRODO_HEADERS := $(addprefix src/kex_lwe_frodo/, kex_lwe_frodo.h local.h)
KEX_LWE_FRODO_HEADERS := $(addprefix src/kex_lwe_frodo/, kex_lwe_frodo.h local.h kex_lwe_frodo_macrify.c lwe_macrify.c)
$(KEX_LWE_FRODO_OBJS): $(KEX_LWE_FRODO_HEADERS)

# KEX_SIDH_CLN16
Expand Down
2 changes: 1 addition & 1 deletion src/kex/kex.c
Expand Up @@ -18,7 +18,7 @@ OQS_KEX *OQS_KEX_new(OQS_RAND *rand, enum OQS_KEX_alg_name alg_name, const uint8
case OQS_KEX_alg_rlwe_newhope:
return OQS_KEX_rlwe_newhope_new(rand);
case OQS_KEX_alg_lwe_frodo:
return OQS_KEX_lwe_frodo_new(rand, seed, seed_len, named_parameters);
return OQS_KEX_lwe_frodo_new_recommended(rand, seed, seed_len, named_parameters);
case OQS_KEX_alg_sidh_cln16:
return OQS_KEX_sidh_cln16_new(rand);
default:
Expand Down
106 changes: 4 additions & 102 deletions src/kex_lwe_frodo/kex_lwe_frodo.c
Expand Up @@ -13,6 +13,7 @@

#include <oqs/kex.h>
#include <oqs/rand.h>
#include <oqs/common.h>

#include "kex_lwe_frodo.h"
#include "local.h"
Expand All @@ -21,115 +22,16 @@

#include <stdio.h>

OQS_KEX *OQS_KEX_lwe_frodo_new(OQS_RAND *rand, const uint8_t *seed, const size_t seed_len, const char *named_parameters) {

OQS_KEX *k;
struct oqs_kex_lwe_frodo_params *params;

if ((seed_len == 0) || (seed == NULL)) {
return NULL;
}

k = malloc(sizeof(OQS_KEX));
if (k == NULL) {
goto err;
}
k->named_parameters = NULL;
k->method_name = NULL;

k->params = malloc(sizeof(struct oqs_kex_lwe_frodo_params));
if (NULL == k->params) {
goto err;
}
params = (struct oqs_kex_lwe_frodo_params *) k->params;
params->cdf_table = NULL;
params->seed = NULL;
params->param_name = NULL;

k->rand = rand;
k->ctx = NULL;
k->alice_priv_free = &OQS_KEX_lwe_frodo_alice_priv_free;
k->free = &OQS_KEX_lwe_frodo_free;

if (strcmp(named_parameters, "recommended") == 0) {

k->alice_0 = &OQS_KEX_lwe_frodo_alice_0_recommended;
k->bob = &OQS_KEX_lwe_frodo_bob_recommended;
k->alice_1 = &OQS_KEX_lwe_frodo_alice_1_recommended;

k->method_name = strdup("LWE Frodo recommended");
if (NULL == k->method_name) {
goto err;
}
k->estimated_classical_security = 144;
k->estimated_quantum_security = 130;
k->named_parameters = strdup(named_parameters);
if (k->named_parameters == NULL) {
goto err;
}

params->seed = malloc(seed_len);
if (NULL == params->seed) {
goto err;
}
memcpy(params->seed, seed, seed_len);
params->seed_len = seed_len;
params->param_name = strdup("recommended");
if (NULL == params->param_name) {
goto err;
}
params->log2_q = 15;
params->q = 1 << params->log2_q;
params->n = 752;
params->extracted_bits = 4;
params->nbar = 8;
params->key_bits = 256;
params->rec_hint_len = LWE_DIV_ROUNDUP(params->nbar * params->nbar, 8);
params->pub_len = LWE_DIV_ROUNDUP(params->n * params->nbar * params->log2_q, 8);
params->stripe_step = 8;
params->sampler_num = 12;
params->cdf_table_len = 6;
params->cdf_table = malloc(params->cdf_table_len * sizeof(uint16_t));
if (NULL == params->cdf_table) {
goto err;
}
uint16_t cdf_table_tmp[6] = {602, 1521, 1927, 2031, 2046, 2047};
memcpy(params->cdf_table, cdf_table_tmp, sizeof(cdf_table_tmp));

} else {

goto err;

}

return k;

err:
if (k) {
if (k->params) {
free(params->cdf_table);
free(params->seed);
free(params->param_name);
free(k->params);
}
free(k->named_parameters);
free(k->method_name);
free(k);
}
return NULL;

}

// pre-process code to obtain "recommended" functions
#include "recommended.h"
#define MACRIFY(NAME) NAME ## _recommended
#include "kex_lwe_frodo_macrify.c"
// undefine macros to avoid any confusion later
#include "recommended.h"
#undef MACRIFY

void OQS_KEX_lwe_frodo_alice_priv_free(UNUSED OQS_KEX *k, void *alice_priv) {
if (alice_priv) {
free(alice_priv);
}
free(alice_priv);
}

void OQS_KEX_lwe_frodo_free(OQS_KEX *k) {
Expand Down
2 changes: 1 addition & 1 deletion src/kex_lwe_frodo/kex_lwe_frodo.h
Expand Up @@ -12,7 +12,7 @@
#include <oqs/kex.h>
#include <oqs/rand.h>

OQS_KEX *OQS_KEX_lwe_frodo_new(OQS_RAND *rand, const uint8_t *seed, const size_t seed_len, const char *named_parameters);
OQS_KEX *OQS_KEX_lwe_frodo_new_recommended(OQS_RAND *rand, const uint8_t *seed, const size_t seed_len, const char *named_parameters);

int OQS_KEX_lwe_frodo_alice_0_recommended(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len);
int OQS_KEX_lwe_frodo_bob_recommended(OQS_KEX *k, const uint8_t *alice_msg, const size_t alice_msg_len, uint8_t **bob_msg, size_t *bob_msg_len, uint8_t **key, size_t *key_len);
Expand Down

0 comments on commit c538294

Please sign in to comment.