2021SC@SDUSC
现在来关注一下 CryptoContext的实现
首先这是各方案都需要使用到的公共库
位于pke/lib下
// Initialize global config variable
//序列化预运算
bool SERIALIZE_PRECOMPUTE = true;
template <typename Element>
// 在eval乘法时生成key
void CryptoContextImpl<Element>::EvalMultKeyGen(
const LPPrivateKey<Element> key) {
if (key == nullptr || Mismatched(key->GetCryptoContext()))
PALISADE_THROW(config_error,
"Key passed to EvalMultKeyGen were not generated with this "
"crypto context");
LPEvalKey<Element> k = GetEncryptionAlgorithm()->EvalMultKeyGen(key);
GetAllEvalMultKeys()[k->GetKeyTag()] = {k};
}
//生成keys
template <typename Element>
void CryptoContextImpl<Element>::EvalMultKeysGen(
const LPPrivateKey<Element> key) {
if (key == nullptr || Mismatched(key->GetCryptoContext()))
PALISADE_THROW(config_error,
"Key passed to EvalMultsKeyGen were not generated with this "
"crypto context");
const vector<LPEvalKey<Element>>& evalKeys =
GetEncryptionAlgorithm()->EvalMultKeysGen(key);
GetAllEvalMultKeys()[evalKeys[0]->GetKeyTag()] = evalKeys;
}
template <typename Element>
const vector<LPEvalKey<Element>>&
CryptoContextImpl<Element>::GetEvalMultKeyVector(const string& keyID) {
auto ekv = GetAllEvalMultKeys().find(keyID);
if (ekv == GetAllEvalMultKeys().end())
PALISADE_THROW(not_available_error,
"You need to use EvalMultKeyGen so that you have an "
"EvalMultKey available for this ID");
return ekv->second;
}
//得到所有乘法key
template <typename Element>
std::map<string, std::vector<LPEvalKey<Element>>>&
CryptoContextImpl<Element>::GetAllEvalMultKeys() {
return evalMultKeyMap();
}
template <typename Element>
void CryptoContextImpl<Element>::ClearEvalMultKeys() {
GetAllEvalMultKeys().clear();
}
/**
* ClearEvalMultKeys - flush EvalMultKey cache for a given id
* @param id
*/
template <typename Element>
void CryptoContextImpl<Element>::ClearEvalMultKeys(const string& id) {
auto kd = GetAllEvalMultKeys().find(id);
if (kd != GetAllEvalMultKeys().e