/************************************************* * Parse a SCAN-style algorithm name * *************************************************/ std::vector<std::string> parse_algorithm_name(const std::string& namex) { if(namex.find('(') == std::string::npos && namex.find(')') == std::string::npos) return std::vector<std::string>(1, namex); std::string name = namex, substring; std::vector<std::string> elems; u32bit level = 0; elems.push_back(name.substr(0, name.find('('))); name = name.substr(name.find('(')); for(std::string::const_iterator j = name.begin(); j != name.end(); ++j) { char c = *j; if(c == '(') ++level; if(c == ')') { if(level == 1 && j == name.end() - 1) { if(elems.size() == 1) elems.push_back(substring.substr(1)); else elems.push_back(substring); return elems; } if(level == 0 || (level == 1 && j != name.end() - 1)) throw Invalid_Algorithm_Name(namex); --level; } if(c == ',' && level == 1) { if(elems.size() == 1) elems.push_back(substring.substr(1)); else elems.push_back(substring); substring.clear(); } else substring += c; } if(substring != "") throw Invalid_Algorithm_Name(namex); return elems; }
/* * Parse a SCAN-style algorithm name */ std::vector<std::string> parse_algorithm_name(const std::string& namex) { if(namex.find('(') == std::string::npos && namex.find(')') == std::string::npos) return std::vector<std::string>(1, namex); std::string name = namex, substring; std::vector<std::string> elems; size_t level = 0; elems.push_back(name.substr(0, name.find('('))); name = name.substr(name.find('(')); for(auto i = name.begin(); i != name.end(); ++i) { char c = *i; if(c == '(') ++level; if(c == ')') { if(level == 1 && i == name.end() - 1) { if(elems.size() == 1) elems.push_back(substring.substr(1)); else elems.push_back(substring); return elems; } if(level == 0 || (level == 1 && i != name.end() - 1)) throw Invalid_Algorithm_Name(namex); --level; } if(c == ',' && level == 1) { if(elems.size() == 1) elems.push_back(substring.substr(1)); else elems.push_back(substring); substring.clear(); } else substring += c; } if(!substring.empty()) throw Invalid_Algorithm_Name(namex); return elems; }
/* * See if the named compression algo is available */ bool CMS_Encoder::can_compress_with(const std::string& algo) { if(algo == "") throw Invalid_Algorithm_Name("Empty string to can_compress_with"); #if defined(BOTAN_HAS_COMPRESSOR_ZLIB) if(algo == "Zlib") return true; #endif return false; }