public double AddWatermarkSubstring(string key_bit, string hmac_sub, int key_idx, int lut_idx)
        {
            Dictionary <string, string> original_tt = new Dictionary <string, string>(TruthTable);
            Dictionary <string, string> tt_sec      = new Dictionary <string, string>();

            // is the truth table implemented in minterms or maxterms?
            string min_maxterm = "1";

            // reverse keybit
            string incorrect_keybit = key_bit == "1" ? "0" : "1";

            foreach (KeyValuePair <string, string> tt_line in original_tt)
            {
                if (tt_line.Value == "0")
                {
                    min_maxterm = "0";
                }
            }

            while (TruthTable.Count > 0)
            {
                string tt_entry = TruthTable.Keys.ElementAt <string>(0);
                string tt_value = TruthTable[tt_entry];
                TruthTable.Remove(tt_entry);

                tt_entry = tt_entry.Insert(lut_idx, key_bit);
                tt_sec.Add(tt_entry, tt_value);
            }

            // insert the HMAC, baby!
            for (int i = 0; i < hmac_sub.Length; i++)
            {
                string tt_line = Convert.ToString(i, 2).PadLeft(NumInputs, '0');

                tt_line = tt_line.Insert(lut_idx, incorrect_keybit);

                // maintain a min/maxterm representation
                if (hmac_sub[i].ToString() == min_maxterm)
                {
                    tt_sec.Add(tt_line, min_maxterm);
                }
            }


            TruthTable = tt_sec;
            LUTinputs.Insert(lut_idx, "sk[" + key_idx + "]");
            this.NumInputs++;
            //return HammingDistance(lut_idx);
            return(0);
        }
 private void AddInput(string input)
 {
     LUTinputs.Add(input);
     IsMinimized = false;
 }
        public void AddKeyInput(string key_bit, int key_idx, int lut_idx)
        {
            keyIndex = lut_idx;
            keyVal   = key_bit;
            Random rand = new Random();
            Dictionary <string, string> tt_sec = new Dictionary <string, string>();

            IsMinimized = false;
            //string tt_value = "";
            //string original_tt_val = expandTruthTable();
            Dictionary <string, string> original_tt = new Dictionary <string, string>(TruthTable);
            string tmp = "1";

            foreach (KeyValuePair <string, string> kvp in TruthTable)
            {
                if (kvp.Value == "0")
                {
                    tmp = "0";
                }
            }
            while (TruthTable.Count > 0)
            {
                string tt_entry = TruthTable.Keys.ElementAt <string>(0);
                string tt_value = TruthTable[tt_entry];
                TruthTable.Remove(tt_entry);

                tt_entry = tt_entry.Insert(key_idx, key_bit);
                tt_sec.Add(tt_entry, tt_value);
            }

            NumInputs++;
            ContentSize *= 2;



            ////fill in don't care logic
            for (int i = 0; i < NumInputs - 2; i++)
            {
                StringBuilder tt_entry = new StringBuilder("0".PadLeft(NumInputs, '0'));

                string tt_value = tmp;

                if (key_bit.Equals("1"))
                {
                    tt_entry[key_idx] = '0';
                }
                else
                {
                    tt_entry[key_idx] = '1';
                }
                while (!tt_sec.ContainsKey(tt_entry.ToString()))
                {
                    for (int j = 0; j < NumInputs; j++)
                    {
                        if (j == key_idx)
                        {
                            continue;
                        }
                        if (rand.Next(100) < 20)
                        {
                            tt_entry[j] = '1';                      // we should use a template (of n input function) instead of random gen. this is just for test.
                        }
                        else
                        {
                            tt_entry[j] = '-';
                        }
                    }
                    if (tt_entry.ToString().Contains('1'))
                    {
                        try
                        {
                            tt_sec.Add(tt_entry.ToString(), tt_value);
                        }
                        catch { }
                    }
                }
            }



            LUTinputs.Insert(key_idx, "sk[" + lut_idx + "]");
            TruthTable = tt_sec;
            string new_tt = expandTruthTable();

            secured = true;
            var newer_tt = expandTruthTable();

            keyBits++;
            //hammingDistance = HammingDistance(key_idx);
        }