|
|
@@ -14,15 +14,19 @@ |
|
|
|
#include <decaf/crypto.h> |
|
|
|
#include <decaf/crypto.hxx> |
|
|
|
#include <stdio.h> |
|
|
|
#include <memcheck.h> |
|
|
|
#include <valgrind/memcheck.h> |
|
|
|
|
|
|
|
using namespace decaf; |
|
|
|
|
|
|
|
static const long NTESTS = 100; |
|
|
|
static const long NTESTS = 1; |
|
|
|
|
|
|
|
const char *undef_str = "Valgrind thinks this string is undefined." |
|
|
|
const char *undef_str = "Valgrind thinks this string is undefined."; |
|
|
|
const Block undef_block(undef_str); |
|
|
|
|
|
|
|
static inline void ignore(decaf_error_t x) { |
|
|
|
(void)x; |
|
|
|
} |
|
|
|
|
|
|
|
template<typename Group> struct Tests { |
|
|
|
|
|
|
|
typedef typename Group::Scalar Scalar; |
|
|
@@ -31,27 +35,26 @@ typedef typename Group::Precomputed Precomputed; |
|
|
|
|
|
|
|
static void test_arithmetic() { |
|
|
|
SpongeRng rng(Block("test_arithmetic")); |
|
|
|
rng.stir(undef_str); |
|
|
|
rng.stir(undef_block); |
|
|
|
|
|
|
|
Test test("Arithmetic"); |
|
|
|
Scalar x(rng),y(rng),z; |
|
|
|
FixedBlock<Group::Scalar::SER_BYTES> Ser; |
|
|
|
uint8_t ser[Group::Scalar::SER_BYTES]; |
|
|
|
|
|
|
|
for (int i=0; i<NTESTS; i++) { |
|
|
|
(void)(x+y); |
|
|
|
(void)(x-y); |
|
|
|
(void)(x*y); |
|
|
|
(void)(x/y); // Probably fails? |
|
|
|
//(void)(x/y); // TODO: Fails due to zero check, but needs to be tested anyway. |
|
|
|
(void)(x==y); |
|
|
|
(void)(z=y); |
|
|
|
x.serialize(ser); |
|
|
|
x.serializeInto(ser); |
|
|
|
x = y; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void test_elligator() { |
|
|
|
SpongeRng rng(Block("test_elligator")); |
|
|
|
rng.stir(undef_str); |
|
|
|
rng.stir(undef_block); |
|
|
|
|
|
|
|
for (int i=0; i<NTESTS; i++) { |
|
|
|
Point x(rng); |
|
|
@@ -62,12 +65,16 @@ static void test_elligator() { |
|
|
|
|
|
|
|
static void test_ec() { |
|
|
|
SpongeRng rng(Block("test_ec")); |
|
|
|
rng.stir(undef_str); |
|
|
|
rng.stir(undef_block); |
|
|
|
|
|
|
|
uint8_t ser[Group::Point::SER_BYTES]; |
|
|
|
|
|
|
|
for (int i=0; i<NTESTS; i++) { |
|
|
|
Scalar y(rng),z(rng); |
|
|
|
Point p(rng),q(rng),r; |
|
|
|
|
|
|
|
|
|
|
|
p.serializeInto(ser); |
|
|
|
ignore(Group::Point::decode(p,FixedBlock<Group::Point::SER_BYTES>(ser))); |
|
|
|
(void)(p*y); |
|
|
|
(void)(p+q); |
|
|
|
(void)(p-q); |
|
|
@@ -75,10 +82,10 @@ static void test_ec() { |
|
|
|
(void)(p.times_two()); |
|
|
|
(void)(p==q); |
|
|
|
(void)(p.debugging_torque()); |
|
|
|
(void)(p.non_secret_combo_with_base(y,z)); // Should fail |
|
|
|
//(void)(p.non_secret_combo_with_base(y,z)); // Should fail |
|
|
|
(void)(Precomputed(p)*y); |
|
|
|
p.dual_scalarmul(q,r,y,z); |
|
|
|
p.double_scalarmul(q,r,y,z); |
|
|
|
Group::Point::double_scalarmul(p,y,q,z); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
@@ -107,7 +114,5 @@ int main(int argc, char **argv) { |
|
|
|
Tests<Ed448Goldilocks>::test_ec(); |
|
|
|
Tests<Ed448Goldilocks>::test_crypto(); |
|
|
|
|
|
|
|
if (passing) printf("Passed all tests.\n"); |
|
|
|
|
|
|
|
return passing ? 0 : 1; |
|
|
|
return 0; |
|
|
|
} |