Keep private keys in memory instead of sqlite3 database
Change-Id: I1a9381218c786e9f840705af5b0584395e34a522
Refs: #3812
diff --git a/src/group-manager-db.cpp b/src/group-manager-db.cpp
index 0f8640b..6b0eb2d 100644
--- a/src/group-manager-db.cpp
+++ b/src/group-manager-db.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
- * Copyright (c) 2014-2015, Regents of the University of California
+ * Copyright (c) 2014-2017, Regents of the University of California
*
* This file is part of ndn-group-encrypt (Group-based Encryption Protocol for NDN).
* See AUTHORS.md for complete list of ndn-group-encrypt authors and contributors.
@@ -61,8 +61,7 @@
" ekeys( \n"
" ekey_id INTEGER PRIMARY KEY, \n"
" ekey_name BLOB NOT NULL, \n"
- " pub_key BLOB NOT NULL, \n"
- " pri_key BLOB NOT NULL \n"
+ " pub_key BLOB NOT NULL \n"
" ); \n"
"CREATE UNIQUE INDEX IF NOT EXISTS \n"
" ekeyNameIndex ON ekeys(ekey_name); \n";
@@ -118,6 +117,7 @@
public:
sqlite3* m_database;
+ std::map<Name, Buffer> m_priKeyBase;
};
GroupManagerDB::GroupManagerDB(const std::string& dbPath)
@@ -342,12 +342,13 @@
GroupManagerDB::addEKey(const Name& eKeyName, const Buffer& pubKey, const Buffer& priKey)
{
Sqlite3Statement statement(m_impl->m_database,
- "INSERT INTO ekeys(ekey_name, pub_key, pri_key) values (?, ?, ?)");
+ "INSERT INTO ekeys(ekey_name, pub_key) values (?, ?)");
statement.bind(1, eKeyName.wireEncode(), SQLITE_TRANSIENT);
statement.bind(2, pubKey.buf(), pubKey.size(), SQLITE_TRANSIENT);
- statement.bind(3, priKey.buf(), priKey.size(), SQLITE_TRANSIENT);
if (statement.step() != SQLITE_DONE)
BOOST_THROW_EXCEPTION(Error("Cannot add the EKey to database"));
+
+ m_impl->m_priKeyBase[eKeyName] = priKey;
}
std::tuple<Buffer, Buffer>
@@ -360,12 +361,11 @@
Buffer pubKey, priKey;
if (statement.step() == SQLITE_ROW) {
pubKey = Buffer(statement.getBlob(2), statement.getSize(2));
- priKey = Buffer(statement.getBlob(3), statement.getSize(3));
}
else {
BOOST_THROW_EXCEPTION(Error("Cannot get the result from database"));
}
- return std::make_tuple(pubKey, priKey);
+ return std::make_tuple(pubKey, m_impl->m_priKeyBase[eKeyName]);
}
void
@@ -373,6 +373,7 @@
{
Sqlite3Statement statement(m_impl->m_database, "DELETE FROM ekeys");
statement.step();
+ m_impl->m_priKeyBase.clear();
}
void
@@ -382,6 +383,9 @@
"DELETE FROM ekeys WHERE ekey_name=?");
statement.bind(1, eKeyName.wireEncode(), SQLITE_TRANSIENT);
statement.step();
+
+ auto search = m_impl->m_priKeyBase.find(eKeyName);
+ m_impl->m_priKeyBase.erase(search);
}
} // namespace gep