1
0
mirror of https://github.com/taigrr/arduinolibs synced 2025-01-18 04:33:12 -08:00

Change the private key format in the NewHope API

This commit is contained in:
Rhys Weatherley 2016-08-24 05:24:51 +10:00
parent ca67bdbae0
commit 824e1c2eb2
3 changed files with 33 additions and 23 deletions

View File

@ -55,7 +55,7 @@
* *
* \code * \code
* uint8_t alice_public[NEWHOPE_SENDABYTES]; * uint8_t alice_public[NEWHOPE_SENDABYTES];
* NewHopePoly alice_private; * NewHopePrivateKey alice_private;
* NewHope::keygen(alice_public, alice_private); * NewHope::keygen(alice_public, alice_private);
* \endcode * \endcode
* *
@ -104,8 +104,12 @@
*/ */
/** /**
* \class NewHopePoly NewHope.h <NewHope.h> * \class NewHopePrivateKey NewHope.h <NewHope.h>
* \brief NewHope polynomial representation * \brief NewHope private key representation
*
* Instances of NewHopePrivateKey are used to hold the private key value
* for alice between the calls to keygen() and shareda(). It should be
* treated as opaque.
* *
* Reference: https://cryptojedi.org/crypto/#newhope * Reference: https://cryptojedi.org/crypto/#newhope
*/ */
@ -850,6 +854,20 @@ static int discardtopoly(uint16_t *x)
// End of public domain code imported from the C reference code. // End of public domain code imported from the C reference code.
class NewHopePoly
{
public:
NewHopePoly();
~NewHopePoly();
void clear();
private:
uint16_t coeffs[1024];
friend class NewHope;
};
// Formats the ChaCha20 input block using a key and nonce. // Formats the ChaCha20 input block using a key and nonce.
static void crypto_chacha20_set_key(uint32_t *block, const unsigned char *k, const unsigned char *n) static void crypto_chacha20_set_key(uint32_t *block, const unsigned char *k, const unsigned char *n)
{ {
@ -977,8 +995,6 @@ static void sha3256(unsigned char *output, const unsigned char *input, unsigned
sha3.finalize(output, 32); sha3.finalize(output, 32);
} }
/** @endcond */
/** /**
* \brief Constructs a new "poly" object for the NewHope algorithm. * \brief Constructs a new "poly" object for the NewHope algorithm.
*/ */
@ -1002,6 +1018,8 @@ void NewHopePoly::clear()
clean(coeffs); clean(coeffs);
} }
/** @endcond */
/** /**
* \enum NewHope::Variant * \enum NewHope::Variant
* \brief Describes the variant of the New Hope algorithm to implement. * \brief Describes the variant of the New Hope algorithm to implement.
@ -1024,7 +1042,7 @@ void NewHopePoly::clear()
* \brief Generates the key pair for Alice in a New Hope key exchange. * \brief Generates the key pair for Alice in a New Hope key exchange.
* *
* \param send The public key value for Alice to be sent to Bob. * \param send The public key value for Alice to be sent to Bob.
* \param sk The secret key value for Alice to be passed to shareda() later. * \param sk The private key value for Alice to be passed to shareda() later.
* \param variant The variant of the New Hope algorithm to use, usually Ref. * \param variant The variant of the New Hope algorithm to use, usually Ref.
* \param random_seed Points to 64 bytes of random data to use to generate * \param random_seed Points to 64 bytes of random data to use to generate
* the key pair. This is intended for test vectors only and should be set * the key pair. This is intended for test vectors only and should be set
@ -1036,7 +1054,7 @@ void NewHopePoly::clear()
* *
* \sa sharedb(), shareda() * \sa sharedb(), shareda()
*/ */
void NewHope::keygen(uint8_t send[NEWHOPE_SENDABYTES], NewHopePoly &sk, void NewHope::keygen(uint8_t send[NEWHOPE_SENDABYTES], NewHopePrivateKey &sk,
Variant variant, const uint8_t *random_seed) Variant variant, const uint8_t *random_seed)
{ {
NewHopePolyExtended a; NewHopePolyExtended a;
@ -1157,7 +1175,7 @@ void NewHope::sharedb(uint8_t shared_key[NEWHOPE_SHAREDBYTES],
* \sa sharedb(), keygen() * \sa sharedb(), keygen()
*/ */
void NewHope::shareda(uint8_t shared_key[NEWHOPE_SHAREDBYTES], void NewHope::shareda(uint8_t shared_key[NEWHOPE_SHAREDBYTES],
const NewHopePoly &sk, const NewHopePrivateKey &sk,
uint8_t received[NEWHOPE_SENDBBYTES]) uint8_t received[NEWHOPE_SENDBBYTES])
{ {
NewHopePoly v, bp; NewHopePoly v, bp;

View File

@ -29,21 +29,13 @@
#define NEWHOPE_SENDBBYTES 2048 #define NEWHOPE_SENDBBYTES 2048
#define NEWHOPE_SHAREDBYTES 32 #define NEWHOPE_SHAREDBYTES 32
class NewHope; typedef struct
class NewHopePoly
{ {
public: /** @cond */
NewHopePoly();
~NewHopePoly();
void clear();
private:
uint16_t coeffs[1024]; uint16_t coeffs[1024];
/** @endcond */
friend class NewHope; } NewHopePrivateKey;
};
class NewHope class NewHope
{ {
@ -58,14 +50,14 @@ public:
Torref Torref
}; };
static void keygen(uint8_t send[NEWHOPE_SENDABYTES], NewHopePoly &sk, static void keygen(uint8_t send[NEWHOPE_SENDABYTES], NewHopePrivateKey &sk,
Variant variant = Ref, const uint8_t *random_seed = 0); Variant variant = Ref, const uint8_t *random_seed = 0);
static void sharedb(uint8_t shared_key[NEWHOPE_SHAREDBYTES], static void sharedb(uint8_t shared_key[NEWHOPE_SHAREDBYTES],
uint8_t send[NEWHOPE_SENDBBYTES], uint8_t send[NEWHOPE_SENDBBYTES],
uint8_t received[NEWHOPE_SENDABYTES], uint8_t received[NEWHOPE_SENDABYTES],
Variant variant = Ref, const uint8_t *random_seed = 0); Variant variant = Ref, const uint8_t *random_seed = 0);
static void shareda(uint8_t shared_key[NEWHOPE_SHAREDBYTES], static void shareda(uint8_t shared_key[NEWHOPE_SHAREDBYTES],
const NewHopePoly &sk, const NewHopePrivateKey &sk,
uint8_t received[NEWHOPE_SENDBBYTES]); uint8_t received[NEWHOPE_SENDBBYTES]);
}; };

View File

@ -96,7 +96,7 @@ static struct TestVector const testNewHope2 = { // "torref" variant
0x3c, 0xfb, 0x28, 0xcc, 0xda, 0xe6, 0x36, 0x0c} 0x3c, 0xfb, 0x28, 0xcc, 0xda, 0xe6, 0x36, 0x0c}
}; };
NewHopePoly alice_private; NewHopePrivateKey alice_private;
uint8_t alice_public[NEWHOPE_SENDABYTES]; uint8_t alice_public[NEWHOPE_SENDABYTES];
uint8_t alice_shared[NEWHOPE_SHAREDBYTES]; uint8_t alice_shared[NEWHOPE_SHAREDBYTES];
uint8_t bob_public[NEWHOPE_SENDBBYTES]; uint8_t bob_public[NEWHOPE_SENDBBYTES];