/** * @brief Return a copy of str, converting each escaped "%XX" to the char value */ inline std::string unescape(const std::string& str) { std::ostringstream result; for (size_t i = 0; i < str.size(); ++i) { if (str[i] == '%' && i + 2 < str.size()) { int hi = fromHexChar(str[i + 1]); int lo = fromHexChar(str[i + 2]); if (hi < 0 || lo < 0) // Invalid hex characters, so just keep the escaped string. result << str[i] << str[i + 1] << str[i + 2]; else result << (uint8_t)(16 * hi + lo); // Skip ahead past the escaped value. i += 2; } else // Just copy through. result << str[i]; } return result.str(); }
/** * Convert the hex string to bytes and call SHA256_Update. * @param context The SHA256_CTX to update. * @param hex The hex string. * @return The result from SHA256_Update. */ static int SHA256_UpdateHex(SHA256_CTX *context, const string& hex) { vector<uint8_t> data(hex.size() / 2); for (size_t i = 0; i < data.size(); ++i) data[i] = (uint8_t)(16 * fromHexChar(hex[2 * i]) + fromHexChar(hex[2 * i + 1])); return SHA256_Update(context, &data[0], data.size()); }