#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 (); struct SigningKey { Bytes sk; SigningKey (); static optional load_human_key_file (const string & file_path, const string & passphrase); 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); 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); }; }