diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2018-08-27 08:43:56 +0000 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2018-09-12 09:26:09 +0000 |
commit | 07ec748c8245b42de0ec9964b2f0062c0034f2f8 (patch) | |
tree | 7e7cd85956f83c779f63afc2b6ecddbefbb30fd1 /contrib/epee/include | |
parent | Merge pull request #4223 (diff) | |
download | monero-07ec748c8245b42de0ec9964b2f0062c0034f2f8.tar.xz |
wipeable_string: add hex_to_pod function
Diffstat (limited to 'contrib/epee/include')
-rw-r--r-- | contrib/epee/include/hex.h | 1 | ||||
-rw-r--r-- | contrib/epee/include/wipeable_string.h | 19 |
2 files changed, 19 insertions, 1 deletions
diff --git a/contrib/epee/include/hex.h b/contrib/epee/include/hex.h index 02600c320..901c666a9 100644 --- a/contrib/epee/include/hex.h +++ b/contrib/epee/include/hex.h @@ -44,6 +44,7 @@ namespace epee static std::string string(const span<const std::uint8_t> src); //! \return A epee::wipeable_string containing hex of `src`. static epee::wipeable_string wipeable_string(const span<const std::uint8_t> src); + template<typename T> static epee::wipeable_string wipeable_string(const T &pod) { return wipeable_string(span<const uint8_t>((const uint8_t*)&pod, sizeof(pod))); } //! \return An array containing hex of `src`. template<std::size_t N> diff --git a/contrib/epee/include/wipeable_string.h b/contrib/epee/include/wipeable_string.h index 4cebe5fdf..31854fe2e 100644 --- a/contrib/epee/include/wipeable_string.h +++ b/contrib/epee/include/wipeable_string.h @@ -28,10 +28,11 @@ #pragma once -#include <boost/optional/optional_fwd.hpp> +#include <boost/optional/optional.hpp> #include <stddef.h> #include <vector> #include <string> +#include "memwipe.h" #include "fnv1.h" namespace epee @@ -65,6 +66,8 @@ namespace epee void trim(); void split(std::vector<wipeable_string> &fields) const; boost::optional<wipeable_string> parse_hexstr() const; + template<typename T> inline bool hex_to_pod(T &pod) const; + template<typename T> inline bool hex_to_pod(tools::scrubbed<T> &pod) const { return hex_to_pod(unwrap(pod)); } void resize(size_t sz); void reserve(size_t sz); void clear(); @@ -79,6 +82,20 @@ namespace epee private: std::vector<char> buffer; }; + + template<typename T> inline bool wipeable_string::hex_to_pod(T &pod) const + { + static_assert(std::is_pod<T>::value, "expected pod type"); + if (size() != sizeof(T) * 2) + return false; + boost::optional<epee::wipeable_string> blob = parse_hexstr(); + if (!blob) + return false; + if (blob->size() != sizeof(T)) + return false; + pod = *(const T*)blob->data(); + return true; + } } namespace std |