Example #1
0
        private byte[] ProcessSMPMessage3(byte[] smp_byte_array, ref OTR.Interface.OTR_SMP_EVENT smp_event_type_1, ref OTR.Interface.OTR_SMP_EVENT smp_event_type_2, ref string message)
        {
            if (smp_byte_array == null || smp_byte_array.Length < 1)
            {
                smp_event_type_1 = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message          = "ProcessSMPMessage3: The SMP byte array cannot be null/empty";
                ResetData();

                return(null);
            }



            if (_smp_state != OTR_SMP_STATE.EXPECT_3)
            {
                smp_event_type_1 = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message          = "ProcessSMPMessage3: Illigal state";
                ResetData();

                return(null);
            }

            int  _start_index = 0;
            uint _mpi_count   = 0;

            byte[] _mpis_buffer = null;



            Utility.DecodeTLVSMPMessage(smp_byte_array, _start_index, ref _mpi_count, ref _mpis_buffer);


            if (_mpi_count != MESSAGE_3_MPI_COUNT)
            {
                smp_event_type_1 = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message          = "ProcessSMPMessage3:The MPI count must be " + MESSAGE_3_MPI_COUNT.ToString();
                ResetData();

                return(null);
            }



            byte[] _p_a_mpi = null;
            byte[] _q_a_mpi = null;
            byte[] _c_p_mpi = null;
            byte[] _d_5_mpi = null;
            byte[] _d_6_mpi = null;

            byte[] _r_a_mpi = null;
            byte[] _c_r_mpi = null;
            byte[] _d_7_mpi = null;

            _start_index = 0;


            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _p_a_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _q_a_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _c_p_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _d_5_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _d_6_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _r_a_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _c_r_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _d_7_mpi);


            _smp_third_message_data = new BigInteger[_mpi_count];


            Utility.DecodeMpiFromBytes(_p_a_mpi, 0, ref _smp_third_message_data[0]);
            Utility.DecodeMpiFromBytes(_q_a_mpi, 0, ref _smp_third_message_data[1]);
            Utility.DecodeMpiFromBytes(_c_p_mpi, 0, ref _smp_third_message_data[2]);
            Utility.DecodeMpiFromBytes(_d_5_mpi, 0, ref _smp_third_message_data[3]);
            Utility.DecodeMpiFromBytes(_d_6_mpi, 0, ref _smp_third_message_data[4]);
            Utility.DecodeMpiFromBytes(_r_a_mpi, 0, ref _smp_third_message_data[5]);
            Utility.DecodeMpiFromBytes(_c_r_mpi, 0, ref _smp_third_message_data[6]);
            Utility.DecodeMpiFromBytes(_d_7_mpi, 0, ref _smp_third_message_data[7]);



            if (IsValidValue(_smp_third_message_data[0]) == false)
            {
                smp_event_type_1 = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message          = "ProcessSMPMessage3: Pa is not valid";
                ResetData();


                return(null);
            }

            if (IsValidValue(_smp_third_message_data[1]) == false)
            {
                smp_event_type_1 = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message          = "ProcessSMPMessage3: Qa is not valid";
                ResetData();

                return(null);
            }

            if (IsValidValue(_smp_third_message_data[5]) == false)
            {
                smp_event_type_1 = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message          = "ProcessSMPMessage3: Ra is not valid";
                ResetData();

                return(null);
            }


            if (VerifyZKProof(6, _smp_third_message_data[0], _smp_third_message_data[1],
                              _smp_third_message_data[2], _smp_third_message_data[3],
                              _smp_third_message_data[4]) == false)
            {
                smp_event_type_1 = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message          = "ProcessSMPMessage3: Zero-Knowledge Proof (Prefix 6) failed";
                ResetData();

                return(null);
            }


            BigInteger _inverse = _session_object.Q.ModInverse(PRIME_MODULO);

            _session_object.Qa_Qb = _smp_third_message_data[1].Multiply(_inverse).Mod(PRIME_MODULO);


            _inverse = _session_object.P.ModInverse(PRIME_MODULO);
            _session_object.Pa_Pb = _smp_third_message_data[0].Multiply(_inverse).Mod(PRIME_MODULO);


            if (VerifyZKProofA(7, _smp_third_message_data[5],
                               _smp_third_message_data[6], _smp_third_message_data[7]) == false)
            {
                smp_event_type_1 = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message          = "ProcessSMPMessage3: Zero-Knowledge Proof (Prefix 7) failed";
                ResetData();
                return(null);
            }



            BigInteger _r_ab = _smp_third_message_data[5].ModPow(_session_object.EXP_2, PRIME_MODULO);


            _smp_state = OTR_SMP_STATE.EXPECT_1;



            if (_r_ab.Equals(_session_object.Pa_Pb) == true)
            {
                smp_event_type_2 = OTR.Interface.OTR_SMP_EVENT.SUCCEEDED;
                // Console.WriteLine("SMP completed succesfully \n");
                message = "ProcessSMPMessage3: SMP completed succesfully";
                ResetData();
            }
            else
            {
                smp_event_type_2 = OTR.Interface.OTR_SMP_EVENT.FAILED;
                // Console.WriteLine("SMP Man in the middle suspected  \n");
                message = "ProcessSMPMessage3: SMP Man in the middle suspected";
                ResetData();
            }



            smp_event_type_1 = OTR.Interface.OTR_SMP_EVENT.SEND;



            return(FormatSMPMessage4());
        }
