Cleaned string helpers

This commit is contained in:
David Rupprecht 2021-09-16 11:53:12 +02:00 committed by Andre Puschmann
parent 36af79b9d5
commit e8a464228d
4 changed files with 58 additions and 62 deletions

View File

@ -15,6 +15,8 @@
#include "srsran/srslog/bundled/fmt/format.h"
#include <algorithm>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <string>
#include <vector>
@ -119,6 +121,49 @@ const char* to_c_str(fmt::basic_memory_buffer<char, N>& mem_buffer)
return mem_buffer.data();
}
static inline bool replace(std::string& str, const std::string& from, const std::string& to)
{
size_t start_pos = str.find(from);
if (start_pos == std::string::npos)
return false;
str.replace(start_pos, from.length(), to);
return true;
}
static inline std::vector<std::string> split_string(const std::string& str, char delimiter)
{
std::vector<std::string> tokens;
std::string token;
std::istringstream tokenStream(str);
while (std::getline(tokenStream, token, delimiter)) {
tokens.push_back(token);
}
return tokens;
}
static inline void get_uint_vec_from_hex_str(const std::string& key_str, uint8_t* key, uint len)
{
const char* pos = key_str.c_str();
for (uint count = 0; count < len; count++) {
sscanf(pos, "%2hhx", &key[count]);
pos += 2;
}
return;
}
static inline std::string hex_string(uint8_t* hex, int size)
{
std::stringstream ss;
ss << std::hex << std::setfill('0');
for (int i = 0; i < size; i++) {
ss << std::setw(2) << static_cast<unsigned>(hex[i]);
}
return ss.str();
}
} // namespace srsran
#endif // SRSRAN_STRING_HELPERS_H

View File

@ -24,7 +24,7 @@
#include "srsran/interfaces/epc_interfaces.h"
#include "srsran/srslog/srslog.h"
#include <cstddef>
#include <fstream>
#include <map>
#define LTE_FDD_ENB_IND_HE_N_BITS 5
@ -94,7 +94,6 @@ private:
void resync_sqn_milenage(hss_ue_ctx_t* ue_ctx, uint8_t* auts);
void resync_sqn_xor(hss_ue_ctx_t* ue_ctx, uint8_t* auts);
std::vector<std::string> split_string(const std::string& str, char delimiter);
void get_uint_vec_from_hex_str(const std::string& key_str, uint8_t* key, uint len);
void increment_ue_sqn(hss_ue_ctx_t* ue_ctx);

View File

@ -11,6 +11,7 @@
*/
#include "srsepc/hdr/hss/hss.h"
#include "srsran/common/security.h"
#include "srsran/common/string_helpers.h"
#include <arpa/inet.h>
#include <inttypes.h> // for printing uint64_t
#include <iomanip>
@ -94,7 +95,7 @@ bool hss::read_db_file(std::string db_filename)
while (std::getline(m_db_file, line)) {
if (line[0] != '#' && line.length() > 0) {
uint column_size = 10;
std::vector<std::string> split = split_string(line, ',');
std::vector<std::string> split = srsran::split_string(line, ',');
if (split.size() != column_size) {
m_logger.error("Error parsing UE database. Wrong number of columns in .csv");
m_logger.error("Columns: %zd, Expected %d.", split.size(), column_size);
@ -115,20 +116,20 @@ bool hss::read_db_file(std::string db_filename)
return false;
}
ue_ctx->imsi = strtoull(split[2].c_str(), nullptr, 10);
get_uint_vec_from_hex_str(split[3], ue_ctx->key, 16);
srsran::get_uint_vec_from_hex_str(split[3], ue_ctx->key, 16);
if (split[4] == std::string("op")) {
ue_ctx->op_configured = true;
get_uint_vec_from_hex_str(split[5], ue_ctx->op, 16);
srsran::get_uint_vec_from_hex_str(split[5], ue_ctx->op, 16);
srsran::compute_opc(ue_ctx->key, ue_ctx->op, ue_ctx->opc);
} else if (split[4] == std::string("opc")) {
ue_ctx->op_configured = false;
get_uint_vec_from_hex_str(split[5], ue_ctx->opc, 16);
srsran::get_uint_vec_from_hex_str(split[5], ue_ctx->opc, 16);
} else {
m_logger.error("Neither OP nor OPc configured.");
return false;
}
get_uint_vec_from_hex_str(split[6], ue_ctx->amf, 2);
get_uint_vec_from_hex_str(split[7], ue_ctx->sqn, 6);
srsran::get_uint_vec_from_hex_str(split[6], ue_ctx->amf, 2);
srsran::get_uint_vec_from_hex_str(split[7], ue_ctx->sqn, 6);
m_logger.debug("Added user from DB, IMSI: %015" PRIu64 "", ue_ctx->imsi);
m_logger.debug(ue_ctx->key, 16, "User Key : ");
@ -214,19 +215,19 @@ bool hss::write_db_file(std::string db_filename)
m_db_file << ",";
m_db_file << std::setfill('0') << std::setw(15) << it->second->imsi;
m_db_file << ",";
m_db_file << hex_string(it->second->key, 16);
m_db_file << srsran::hex_string(it->second->key, 16);
m_db_file << ",";
if (it->second->op_configured) {
m_db_file << "op,";
m_db_file << hex_string(it->second->op, 16);
m_db_file << srsran::hex_string(it->second->op, 16);
} else {
m_db_file << "opc,";
m_db_file << hex_string(it->second->opc, 16);
m_db_file << srsran::hex_string(it->second->opc, 16);
}
m_db_file << ",";
m_db_file << hex_string(it->second->amf, 2);
m_db_file << srsran::hex_string(it->second->amf, 2);
m_db_file << ",";
m_db_file << hex_string(it->second->sqn, 6);
m_db_file << srsran::hex_string(it->second->sqn, 6);
m_db_file << ",";
m_db_file << it->second->qci;
if (it->second->static_ip_addr != "0.0.0.0") {
@ -611,41 +612,6 @@ hss_ue_ctx_t* hss::get_ue_ctx(uint64_t imsi)
return ue_ctx_it->second.get();
}
/* Helper functions*/
std::vector<std::string> hss::split_string(const std::string& str, char delimiter)
{
std::vector<std::string> tokens;
std::string token;
std::istringstream tokenStream(str);
while (std::getline(tokenStream, token, delimiter)) {
tokens.push_back(token);
}
return tokens;
}
void hss::get_uint_vec_from_hex_str(const std::string& key_str, uint8_t* key, uint len)
{
const char* pos = key_str.c_str();
for (uint count = 0; count < len; count++) {
sscanf(pos, "%2hhx", &key[count]);
pos += 2;
}
return;
}
std::string hss::hex_string(uint8_t* hex, int size)
{
std::stringstream ss;
ss << std::hex << std::setfill('0');
for (int i = 0; i < size; i++) {
ss << std::setw(2) << static_cast<unsigned>(hex[i]);
}
return ss.str();
}
std::map<std::string, uint64_t> hss::get_ip_to_imsi(void) const
{
return m_ip_to_imsi;

View File

@ -258,20 +258,6 @@ private:
return true;
}
std::vector<uint8_t> split_string(const std::string input)
{
std::vector<uint8_t> list;
std::stringstream ss(input);
while (ss.good()) {
std::string substr;
getline(ss, substr, ',');
if (not substr.empty()) {
list.push_back(strtol(substr.c_str(), nullptr, 10));
}
}
return list;
}
// NAS Idle procedures
class plmn_search_proc; // PLMN selection proc (fwd declared)