diff options
| author | xiphon <xiphon@protonmail.com> | 2020-04-06 16:57:32 +0000 |
|---|---|---|
| committer | xiphon <xiphon@protonmail.com> | 2020-04-12 21:34:22 +0000 |
| commit | 5f27a45910fcba954e652f3214bc489f03262346 (patch) | |
| tree | 151d35b69a466881628096f7130eefdd02758596 /src/openpgp/openpgp.h | |
| parent | 042400b83fdea6c18ea8a7970cb0a8af2070c03a (diff) | |
| download | monzero-gui-5f27a45910fcba954e652f3214bc489f03262346.tar.gz monzero-gui-5f27a45910fcba954e652f3214bc489f03262346.tar.xz monzero-gui-5f27a45910fcba954e652f3214bc489f03262346.zip | |
'--verify-update', shasum support, OpenPGP signatures verification
Diffstat (limited to 'src/openpgp/openpgp.h')
| -rw-r--r-- | src/openpgp/openpgp.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/openpgp/openpgp.h b/src/openpgp/openpgp.h new file mode 100644 index 00000000..cef003ed --- /dev/null +++ b/src/openpgp/openpgp.h @@ -0,0 +1,122 @@ +// Copyright (c) 2020, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#include <vector> + +#include <gcrypt.h> + +#include <span.h> + +#include "s_expression.h" + +namespace openpgp +{ + +enum algorithm : uint8_t +{ + rsa = 1, +}; + +class public_key_rsa +{ +public: + public_key_rsa(const std::string &armored); + public_key_rsa(std::tuple<std::string, s_expression, size_t> params); + + size_t bits() const; + const gcry_sexp_t &get() const; + std::string user_id() const; + +private: + static std::tuple<std::string, s_expression, size_t> decode(const std::string &armored); + static std::tuple<std::string, s_expression, size_t> decode(const epee::span<const uint8_t> buffer); + +private: + s_expression m_expression; + size_t m_bits; + 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<uint8_t, uint8_t> hash_leftmost_bytes, + uint8_t hash_algorithm, + const std::vector<uint8_t> &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<const uint8_t> input); + + bool verify(const epee::span<const uint8_t> message, const public_key_rsa &public_key) const; + +private: + s_expression hash_message(const epee::span<const uint8_t> message, size_t public_key_bits) const; + std::vector<uint8_t> hash_asn_object_id() const; + s_expression hash_bytes(const epee::span<const uint8_t> message, size_t public_key_bits) const; + + static std::vector<uint8_t> format_hashed_appendix( + uint8_t algorithm, + uint8_t hash_algorithm, + const std::vector<uint8_t> &hashed_data, + uint8_t type, + uint8_t version); + +private: + uint8_t m_hash_algorithm; + std::pair<uint8_t, uint8_t> m_hash_leftmost_bytes; + std::vector<uint8_t> 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 uint8_t>() const; + +private: + std::string m_message; +}; + +} // namespace openpgp |
