Browse Source

fixed Elligator tests

pull/1474/head
orignal 5 years ago
parent
commit
0d2d7e5e71
  1. 18
      libi2pd/Elligator.cpp
  2. 2
      libi2pd/Elligator.h
  3. 4
      tests/test-elligator.cpp

18
libi2pd/Elligator.cpp

@ -40,7 +40,7 @@ namespace crypto
BN_free (u); BN_free (iu); 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; bool ret = true;
BN_CTX * ctx = BN_CTX_new (); BN_CTX * ctx = BN_CTX_new ();
@ -63,10 +63,13 @@ namespace crypto
if (Legendre (uxxA, ctx) != -1) if (Legendre (uxxA, ctx) != -1)
{ {
uint8_t randByte; // random highest bits and high y uint8_t randByte = 0; // random highest bits and high y
RAND_bytes (&randByte, 1); if (random)
bool highY = randByte & 0x01; {
RAND_bytes (&randByte, 1);
highY = randByte & 0x01;
}
BIGNUM * r = BN_CTX_get (ctx); BIGNUM * r = BN_CTX_get (ctx);
if (highY) if (highY)
{ {
@ -82,8 +85,9 @@ namespace crypto
SquareRoot (r, r, ctx); SquareRoot (r, r, ctx);
bn2buf (r, encoded, 32); 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 for (size_t i = 0; i < 16; i++) // To Little Endian
{ {
uint8_t tmp = encoded[i]; uint8_t tmp = encoded[i];

2
libi2pd/Elligator.h

@ -17,7 +17,7 @@ namespace crypto
Elligator2 (); Elligator2 ();
~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; bool Decode (const uint8_t * encoded, uint8_t * key) const;
private: private:

4
tests/test-elligator.cpp

@ -69,9 +69,9 @@ int main ()
uint8_t buf[32]; uint8_t buf[32];
i2p::crypto::Elligator2 el; i2p::crypto::Elligator2 el;
// encoding tests // encoding tests
el.Encode (key, buf); el.Encode (key, buf, false, false);
assert(memcmp (buf, encoded_key, 32) == 0); 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); assert(memcmp (buf, encoded_key_high_y, 32) == 0);
// decoding tests // decoding tests
el.Decode (encoded1, buf); el.Decode (encoded1, buf);

Loading…
Cancel
Save