Make the NTRU parameter set configurable

This commit is contained in:
Andreas Steffen
2013-11-27 20:21:41 +01:00
parent 2c620cb089
commit 1f73969eb5
3 changed files with 118 additions and 43 deletions
+5
View File
@@ -867,6 +867,11 @@ Enable logging of SQL IP pool leases
.BR libstrongswan.plugins.gcrypt.quick_random " [no]" .BR libstrongswan.plugins.gcrypt.quick_random " [no]"
Use faster random numbers in gcrypt; for testing only, produces weak keys! Use faster random numbers in gcrypt; for testing only, produces weak keys!
.TP .TP
.BR libstrongswan.plugins.ntru.param_set_selection " [optimum]"
The following parameter sets are available: 'x9_98_speed', 'x9_98_bandwidth',
'x9_98_balance' and 'optimum', the last set not being part of the X9.98
standard but exhibiting the best performance.
.TP
.BR libstrongswan.plugins.openssl.engine_id " [pkcs11]" .BR libstrongswan.plugins.openssl.engine_id " [pkcs11]"
ENGINE ID to use in the OpenSSL plugin ENGINE ID to use in the OpenSSL plugin
.TP .TP
+47 -14
View File
@@ -193,6 +193,7 @@ METHOD(diffie_hellman_t, set_other_public_value, void,
chunk_free(&this->shared_secret); chunk_free(&this->shared_secret);
return; return;
} }
this->computed = TRUE;
/* determine the size of the ciphertext */ /* determine the size of the ciphertext */
if (ntru_crypto_ntru_encrypt(this->drbg, if (ntru_crypto_ntru_encrypt(this->drbg,
@@ -204,7 +205,6 @@ METHOD(diffie_hellman_t, set_other_public_value, void,
return; return;
} }
this->ciphertext = chunk_alloc(ciphertext_len); this->ciphertext = chunk_alloc(ciphertext_len);
this->computed = TRUE;
/* encrypt the shared secret */ /* encrypt the shared secret */
if (ntru_crypto_ntru_encrypt(this->drbg, if (ntru_crypto_ntru_encrypt(this->drbg,
@@ -247,35 +247,68 @@ ntru_ke_t *ntru_ke_create(diffie_hellman_group_t group, chunk_t g, chunk_t p)
{ {
private_ntru_ke_t *this; private_ntru_ke_t *this;
char personalization_str[] = "strongSwan NTRU-KE"; char personalization_str[] = "strongSwan NTRU-KE";
NTRU_ENCRYPT_PARAM_SET_ID param_set_id; NTRU_ENCRYPT_PARAM_SET_ID *param_set, param_set_id;
DRBG_HANDLE drbg; DRBG_HANDLE drbg;
char *param_set_selection;
u_int32_t strength; u_int32_t strength;
/** /* Best bandwidth and speed, no X9.98 compatibility */
* We are selecting the X9.98 / IEEE 1363.1 parameter sets NTRU_ENCRYPT_PARAM_SET_ID param_set_optimum[] = {
* which balance speed and bandwidth NTRU_EES401EP2, NTRU_EES439EP1, NTRU_EES593EP1, NTRU_EES743EP1
*/ };
/* X9.98/IEEE 1363.1 parameter set for best speed */
NTRU_ENCRYPT_PARAM_SET_ID param_set_x9_98_speed[] = {
NTRU_EES659EP1, NTRU_EES761EP1, NTRU_EES1087EP1, NTRU_EES1499EP1
};
/* X9.98/IEEE 1363.1 parameter set for best bandwidth (smallest size) */
NTRU_ENCRYPT_PARAM_SET_ID param_set_x9_98_bandwidth[] = {
NTRU_EES401EP1, NTRU_EES449EP1, NTRU_EES677EP1, NTRU_EES1087EP1
};
/* X9.98/IEEE 1363.1 parameter set balancing speed and bandwidth */
NTRU_ENCRYPT_PARAM_SET_ID param_set_x9_98_balance[] = {
NTRU_EES541EP1, NTRU_EES613EP1, NTRU_EES887EP1, NTRU_EES1171EP1
};
param_set_selection = lib->settings->get_str(lib->settings,
"libstrongswan.plugins.ntru.param__set_selection", "optimum");
if (streq(param_set_selection, "x9_98_speed"))
{
param_set = param_set_x9_98_speed;
}
else if (streq(param_set_selection, "x9_98_bandwidth"))
{
param_set = param_set_x9_98_bandwidth;
}
else if (streq(param_set_selection, "x9_98_balance"))
{
param_set = param_set_x9_98_balance;
}
else
{
param_set = param_set_optimum;
}
switch (group) switch (group)
{ {
case NTRU_112_BIT: case NTRU_112_BIT:
strength = 112; strength = 112;
/* param_set_id = NTRU_EES541EP1; */ param_set_id = param_set[0];
param_set_id = NTRU_EES401EP2;
break; break;
case NTRU_128_BIT: case NTRU_128_BIT:
strength = 128; strength = 128;
/* param_set_id = NTRU_EES613EP1; */ param_set_id = param_set[1];
param_set_id = NTRU_EES439EP1;
break; break;
case NTRU_192_BIT: case NTRU_192_BIT:
strength = 192; strength = 192;
/* param_set_id = NTRU_EES887EP1; */ param_set_id = param_set[2];
param_set_id = NTRU_EES593EP1;
break; break;
case NTRU_256_BIT: case NTRU_256_BIT:
strength = 256; strength = 256;
/* param_set_id = NTRU_EES1171EP1; */ param_set_id = param_set[3];
param_set_id = NTRU_EES743EP1;
break; break;
default: default:
return NULL; return NULL;
+66 -29
View File
@@ -28,12 +28,19 @@ static struct {
{ NTRU_256_BIT, "NTRU_256" } { NTRU_256_BIT, "NTRU_256" }
}; };
START_TEST(test_ke) /**
* NTRU parameter set selection
*/
char *param_set_selection[] = {
"x9_98_speed", "x9_98_bandwidth", "x9_98_balance", "optimum"
};
START_TEST(test_ntru_ke)
{ {
chunk_t pub_key, cipher_text, i_shared_secret, r_shared_secret; chunk_t pub_key, cipher_text, i_shared_secret, r_shared_secret;
diffie_hellman_t *i_ntru, *r_ntru; diffie_hellman_t *i_ntru, *r_ntru;
char buf[10]; char buf[10];
int len; int n, len;
status_t status; status_t status;
len = snprintf(buf, sizeof(buf), "%N", diffie_hellman_group_names, len = snprintf(buf, sizeof(buf), "%N", diffie_hellman_group_names,
@@ -41,37 +48,63 @@ START_TEST(test_ke)
ck_assert(len == 8); ck_assert(len == 8);
ck_assert(streq(buf, params[_i].group_name)); ck_assert(streq(buf, params[_i].group_name));
i_ntru = lib->crypto->create_dh(lib->crypto, params[_i].group); for (n = 0; n < countof(param_set_selection); n++)
ck_assert(i_ntru != NULL); {
ck_assert(i_ntru->get_dh_group(i_ntru) == params[_i].group); lib->settings->set_str(lib->settings,
"libcharon.plugins.ntru.param_set_selection",
param_set_selection[n]);
i_ntru->get_my_public_value(i_ntru, &pub_key); i_ntru = lib->crypto->create_dh(lib->crypto, params[_i].group);
ck_assert(pub_key.len > 0); ck_assert(i_ntru != NULL);
ck_assert(i_ntru->get_dh_group(i_ntru) == params[_i].group);
r_ntru = lib->crypto->create_dh(lib->crypto, params[_i].group); i_ntru->get_my_public_value(i_ntru, &pub_key);
ck_assert(r_ntru != NULL); ck_assert(pub_key.len > 0);
r_ntru->set_other_public_value(r_ntru, pub_key); r_ntru = lib->crypto->create_dh(lib->crypto, params[_i].group);
ck_assert(r_ntru != NULL);
r_ntru->set_other_public_value(r_ntru, pub_key);
r_ntru->get_my_public_value(r_ntru, &cipher_text);
ck_assert(cipher_text.len > 0);
status = r_ntru->get_shared_secret(r_ntru, &r_shared_secret);
ck_assert(status == SUCCESS);
ck_assert(r_shared_secret.len > 0);
i_ntru->set_other_public_value(i_ntru, cipher_text);
status = i_ntru->get_shared_secret(i_ntru, &i_shared_secret);
if (status == SUCCESS)
{
ck_assert(chunk_equals(i_shared_secret, r_shared_secret));
}
else
{
ck_assert(i_shared_secret.len == 0);
}
chunk_clear(&i_shared_secret);
chunk_clear(&r_shared_secret);
chunk_free(&pub_key);
chunk_free(&cipher_text);
i_ntru->destroy(i_ntru);
r_ntru->destroy(r_ntru);
}
}
END_TEST
START_TEST(test_ntru_pubkey)
{
diffie_hellman_t *r_ntru;
chunk_t cipher_text;
r_ntru = lib->crypto->create_dh(lib->crypto, NTRU_128_BIT);
r_ntru->set_other_public_value(r_ntru, chunk_empty);
r_ntru->get_my_public_value(r_ntru, &cipher_text); r_ntru->get_my_public_value(r_ntru, &cipher_text);
ck_assert(cipher_text.len > 0); ck_assert(cipher_text.len == 0);
i_ntru->set_other_public_value(i_ntru, cipher_text);
status = i_ntru->get_shared_secret(i_ntru, &i_shared_secret);
ck_assert(status == SUCCESS);
ck_assert(i_shared_secret.len > 0);
status = r_ntru->get_shared_secret(r_ntru, &r_shared_secret);
ck_assert(status == SUCCESS);
ck_assert(r_shared_secret.len > 0);
ck_assert(chunk_equals(i_shared_secret, r_shared_secret));
chunk_clear(&i_shared_secret);
chunk_clear(&r_shared_secret);
chunk_free(&pub_key);
chunk_free(&cipher_text);
i_ntru->destroy(i_ntru);
r_ntru->destroy(r_ntru); r_ntru->destroy(r_ntru);
} }
END_TEST END_TEST
@@ -83,7 +116,11 @@ Suite *ntru_suite_create()
s = suite_create("ntru"); s = suite_create("ntru");
tc = tcase_create("ke"); tc = tcase_create("ke");
tcase_add_loop_test(tc, test_ke, 0, countof(params)); tcase_add_loop_test(tc, test_ntru_ke, 0, countof(params));
suite_add_tcase(s, tc);
tc = tcase_create("pubkey");
tcase_add_test(tc, test_ntru_pubkey);
suite_add_tcase(s, tc); suite_add_tcase(s, tc);
return s; return s;