void yxyDES2::CompressFuncS(char* _src48, char* _dst32) { char bTemp[8][6]={0}; char dstBits[4]={0}; for(int i=0;i<8;i++) { memcpy(bTemp[i],_src48+i*6,6); int iX = (bTemp[i][0])*2 + (bTemp[i][5]); int iY = 0; for(int j=1;j<5;j++) { iY += bTemp[i][j]<<(4-j); } Int2Bits(S_Box[i][iX][iY], dstBits); memcpy(_dst32 + i * 4, dstBits, 4); } }
// MUX circuit (for indexes) // input: start gate id, if or not the vs is final, # of bits, if or not vs is left, current layer#, # of gates to skip, // whether or not the higher layer's vs uses MUX_value circuit, // vs number from the leftmost (on the current layer) of the tournament starting from 0, // whether vs is a pair or a single, number of parties // output: final gate id int CP2PCircuit::CreateMUXIndex(int id, int is_final, int num_bits, int num_vbits, int is_left, int layer_no, int gates_skip, int is_moreMUXvalue, int* vs_no, int is_alone, int nParties) { int idx1=0; // Note: actual index starts from 1 int idx2=0; int* idx1_bits = new int[num_bits]; int* idx2_bits = new int[num_bits]; int tmpid = -1; int num_outgates = 0; // gets each input index's binary bits if (layer_no==0){ for (int i=0;i<num_bits;i++){ idx1_bits[i] = 0; } idx1 = vs_no[0]*2+1; Int2Bits(idx1, idx1_bits); if(!is_alone){ for (int i=0;i<num_bits;i++){ idx2_bits[i] = 0; } idx2 = vs_no[0]*2+2; Int2Bits(idx2, idx2_bits); } } // another MUX circuit (for index) for (int k=0;k<num_bits;k++){ (m_pGates+id)->type = G_XOR; m_nNumXORs++; (m_pGates+id)->p_num = 1; (m_pGates+id)->p_ids = New(1); tmpid = id + 1; (m_pGates+id)->p_ids[0] = tmpid; (m_pGates+tmpid)->right = id; // for provider and customer IN gates if (layer_no == 0){ if(!is_alone){ (m_pGates+id)->left = idx1_bits[k]; (m_pGates+id)->right = idx2_bits[k]; } else{ (m_pGates+id)->right = idx1_bits[k]; } } id++; (m_pGates+id)->type = G_AND; (m_pGates+id)->p_num = 1; (m_pGates+id)->p_ids = New(1); tmpid = id + 1; (m_pGates+id)->p_ids[0] = tmpid; (m_pGates+tmpid)->right = id; id++; (m_pGates+id)->type = G_XOR; m_nNumXORs++; // for provider and customer IN gates if (layer_no == 0 && !is_alone){ (m_pGates+id)->left = idx1_bits[k]; } if (!is_final){ if (is_left){ if(is_moreMUXvalue){ (m_pGates+id)->p_num = 2; (m_pGates+id)->p_ids = New(2); tmpid = id + (num_bits-k-1)*MUX_GATES+1 + num_vbits*CMP_GATES + num_vbits*MUX_GATES + MUX_GATES*k + gates_skip; (m_pGates+id)->p_ids[0] = tmpid; (m_pGates+tmpid)->left = id; tmpid = id + (num_bits-k-1)*MUX_GATES+1 + num_vbits*CMP_GATES + num_vbits*MUX_GATES + MUX_GATES*k +2 + gates_skip; (m_pGates+id)->p_ids[1] = tmpid; (m_pGates+tmpid)->left = id; } else{ (m_pGates+id)->p_num = 2; (m_pGates+id)->p_ids = New(2); tmpid = id + (num_bits-k-1)*MUX_GATES+1 + num_vbits*CMP_GATES + MUX_GATES*k + gates_skip; (m_pGates+id)->p_ids[0] = tmpid; (m_pGates+tmpid)->left = id; #ifdef _DEBUG cout << "last left index goes to:"<< tmpid << endl; #endif tmpid = id + (num_bits-k-1)*MUX_GATES+1 + num_vbits*CMP_GATES + MUX_GATES*k +2 + gates_skip; (m_pGates+id)->p_ids[1] = tmpid; (m_pGates+tmpid)->left = id; } } else{ if(is_moreMUXvalue){ (m_pGates+id)->p_num = 1; (m_pGates+id)->p_ids = New(1); tmpid = id + (num_bits-k-1)*MUX_GATES+1 + num_vbits*CMP_GATES + num_vbits*MUX_GATES + MUX_GATES*k; (m_pGates+id)->p_ids[0] = tmpid; (m_pGates+tmpid)->right = id; } else{ (m_pGates+id)->p_num = 1; (m_pGates+id)->p_ids = New(1); tmpid = id + (num_bits-k-1)*MUX_GATES+1 + num_vbits*CMP_GATES + MUX_GATES*k; (m_pGates+id)->p_ids[0] = tmpid; (m_pGates+tmpid)->right = id; #ifdef _DEBUG cout << "last right index goes to:"<< tmpid << endl; #endif } } } else{ // Final Output!!!! (m_pGates+id)->p_num = 1; (m_pGates+id)->p_ids = New(1); tmpid = m_vOutputStart[nParties-1]+num_outgates; (m_pGates+id)->p_ids[0] = tmpid; cout << "Output Gate id:" << id << endl; cout << "Final Output Gate id:" << tmpid << endl; (m_pGates+tmpid)->left = id; num_outgates++; } id++; } return id; }