2016-02-18 23:57:43 +03:00
|
|
|
#include "util.h"
|
2016-02-19 19:18:01 +03:00
|
|
|
#include <openssl/evp.h>
|
|
|
|
#include <openssl/ssl.h>
|
2016-02-18 23:57:43 +03:00
|
|
|
#include "Log.h"
|
|
|
|
#include "Family.h"
|
|
|
|
|
|
|
|
namespace i2p
|
|
|
|
{
|
|
|
|
namespace data
|
|
|
|
{
|
|
|
|
Families::Families ()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Families::~Families ()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void Families::LoadCertificate (const std::string& filename)
|
|
|
|
{
|
|
|
|
SSL_CTX * ctx = SSL_CTX_new (TLSv1_method ());
|
|
|
|
int ret = SSL_CTX_use_certificate_file (ctx, filename.c_str (), SSL_FILETYPE_PEM);
|
|
|
|
if (ret)
|
|
|
|
{
|
|
|
|
SSL * ssl = SSL_new (ctx);
|
|
|
|
X509 * cert = SSL_get_certificate (ssl);
|
|
|
|
// verify
|
|
|
|
if (cert)
|
|
|
|
{
|
|
|
|
// extract issuer name
|
|
|
|
char name[100];
|
|
|
|
X509_NAME_oneline (X509_get_issuer_name(cert), name, 100);
|
|
|
|
auto pkey = X509_get_pubkey (cert);
|
|
|
|
int keyType = EVP_PKEY_type(pkey->type);
|
|
|
|
switch (keyType)
|
|
|
|
{
|
|
|
|
case EVP_PKEY_DSA:
|
|
|
|
// TODO:
|
|
|
|
break;
|
|
|
|
case EVP_PKEY_EC:
|
|
|
|
{
|
|
|
|
//EC_KEY * ecKey = EVP_PKEY_get0_EC_KEY (pkey);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
LogPrint (eLogWarning, "Family: Certificate key type ", keyType, " is not supported");
|
|
|
|
}
|
2016-02-19 00:28:43 +03:00
|
|
|
EVP_PKEY_free (pkey);
|
2016-02-18 23:57:43 +03:00
|
|
|
}
|
|
|
|
SSL_free (ssl);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
LogPrint (eLogError, "Family: Can't open certificate file ", filename);
|
|
|
|
SSL_CTX_free (ctx);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Families::LoadCertificates ()
|
|
|
|
{
|
|
|
|
boost::filesystem::path familyDir = i2p::util::filesystem::GetCertificatesDir() / "family";
|
|
|
|
|
|
|
|
if (!boost::filesystem::exists (familyDir)) return;
|
|
|
|
int numCertificates = 0;
|
|
|
|
boost::filesystem::directory_iterator end; // empty
|
|
|
|
for (boost::filesystem::directory_iterator it (familyDir); it != end; ++it)
|
|
|
|
{
|
|
|
|
if (boost::filesystem::is_regular_file (it->status()) && it->path ().extension () == ".crt")
|
|
|
|
{
|
|
|
|
LoadCertificate (it->path ().string ());
|
|
|
|
numCertificates++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (numCertificates > 0)
|
|
|
|
LogPrint (eLogInfo, "Family: ", numCertificates, " certificates loaded");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|