コード例 #1
0
ファイル: DSASigner.cs プロジェクト: zamud/OTRLib
        public DSASigner(OTR.Interface.DSAKeyParams dsa_key_hex_strings)
        {
            if (dsa_key_hex_strings == null)
            throw new ArgumentException("DSASigner: The DSA key hex string object cannot be null");

            try
            {
                SetKey(dsa_key_hex_strings.GetParamP(), dsa_key_hex_strings.GetParamQ(),
                    dsa_key_hex_strings.GetParamG(), dsa_key_hex_strings.GetParamX());

            }
            catch (Exception ex)
            {
                throw new ArgumentException("DSASigner(DSAKeyHexStrings)" + ex.ToString());

            }
        }
コード例 #2
0
ファイル: SMPManager.cs プロジェクト: zamud/OTRLib
        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;
        }
コード例 #3
0
ファイル: SMPManager.cs プロジェクト: zamud/OTRLib
        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();
        }
コード例 #4
0
ファイル: SMPManager.cs プロジェクト: zamud/OTRLib
        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();
        }
コード例 #5
0
ファイル: SMPManager.cs プロジェクト: zamud/OTRLib
        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();
        }
コード例 #6
0
ファイル: SMPManager.cs プロジェクト: zamud/OTRLib
        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;
        }