mini-keyctl cleanup: keep local funcitons static

Test: build
Bug: None
Change-Id: If58f496173d8afff9eb81ff7f5975ddaac765d18
This commit is contained in:
Victor Hsieh 2019-03-15 11:36:39 -07:00
parent 9555bd40ce
commit 582c7b9b82
2 changed files with 48 additions and 55 deletions

View file

@ -36,12 +36,59 @@
static constexpr int kMaxCertSize = 4096;
std::vector<std::string> SplitBySpace(const std::string& s) {
static std::vector<std::string> SplitBySpace(const std::string& s) {
std::istringstream iss(s);
return std::vector<std::string>{std::istream_iterator<std::string>{iss},
std::istream_iterator<std::string>{}};
}
// Find the keyring id. Because request_key(2) syscall is not available or the key is
// kernel keyring, the id is looked up from /proc/keys. The keyring description may contain other
// information in the descritption section depending on the key type, only the first word in the
// keyring description is used for searching.
static bool GetKeyringId(const std::string& keyring_desc, key_serial_t* keyring_id) {
if (!keyring_id) {
LOG(ERROR) << "keyring_id is null";
return false;
}
// If the keyring id is already a hex number, directly convert it to keyring id
try {
key_serial_t id = std::stoi(keyring_desc, nullptr, 16);
*keyring_id = id;
return true;
} catch (const std::exception& e) {
LOG(INFO) << "search /proc/keys for keyring id";
}
// Only keys allowed by SELinux rules will be shown here.
std::ifstream proc_keys_file("/proc/keys");
if (!proc_keys_file.is_open()) {
PLOG(ERROR) << "Failed to open /proc/keys";
return false;
}
std::string line;
while (getline(proc_keys_file, line)) {
std::vector<std::string> tokens = SplitBySpace(line);
if (tokens.size() < 9) {
continue;
}
std::string key_id = tokens[0];
std::string key_type = tokens[7];
// The key description may contain space.
std::string key_desc_prefix = tokens[8];
// The prefix has a ":" at the end
std::string key_desc_pattern = keyring_desc + ":";
if (key_type != "keyring" || key_desc_prefix != key_desc_pattern) {
continue;
}
*keyring_id = std::stoi(key_id, nullptr, 16);
return true;
}
return false;
}
int AddCertsFromDir(const std::string& type, const std::string& desc_prefix,
const std::string& cert_dir, const std::string& keyring) {
key_serial_t keyring_id;
@ -89,49 +136,6 @@ int AddCertsFromDir(const std::string& type, const std::string& desc_prefix,
return 0;
}
bool GetKeyringId(const std::string& keyring_desc, key_serial_t* keyring_id) {
if (!keyring_id) {
LOG(ERROR) << "keyring_id is null";
return false;
}
// If the keyring id is already a hex number, directly convert it to keyring id
try {
key_serial_t id = std::stoi(keyring_desc, nullptr, 16);
*keyring_id = id;
return true;
} catch (const std::exception& e) {
LOG(INFO) << "search /proc/keys for keyring id";
}
// Only keys allowed by SELinux rules will be shown here.
std::ifstream proc_keys_file("/proc/keys");
if (!proc_keys_file.is_open()) {
PLOG(ERROR) << "Failed to open /proc/keys";
return false;
}
std::string line;
while (getline(proc_keys_file, line)) {
std::vector<std::string> tokens = SplitBySpace(line);
if (tokens.size() < 9) {
continue;
}
std::string key_id = tokens[0];
std::string key_type = tokens[7];
// The key description may contain space.
std::string key_desc_prefix = tokens[8];
// The prefix has a ":" at the end
std::string key_desc_pattern = keyring_desc + ":";
if (key_type != "keyring" || key_desc_prefix != key_desc_pattern) {
continue;
}
*keyring_id = std::stoi(key_id, nullptr, 16);
return true;
}
return false;
}
int Unlink(key_serial_t key, const std::string& keyring) {
key_serial_t keyring_id;
if (!GetKeyringId(keyring, &keyring_id)) {

View file

@ -23,11 +23,6 @@
int AddCertsFromDir(const std::string& type, const std::string& desc_prefix,
const std::string& cert_dir, const std::string& keyring);
// Add all the certs from directory path to keyring with keyring_id. Returns the number of keys
// added. Returns non-zero if any error happens.
int AddKeys(const std::string& path, const key_serial_t keyring_id, const std::string& type,
const std::string& desc, int start_index);
// Add key to a keyring. Returns non-zero if error happens.
int Add(const std::string& type, const std::string& desc, const std::string& data,
const std::string& keyring);
@ -41,11 +36,5 @@ int Unlink(key_serial_t key, const std::string& keyring);
// Apply key-linking to a keyring. Return non-zero if error happens.
int RestrictKeyring(const std::string& keyring);
// Find the keyring id. Because request_key(2) syscall is not available or the key is
// kernel keyring, the id is looked up from /proc/keys. The keyring description may contain other
// information in the descritption section depending on the key type, only the first word in the
// keyring description is used for searching.
bool GetKeyringId(const std::string& keyring_desc, key_serial_t* keyring_id);
// Retrieves a key's security context. Return the context string, or empty string on error.
std::string RetrieveSecurityContext(key_serial_t key);