blob: 5156cf6d526c599f9fb1a6541cc71903e2853461 [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "shill/nss.h"
#include <base/logging.h>
#include <base/string_number_conversions.h>
#include <base/string_util.h>
#include <base/stringprintf.h>
#include "shill/glib.h"
#include "shill/scope_logger.h"
using base::HexEncode;
using base::StringPrintf;
using std::string;
using std::vector;
namespace shill {
namespace {
base::LazyInstance<NSS> g_nss = LAZY_INSTANCE_INITIALIZER;
const char kCertfileBasename[] = "/tmp/nss-cert.";
const char kNSSGetCertScript[] = SCRIPTDIR "/nss-get-cert";
} // namespace
NSS::NSS()
: glib_(NULL) {
SLOG(Crypto, 2) << __func__;
}
NSS::~NSS() {
SLOG(Crypto, 2) << __func__;
}
// static
NSS *NSS::GetInstance() {
return g_nss.Pointer();
}
void NSS::Init(GLib *glib) {
glib_ = glib;
}
FilePath NSS::GetPEMCertfile(const string &nickname, const vector<char> &id) {
return GetCertfile(nickname, id, "pem");
}
FilePath NSS::GetDERCertfile(const string &nickname, const vector<char> &id) {
return GetCertfile(nickname, id, "der");
}
FilePath NSS::GetCertfile(
const string &nickname, const vector<char> &id, const string &type) {
CHECK(glib_);
string filename =
kCertfileBasename + StringToLowerASCII(HexEncode(&id[0], id.size()));
char *argv[] = {
const_cast<char *>(kNSSGetCertScript),
const_cast<char *>(nickname.c_str()),
const_cast<char *>(type.c_str()),
const_cast<char *>(filename.c_str()),
NULL
};
char *envp[1] = { NULL };
int status = 0;
GError *error = NULL;
if (!glib_->SpawnSync(NULL,
argv,
envp,
static_cast<GSpawnFlags>(0),
NULL,
NULL,
NULL,
NULL,
&status,
&error)) {
LOG(ERROR) << "nss-get-cert failed: "
<< glib_->ConvertErrorToMessage(error);
return FilePath();
}
if (!WIFEXITED(status) || WEXITSTATUS(status)) {
LOG(ERROR) << "nss-get-cert failed, status=" << status;
return FilePath();
}
return FilePath(filename);
}
} // namespace shill