How To Migrate A User Project From Palisade To OpenFHE
This migration guide describes how to migrate user projects from Palisade to OpenFHE. The guide uses src/pke/examples/simple-integers.cpp as an example.
Before making any changes to simple-integers.cpp:
Install OpenFHE (see instructions here)
Change the
CMakeLists.txt
for your project: replace all instances of Palisade with OpenFHE and all instances of PALISADE with OPENFHE
Code changes (in src/pke/examples/simple-integers.cpp):
1. Generate CryptoContext (see instructions here). You don’t need to set multiple arguments anymore to generate CryptoContext. A separate parameter object is required instead and every parameter in the object has a default value. So, set only those parameters that you want to change. For this example, we changed two of them:
// declare the parameter object
CCParams<CryptoContextBFVRNS> parameters;
// set the desired parameter values
parameters.SetPlaintextModulus(65537);
parameters.SetMultiplicativeDepth(2);
All parameter values can be seen by simply printing the parameter object:
// print all parameters for CryptoContext
std::cout << parameters << std::endl;
And you get something similar to this line:
scheme: BFVRNS; ptModulus: 65537; digitSize: 0; standardDeviation: 3.19; secretKeyDist: UNIFORM_TERNARY; maxRelinSkDeg: 2; ksTech: BV; scalTech: NORESCALE; batchSize: 0; firstModSize: 60; numLargeDigits: 0; multiplicativeDepth:2; scalingModSize: 60; securityLevel: HEStd_128_classic; ringDim: 0; evalAddCount: 0; keySwitchCount: 0; encryptionTechnique: STANDARD; multiplicationTechnique: HPSPOVERQLEVELED; multiHopModSize: 0; PREMode: INDCPA; multipartyMode: FIXED_NOISE_MULTIPARTY; executionMode: EXEC_EVALUATION; decryptionNoiseMode: FIXED_NOISE_DECRYPT; noiseEstimate: 0; desiredPrecision: 0; statisticalSecurity: 30; numAdversarialQueries: 1
The parameter object is created using a template and for BFV it should be
CCParams<CryptoContextBFVRNS> parameters;
All other changes are mostly cosmetic as some types and functions were renamed:
KeyPair<DCRTPoly>
instead ofLPKeyPair<DCRTPoly>
EvalRotateKeyGen()
instead ofEvalAtIndexKeyGen()
EvalRotate()
instead ofEvalAtIndex()
GetScheme()
instead ofGetEncryptionAlgorithm()
GetNoiseScaleDeg()
instead ofGetDepth()
After you make all the changes mentioned above, you can link and run the example.
Palisade-OpenFHE type mappings and new parameter types
In Palisade |
In OpenFHE |
---|---|
Arguments to cryptoContext->Enable() |
|
ENCRYPTION |
PKE |
PRE |
PRE |
SHE |
LEVELEDSHE |
ADVANCEDSHE |
ADVANCEDSHE |
MULTIPARTY |
MULTIPARTY |
FHE |
FHE |
MODE |
SecretKeyDist |
RLWE |
GAUSSIAN |
OPTIMIZED |
UNIFORM_TERNARY |
SPARSE |
SPARSE_TERNARY |
KeySwitchTechnique |
KeySwitchTechnique |
HYBRID |
HYBRID |
BV |
BV |
GHS |
No longer supported |
RescalingTechnique |
ScalingTechnique |
APPROXRESCALE |
FIXEDMANUAL |
APPROXAUTO |
FIXEDAUTO |
EXACTRESCALE |
FLEXIBLEAUTO |
FLEXIBLEAUTOEXT (new) |
|
NORESCALE (new) |
|
BFV CryptoContext Call |
MultiplicationTechnique (BFV only) |
genCryptoContextBFVrnsB |
BEHZ |
genCryptoContextBFVrns |
HPS |
HPSPOVERQ (new) |
|
HPSPOVERQLEVELED (new) |
If your project includes serialization, then the following files should be included in addition to “openfhe.h”:
To serialize ciphertext:
#include "ciphertext-ser.h"
To serialize cryptocontext:
#include "cryptocontext-ser.h"
To serialize key(s):
#include "key/key-ser.h"
… and the scheme-related serialization header file
for CKKS
#include "scheme/ckksrns/ckksrns-ser.h"
for BGV
#include "scheme/bgvrns/bgvrns-ser.h"
for BFV
#include "scheme/bfvrns/bfvrns-ser.h"
See the code difference in simple-integers.cpp
before and after the migration.
For advanced users: see the code difference in openfhe-genomic-examples
before and after the migration.