void EncodedFSM::preProcess( const FSM& fsm ) { std::cout << "[EncodedFSM]: Preproccessing FSM ..." << std::endl; size_t k = _secretKeyPtr->k(); size_t lambda = _secretKeyPtr->lambda(); auto states = fsm.states(); std::map<size_t, PolyRingMatrixPtr> stateSecretKeys; // secret start key is already generated stateSecretKeys[0] = make_unique<PolyRingMatrix>( *_secretKeyPtr->start() ); // create new random key for every state except start state std::cout << "[EncodedFSM]: Creating encoded state keys ..." << std::endl; for ( size_t stateID = 1; stateID < fsm.numStates(); ++stateID ) { // key should be Z^n -> 1 polynomial in ring setting auto stateKey = PolyRingMatrix{1, 1, lambda, k}; stateKey.uniformInit(); stateSecretKeys[stateID] = make_unique<PolyRingMatrix>( stateKey ); } /** * Encode transitions using public matrices and secret start and terminal * states. */ auto G = GTrapdoor{k, lambda}; auto transitions = fsm.transitions(); std::cout << "[EncodedFSM]: Creating encoded transitions ..." << std::endl; for ( size_t stateID = 0; stateID < fsm.numStates(); ++stateID ) { auto transition = transitions[stateID]; // retrieve state keys auto currentStateKey = make_unique<PolyRingMatrix>( *stateSecretKeys[stateID] ); auto stateKeyFor0 = make_unique<PolyRingMatrix>( *stateSecretKeys[transition.nextStateFor0()]); auto stateKeyFor1 = make_unique<PolyRingMatrix>( *stateSecretKeys[transition.nextStateFor1()] ); // sample error auto e0 = _secretKeyPtr->buildTernaryTempMatrix( k, 1 ); auto e1 = _secretKeyPtr->buildTernaryTempMatrix( k, 1 ); // encode transitions auto t0 = *_secretKeyPtr->A0() * *currentStateKey + e0 + G * *stateKeyFor0; auto t1 = *_secretKeyPtr->A1() * *currentStateKey + e1 + G * *stateKeyFor1; _transitions.push_back( make_unique<PolyRingMatrix>( t0 ) ); _transitions.push_back( make_unique<PolyRingMatrix>( t1 ) ); // generate error for terminal transition auto et = _secretKeyPtr->buildTernaryTempMatrix( k, 1 ); // encode terminal transition if ( states[stateID].acceptState() ) { auto tt = *_secretKeyPtr->At() * *currentStateKey + et + G * *_secretKeyPtr->accept(); _acceptTransitions.push_back( make_unique<PolyRingMatrix>( tt ) ); } else { auto tt = *_secretKeyPtr->At() * *currentStateKey + et + G * *_secretKeyPtr->reject(); _rejectTransitions.push_back( make_unique<PolyRingMatrix>( tt ) ); } } std::cout << "[EncodedFSM]: DONE preprocessing" << std::endl; }