Skip to content
Snippets Groups Projects
provider.cc 2.04 KiB
Newer Older
  • Learn to ignore specific revisions
  • Daniel Lyubomirov's avatar
    Daniel Lyubomirov committed
    #include <vereign/identity/provider.hh>
    
    
    Daniel Lyubomirov's avatar
    Daniel Lyubomirov committed
    #include <vereign/crypto/digest.hh>
    
    Daniel Lyubomirov's avatar
    Daniel Lyubomirov committed
    #include <vereign/crypto/bio.hh>
    #include <vereign/crypto/rsa.hh>
    #include <vereign/encoding/base64.hh>
    
    namespace {
      constexpr int rsaKeySizeBits = 2048;
    }
    
    namespace vereign::identity {
    
    Provider::Provider(kvstore::CryptoStorage& storage)
      : storage_{storage}
    {}
    
    Provider::~Provider() = default;
    
    auto Provider::ResetIdentity(const std::string& pin) -> std::string {
      std::lock_guard<std::mutex> l{mu_};
    
      storage_.Reset(pin);
    
      auto rsa = crypto::rsa::GenerateKey(rsaKeySizeBits);
    
      auto private_key = crypto::rsa::ExportPrivateKeyToPEM(rsa.get());
      storage_.PutBytes("identity_private_key", crypto::bio::View(private_key.get()));
    
      auto public_key = crypto::rsa::ExportPublicKeyToPEM(rsa.get());
      storage_.PutBytes("identity_public_key", crypto::bio::View(public_key.get()));
    
      bytes::Buffer encoded;
      encoding::base64::Encode(crypto::bio::View(public_key.get()), encoded);
    
      return std::string{encoded.View().String()};
    }
    
    auto Provider::LoadIdentity(const std::string& pin) -> std::string {
      std::lock_guard<std::mutex> l{mu_};
    
      storage_.Open(pin);
    
      bytes::Buffer public_key;
      storage_.GetBytes("identity_public_key", public_key);
    
      bytes::Buffer encoded;
      encoding::base64::Encode(public_key.View(), encoded);
    
      return std::string(encoded.View().String());
    }
    
    auto Provider::GetIdentityPublicKeyBase64() -> std::string {
      std::lock_guard<std::mutex> l{mu_};
    
      bytes::Buffer public_key;
      storage_.GetBytes("identity_public_key", public_key);
    
      bytes::Buffer encoded;
      encoding::base64::Encode(public_key.View(), encoded);
    
      return std::string(encoded.View().String());
    }
    
    auto Provider::GetDeviceHash() -> std::string {
      std::lock_guard<std::mutex> l{mu_};
    
      bytes::Buffer public_key;
      storage_.GetBytes("identity_public_key", public_key);
    
      bytes::Buffer hash;
      crypto::digest::sha1(public_key.View(), hash);
    
      bytes::Buffer encoded;
      encoding::base64::Encode(hash.View(), encoded);
    
      return std::string(encoded.View().String());
    }
    
    } // namespace vereign::identity