#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace xrpl { Seed::~Seed() { secure_erase(buf_.data(), buf_.size()); } Seed::Seed(Slice const& slice) { if (slice.size() != buf_.size()) LogicError("Seed::Seed: invalid size"); std::memcpy(buf_.data(), slice.data(), buf_.size()); } Seed::Seed(uint128 const& seed) { if (seed.size() != buf_.size()) LogicError("Seed::Seed: invalid size"); std::memcpy(buf_.data(), seed.data(), buf_.size()); } //------------------------------------------------------------------------------ Seed randomSeed() { std::array buffer{}; beast::rngfill(buffer.data(), buffer.size(), crypto_prng()); Seed const seed(makeSlice(buffer)); secure_erase(buffer.data(), buffer.size()); return seed; } Seed generateSeed(std::string const& passPhrase) { sha512_half_hasher_s h; h(passPhrase.data(), passPhrase.size()); auto const digest = sha512_half_hasher::result_type(h); return Seed({digest.data(), 16}); } template <> std::optional parseBase58(std::string const& s) { auto const result = decodeBase58Token(s, TokenType::FamilySeed); if (result.empty()) return std::nullopt; if (result.size() != 16) return std::nullopt; return Seed(makeSlice(result)); } std::optional parseGenericSeed(std::string const& str, bool rfc1751) { if (str.empty()) return std::nullopt; if (parseBase58(str) || parseBase58(TokenType::NodePublic, str) || parseBase58(TokenType::AccountPublic, str) || parseBase58(TokenType::NodePrivate, str) || parseBase58(TokenType::AccountSecret, str)) { return std::nullopt; } { uint128 seed; if (seed.parseHex(str)) return Seed{Slice(seed.data(), seed.size())}; } if (auto seed = parseBase58(str)) return seed; if (rfc1751) { std::string key; if (RFC1751::getKeyFromEnglish(key, str) == 1) { Blob const blob(key.rbegin(), key.rend()); return Seed{uint128{blob}}; } } return generateSeed(str); } std::string seedAs1751(Seed const& seed) { std::string key; std::reverse_copy(seed.data(), seed.data() + 16, std::back_inserter(key)); std::string encodedKey; RFC1751::getEnglishFromKey(encodedKey, key); return encodedKey; } } // namespace xrpl