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[] 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 #3
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 #4
0
 private void ResetData()
 {
     _smp_state  = OTR_SMP_STATE.EXPECT_1;
     _is_started = false;
 }
Example #5
0
        public byte[] FormatSMPMessage1()
        {
            SetFirstMessageData();

            if (_smp_first_message_data == null || _smp_first_message_data.Length < MESSAGE_1_MPI_COUNT)
            {
                throw new InvalidDataException("FormatSMPMessage1:The SMP first message data cannot be null or have elements less than " + MESSAGE_1_MPI_COUNT.ToString());
            }


            byte[] _temp_mpi_buff = null;
            byte[] _message_buff  = 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;



            int _buff_length = 0;
            int _next_index  = 0;



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

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

            _buff_length  = _g_2_mpi.Length + _c_2_mpi.Length + _d_2_mpi.Length;
            _buff_length += _g_3_mpi.Length + _c_3_mpi.Length + _d_3_mpi.Length;


            _temp_mpi_buff = new byte[_buff_length];


            Buffer.BlockCopy(_g_2_mpi, 0, _temp_mpi_buff, _next_index, _g_2_mpi.Length);
            _next_index += _g_2_mpi.Length;

            Buffer.BlockCopy(_c_2_mpi, 0, _temp_mpi_buff, _next_index, _c_2_mpi.Length);
            _next_index += _c_2_mpi.Length;

            Buffer.BlockCopy(_d_2_mpi, 0, _temp_mpi_buff, _next_index, _d_2_mpi.Length);
            _next_index += _d_2_mpi.Length;

            Buffer.BlockCopy(_g_3_mpi, 0, _temp_mpi_buff, _next_index, _g_3_mpi.Length);
            _next_index += _g_3_mpi.Length;

            Buffer.BlockCopy(_c_3_mpi, 0, _temp_mpi_buff, _next_index, _c_3_mpi.Length);
            _next_index += _c_3_mpi.Length;

            Buffer.BlockCopy(_d_3_mpi, 0, _temp_mpi_buff, _next_index, _d_3_mpi.Length);
            _next_index += _d_3_mpi.Length;


            Utility.EncodeTLVSMPMessage(OTR_TLV_TYPE.SMP_MESSAGE_1, MESSAGE_1_MPI_COUNT, _temp_mpi_buff, ref _message_buff);



            _smp_state = OTR_SMP_STATE.EXPECT_2;


            return(_message_buff);
        }
Example #6
0
 private void ResetData()
 {
     _smp_state = OTR_SMP_STATE.EXPECT_1;
        _is_started = false;
 }
Example #7
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);
        }
Example #8
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;
        }
Example #9
0
        public byte[] FormatSMPMessage1()
        {
            SetFirstMessageData();

            if (_smp_first_message_data == null || _smp_first_message_data.Length < MESSAGE_1_MPI_COUNT)
            throw new InvalidDataException("FormatSMPMessage1:The SMP first message data cannot be null or have elements less than " + MESSAGE_1_MPI_COUNT.ToString());

            byte[] _temp_mpi_buff = null;
            byte[] _message_buff = 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;

            int _buff_length = 0;
            int _next_index = 0;

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

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

            _buff_length = _g_2_mpi.Length + _c_2_mpi.Length + _d_2_mpi.Length;
            _buff_length += _g_3_mpi.Length + _c_3_mpi.Length + _d_3_mpi.Length;

            _temp_mpi_buff = new byte[_buff_length];

            Buffer.BlockCopy(_g_2_mpi, 0, _temp_mpi_buff, _next_index, _g_2_mpi.Length);
            _next_index += _g_2_mpi.Length;

            Buffer.BlockCopy(_c_2_mpi, 0, _temp_mpi_buff, _next_index, _c_2_mpi.Length);
            _next_index += _c_2_mpi.Length;

            Buffer.BlockCopy(_d_2_mpi, 0, _temp_mpi_buff, _next_index, _d_2_mpi.Length);
            _next_index += _d_2_mpi.Length;

            Buffer.BlockCopy(_g_3_mpi, 0, _temp_mpi_buff, _next_index, _g_3_mpi.Length);
            _next_index += _g_3_mpi.Length;

            Buffer.BlockCopy(_c_3_mpi, 0, _temp_mpi_buff, _next_index, _c_3_mpi.Length);
            _next_index += _c_3_mpi.Length;

            Buffer.BlockCopy(_d_3_mpi, 0, _temp_mpi_buff, _next_index, _d_3_mpi.Length);
            _next_index += _d_3_mpi.Length;

            Utility.EncodeTLVSMPMessage(OTR_TLV_TYPE.SMP_MESSAGE_1, MESSAGE_1_MPI_COUNT, _temp_mpi_buff, ref _message_buff);

            _smp_state = OTR_SMP_STATE.EXPECT_2;

            return _message_buff;
        }
Example #10
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 #11
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 #12
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();
        }