lokinet/llarp/crypto/types.cpp

120 lines
2.3 KiB
C++
Raw Normal View History

#include <crypto/types.hpp>
#include <util/buffer.hpp>
#include <fstream>
2019-06-24 16:26:15 +00:00
#include <util/fs.hpp>
#include <iterator>
namespace llarp
{
bool
PubKey::FromString(const std::string& str)
{
return HexDecode(str.c_str(), begin(), size());
}
std::string
PubKey::ToString() const
{
char buf[(PUBKEYSIZE + 1) * 2] = {0};
return HexEncode(*this, buf);
}
bool
SecretKey::LoadFromFile(const char* fname)
{
2019-06-24 17:36:25 +00:00
std::ifstream f(fname, std::ios::in | std::ios::binary);
if(!f.is_open())
{
return false;
}
2019-01-15 00:42:50 +00:00
f.seekg(0, std::ios::end);
2019-01-15 00:42:50 +00:00
const size_t sz = f.tellg();
f.seekg(0, std::ios::beg);
2019-01-15 00:42:50 +00:00
if(sz == size())
{
// is raw buffer
2019-01-15 23:07:02 +00:00
std::copy_n(std::istreambuf_iterator< char >(f), sz, begin());
return true;
}
2019-01-15 00:42:50 +00:00
std::array< byte_t, 128 > tmp;
2019-02-02 23:12:42 +00:00
llarp_buffer_t buf(tmp);
if(sz > sizeof(tmp))
{
return false;
}
2019-01-15 00:42:50 +00:00
f.read(reinterpret_cast< char* >(tmp.data()), sz);
return BDecode(&buf);
}
bool
SecretKey::SaveToFile(const char* fname) const
{
2019-02-02 23:12:42 +00:00
std::array< byte_t, 128 > tmp;
llarp_buffer_t buf(tmp);
if(!BEncode(&buf))
{
return false;
}
2019-06-24 16:26:15 +00:00
const fs::path fpath = std::string(fname);
2019-06-24 17:36:25 +00:00
auto optional_f =
llarp::util::OpenFileStream< std::ofstream >(fpath, std::ios::binary);
2019-06-24 16:26:15 +00:00
if(!optional_f)
return false;
auto& f = optional_f.value();
if(!f.is_open())
return false;
f.write((char*)buf.base, buf.cur - buf.base);
2019-06-24 17:36:25 +00:00
return f.good();
}
bool
IdentitySecret::LoadFromFile(const char* fname)
{
2019-06-24 16:26:15 +00:00
const fs::path fpath = std::string(fname);
auto optional = util::OpenFileStream< std::ifstream >(
fpath, std::ios::binary | std::ios::in);
if(!optional)
return false;
2019-06-24 16:26:15 +00:00
auto& f = optional.value();
f.seekg(0, std::ios::end);
const size_t sz = f.tellg();
f.seekg(0, std::ios::beg);
if(sz != 32)
{
llarp::LogError("service node seed size invalid: ", sz, " != 32");
return false;
}
std::copy_n(std::istreambuf_iterator< char >(f), sz, begin());
return true;
}
byte_t*
Signature::R()
{
return data();
}
const byte_t*
Signature::R() const
{
return data();
}
byte_t*
Signature::C()
{
return data() + 32;
}
const byte_t*
Signature::C() const
{
return data() + 32;
}
} // namespace llarp