This commit is contained in:
Ryan Tharp 2018-06-21 11:28:32 +00:00
commit 6f9af33058
7 changed files with 99 additions and 43 deletions

View File

@ -30,7 +30,7 @@ bool printNode(struct llarp_nodedb_iter *iter) {
const char *hexname = const char *hexname =
llarp::HexEncode< llarp::PubKey, decltype(ftmp) >(iter->rc->pubkey, ftmp); llarp::HexEncode< llarp::PubKey, decltype(ftmp) >(iter->rc->pubkey, ftmp);
printf("[%d]=>[%s]\n", iter->index, hexname); printf("[%zu]=>[%s]\n", iter->index, hexname);
return false; return false;
} }
@ -217,7 +217,20 @@ main(int argc, char *argv[])
} }
if (exportMode) { if (exportMode) {
llarp_main_loadDatabase(ctx); llarp_main_loadDatabase(ctx);
// TODO: write me //llarp::Info("Looking for string: ", rcfname);
llarp::PubKey binaryPK;
llarp::HexDecode(rcfname, binaryPK.data());
llarp::Info("Looking for binary: ", binaryPK);
struct llarp_rc *rc = llarp_main_getDatabase(ctx, binaryPK.data());
if (!rc) {
llarp::Error("Can't load RC from database");
}
std::string filename(rcfname);
filename.append(".signed");
llarp::Info("Writing out: ", filename);
llarp_rc_write(rc, filename.c_str());
} }
llarp_main_free(ctx); llarp_main_free(ctx);
return 1; // success return 1; // success

View File

@ -44,6 +44,9 @@ llarp_main_iterateDatabase(struct llarp_main *ptr, struct llarp_nodedb_iter i);
bool bool
llarp_main_putDatabase(struct llarp_main *ptr, struct llarp_rc *rc); llarp_main_putDatabase(struct llarp_main *ptr, struct llarp_rc *rc);
struct llarp_rc *
llarp_main_getDatabase(struct llarp_main *ptr, byte_t *pk);
void void
llarp_main_free(struct llarp_main *ptr); llarp_main_free(struct llarp_main *ptr);

View File

@ -42,6 +42,9 @@ namespace llarp
bool bool
PutDatabase(struct llarp_rc *rc); PutDatabase(struct llarp_rc *rc);
struct llarp_rc *
GetDatabase(const byte_t *pk);
int int
Run(); Run();

View File

@ -26,6 +26,9 @@ namespace llarp
*ptr = 0; *ptr = 0;
return &stack[0]; return &stack[0];
} }
int char2int(char input);
void HexDecode(const char* src, uint8_t* target);
} }
#endif #endif

View File

@ -118,6 +118,11 @@ namespace llarp
return llarp_nodedb_put_rc(nodedb, rc); return llarp_nodedb_put_rc(nodedb, rc);
} }
struct llarp_rc *
Context::GetDatabase(const byte_t *pk)
{
return llarp_nodedb_get_rc(nodedb, pk);
}
int int
Context::Run() Context::Run()
@ -328,6 +333,11 @@ llarp_main_putDatabase(struct llarp_main *ptr, struct llarp_rc *rc)
return ptr->ctx->PutDatabase(rc); return ptr->ctx->PutDatabase(rc);
} }
struct llarp_rc *
llarp_main_getDatabase(struct llarp_main *ptr, byte_t *pk)
{
return ptr->ctx->GetDatabase(pk);
}
void void
llarp_main_free(struct llarp_main *ptr) llarp_main_free(struct llarp_main *ptr)

27
llarp/encode.cpp Normal file
View File

@ -0,0 +1,27 @@
#include <llarp/encode.hpp>
#include <stdexcept>
namespace llarp
{
int char2int(char input)
{
if(input >= '0' && input <= '9')
return input - '0';
if(input >= 'A' && input <= 'F')
return input - 'A' + 10;
if(input >= 'a' && input <= 'f')
return input - 'a' + 10;
throw std::invalid_argument("Invalid input string");
}
void HexDecode(const char* src, uint8_t* target)
{
while(*src && src[1])
{
*(target++) = char2int(*src)*16 + char2int(src[1]);
src += 2;
}
}
}

View File

@ -47,6 +47,24 @@ struct llarp_nodedb
return entries.find(pk) != entries.end(); return entries.find(pk) != entries.end();
} }
/*
bool
Has(const byte_t *pk)
{
llarp::PubKey test(pk);
auto itr = this->entries.begin();
while(itr != this->entries.end())
{
llarp::Info("Has byte_t [", test.size(), "] vs [", itr->first.size(), "]");
if (memcmp(test.data(), itr->first.data(), 32) == 0) {
llarp::Info("Match");
}
itr++;
}
return entries.find(pk) != entries.end();
}
*/
bool bool
pubKeyExists(llarp_rc *rc) pubKeyExists(llarp_rc *rc)
{ {
@ -167,8 +185,9 @@ struct llarp_nodedb
auto itr = i.begin(); auto itr = i.begin();
while(itr != itr.end()) while(itr != itr.end())
{ {
if(loadfile(*itr)) if (fs::is_regular_file(itr->symlink_status()) && loadfile(*itr))
sz++; sz++;
++itr; ++itr;
} }
return sz; return sz;
@ -177,49 +196,26 @@ struct llarp_nodedb
bool bool
loadfile(const fs::path &fpath) loadfile(const fs::path &fpath)
{ {
#if __APPLE__ && __MACH__
// skip .DS_Store files
if (strstr(fpath.c_str(), ".DS_Store") != 0) {
return false;
}
#endif
llarp_rc *rc = llarp_rc_read(fpath.c_str()); llarp_rc *rc = llarp_rc_read(fpath.c_str());
if (rc) if (!rc)
{ {
if(llarp_rc_verify_sig(crypto, rc)) llarp::Error("Signature read failed", fpath);
{ return false;
llarp::PubKey pk(rc->pubkey);
entries[pk] = *rc;
return true;
}
} }
/* if(!llarp_rc_verify_sig(crypto, rc))
std::ifstream f(fpath, std::ios::binary);
if(!f.is_open())
return false;
byte_t tmp[MAX_RC_SIZE];
auto buf = llarp::StackBuffer< decltype(tmp) >(tmp);
f.seekg(0, std::ios::end);
size_t sz = f.tellg();
f.seekg(0, std::ios::beg);
if(sz > buf.sz)
return false;
// TODO: error checking
f.read((char *)buf.base, sz);
buf.sz = sz;
llarp_rc rc;
llarp::Zero(&rc, sizeof(llarp_rc));
if(llarp_rc_bdecode(&rc, &buf))
{ {
if(llarp_rc_verify_sig(crypto, &rc)) llarp::Error("Signature verify failed", fpath);
{ return false;
llarp::PubKey pk(rc.pubkey);
entries[pk] = rc;
return true;
}
} }
llarp_rc_free(&rc); llarp::PubKey pk(rc->pubkey);
*/ entries[pk] = *rc;
return false; return true;
} }
bool iterate() { bool iterate() {
@ -414,6 +410,7 @@ llarp_nodedb_async_load_rc(struct llarp_async_load_rc *job)
struct llarp_rc * struct llarp_rc *
llarp_nodedb_get_rc(struct llarp_nodedb *n, const byte_t *pk) llarp_nodedb_get_rc(struct llarp_nodedb *n, const byte_t *pk)
{ {
//llarp::Info("llarp_nodedb_get_rc [", pk, "]");
if(n->Has(pk)) if(n->Has(pk))
return n->getRC(pk); return n->getRC(pk);
else else