Refactored ntru_param_sets

This commit is contained in:
Andreas Steffen
2014-03-07 21:56:33 +01:00
parent 0d30d73eb9
commit 7befce8c3f
9 changed files with 173 additions and 244 deletions
+1 -2
View File
@@ -15,6 +15,7 @@ libstrongswan_ntru_la_SOURCES = \
ntru_drbg.h ntru_drbg.c \
ntru_ke.h ntru_ke.c \
ntru_mgf1.h ntru_mgf1.c \
ntru_param_set.h ntru_param_set.c \
ntru_poly.h ntru_poly.c \
ntru_trits.h ntru_trits.c \
ntru_crypto/ntru_crypto.h \
@@ -23,8 +24,6 @@ libstrongswan_ntru_la_SOURCES = \
ntru_crypto/ntru_crypto_ntru_encrypt.c \
ntru_crypto/ntru_crypto_ntru_encrypt_key.h \
ntru_crypto/ntru_crypto_ntru_encrypt_key.c \
ntru_crypto/ntru_crypto_ntru_encrypt_param_sets.h \
ntru_crypto/ntru_crypto_ntru_encrypt_param_sets.c \
ntru_crypto/ntru_crypto_ntru_poly.h \
ntru_crypto/ntru_crypto_ntru_poly.c
@@ -36,6 +36,7 @@
#include <library.h>
#include "ntru_param_set.h"
#include "ntru_drbg.h"
#if !defined( NTRUCALL )
@@ -51,28 +52,6 @@
#endif
#endif /* NTRUCALL */
/* parameter set ID list */
typedef enum _NTRU_ENCRYPT_PARAM_SET_ID {
NTRU_EES401EP1,
NTRU_EES449EP1,
NTRU_EES677EP1,
NTRU_EES1087EP2,
NTRU_EES541EP1,
NTRU_EES613EP1,
NTRU_EES887EP1,
NTRU_EES1171EP1,
NTRU_EES659EP1,
NTRU_EES761EP1,
NTRU_EES1087EP1,
NTRU_EES1499EP1,
NTRU_EES401EP2,
NTRU_EES439EP1,
NTRU_EES593EP1,
NTRU_EES743EP1,
} NTRU_ENCRYPT_PARAM_SET_ID;
/* error codes */
#define NTRU_OK 0
@@ -219,7 +198,7 @@ ntru_crypto_ntru_decrypt(
NTRUCALL
ntru_crypto_ntru_encrypt_keygen(
ntru_drbg_t *drbg, /* in - handle of DRBG */
NTRU_ENCRYPT_PARAM_SET_ID param_set_id, /* in - parameter set ID */
ntru_param_set_id_t param_set_id, /* in - parameter set ID */
uint16_t *pubkey_blob_len, /* in/out - no. of octets in
pubkey_blob, addr
for no. of octets
@@ -36,11 +36,11 @@
#include <string.h>
#include <assert.h>
#include "ntru_crypto.h"
#include "ntru_crypto_ntru_encrypt_param_sets.h"
#include "ntru_crypto_ntru_encrypt_key.h"
#include "ntru_crypto_ntru_convert.h"
#include "ntru_crypto_ntru_poly.h"
#
#include "ntru_param_set.h"
#include "ntru_trits.h"
#include "ntru_poly.h"
@@ -87,7 +87,7 @@ ntru_crypto_ntru_encrypt(
no. of octets in ciphertext */
uint8_t *ct) /* out - address for ciphertext */
{
NTRU_ENCRYPT_PARAM_SET *params = NULL;
ntru_param_set_t *params = NULL;
uint8_t const *pubkey_packed = NULL;
uint8_t pubkey_pack_type = 0x00;
uint16_t packed_ct_len;
@@ -216,7 +216,7 @@ ntru_crypto_ntru_encrypt(
{
/* form sData (OID || m || b || hTrunc) */
memcpy(ptr, params->OID, 3);
memcpy(ptr, params->oid, 3);
ptr += 3;
memcpy(ptr, pt, pt_len);
ptr += pt_len;
@@ -411,7 +411,7 @@ ntru_crypto_ntru_decrypt(
no. of octets in plaintext */
uint8_t *pt) /* out - address for plaintext */
{
NTRU_ENCRYPT_PARAM_SET *params = NULL;
ntru_param_set_t *params = NULL;
uint8_t const *privkey_packed = NULL;
uint8_t const *pubkey_packed = NULL;
uint8_t privkey_pack_type = 0x00;
@@ -691,7 +691,7 @@ ntru_crypto_ntru_decrypt(
/* form sData (OID || m || b || hTrunc) */
ptr = tmp_buf;
memcpy(ptr, params->OID, 3);
memcpy(ptr, params->oid, 3);
ptr += 3;
memcpy(ptr, m_buf, cm_len);
ptr += cm_len;
@@ -803,7 +803,7 @@ ntru_crypto_ntru_decrypt(
uint32_t
ntru_crypto_ntru_encrypt_keygen(
ntru_drbg_t *drbg, /* in - handle of DRBG */
NTRU_ENCRYPT_PARAM_SET_ID param_set_id, /* in - parameter set ID */
ntru_param_set_id_t param_set_id, /* in - parameter set ID */
uint16_t *pubkey_blob_len, /* in/out - no. of octets in
pubkey_blob, addr
for no. of octets
@@ -817,7 +817,7 @@ ntru_crypto_ntru_encrypt_keygen(
uint8_t *privkey_blob) /* out - address for
private key blob */
{
NTRU_ENCRYPT_PARAM_SET *params = NULL;
ntru_param_set_t *params = NULL;
uint16_t public_key_blob_len;
uint16_t private_key_blob_len;
uint8_t pubkey_pack_type;
@@ -840,22 +840,20 @@ ntru_crypto_ntru_encrypt_keygen(
ntru_poly_t *g_poly = NULL;
uint16_t *F_indices;
/* get a pointer to the parameter-set parameters */
if ((params = ntru_encrypt_get_params_with_id(param_set_id)) == NULL)
/* get a pointer to the parameter-set parameters */
params = ntru_param_set_get_by_id(param_set_id);
if (!params)
{
return NTRU_INVALID_PARAMETER_SET;
}
/* check for bad parameters */
if (!pubkey_blob_len || !privkey_blob_len)
{
return NTRU_BAD_PARAMETER;
}
/* get public and private key packing types and blob lengths */
ntru_crypto_ntru_encrypt_key_get_blob_params(params, &pubkey_pack_type,
&public_key_blob_len,
&privkey_pack_type,
@@ -60,7 +60,7 @@ ntru_crypto_ntru_encrypt_key_parse(
packing type */
uint8_t *privkey_pack_type, /* out - addr for privkey
packing type */
NTRU_ENCRYPT_PARAM_SET **params, /* out - addr for ptr to
ntru_param_set_t **params, /* out - addr for ptr to
parameter set */
uint8_t const **pubkey, /* out - addr for ptr to
packed pubkey */
@@ -69,14 +69,7 @@ ntru_crypto_ntru_encrypt_key_parse(
{
uint8_t tag;
assert(key_blob_len);
assert(key_blob);
assert(pubkey_pack_type);
assert(params);
assert(pubkey);
/* parse key blob based on tag */
tag = key_blob[0];
switch (tag) {
case NTRU_ENCRYPT_PUBKEY_TAG:
@@ -110,7 +103,7 @@ ntru_crypto_ntru_encrypt_key_parse(
*/
{
NTRU_ENCRYPT_PARAM_SET *p = NULL;
ntru_param_set_t *p = NULL;
uint16_t pubkey_packed_len;
/* check OID length and minimum blob length for tag and OID */
@@ -118,10 +111,12 @@ ntru_crypto_ntru_encrypt_key_parse(
if ((key_blob_len < 5) || (key_blob[1] != 3))
return FALSE;
/* get a pointer to the parameter set corresponding to the OID */
if ((p = ntru_encrypt_get_params_with_OID(key_blob + 2)) == NULL)
return FALSE;
/* get a pointer to the parameter set corresponding to the OID */
p = ntru_param_set_get_by_oid(key_blob + 2);
if (!p)
{
return FALSE;
}
/* check blob length and assign pointers to blob fields */
@@ -203,7 +198,7 @@ ntru_crypto_ntru_encrypt_key_parse(
void
ntru_crypto_ntru_encrypt_key_get_blob_params(
NTRU_ENCRYPT_PARAM_SET const *params, /* in - pointer to
ntru_param_set_t *params, /* in - pointer to
param set
parameters */
uint8_t *pubkey_pack_type, /* out - addr for pubkey
@@ -260,7 +255,7 @@ ntru_crypto_ntru_encrypt_key_get_blob_params(
void
ntru_crypto_ntru_encrypt_key_create_pubkey_blob(
NTRU_ENCRYPT_PARAM_SET const *params, /* in - pointer to
ntru_param_set_t *params, /* in - pointer to
param set
parameters */
uint16_t const *pubkey, /* in - pointer to the
@@ -278,9 +273,9 @@ ntru_crypto_ntru_encrypt_key_create_pubkey_blob(
switch (pubkey_pack_type) {
case NTRU_ENCRYPT_KEY_PACKED_COEFFICIENTS:
*pubkey_blob++ = NTRU_ENCRYPT_PUBKEY_TAG;
*pubkey_blob++ = (uint8_t)sizeof(params->OID);
memcpy(pubkey_blob, params->OID, sizeof(params->OID));
pubkey_blob += sizeof(params->OID);
*pubkey_blob++ = (uint8_t)sizeof(params->oid);
memcpy(pubkey_blob, params->oid, sizeof(params->oid));
pubkey_blob += sizeof(params->oid);
ntru_elements_2_octets(params->N, pubkey, params->q_bits,
pubkey_blob);
break;
@@ -297,7 +292,7 @@ ntru_crypto_ntru_encrypt_key_create_pubkey_blob(
void
ntru_crypto_ntru_encrypt_key_create_privkey_blob(
NTRU_ENCRYPT_PARAM_SET const *params, /* in - pointer to
ntru_param_set_t *params, /* in - pointer to
param set
parameters */
uint16_t const *pubkey, /* in - pointer to the
@@ -324,9 +319,9 @@ ntru_crypto_ntru_encrypt_key_create_privkey_blob(
/* format header and packed public key */
*privkey_blob++ = NTRU_ENCRYPT_PRIVKEY_DEFAULT_TAG;
*privkey_blob++ = (uint8_t)sizeof(params->OID);
memcpy(privkey_blob, params->OID, sizeof(params->OID));
privkey_blob += sizeof(params->OID);
*privkey_blob++ = (uint8_t)sizeof(params->oid);
memcpy(privkey_blob, params->oid, sizeof(params->oid));
privkey_blob += sizeof(params->oid);
ntru_elements_2_octets(params->N, pubkey, params->q_bits,
privkey_blob);
privkey_blob += (params->N * params->q_bits + 7) >> 3;
@@ -27,8 +27,8 @@
#define NTRU_CRYPTO_NTRU_ENCRYPT_KEY_H
#include "ntru_crypto_ntru_convert.h"
#include "ntru_crypto_ntru_encrypt_param_sets.h"
#include "ntru_param_set.h"
/* key-blob definitions */
@@ -68,7 +68,7 @@ ntru_crypto_ntru_encrypt_key_parse(
packing type */
uint8_t *privkey_pack_type, /* out - addr for privkey
packing type */
NTRU_ENCRYPT_PARAM_SET **params, /* out - addr for ptr to
ntru_param_set_t **params, /* out - addr for ptr to
parameter set */
uint8_t const **pubkey, /* out - addr for ptr to
packed pubkey */
@@ -87,7 +87,7 @@ ntru_crypto_ntru_encrypt_key_parse(
extern void
ntru_crypto_ntru_encrypt_key_get_blob_params(
NTRU_ENCRYPT_PARAM_SET const *params, /* in - pointer to
ntru_param_set_t *params, /* in - pointer to
param set
parameters */
uint8_t *pubkey_pack_type, /* out - addr for pubkey
@@ -109,7 +109,7 @@ ntru_crypto_ntru_encrypt_key_get_blob_params(
extern void
ntru_crypto_ntru_encrypt_key_create_pubkey_blob(
NTRU_ENCRYPT_PARAM_SET const *params, /* in - pointer to
ntru_param_set_t *params, /* in - pointer to
param set
parameters */
uint16_t const *pubkey, /* in - pointer to the
@@ -128,7 +128,7 @@ ntru_crypto_ntru_encrypt_key_create_pubkey_blob(
extern void
ntru_crypto_ntru_encrypt_key_recreate_pubkey_blob(
NTRU_ENCRYPT_PARAM_SET const *params, /* in - pointer to
ntru_param_set_t *params, /* in - pointer to
param set
parameters */
uint16_t packed_pubkey_len, /* in - no. octets in
@@ -148,7 +148,7 @@ ntru_crypto_ntru_encrypt_key_recreate_pubkey_blob(
extern void
ntru_crypto_ntru_encrypt_key_create_privkey_blob(
NTRU_ENCRYPT_PARAM_SET const *params, /* in - pointer to
ntru_param_set_t *params, /* in - pointer to
param set
parameters */
uint16_t const *pubkey, /* in - pointer to the
@@ -1,101 +0,0 @@
/******************************************************************************
* NTRU Cryptography Reference Source Code
* Copyright (c) 2009-2013, by Security Innovation, Inc. All rights reserved.
*
* ntru_crypto_ntru_encrypt_param_sets.h is a component of ntru-crypto.
*
* Copyright (C) 2009-2013 Security Innovation
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*****************************************************************************/
/******************************************************************************
*
* File: ntru_crypto_ntru_encrypt_param_sets.h
*
* Contents: Definitions and declarations for the NTRUEncrypt parameter sets.
*
*****************************************************************************/
#ifndef NTRU_CRYPTO_NTRU_ENCRYPT_PARAM_SETS_H
#define NTRU_CRYPTO_NTRU_ENCRYPT_PARAM_SETS_H
#include "ntru_crypto.h"
/* structures */
typedef struct _NTRU_ENCRYPT_PARAM_SET {
NTRU_ENCRYPT_PARAM_SET_ID id; /* parameter-set ID */
uint8_t const OID[3]; /* pointer to OID */
uint8_t der_id; /* parameter-set DER id */
uint8_t N_bits; /* no. of bits in N (i.e. in
an index */
uint16_t N; /* ring dimension */
uint16_t sec_strength_len; /* no. of octets of
security strength */
uint16_t q; /* big modulus */
uint8_t q_bits; /* no. of bits in q (i.e. in
a coefficient */
bool is_product_form; /* if product form used */
uint32_t dF_r; /* no. of 1 or -1 coefficients
in ring elements F, r */
uint16_t dg; /* no. - 1 of 1 coefficients
or no. of -1 coefficients
in ring element g */
uint16_t m_len_max; /* max no. of plaintext
octets */
uint16_t min_msg_rep_wt; /* min. message
representative weight */
uint8_t c_bits; /* no. bits in candidate for
deriving an index in
IGF-2 */
uint8_t m_len_len; /* no. of octets to hold
mLenOctets */
} NTRU_ENCRYPT_PARAM_SET;
/* function declarations */
/* ntru_encrypt_get_params_with_id
*
* Looks up a set of NTRU Encrypt parameters based on the id of the
* parameter set.
*
* Returns a pointer to the parameter set parameters if successful.
* Returns NULL if the parameter set cannot be found.
*/
extern NTRU_ENCRYPT_PARAM_SET *
ntru_encrypt_get_params_with_id(
NTRU_ENCRYPT_PARAM_SET_ID id); /* in - parameter-set id */
/* ntru_encrypt_get_params_with_OID
*
* Looks up a set of NTRU Encrypt parameters based on the OID of the
* parameter set.
*
* Returns a pointer to the parameter set parameters if successful.
* Returns NULL if the parameter set cannot be found.
*/
extern NTRU_ENCRYPT_PARAM_SET *
ntru_encrypt_get_params_with_OID(
uint8_t const *oid); /* in - pointer to parameter-set OID */
#endif /* NTRU_CRYPTO_NTRU_ENCRYPT_PARAM_SETS_H */
+2 -1
View File
@@ -15,6 +15,7 @@
#include "ntru_ke.h"
#include "ntru_drbg.h"
#include "ntru_param_set.h"
#include "ntru_crypto/ntru_crypto.h"
@@ -28,7 +29,7 @@ typedef struct param_set_t param_set_t;
* Defines an NTRU parameter set by ID or OID
*/
struct param_set_t {
NTRU_ENCRYPT_PARAM_SET_ID id;
ntru_param_set_id_t id;
char oid[3];
char *name;
};
@@ -1,43 +1,26 @@
/******************************************************************************
* NTRU Cryptography Reference Source Code
* Copyright (c) 2009-2013, by Security Innovation, Inc. All rights reserved.
*
* ntru_crypto_ntru_param_sets.c is a component of ntru-crypto.
/*
* Copyright (C) 2014 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* Copyright (C) 2009-2013 Security Innovation
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*****************************************************************************/
/******************************************************************************
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* File: ntru_crypto_ntru_encrypt_param_sets.c
*
* Contents: Defines the NTRUEncrypt parameter sets.
*
*****************************************************************************/
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include <stdlib.h>
#include <string.h>
#include "ntru_crypto_ntru_encrypt_param_sets.h"
#include "ntru_param_set.h"
/* parameter sets */
static NTRU_ENCRYPT_PARAM_SET ntruParamSets[] = {
/**
* NTRU encryption parameter set definitions
*/
static ntru_param_set_t ntru_param_sets[] = {
{
NTRU_EES401EP1, /* parameter-set id */
@@ -329,56 +312,38 @@ static NTRU_ENCRYPT_PARAM_SET ntruParamSets[] = {
};
static size_t numParamSets =
sizeof(ntruParamSets)/sizeof(NTRU_ENCRYPT_PARAM_SET);
/* functions */
/* ntru_encrypt_get_params_with_id
*
* Looks up a set of NTRUEncrypt parameters based on the id of the
* parameter set.
*
* Returns a pointer to the parameter set parameters if successful.
* Returns NULL if the parameter set cannot be found.
/**
* See header.
*/
NTRU_ENCRYPT_PARAM_SET *
ntru_encrypt_get_params_with_id(
NTRU_ENCRYPT_PARAM_SET_ID id) /* in - parameter-set id */
ntru_param_set_t* ntru_param_set_get_by_id(ntru_param_set_id_t id)
{
size_t i;
int i;
for (i = 0; i < numParamSets; i++) {
if (ntruParamSets[i].id == id) {
return &(ntruParamSets[i]);
}
}
return NULL;
for (i = 0; i < countof(ntru_param_sets); i++)
{
if (ntru_param_sets[i].id == id)
{
return &ntru_param_sets[i];
}
}
return NULL;
}
/* ntru_encrypt_get_params_with_OID
*
* Looks up a set of NTRUEncrypt parameters based on the OID of the
* parameter set.
*
* Returns a pointer to the parameter set parameters if successful.
* Returns NULL if the parameter set cannot be found.
/**
* See header.
*/
NTRU_ENCRYPT_PARAM_SET *
ntru_encrypt_get_params_with_OID(
uint8_t const *oid) /* in - pointer to parameter-set OID */
ntru_param_set_t* ntru_param_set_get_by_oid(uint8_t const *oid)
{
size_t i;
int i;
for (i = 0; i < numParamSets; i++) {
if (!memcmp(ntruParamSets[i].OID, oid, 3)) {
return &(ntruParamSets[i]);
}
}
return NULL;
for (i = 0; i < countof(ntru_param_sets); i++)
{
if (memeq(ntru_param_sets[i].oid, oid, 3))
{
return &ntru_param_sets[i];
}
}
return NULL;
}
@@ -0,0 +1,93 @@
/*
* Copyright (C) 2014 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* Copyright (C) 2009-2013 Security Innovation
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
/**
* @defgroup ntru_param_set ntru_param_set
* @{ @ingroup ntru_p
*/
#ifndef NTRU_PARAM_SET_H_
#define NTRU_PARAM_SET_H_
typedef enum ntru_param_set_id_t ntru_param_set_id_t;
typedef struct ntru_param_set_t ntru_param_set_t;
#include <library.h>
/**
* NTRU encryption parameter set ID list
*/
enum ntru_param_set_id_t {
NTRU_EES401EP1,
NTRU_EES449EP1,
NTRU_EES677EP1,
NTRU_EES1087EP2,
NTRU_EES541EP1,
NTRU_EES613EP1,
NTRU_EES887EP1,
NTRU_EES1171EP1,
NTRU_EES659EP1,
NTRU_EES761EP1,
NTRU_EES1087EP1,
NTRU_EES1499EP1,
NTRU_EES401EP2,
NTRU_EES439EP1,
NTRU_EES593EP1,
NTRU_EES743EP1,
};
/**
* NTRU encryption parameter set definitions
*/
struct ntru_param_set_t {
ntru_param_set_id_t id; /* NTRU parameter set ID */
uint8_t oid[3]; /* pointer to OID */
uint8_t der_id; /* parameter-set DER id */
uint8_t N_bits; /* no. of bits in N (i.e. in an index */
uint16_t N; /* ring dimension */
uint16_t sec_strength_len; /* no. of octets of security strength */
uint16_t q; /* big modulus */
uint8_t q_bits; /* no. of bits in q (i.e. in a coefficient */
bool is_product_form; /* if product form used */
uint32_t dF_r; /* no. of +1 or -1 coefficients in ring elements
F, r */
uint16_t dg; /* no. - 1 of +1 coefficients or
no. of -1 coefficients in ring element g */
uint16_t m_len_max; /* max no. of plaintext octets */
uint16_t min_msg_rep_wt; /* min. message representative weight */
uint8_t c_bits; /* no. bits in candidate for deriving an index */
uint8_t m_len_len; /* no. of octets to hold mLenOctets */
};
/**
* Get NTRU encryption parameter set by NTRU parameter set ID
*
* @param id NTRU parameter set ID
* @return NTRU parameter set
*/
ntru_param_set_t* ntru_param_set_get_by_id(ntru_param_set_id_t id);
/**
* Get NTRU encryption parameter set by NTRU parameter set OID
*
* @param oid NTRU parameter set OID
* @return NTRU parameter set
*/
ntru_param_set_t* ntru_param_set_get_by_oid(uint8_t const *oid);
#endif /** NTRU_PARAM_SET_H_ @}*/