Example #2
0
        private byte[] ProcessSMPMessage2(byte[] smp_byte_array, ref OTR.Interface.OTR_SMP_EVENT smp_event_type, ref string message)
        {
            if (_smp_state != OTR_SMP_STATE.EXPECT_2)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage2: The SMP byte array cannot be null/empty";
                ResetData();

                return(null);
            }


            int  _start_index = 0;
            uint _mpi_count   = 0;

            byte[] _mpis_buffer = null;


            Utility.DecodeTLVSMPMessage(smp_byte_array, _start_index, ref _mpi_count, ref _mpis_buffer);


            if (_mpi_count != MESSAGE_2_MPI_COUNT)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage2: The MPI count must be " + MESSAGE_2_MPI_COUNT.ToString();
                ResetData();
                return(null);
            }

            byte[] _g_2_b_mpi = null;
            byte[] _c_2_mpi   = null;
            byte[] _d_2_mpi   = null;

            byte[] _g_3_b_mpi = null;
            byte[] _c_3_mpi   = null;
            byte[] _d_3_mpi   = null;


            byte[] _p_b_mpi = null;
            byte[] _q_b_mpi = null;
            byte[] _c_p_mpi = null;
            byte[] _d_5_mpi = null;
            byte[] _d_6_mpi = null;



            _start_index = 0;



            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _g_2_b_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _c_2_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _d_2_mpi);


            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _g_3_b_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _c_3_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _d_3_mpi);


            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _p_b_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _q_b_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _c_p_mpi);


            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _d_5_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _d_6_mpi);

            _smp_second_message_data = new BigInteger[_mpi_count];

            Utility.DecodeMpiFromBytes(_g_2_b_mpi, 0, ref _smp_second_message_data[0]);
            Utility.DecodeMpiFromBytes(_c_2_mpi, 0, ref _smp_second_message_data[1]);
            Utility.DecodeMpiFromBytes(_d_2_mpi, 0, ref _smp_second_message_data[2]);


            Utility.DecodeMpiFromBytes(_g_3_b_mpi, 0, ref _smp_second_message_data[3]);
            Utility.DecodeMpiFromBytes(_c_3_mpi, 0, ref _smp_second_message_data[4]);
            Utility.DecodeMpiFromBytes(_d_3_mpi, 0, ref _smp_second_message_data[5]);


            Utility.DecodeMpiFromBytes(_p_b_mpi, 0, ref _smp_second_message_data[6]);
            Utility.DecodeMpiFromBytes(_q_b_mpi, 0, ref _smp_second_message_data[7]);
            Utility.DecodeMpiFromBytes(_c_p_mpi, 0, ref _smp_second_message_data[8]);

            Utility.DecodeMpiFromBytes(_d_5_mpi, 0, ref _smp_second_message_data[9]);
            Utility.DecodeMpiFromBytes(_d_6_mpi, 0, ref _smp_second_message_data[10]);



            if (IsValidValue(_smp_second_message_data[0]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage2: G2b is not valid";
                ResetData();

                return(null);
            }

            if (IsValidValue(_smp_second_message_data[3]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage2: G3b is not valid";
                ResetData();

                return(null);
            }

            if (IsValidValue(_smp_second_message_data[6]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage2: P is not valid";
                ResetData();

                return(null);
            }

            if (IsValidValue(_smp_second_message_data[7]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage2: Q is not valid";
                ResetData();

                return(null);
            }



            _session_object.G_2 = _smp_second_message_data[0].ModPow(_session_object.EXP_1, PRIME_MODULO);
            _session_object.G_3 = _smp_second_message_data[3].ModPow(_session_object.EXP_2, PRIME_MODULO);



            if (VerifyZKProof(3, _smp_second_message_data[0], _smp_second_message_data[1], _smp_second_message_data[2]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage2: Zero-Knowledge Proof (Prefix 3) failed";
                ResetData();


                return(null);
            }


            if (VerifyZKProof(4, _smp_second_message_data[3], _smp_second_message_data[4], _smp_second_message_data[5]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage2: Zero-Knowledge Proof (Prefix 4) failed";
                ResetData();

                return(null);
            }



            if (VerifyZKProof(5, _smp_second_message_data[6], _smp_second_message_data[7],
                              _smp_second_message_data[8], _smp_second_message_data[9],
                              _smp_second_message_data[10]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage2: Zero-Knowledge Proof (Prefix 5) failed";
                ResetData();

                return(null);
            }



            _smp_state = OTR_SMP_STATE.EXPECT_4;

            smp_event_type = OTR.Interface.OTR_SMP_EVENT.SEND;



            return(FormatSMPMessage3());
        }
Example #3
0
        public byte[] ProcessSMPMessage(byte[] smp_byte_array, OTR_TLV_TYPE tlv_type, ref OTR.Interface.OTR_SMP_EVENT smp_event_type_1, ref OTR.Interface.OTR_SMP_EVENT smp_event_type_2, ref string message)
        {
            try
            {
                if (tlv_type == OTR_TLV_TYPE.SMP_MESSAGE_1)
                {
                    return(ProcessSMPMessage1(smp_byte_array, ref smp_event_type_1, ref message));
                }

                else if (tlv_type == OTR_TLV_TYPE.SMP_MESSAGE_2)
                {
                    return(ProcessSMPMessage2(smp_byte_array, ref smp_event_type_1, ref message));
                }

                else if (tlv_type == OTR_TLV_TYPE.SMP_MESSAGE_3)
                {
                    return(ProcessSMPMessage3(smp_byte_array, ref smp_event_type_1, ref smp_event_type_2, ref message));
                }


                else if (tlv_type == OTR_TLV_TYPE.SMP_MESSAGE_4)
                {
                    return(ProcessSMPMessage4(smp_byte_array, ref smp_event_type_1, ref message));
                }
            }
            catch (Exception ex)
            {
                smp_event_type_1 = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message          = "ProcessSMPMessage:" + ex.ToString();
                ResetData();
                //TODO(mo)
                //Console.WriteLine("Exception {0} \n", ex.ToString());
            }


            return(null);
        }
Example #4
0
        private byte[] ProcessSMPMessage1(byte[] smp_byte_array, ref OTR.Interface.OTR_SMP_EVENT smp_event_type, ref string message)
        {
            if (smp_byte_array == null || smp_byte_array.Length < 1)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage1: The SMP byte array cannot be null/empty";
                ResetData();
                return(null);
            }


            if (_smp_state != OTR_SMP_STATE.EXPECT_1)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage1: Illigal state";
                ResetData();

                return(null);
            }


            int  _start_index = 0;
            uint _mpi_count   = 0;

            byte[] _mpis_buffer = null;

            byte[] _g_2_mpi = null;
            byte[] _c_2_mpi = null;
            byte[] _d_2_mpi = null;

            byte[] _g_3_mpi = null;
            byte[] _c_3_mpi = null;
            byte[] _d_3_mpi = null;


            Utility.DecodeTLVSMPMessage(smp_byte_array, _start_index, ref _mpi_count, ref _mpis_buffer);


            if (_mpi_count != MESSAGE_1_MPI_COUNT)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage1: The MPI count must be " + MESSAGE_1_MPI_COUNT.ToString();
                ResetData();

                return(null);
            }



            _start_index = 0;



            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _g_2_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _c_2_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _d_2_mpi);

            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _g_3_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _c_3_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _d_3_mpi);


            _smp_first_message_data = new BigInteger[_mpi_count];


            Utility.DecodeMpiFromBytes(_g_2_mpi, 0, ref _smp_first_message_data[0]);
            Utility.DecodeMpiFromBytes(_c_2_mpi, 0, ref _smp_first_message_data[1]);
            Utility.DecodeMpiFromBytes(_d_2_mpi, 0, ref _smp_first_message_data[2]);


            Utility.DecodeMpiFromBytes(_g_3_mpi, 0, ref _smp_first_message_data[3]);
            Utility.DecodeMpiFromBytes(_c_3_mpi, 0, ref _smp_first_message_data[4]);
            Utility.DecodeMpiFromBytes(_d_3_mpi, 0, ref _smp_first_message_data[5]);



            if (IsValidValue(_smp_first_message_data[0]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage1: G2a is not valid";
                ResetData();

                return(null);
            }

            if (IsValidValue(_smp_first_message_data[3]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage3: G3a is not valid";
                ResetData();
                return(null);
            }



            if (VerifyZKProof(1, _smp_first_message_data[0], _smp_first_message_data[1], _smp_first_message_data[2]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage1: Zero-Knowledge Proof (Prefix 1) failed";
                ResetData();

                return(null);
            }

            if (VerifyZKProof(2, _smp_first_message_data[3], _smp_first_message_data[4], _smp_first_message_data[5]) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage1: Zero-Knowledge Proof (Prefix 2) failed";
                ResetData();

                return(null);
            }



            _smp_state = OTR_SMP_STATE.EXPECT_3;


            smp_event_type = OTR.Interface.OTR_SMP_EVENT.SEND;


            return(FormatSMPMessage2());
        }
Example #5
0
        private byte[] ProcessSMPMessage4(byte[] smp_byte_array, ref OTR.Interface.OTR_SMP_EVENT smp_event_type, ref string message)
        {
            if (smp_byte_array == null || smp_byte_array.Length < 1)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage4: The SMP byte array cannot be null/empty";
                ResetData();


                return(null);
            }



            if (_smp_state != OTR_SMP_STATE.EXPECT_4)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage4: Illigal state";
                ResetData();



                return(null);
            }


            int  _start_index = 0;
            uint _mpi_count   = 0;

            byte[] _mpis_buffer = null;


            Utility.DecodeTLVSMPMessage(smp_byte_array, _start_index, ref _mpi_count, ref _mpis_buffer);

            if (_mpi_count != MESSAGE_4_MPI_COUNT)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage4: The MPI count must be " + MESSAGE_4_MPI_COUNT.ToString();
                ResetData();

                return(null);
            }

            byte[] _r_b_mpi = null;
            byte[] _c_mpi   = null;
            byte[] _d_mpi   = null;

            BigInteger _r_b = null;
            BigInteger _c   = null;
            BigInteger _d   = null;

            _start_index = 0;

            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _r_b_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _c_mpi);
            _start_index = Utility.DecoupleMpiFromBytes(_mpis_buffer, _start_index, ref _d_mpi);

            Utility.DecodeMpiFromBytes(_r_b_mpi, 0, ref _r_b);
            Utility.DecodeMpiFromBytes(_c_mpi, 0, ref _c);
            Utility.DecodeMpiFromBytes(_d_mpi, 0, ref _d);

            if (IsValidValue(_r_b) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage4: Rb is not valid";
                ResetData();

                return(null);
            }



            if (VerifyZKProofA(8, _r_b, _c, _d) == false)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.ABORT;
                message        = "ProcessSMPMessage4: Zero-Knowledge Proof (Prefix 8) failed";
                ResetData();

                return(null);
            }


            _smp_state = OTR_SMP_STATE.EXPECT_1;


            BigInteger _r_ab = _r_b.ModPow(_session_object.EXP_2, PRIME_MODULO);


            if (_r_ab.Equals(_session_object.Pa_Pb) == true)
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.SUCCEEDED;
                // Console.WriteLine("SMP completed succesfully \n");
                message = "ProcessSMPMessage4: SMP completed succesfully";
                ResetData();
            }
            else
            {
                smp_event_type = OTR.Interface.OTR_SMP_EVENT.FAILED;
                //  Console.WriteLine("SMP Man in the middle suspected  \n");
                message = "ProcessSMPMessage4: SMP Man in the middle suspected";
                ResetData();
            }


            return(null);
        }