// SPDX-License-Identifier: BSD-3-Clause // SPDX-FileCopyrightText: 2020-2023 The Monero Project #pragma once #include #include #include #include #include "s_expression.h" namespace openpgp { enum algorithm : uint8_t { rsa = 1, }; class public_key_rsa { public: public_key_rsa(s_expression expression, size_t bits); size_t bits() const; const gcry_sexp_t &get() const; private: s_expression m_expression; size_t m_bits; }; class public_key_block : public std::vector { public: public_key_block(const std::string &armored); public_key_block(const epee::span buffer); std::string user_id() const; private: std::string m_user_id; }; class signature_rsa { public: enum type : uint8_t { binary_document = 0, canonical_text_document = 1, }; signature_rsa( uint8_t algorithm, std::pair hash_leftmost_bytes, uint8_t hash_algorithm, const std::vector &hashed_data, type type, s_expression signature, uint8_t version); static signature_rsa from_armored(const std::string &armored_signed_message); static signature_rsa from_base64(const std::string &base64); static signature_rsa from_buffer(const epee::span input); bool verify(const epee::span message, const public_key_rsa &public_key) const; private: s_expression hash_message(const epee::span message, size_t public_key_bits) const; std::vector hash_asn_object_id() const; s_expression hash_bytes(const epee::span message, size_t public_key_bits) const; static std::vector format_hashed_appendix( uint8_t algorithm, uint8_t hash_algorithm, const std::vector &hashed_data, uint8_t type, uint8_t version); private: uint8_t m_hash_algorithm; std::pair m_hash_leftmost_bytes; std::vector m_hashed_appendix; s_expression m_signature; type m_type; }; class message_armored { public: message_armored(const std::string &message_armored); operator epee::span() const; private: std::string m_message; }; } // namespace openpgp