fixed Elligator tests

This commit is contained in:
orignal 2020-01-21 17:53:48 -05:00
parent 6142e93252
commit 0d2d7e5e71
3 changed files with 14 additions and 10 deletions

View File

@ -40,7 +40,7 @@ namespace crypto
BN_free (u); BN_free (iu);
}
bool Elligator2::Encode (const uint8_t * key, uint8_t * encoded) const
bool Elligator2::Encode (const uint8_t * key, uint8_t * encoded, bool highY, bool random) const
{
bool ret = true;
BN_CTX * ctx = BN_CTX_new ();
@ -63,9 +63,12 @@ namespace crypto
if (Legendre (uxxA, ctx) != -1)
{
uint8_t randByte; // random highest bits and high y
RAND_bytes (&randByte, 1);
bool highY = randByte & 0x01;
uint8_t randByte = 0; // random highest bits and high y
if (random)
{
RAND_bytes (&randByte, 1);
highY = randByte & 0x01;
}
BIGNUM * r = BN_CTX_get (ctx);
if (highY)
@ -83,7 +86,8 @@ namespace crypto
SquareRoot (r, r, ctx);
bn2buf (r, encoded, 32);
encoded[0] |= (randByte & 0xC0); // copy two highest bits from randByte
if (random)
encoded[0] |= (randByte & 0xC0); // copy two highest bits from randByte
for (size_t i = 0; i < 16; i++) // To Little Endian
{
uint8_t tmp = encoded[i];

View File

@ -17,7 +17,7 @@ namespace crypto
Elligator2 ();
~Elligator2 ();
bool Encode (const uint8_t * key, uint8_t * encoded) const;
bool Encode (const uint8_t * key, uint8_t * encoded, bool highY = false, bool random = true) const;
bool Decode (const uint8_t * encoded, uint8_t * key) const;
private:

View File

@ -69,9 +69,9 @@ int main ()
uint8_t buf[32];
i2p::crypto::Elligator2 el;
// encoding tests
el.Encode (key, buf);
el.Encode (key, buf, false, false);
assert(memcmp (buf, encoded_key, 32) == 0);
el.Encode (key, buf, true); // with highY
el.Encode (key, buf, true, false); // with highY
assert(memcmp (buf, encoded_key_high_y, 32) == 0);
// decoding tests
el.Decode (encoded1, buf);