#ifndef StateIntegrity_hpp #define StateIntegrity_hpp #include #include class StateIntegrity { private: struct Private { }; public: static constexpr const size_t SEED_SIZE = 32; static constexpr const size_t PRIVATE_KEY_SIZE = 64; static constexpr const size_t PUBLIC_KEY_SIZE = 32; static constexpr const size_t SIGNATURE_SIZE = 64; static std::string generateSeed(); using private_key_t = std::array; using public_key_t = std::array; StateIntegrity(const std::string_view & seed); ~StateIntegrity(); std::string sign(const std::string_view & data); std::string verify(const std::string_view & data); void updateKeyTrust(const std::string_view & key, std::optional trust); std::optional getKeyTrust(const std::string_view & key); void loadTrustStore(const juce::XmlElement & elem); std::unique_ptr saveTrustStore(); void clearTrustStore(); class PublicKeyNotTrusted : public std::exception { public: PublicKeyNotTrusted(const PublicKeyNotTrusted &) = delete; PublicKeyNotTrusted(Private, std::string && publicKey, bool isKnown) : publicKey(std::move(publicKey)), isKnown(isKnown) { } virtual char const * what() const noexcept { return "StateIntegrity: Signature verification failed"; } const std::string getPublicKey() const { return publicKey; } const bool getIsKnown() const { return isKnown; } private: std::string publicKey; bool isKnown; }; class SignatureVerificationFailed : public std::exception { public: SignatureVerificationFailed(const SignatureVerificationFailed &) = delete; SignatureVerificationFailed(Private) { }; virtual char const * what() const noexcept { return "StateIntegrity: Signature verification failed"; } }; private: private_key_t privateKey; public_key_t publicKey; std::map trustStore; }; #endif /* StateIntegrity_hpp */