#pragma once #include #include #include #include #include "json.hpp" #include "expiring_signature.h" #include "time_helpers.h" namespace BareMinimumCrypto { using namespace std; using nlohmann::json; string get_machine_id (); string get_passphrase_from_user (); optional try_load_msgpack_file (const string & file_path); struct SigningKey { Bytes sk; SigningKey (); Bytes pubkey () const; Bytes pub_to_msgpack () const; optional sign ( const Bytes & payload, TimeRange tr ) const; optional sign_key (const SigningKey & k, Instant now) const; optional sign_data (const Bytes & v, Instant now) const; }; struct HumanKeyFile { Bytes salt; Instant time_created; Bytes pubkey; string machine_id; // This doesn't fsync, so it's possible to lose the key due to a power outage // or filesystem nonsense right after this function returns. // It also doesn't do the rename trick. The caller may do that. static optional generate (const string & file_path, const string & passphrase); static optional load (const string & file_path, const string & passphrase); static optional unlock_key (const Bytes & salt, const string & passphrase); Bytes to_msgpack () const; static optional try_from_msgpack (const json & msg); }; struct MachineKeyFile { Bytes secretkey; Instant time_created; string machine_id; static optional generate (const string & file_path); Bytes pubkey () const; Bytes to_msgpack () const; static optional try_from_msgpack (const json & msg); }; }