From 67957afb6ba01bcd85f1abd1a50ad2c1aa813c7c Mon Sep 17 00:00:00 2001 From: Aleksi Lindeman <0xdec05eba@gmail.com> Date: Wed, 14 Feb 2018 22:18:48 +0100 Subject: Sign messages/verify message signatures --- tests/main.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 7 deletions(-) (limited to 'tests') diff --git a/tests/main.cpp b/tests/main.cpp index 8818ff9..1940c1a 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -9,15 +9,63 @@ using namespace std; using namespace chrono_literals; using namespace odhtdb; -int main() +#define assertEquals(a, b) do { if((a) != (b)) { fprintf(stderr, "Assert failed:\n%s != %s\n", #a, #b); exit(1); } } while(0) +void fail(const string &errMsg) { fprintf(stderr, "Fail:\n%.*s\n", errMsg.size(), errMsg.c_str()); } + +void testSignData(LocalUser *localUser) { - LocalUser *localUser = LocalUser::create(Signature::KeyPair(), "dec05eba"); - std::string publicKeyStr = localUser->getPublicKey().toString(); printf("Local user public key: %s\n", publicKeyStr.c_str()); std::string privateKeyStr = localUser->getPrivateKey().toString(); printf("Local user private key: %s\n", privateKeyStr.c_str()); + + string expectedUnsignedData = "hello, world!"; + string signedData = localUser->getPrivateKey().sign(DataView((void*)expectedUnsignedData.data(), expectedUnsignedData.size())); + assertEquals(SIGNED_HASH_SIZE + expectedUnsignedData.size(), signedData.size()); + + string unsignedData = localUser->getPublicKey().unsign(DataView((void*)signedData.data(), signedData.size())); + assertEquals(expectedUnsignedData, unsignedData); + + try + { + Signature::KeyPair anotherKeyPair; + anotherKeyPair.getPublicKey().unsign(DataView((void*)signedData.data(), signedData.size())); + fail("Expected unsign to fail since the data was not signed with the private key matching given public key"); + } + catch (UnsignWrongKeyException &e) + { + + } + catch (exception &e) + { + string errMsg = "Expected unsign to fail with UnsignWrongKeyException, fail reason: "; + errMsg += e.what(); + fail(errMsg); + } + + try + { + Signature::KeyPair anotherKeyPair; + anotherKeyPair.getPublicKey().unsign(DataView((void*)signedData.data(), 3)); + fail("Expected unsign to fail since the (signed) data is too small to have been signed (signed hash is 64 bytes)"); + } + catch (UnsignInvalidSizeException &e) + { + + } + catch (exception &e) + { + string errMsg = "Expected unsign to fail with UnsignInvalidSizeException, fail reason: "; + errMsg += e.what(); + fail(errMsg); + } +} + +int main() +{ + LocalUser *localUser = LocalUser::create(Signature::KeyPair(), "dec05eba"); + testSignData(localUser); // TODO: For tests, dont run against bootstrap.ring.cx. // Run against a bootstrap node made only for testing which doesn't persist added data. @@ -25,12 +73,10 @@ int main() Database database("bootstrap.ring.cx", 4222, "storage"); database.seed(); - Group group("admin"); - group.addUser(localUser); - database.create("galax.channel.latenight.chat", &group); + database.create(localUser, "galax.channel.latenight.chat"); const char *data = "hello, world!"; - database.add("galax.channel.latenight.chat", DataView{ (void*)data, strlen(data) }, localUser); + database.add(localUser, "galax.channel.latenight.chat", DataView{ (void*)data, strlen(data) }); database.commit(); auto start = chrono::high_resolution_clock::now(); while(chrono::high_resolution_clock::now() - start < 5s) -- cgit v1.2.3