diff options
| author | luigi1111 <luigi1111w@gmail.com> | 2020-06-15 15:11:56 -0500 |
|---|---|---|
| committer | luigi1111 <luigi1111w@gmail.com> | 2020-06-15 15:11:56 -0500 |
| commit | c9ee76c2ee062dc9dc9488a68a8312622a5b35e0 (patch) | |
| tree | 8204b5c534f2f87de57a83b5c4c30d1dd775d663 /src/openpgp/openpgp.cpp | |
| parent | 94dbf179d5dcf7501d1e27f673dabb6f5cce61cb (diff) | |
| parent | ef5d855950910849c66edc94200c3b604ca06918 (diff) | |
| download | monzero-gui-c9ee76c2ee062dc9dc9488a68a8312622a5b35e0.tar.gz monzero-gui-c9ee76c2ee062dc9dc9488a68a8312622a5b35e0.tar.xz monzero-gui-c9ee76c2ee062dc9dc9488a68a8312622a5b35e0.zip | |
Merge pull request #2943
ef5d855 openpgp: implement public subkeys support (xiphon)
Diffstat (limited to 'src/openpgp/openpgp.cpp')
| -rw-r--r-- | src/openpgp/openpgp.cpp | 82 |
1 files changed, 42 insertions, 40 deletions
diff --git a/src/openpgp/openpgp.cpp b/src/openpgp/openpgp.cpp index 108990fb..437e0d99 100644 --- a/src/openpgp/openpgp.cpp +++ b/src/openpgp/openpgp.cpp @@ -93,15 +93,9 @@ std::string get_armored_block_contents(const std::string &text, const std::strin } // namespace -public_key_rsa::public_key_rsa(const std::string &armored) - : public_key_rsa(decode(armored)) -{ -} - -public_key_rsa::public_key_rsa(std::tuple<std::string, s_expression, size_t> params) - : m_expression(std::move(std::get<1>(params))) - , m_bits(std::get<2>(params)) - , m_user_id(std::move(std::get<0>(params))) +public_key_rsa::public_key_rsa(s_expression expression, size_t bits) + : m_expression(std::move(expression)) + , m_bits(bits) { } @@ -115,19 +109,14 @@ size_t public_key_rsa::bits() const return m_bits; } -std::string public_key_rsa::user_id() const -{ - return m_user_id; -} - -std::tuple<std::string, s_expression, size_t> public_key_rsa::decode(const std::string &armored) +public_key_block::public_key_block(const std::string &armored) + : public_key_block(epee::to_byte_span(epee::to_span(epee::string_encoding::base64_decode( + strip_line_breaks(get_armored_block_contents(armored, "BEGIN PGP PUBLIC KEY BLOCK")))))) { - const std::string buffer = epee::string_encoding::base64_decode( - strip_line_breaks(get_armored_block_contents(armored, "BEGIN PGP PUBLIC KEY BLOCK"))); - return decode(epee::to_byte_span(epee::to_span(buffer))); } -std::tuple<std::string, s_expression, size_t> public_key_rsa::decode(const epee::span<const uint8_t> buffer) +// TODO: Public-Key expiration, User ID and Public-Key certification, Subkey binding checks +public_key_block::public_key_block(const epee::span<const uint8_t> buffer) { packet_stream packets(buffer); @@ -136,38 +125,51 @@ std::tuple<std::string, s_expression, size_t> public_key_rsa::decode(const epee: { throw std::runtime_error("user id is missing"); } - std::string user_id(data->begin(), data->end()); + m_user_id.assign(data->begin(), data->end()); - data = packets.find_first(packet_tag::type::public_key); - if (data == nullptr) - { - throw std::runtime_error("public key is missing"); - } + const auto append_public_key = [this](const std::vector<uint8_t> &data) { + deserializer<std::vector<uint8_t>> serialized(data); - deserializer<std::vector<uint8_t>> serialized(*data); + const auto version = serialized.read_big_endian<uint8_t>(); + if (version != 4) + { + throw std::runtime_error("unsupported public key version"); + } - const auto version = serialized.read_big_endian<uint8_t>(); - if (version != 4) - { - throw std::runtime_error("unsupported public key version"); - } + /* const auto timestamp = */ serialized.read_big_endian<uint32_t>(); - /* const auto timestamp = */ serialized.read_big_endian<uint32_t>(); + const auto algorithm = serialized.read_big_endian<uint8_t>(); + if (algorithm != algorithm::rsa) + { + throw std::runtime_error("unsupported public key algorithm"); + } - const auto algorithm = serialized.read_big_endian<uint8_t>(); - if (algorithm != algorithm::rsa) + { + const mpi public_key_n = serialized.read_mpi(); + const mpi public_key_e = serialized.read_mpi(); + + emplace_back( + s_expression("(public-key (rsa (n %m) (e %m)))", public_key_n.get(), public_key_e.get()), + gcry_mpi_get_nbits(public_key_n.get())); + } + }; + + data = packets.find_first(packet_tag::type::public_key); + if (data == nullptr) { - throw std::runtime_error("unsupported public key algorithm"); + throw std::runtime_error("public key is missing"); } + append_public_key(*data); - const mpi public_key_n = serialized.read_mpi(); - const mpi public_key_e = serialized.read_mpi(); - - s_expression expression("(public-key (rsa (n %m) (e %m)))", public_key_n.get(), public_key_e.get()); + packets.for_each(packet_tag::type::public_subkey, append_public_key); +} - return {std::move(user_id), std::move(expression), gcry_mpi_get_nbits(public_key_n.get())}; +std::string public_key_block::user_id() const +{ + return m_user_id; } +// TODO: Signature expiration check signature_rsa::signature_rsa( uint8_t algorithm, std::pair<uint8_t, uint8_t> hash_leftmost_bytes, |
