Exemplo n.º 1
0
        internal RSACryptoSystem( BackgroundWorker UseWorker, RSACryptoWorkerInfo UseWInfo )
        {
            Worker = UseWorker;
            WorkerInfo = UseWInfo;
            StartTime = new ECTime();
            StartTime.SetToNow();

            RngCsp = new RNGCryptoServiceProvider();
            IntMath = new IntegerMath();
            IntMathNewForP = new IntegerMathNew( IntMath );
            IntMathNewForQ = new IntegerMathNew( IntMath );

            Worker.ReportProgress( 0, IntMath.GetStatusString() );
            Quotient = new Integer();
            Remainder = new Integer();
            PrimeP = new Integer();
            PrimeQ = new Integer();
            PrimePMinus1 = new Integer();
            PrimeQMinus1 = new Integer();
            PubKeyN = new Integer();
            PubKeyExponent = new Integer();
            PrivKInverseExponent = new Integer();
            PrivKInverseExponentDP = new Integer();
            PrivKInverseExponentDQ = new Integer();
            QInv = new Integer();
            PhiN = new Integer();
            TestForDecrypt = new Integer();
            M1ForInverse = new Integer();
            M2ForInverse = new Integer();
            HForQInv = new Integer();
            M1MinusM2 = new Integer();
            M1M2SizeDiff = new Integer();

            PubKeyExponent.SetFromULong( PubKeyExponentUint );
        }
Exemplo n.º 2
0
        internal TLSTCPClient( MainForm UseForm, TcpClient UseClient, string UseAddress )
        {
            MForm = UseForm;
            RemoteAddress = UseAddress;

            RawBuffer = new byte[RawBufferLength];
            TLSOuterRecordBuffer = new byte[MaximumTLSRecordLength + 5]; // Plus 5 for the header.

            LastTransactTime = new ECTime();
            LastTransactTime.SetToNow();

            if( UseClient == null )
              Client = new TcpClient();
            else
              Client = UseClient;

            try
            {
            NetStream = Client.GetStream();
            }
            catch( Exception Except )
              {
              MForm.ShowTLSListenerFormStatus( "Exception in Creating the NetStream:" );
              MForm.ShowTLSListenerFormStatus( Except.Message );
              NetStream = null;
              return;
              }

            Client.ReceiveTimeout = 3 * 1000;
            Client.SendTimeout = 3 * 1000;
            Client.SendBufferSize = 1024 * 32;
        }
Exemplo n.º 3
0
        public WebTCPClient( MainForm UseForm, TcpClient UseClient, string UseAddress )
        {
            MForm = UseForm;
            RemoteAddress = UseAddress;

            LastTransactTime = new ECTime();
            LastTransactTime.SetToNow();
            LinesDictionary = new Dictionary<string, string>();

            if( UseClient == null )
              Client = new TcpClient();
            else
              Client = UseClient;

            try
            {
            NetStream = Client.GetStream();
            }
            catch( Exception Except )
              {
              MForm.ShowWebListenerFormStatus( "Exception in Creating the NetStream:" );
              MForm.ShowWebListenerFormStatus( Except.Message );
              NetStream = null;
              return;
              }

            Client.ReceiveTimeout = 3 * 1000;
            Client.SendTimeout = 3 * 1000;
            Client.SendBufferSize = 1024 * 32;
        }
 internal SendCustomerTLSHandshake( BackgroundWorker UseWorker, BackWorkerInfo UseWInfo )
 {
     Worker = UseWorker;
     WInfo = UseWInfo;
     StartTime = new ECTime();
     StartTime.SetToNow();
     MsgClient = new CustomerTLSClient( WInfo.ServerIPOrDomainName );
 }
Exemplo n.º 5
0
        internal CustomerTLSClient( string UseDomainName )
        {
            DomainName = UseDomainName;
            RawBuffer = new byte[RawBufferLength];
            TLSOuterRecordBuffer = new byte[MaximumTLSRecordLength];

            Handshake = new ProcessHandshake( DomainName );

            Client = new TcpClient();
            Client.ReceiveTimeout = 15 * 1000;
            Client.SendTimeout = 15 * 1000;
            LastReadWriteTime = new ECTime();
            LastReadWriteTime.SetToNow();
            CryptoRand = new RNGCryptoServiceProvider();
        }
Exemplo n.º 6
0
 internal FactorBase( QuadResWorkerInfo UseWInfo, BackgroundWorker UseWorker )
 {
     WInfo = UseWInfo;
     Worker = UseWorker;
     IntMath = new IntegerMath();
     Quotient = new Integer();
     Remainder = new Integer();
     Product = new Integer();
     ProductSqrRoot = new Integer();
     EulerExponent = new Integer();
     EulerResult = new Integer();
     EulerModulus = new Integer();
     OneMainFactor = new Integer();
     ExpOneMainFactor = new ExponentVectorNumber( IntMath );
     StartTime = new ECTime();
     StartTime.SetToNow();
     IntMath.SetFromString( Product, WInfo.PublicKeyModulus );
     IntMath.SquareRoot( Product, ProductSqrRoot );
 }
Exemplo n.º 7
0
        internal QuadResCombinatorics( QuadResWorkerInfo UseWInfo, BackgroundWorker UseWorker )
        {
            WInfo = UseWInfo;
            Worker = UseWorker;
            IntMath = new IntegerMath();
            Quotient = new Integer();
            Remainder = new Integer();
            Product = new Integer();
            SolutionP = new Integer();
            SolutionQ = new Integer();
            ToDivideMod32 = new Integer();
            LastAccumulateValue = new Integer();
            GetValueBasePart = new Integer();
            StartTime = new ECTime();
            StartTime.SetToNow();

            IntMath.SetFromString( Product, WInfo.PublicKeyModulus );
            QuadResDigitsArray = new QuadResDigitsRec[DigitsArrayLength];
        }
Exemplo n.º 8
0
        internal TLSListenerForm( MainForm UseForm )
        {
            InitializeComponent();

            MForm = UseForm;

            DNSBackgroundWorker.WorkerReportsProgress = true;
            DNSBackgroundWorker.WorkerSupportsCancellation = true;

            ClientsLast = 0;
            // It will resize this as it needs more.
            Clients = new TLSClient[8];

            Listener = new TcpListener( IPAddress.Any, 443 );
            Listener.ExclusiveAddressUse = true;

            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            UniqueEntityTag = RightNow.GetIndex(); // Start it with something new.
        }
        internal bool Connect()
        {
            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            // Worker.ReportProgress( 0, "Time: " + RightNow.ToLocalTimeString() );

            if( !MsgClient.Connect( WInfo.ServerIPOrDomainName, 443 ))
              {
              string ErrorS = "Can't connect to the server for:\r\n" +
            WInfo.ServerIPOrDomainName + "\r\n" +
            MsgClient.GetStatusString() + "\r\n";

              Worker.ReportProgress( 0, ErrorS );
              Thread.Sleep( 1000 );
              MsgClient.FreeEverything();
              return false;
              }

            Worker.ReportProgress( 0, "Connected to the server at: " + WInfo.ServerIPOrDomainName );
            return true;
        }
Exemplo n.º 10
0
        internal string GetRandomDomainName()
        {
            try
            {
            ECTime OldDate = new ECTime();
            OldDate.SetToNow();
            OldDate.AddMinutes( -(60 * 24 * 90)); // Go back 90 days.
            ulong OldDateIndex = OldDate.GetIndex();

            // A limited while( true ) that won't go forever.
            for( int Count = 0; Count < 10000; Count++ )
              {
              int Index = MForm.GetRandomNumber();
              Index = Index % DomainX509RecArrayLast;
              DomainX509Record Rec = DomainX509RecArray[Index];
              if( Rec.GetModifyTimeIndex() > OldDateIndex )
            continue; // Don't get a recently used one.

              // if( anything else )
            // continue;

              // return "127.0.0.1"; // For testing with local loopback.
              // return "promocodeclub.com"; // Good for testing X.509.
              return "secure.ballantinecommunications.net";
              // return "schneier.com"; //  Bruce Schneier, the cryptographer.
              // return "vantiv.com";

              // return Rec.DomainName;
              }

            return ""; // It shouldn't get here.

            }
            catch( Exception Except )
              {
              MForm.ShowStatus( "Exception in GetRandomDomainName():" );
              MForm.ShowStatus( Except.Message );
              return "";
              }
        }
Exemplo n.º 11
0
        internal void AddToBadWebPageCount( string Address, string SentText )
        {
            try
            {
            IPStatusRec StatusRec;
            if( IPsDictionary.ContainsKey( Address ))
              StatusRec = IPsDictionary[Address];
            else
              StatusRec = MakeNewStatusRec();

            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            StatusRec.TimeIndex = RightNow.GetIndex();
            StatusRec.BadWebPageCount++;
            StatusRec.SentText = Utility.CleanAsciiString( SentText, 2048 );

            IPsDictionary[Address] = StatusRec;
            }
            catch( Exception Except )
              {
              MForm.ShowStatus( "Exception in AddToBadWebPageCountCount():" );
              MForm.ShowStatus( Except.Message );
              }
        }
Exemplo n.º 12
0
        // http://en.wikipedia.org/wiki/Internet_media_type
        internal void SendGenericWebResponse( byte[] Buffer, ulong ModifiedIndex, ulong UniqueEntity, string ContentType )
        {
            if( Client == null )
              return;

            try
            {
            // Set the initial UniqueEntity to the current date time index and then just
            // keep incrementing it.
            ECTime RightNow = new ECTime();
            RightNow.SetToNow();

            ECTime ExpireTime = new ECTime();
            ExpireTime.SetToNow();
            ExpireTime.AddSeconds( 120 );

            ECTime ModifiedTime = new ECTime( ModifiedIndex );

            // ETag is an Entity Tag.
            // "An entity tag MUST be unique across all versions of all entities
            // associated with a particular resource."
            string Header = "HTTP/1.1 200 OK\r\n" +
               "Date: " + RightNow.GetHTTPHeaderDateTime() + "\r\n" +
               "Server: Eric Example\r\n" +
               "Last-Modified: " + ModifiedTime.GetHTTPHeaderDateTime() + "\r\n" +
               "ETag: " + UniqueEntity.ToString() + "\r\n" +
               "Accept-Ranges: bytes\r\n" +
               "Content-Length: " + Buffer.Length.ToString() + "\r\n" +
               // "Cache-Control: max-age=5184000
               "Expires: " + ExpireTime.GetHTTPHeaderDateTime() + "\r\n" +
               "Keep-Alive: timeout=5, max=100\r\n" +
               "Connection: Keep-Alive\r\n" +
               "Content-Type: " + ContentType + "\r\n" +
               "\r\n"; // Empty line and then the actual bytes.

            byte[] HeaderBytes = UTF8Strings.StringToBytes( Header );
            if( HeaderBytes == null )
              return;

            byte[] AllSendBytes;

            if( GetIsHeadOnly() )
              AllSendBytes = new byte[HeaderBytes.Length];
            else
              AllSendBytes = new byte[HeaderBytes.Length + Buffer.Length];

            int Where = 0;
            for( int Count = 0; Count < HeaderBytes.Length; Count++ )
              {
              AllSendBytes[Where] = HeaderBytes[Count];
              Where++;
              }

            if( !GetIsHeadOnly() )
              {
              for( int Count = 0; Count < Buffer.Length; Count++ )
            {
            AllSendBytes[Where] = Buffer[Count];
            Where++;
            }
              }

            // This returns immediately.
            WriteBytesAsync( AllSendBytes );

            }
            catch( Exception Except )
              {
              MForm.ShowStatus( "Exception in SendHTMLOrText():" );
              MForm.ShowStatus( Except.Message );
              }
        }
Exemplo n.º 13
0
        internal void CloseTimedOut()
        {
            ECTime OldTime = new ECTime();
            OldTime.SetToNow();
            ////////////////////////
            OldTime.AddSeconds( -4 );

            ECTime OldWebTime = new ECTime();
            OldWebTime.SetToNow();
            // Browsers that are cooperative don't open too many connections at once.
            // Denial of service people will.
            // This delay makes browsers that are cooperative hold off on sending more
            // requests until they've closed some sockets.
            // Apparently this is the operating system that is being cooperative.
            // And if this server is too busy it's not going to be calling this
            // function to close it until it can get around to it.
            // So cooperative web clients will wait.
            OldWebTime.AddSeconds( -0.1 );
            // OldWebTime.AddSeconds( 10 ); // If I put it 10 seconds in the _future_ it works.
            // OldWebTime.AddSeconds( -10 );
            // The socket is setting LastTransactTime when AsyncResult.IsCompleted.
            // So it's setting it when the socket thinks it's done sending it.
            ulong OldIndex = OldTime.GetIndex();
            ulong OldWebIndex = OldWebTime.GetIndex();
            for( int Count = 0; Count < ClientsLast; Count++ )
              {
              if( Clients[Count] == null ) // This should never happen but...
            continue;

              if( Clients[Count].IsShutDown())
            continue;

              /*
              // Close a web request only after it has started processing the request.
              if( Clients[Count].GetProcessingStarted())
            {
            if( Clients[Count].GetIsAWebRequest())
              {
              if( Clients[Count].GetLastTransactTimeIndex() < OldWebIndex )
            {
            if( Clients[Count].IsProcessingInBackground())
              {
              // ShowStatus( " " );
              // ShowStatus( "Web request is still sending." );
              // MForm.ServerLog.AddToLog( "Web Still Sending", "Nada", Clients[Count].GetRemoteAddress() );
              }

            Clients[Count].FreeEverything();
            }
              }
            }
            */

              // If it's more recent than the old index then it's OK.
              if( Clients[Count].GetLastTransactTimeIndex() > OldIndex )
            continue;

              /*
              // If this message has not already been processed.
              if( !Clients[Count].GetProcessingStarted())
            {
            string InputS = Utility.GetCleanUnicodeString( Clients[Count].GetAllInputS(), 2000 );
            InputS = InputS.Trim();
            if( InputS.Length > 0 )
              {
              // ShowStatus( "Timed out with: " + InputS );
              }

            MForm.NetStats.AddToTimedOutCount( Clients[Count].GetRemoteAddress(), InputS );
            }
            */

              if( Clients[Count].IsProcessingInBackground())
            {
            ShowStatus( " " );
            ShowStatus( "**************************************" );
            ShowStatus( "Still sending after time out period." );
            ShowStatus( "**************************************" );
            ShowStatus( " " );
            }

              // They normally time out.
              ShowStatus( "Closing timed out: " + Clients[Count].GetRemoteAddress());
              Clients[Count].FreeEverything();
              }
        }
Exemplo n.º 14
0
        internal void UpdateHostNameCheckTime( string IP )
        {
            try
            {
            IPStatusRec StatusRec;
            if( IPsDictionary.ContainsKey( IP ))
              StatusRec = IPsDictionary[IP];
            else
              StatusRec = MakeNewStatusRec();

            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            StatusRec.TimeIndex = RightNow.GetIndex();
            StatusRec.LastHostNameUpdate = RightNow.GetIndex();
            IPsDictionary[IP] = StatusRec;
            }
            catch( Exception Except )
              {
              MForm.ShowStatus( "Exception in NetStatus.UpdateHostNameCheckTime():" );
              MForm.ShowStatus( Except.Message );
              }
        }
Exemplo n.º 15
0
        internal void AddToConfirmBillingCount( string Address )
        {
            try
            {
            IPStatusRec StatusRec;
            if( IPsDictionary.ContainsKey( Address ))
              StatusRec = IPsDictionary[Address];
            else
              StatusRec = MakeNewStatusRec();

            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            StatusRec.TimeIndex = RightNow.GetIndex();
            StatusRec.ConfirmBillingCount++;
            StatusRec.TotalConfirmBillingCount++;

            IPsDictionary[Address] = StatusRec;
            }
            catch( Exception Except )
              {
              MForm.ShowStatus( "Exception in AddToConfirmBillingCount():" );
              MForm.ShowStatus( Except.Message );
              }
        }
Exemplo n.º 16
0
        private void ProcessOuterMessages()
        {
            if( MForm.GetIsClosing())
              return;

            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            for( int Count = 0; Count < ClientsLast; Count++ )
              {
              if( Clients[Count] == null ) // This should never happen but...
            continue;

              // IsShutDown is a little slower than the above checks.
              if( Clients[Count].IsShutDown())
            continue;

              Clients[Count].ProcessOuterMessages();
              }
        }
Exemplo n.º 17
0
        internal void StartSendingForDns( string IP )
        {
            if( MForm.GetIsClosing())
              return;

            if( IsDisposed )
              return;

            ulong LastUpdate = MForm.NetStats.GetLastHostNameUpdate( IP );
            if( LastUpdate != 0 )
              {
              ECTime LastUpdateTime = new ECTime( LastUpdate );
              if( LastUpdateTime.GetDaysToNow() < 7 )
            return;

              }
            // MForm.ServerLog.AddToLog( "Description Data", "Getting description data." );

            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            MForm.NetStats.UpdateHostNameCheckTime( IP );

            // ShowStatus( " " );
            // ShowStatus( "Dns for: " + IP + " " + ForWhat + " " + RightNow.ToLocalTimeString() );
            // ShowStatus( "Dns for: " + ForWhat + " " + RightNow.ToLocalTimeString() );

            DnsWorkerInfo WInfo = new DnsWorkerInfo();

            WInfo.IP = IP;

            try
            {
            if( !DNSBackgroundWorker.IsBusy )
              {
              DNSBackgroundWorker.RunWorkerAsync( WInfo );
              }
            else
              {
              // ShowStatus( "Dns background process is busy." );
              }

            }
            catch( Exception Except )
              {
              ShowStatus( "Error starting background process for Dns." );
              ShowStatus( Except.Message );
              return;
              }
        }
Exemplo n.º 18
0
        internal void MakeRSAKeys()
        {
            int ShowBits = (PrimeIndex + 1) * 32;
            // int TestLoops = 0;

            Worker.ReportProgress( 0, "Making RSA keys." );
            Worker.ReportProgress( 0, "Bits size is: " + ShowBits.ToString());

            // ulong Loops = 0;
            while( true )
              {
              if( Worker.CancellationPending )
            return;

              Thread.Sleep( 1 ); // Give up the time slice.  Let other things on the server run.

              // Make two prime factors.
              // Normally you'd only make new primes when you pay the Certificate
              // Authority for a new certificate.
              if( !MakeAPrime( PrimeP, PrimeIndex, 20 ))
            return;

              IntegerBase TestP = new IntegerBase();
              IntegerBaseMath IntBaseMath = new IntegerBaseMath( IntMath );
              string TestS = IntMath.ToString10( PrimeP );
              IntBaseMath.SetFromString( TestP, TestS );
              string TestS2 = IntBaseMath.ToString10( TestP );
              if( TestS != TestS2 )
            throw( new Exception( "TestS != TestS2 for IntegerBase." ));

              if( Worker.CancellationPending )
            return;

              if( !MakeAPrime( PrimeQ, PrimeIndex, 20 ))
            return;

              if( Worker.CancellationPending )
            return;

              // This is extremely unlikely.
              Integer Gcd = new Integer();
              IntMath.GreatestCommonDivisor( PrimeP, PrimeQ, Gcd );
              if( !Gcd.IsOne())
            {
            Worker.ReportProgress( 0, "They had a GCD: " + IntMath.ToString10( Gcd ));
            continue;
            }

              if( Worker.CancellationPending )
            return;

              // This would never happen since the public key exponent used here
              // is one of the small primes in the array in IntegerMath that it
              // was checked against.  But it does show here in the code that
              // they have to be co-prime to each other.  And in the future it
              // might be found that the public key exponent has to be much larger
              // than the one used here.
              IntMath.GreatestCommonDivisor( PrimeP, PubKeyExponent, Gcd );
              if( !Gcd.IsOne())
            {
            Worker.ReportProgress( 0, "They had a GCD with PubKeyExponent: " + IntMath.ToString10( Gcd ));
            continue;
            }

              if( Worker.CancellationPending )
            return;

              IntMath.GreatestCommonDivisor( PrimeQ, PubKeyExponent, Gcd );
              if( !Gcd.IsOne())
            {
            Worker.ReportProgress( 0, "2) They had a GCD with PubKeyExponent: " + IntMath.ToString10( Gcd ));
            continue;
            }

              // For Modular Reduction.  This only has to be done
              // once, when P and Q are made.
              IntMathNewForP.SetupGeneralBaseArray( PrimeP );
              IntMathNewForQ.SetupGeneralBaseArray( PrimeQ );

              PrimePMinus1.Copy( PrimeP );
              IntMath.SubtractULong( PrimePMinus1, 1 );
              PrimeQMinus1.Copy( PrimeQ );
              IntMath.SubtractULong( PrimeQMinus1, 1 );

              // These checks should be more thorough.

              if( Worker.CancellationPending )
            return;

              Worker.ReportProgress( 0, "The Index of Prime P is: " + PrimeP.GetIndex().ToString() );
              Worker.ReportProgress( 0, "Prime P:" );
              Worker.ReportProgress( 0, IntMath.ToString10( PrimeP ));
              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, "Prime Q:" );
              Worker.ReportProgress( 0, IntMath.ToString10( PrimeQ ));
              Worker.ReportProgress( 0, " " );

              PubKeyN.Copy( PrimeP );
              IntMath.Multiply( PubKeyN, PrimeQ );

              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, "PubKeyN:" );
              Worker.ReportProgress( 0, IntMath.ToString10( PubKeyN ));
              Worker.ReportProgress( 0, " " );

              // Euler's Theorem:
              // https://en.wikipedia.org/wiki/Euler's_theorem
              // if x ≡ y (mod φ(n)),
              // then a^x ≡ a^y (mod n).

              // Euler's Phi function (aka Euler's Totient function) is calculated
              // next.

              // PhiN is made from the two factors: (P - 1)(Q - 1)
              // PhiN is: (P - 1)(Q - 1) = PQ - P - Q + 1
              // If I add (P - 1) to PhiN I get:
              // PQ - P - Q + 1 + (P - 1) = PQ - Q.
              // If I add (Q - 1) to that I get:
              // PQ - Q + (Q - 1) = PQ - 1.
              // (P - 1)(Q - 1) + (P - 1) + (Q - 1) = PQ - 1

              // If (P - 1) and (Q - 1) had a larger GCD then PQ - 1 would have
              // that same factor too.

              IntMath.GreatestCommonDivisor( PrimePMinus1, PrimeQMinus1, Gcd );
              Worker.ReportProgress( 0, "GCD of PrimePMinus1, PrimeQMinus1 is: " + IntMath.ToString10( Gcd ));

              if( !Gcd.IsULong())
            {
            Worker.ReportProgress( 0, "This GCD number is too big: " + IntMath.ToString10( Gcd ));
            continue;
            }
              else
            {
            ulong TooBig = Gcd.GetAsULong();
            // How big of a GCD is too big?
            if( TooBig > 1234567 )
              {
              // (P - 1)(Q - 1) + (P - 1) + (Q - 1) = PQ - 1
              Worker.ReportProgress( 0, "This GCD number is bigger than 1234567: " + IntMath.ToString10( Gcd ));
              continue;
              }
            }

              Integer Temp1 = new Integer();

              PhiN.Copy( PrimePMinus1 );
              Temp1.Copy( PrimeQMinus1 );
              IntMath.Multiply( PhiN, Temp1 );

              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, "PhiN:" );
              Worker.ReportProgress( 0, IntMath.ToString10( PhiN ));
              Worker.ReportProgress( 0, " " );
              if( Worker.CancellationPending )
            return;

              // In RFC 2437 there are commonly used letters/symbols to represent
              // the numbers used.  So the number e is the public exponent.
              // The number e that is used here is called PubKeyExponentUint = 65537.
              // In the RFC the private key d is the multiplicative inverse of
              // e mod PhiN.  Which is mod (P - 1)(Q - 1).  It's called
              // PrivKInverseExponent here.

              if( !IntMath.IntMathNew.FindMultiplicativeInverseSmall( PrivKInverseExponent, PubKeyExponent, PhiN, Worker ))
            return;

              if( PrivKInverseExponent.IsZero())
            continue;

              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, "PrivKInverseExponent: " + IntMath.ToString10( PrivKInverseExponent ));

              if( Worker.CancellationPending )
            return;

              // In RFC 2437 it defines a number dP which is the multiplicative
              // inverse, mod (P - 1) of e.  That dP is named PrivKInverseExponentDP here.
              Worker.ReportProgress( 0, " " );
              if( !IntMath.IntMathNew.FindMultiplicativeInverseSmall( PrivKInverseExponentDP, PubKeyExponent, PrimePMinus1, Worker ))
            return;

              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, "PrivKInverseExponentDP: " + IntMath.ToString10( PrivKInverseExponentDP ));
              if( PrivKInverseExponentDP.IsZero())
            continue;

              // PrivKInverseExponentDP is PrivKInverseExponent mod PrimePMinus1.
              Integer Test1 = new Integer();
              Test1.Copy( PrivKInverseExponent );
              IntMath.Divide( Test1, PrimePMinus1, Quotient, Remainder );
              Test1.Copy( Remainder );
              if( !Test1.IsEqual( PrivKInverseExponentDP ))
            throw( new Exception( "Bug. This does not match the definition of PrivKInverseExponentDP." ));

              if( Worker.CancellationPending )
            return;

              // In RFC 2437 it defines a number dQ which is the multiplicative
              // inverse, mod (Q - 1) of e.  That dQ is named PrivKInverseExponentDQ here.
              Worker.ReportProgress( 0, " " );
              if( !IntMath.IntMathNew.FindMultiplicativeInverseSmall( PrivKInverseExponentDQ, PubKeyExponent, PrimeQMinus1, Worker ))
            return;

              if( PrivKInverseExponentDQ.IsZero())
            continue;

              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, "PrivKInverseExponentDQ: " + IntMath.ToString10( PrivKInverseExponentDQ ));
              if( Worker.CancellationPending )
            return;

              Test1.Copy( PrivKInverseExponent );
              IntMath.Divide( Test1, PrimeQMinus1, Quotient, Remainder );
              Test1.Copy( Remainder );
              if( !Test1.IsEqual( PrivKInverseExponentDQ ))
            throw( new Exception( "Bug. This does not match the definition of PrivKInverseExponentDQ." ));

              // Make a random number to test encryption/decryption.
              Integer ToEncrypt = new Integer();
              int HowManyBytes = PrimeIndex * 4;
              byte[] RandBytes = MakeRandomBytes( HowManyBytes );
              if( RandBytes == null )
            {
            Worker.ReportProgress( 0, "Error making random bytes in MakeRSAKeys()." );
            return;
            }

              if( !ToEncrypt.MakeRandomOdd( PrimeIndex - 1, RandBytes ))
            {
            Worker.ReportProgress( 0, "Error making random number ToEncrypt." );
            return;
            }

              Integer PlainTextNumber = new Integer();
              PlainTextNumber.Copy( ToEncrypt );

              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, "Before encrypting number: " + IntMath.ToString10( ToEncrypt ));
              Worker.ReportProgress( 0, " " );

              IntMath.IntMathNew.ModularPower( ToEncrypt, PubKeyExponent, PubKeyN, false );
              if( Worker.CancellationPending )
            return;

              Worker.ReportProgress( 0, IntMath.GetStatusString() );

              Integer CipherTextNumber = new Integer();
              CipherTextNumber.Copy( ToEncrypt );

              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, "Encrypted number: " + IntMath.ToString10( CipherTextNumber ));
              Worker.ReportProgress( 0, " " );

              ECTime DecryptTime = new ECTime();
              DecryptTime.SetToNow();
              IntMath.IntMathNew.ModularPower( ToEncrypt, PrivKInverseExponent, PubKeyN, false );
              Worker.ReportProgress( 0, "Decrypted number: " + IntMath.ToString10( ToEncrypt ));

              if( !PlainTextNumber.IsEqual( ToEncrypt ))
            {
            throw( new Exception( "PlainTextNumber not equal to unencrypted value." ));
            // Because P or Q wasn't really a prime?
            // Worker.ReportProgress( 0, "PlainTextNumber not equal to unencrypted value." );
            // continue;
            }

              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, "Decrypt time seconds: " + DecryptTime.GetSecondsToNow().ToString( "N2" ));
              Worker.ReportProgress( 0, " " );
              if( Worker.CancellationPending )
            return;

              // Test the standard optimized way of decrypting:
              if( !ToEncrypt.MakeRandomOdd( PrimeIndex - 1, RandBytes ))
            {
            Worker.ReportProgress( 0, "Error making random number in MakeRSAKeys()." );
            return;
            }

              PlainTextNumber.Copy( ToEncrypt );
              IntMath.IntMathNew.ModularPower( ToEncrypt, PubKeyExponent, PubKeyN, false );
              if( Worker.CancellationPending )
            return;

              CipherTextNumber.Copy( ToEncrypt );

              // QInv is the multiplicative inverse of PrimeQ mod PrimeP.
              if( !IntMath.MultiplicativeInverse( PrimeQ, PrimeP, QInv, Worker ))
            throw( new Exception( "MultiplicativeInverse() returned false." ));

              if( QInv.IsNegative )
            throw( new Exception( "This is a bug. QInv is negative." ));

              Worker.ReportProgress( 0, "QInv is: " + IntMath.ToString10( QInv ));

              DecryptWithQInverse( CipherTextNumber,
                           ToEncrypt, // Decrypt it to this.
                           PlainTextNumber, // Test it against this.
                           PubKeyN,
                           PrivKInverseExponentDP,
                           PrivKInverseExponentDQ,
                           PrimeP,
                           PrimeQ,
                           Worker );

              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, "Found the values:" );
              Worker.ReportProgress( 0, "Seconds: " + StartTime.GetSecondsToNow().ToString( "N0" ));
              Worker.ReportProgress( 0, " " );

              Worker.ReportProgress( 1, "Prime1: " + IntMath.ToString10( PrimeP ));
              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 1, "Prime2: " + IntMath.ToString10( PrimeQ ));
              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 1, "PubKeyN: " + IntMath.ToString10( PubKeyN ));
              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 1, "PrivKInverseExponent: " + IntMath.ToString10( PrivKInverseExponent ));

              /*
              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, " " );
              Worker.ReportProgress( 0, " " );
              DoCRTTest( PrivKInverseExponent );
              Worker.ReportProgress( 0, "Finished CRT test." );
              Worker.ReportProgress( 0, " " );
              */

              return; // Comment this out to just leave it while( true ) for testing.
              }
        }
Exemplo n.º 19
0
        internal bool SendCrudeClientHello( RNGCryptoServiceProvider CryptoRand, CustomerTLSClient CustomerTLS )
        {
            try
            {
            int LengthOfOuterMessage = 52 - 5;
            byte[] ToSendBuf = new byte[LengthOfOuterMessage + 5];

            // The first five bytes are the outer TLS record.
            ToSendBuf[0] = 22; // Content type is Handshake
            ToSendBuf[1] = 3;  // Version Major   TLS version 1.2 is version 3.3 (of SSL).
            ToSendBuf[2] = 3;  // Version Minor
            ToSendBuf[3] = (byte)(LengthOfOuterMessage >> 8);
            ToSendBuf[4] = (byte)(LengthOfOuterMessage);

            // Start of the inner ClientHello message.
            ToSendBuf[5] = 1; // Message type 1 is a  ClientHello message.

            int LengthOfClientHelloMessage = LengthOfOuterMessage - 4;
            ToSendBuf[6] = (byte)(LengthOfClientHelloMessage >> 16);
            ToSendBuf[7] = (byte)(LengthOfClientHelloMessage >> 8);
            ToSendBuf[8] = (byte)(LengthOfClientHelloMessage);
            ToSendBuf[9] = 3;   // Version Major
            ToSendBuf[10] = 3;  // Version Minor

            // This part for Unix time is not in TLS 1.3 because there's no point in having it.
            // But it is here in TLS 1.2.
            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            ulong UnixTime = RightNow.ToUnixTime();
            ToSendBuf[11] = (byte)(UnixTime >> 24);
            ToSendBuf[12] = (byte)(UnixTime >> 16);
            ToSendBuf[13] = (byte)(UnixTime >> 8);
            ToSendBuf[14] = (byte)(UnixTime);

            // These bytes have to be cryptographically random.
            // These are used later in generating the master secret and keys, etc.
            byte[] RandomBytes = new byte[28];
            CryptoRand.GetBytes( RandomBytes );

            int Index = 15;
            for( int Count = 0; Count < 28; Count++ )
              {
              ToSendBuf[Index] = RandomBytes[Count];
              Index++;
              }

            // Index is 15 + 28 = 43.
            // StatusString += "Index at the end of Random bytes is: " + Index.ToString() + "\r\n";
            // Index at the end of Random bytes is: 43

            ToSendBuf[43] = 0; // Session ID Length is zero. It's not resuming a session here.

            // A browser sends a lot more cipher suites than this so this is
            // usually a lot longer.  The algorithm you prefer to use should
            // be listed first.  So they are listed in order of preference.
            ToSendBuf[44] = 0; // Cipher Suites Length high byte
            ToSendBuf[45] = 4; // Cipher Suites Length
            ToSendBuf[46] = 0;
            ToSendBuf[47] = 0x35; // TLS_RSA_WITH_AES_256_CBC_SHA    = { 0x00,0x35 };
            ToSendBuf[48] = 0;
            ToSendBuf[49] = 0x3D; // TLS_RSA_WITH_AES_256_CBC_SHA256 = { 0x00,0x3D };
            ToSendBuf[50] = 1; // Compression Methods Length
            ToSendBuf[51] = 0; // Compression Method is null.

            // This message has no extensions, so that's all there is to send.
            return CustomerTLS.SendBuffer( ToSendBuf );

            }
            catch( Exception Except )
              {
              StatusString += "Exception in SendCrudeClientHello()\r\n";
              StatusString += Except.Message + "\r\n";
              return false;
              }
        }
Exemplo n.º 20
0
        private void ProcessWebRequests()
        {
            if( MForm.GetIsClosing())
              return;

            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            for( int Count = 0; Count < ClientsLast; Count++ )
              {
              if( Clients[Count] == null ) // This should never happen but...
            continue;

              // If this is something that has already been processed.
              if( Clients[Count].GetProcessingStarted())
            continue;

              // IsShutDown is a little slower than the above checks.
              if( Clients[Count].IsShutDown())
            continue;

              if( !Clients[Count].IsBrowserRequest())
            continue;

              if( !Clients[Count].IsBrowserRequestReady())
            continue;

              // ShowStatus( "Got a browser request 2." );

              Clients[Count].SetProcessingStarted( true );

              string InputS = Utility.GetCleanUnicodeString( Clients[Count].GetAllInputS(), 2000 );

              // This FileName is already cleaned ASCII.
              string FileName = Clients[Count].GetHTTPFileRequested();
              string OriginalFileName = FileName;

              FileName = FileName.ToLower();
              FileName = FileName.Replace( "/", "" );
              // ShowStatus( "FileName is: " + FileName );

              if( FileName.StartsWith( "bad http:" ))
            {
            MForm.NetStats.AddToHackerCount( Clients[Count].GetRemoteAddress(), InputS );
            // MForm.ServerLog.AddToLog( "Bad HTTP", InputS, Clients[Count].GetRemoteAddress() );
            Clients[Count].FreeEverything();
            ShowStatus( FileName );
            continue;
            }

              if( FileName.StartsWith( "hacking:" ))
            {
            DailyHackCount++;
            MForm.NetStats.AddToHackerCount( Clients[Count].GetRemoteAddress(), InputS );
            // MForm.ServerLog.AddToLog( "Hacking", InputS, Clients[Count].GetRemoteAddress() );
            Clients[Count].FreeEverything();
            RightNow.SetToNow();
            ShowStatus( RightNow.ToLocalTimeString() + " on " + RightNow.ToLocalDateString() );
            ShowStatus( FileName );
            ShowStatus( " " );
            continue;
            }

              RightNow.SetToNow();
              string Referer = "None";
              string UserAgent = "None";

              if( FileName == "laplata.htm" )
            {
            if( MForm.GetIsClosing())
              return;

            // MForm.NetStats.AddTo...

            byte[] ToSendBuf = MForm.LaPlataData1.GetHTML( "smith" );
            if( ToSendBuf != null )
              Clients[Count].SendGenericWebResponse( ToSendBuf, RightNow.GetIndex(), UniqueEntityTag, "text/html" );

            Referer = Clients[Count].GetReferer();
            UserAgent = Clients[Count].GetUserAgent();
            // MForm.ServerLog.AddToLog() ...
            continue;
            }

              if( !MForm.WebFData.ContainsFile( FileName ))
            {
            Clients[Count].FreeEverything();
             // This is already clean ASCII.
            string LogText = FileName + ": " + InputS;
            // MForm.ServerLog.AddToLog( "No Web File", LogText, Clients[Count].GetRemoteAddress() );
            MForm.NetStats.AddToBadWebPageCount( Clients[Count].GetRemoteAddress(), InputS );
            ShowStatus( " " );
            RightNow.SetToNow();
            ShowStatus( RightNow.ToLocalTimeString() + " on " + RightNow.ToLocalDateString() );
            ShowStatus( "No Web File" );
            ShowStatus( "Original: " + OriginalFileName );
            ShowStatus( "Fixed: " + FileName );
            ShowStatus( "From IP: " + Clients[Count].GetRemoteAddress() );
            continue;
            }

              if( FileName.EndsWith( ".exe" ) || FileName.EndsWith( ".apk" ))
            {
            ShowStatus( " " );
            RightNow.SetToNow();
            ShowStatus( RightNow.ToLocalTimeString() + " on " + RightNow.ToLocalDateString() );
            ShowStatus( "Request for: " + FileName );
            ShowStatus( "From IP: " + Clients[Count].GetRemoteAddress() );
            ShowStatus( " " );
            }

              Referer = Clients[Count].GetReferer();
              UserAgent = Clients[Count].GetUserAgent();
              MForm.NetStats.AddToUserAgentAndReferer( Clients[Count].GetRemoteAddress(), Referer, UserAgent );

              // Increment UniqueEntityTag when it sends something.
              UniqueEntityTag++;
              // FileName is already clean ASCII, it's lower case, and trimmed.

              // This is a reference to the buffer, but the client copies from it.
              byte[] Buffer = MForm.WebFData.GetBuffer( FileName );
              if( Buffer == null )
            {
            ShowStatus( "The buffer was null for a good web request: " + FileName );
            continue;
            }

              if( FileName.EndsWith( ".jpg" ))
            {
            Clients[Count].SendGenericWebResponse( Buffer, RightNow.GetIndex(), UniqueEntityTag, "image/jpeg" );
            // MForm.ServerLog.AddToLog( "Finished Web Request", FileName, Clients[Count].GetRemoteAddress() );
            continue;
            }

              if( FileName.EndsWith( ".gif" ))
            {
            Clients[Count].SendGenericWebResponse( Buffer, RightNow.GetIndex(), UniqueEntityTag, "image/gif" );
            // MForm.ServerLog.AddToLog( "Finished Web Request", FileName, Clients[Count].GetRemoteAddress() );
            continue;
            }

              if( FileName.EndsWith( ".htm" ))
            {
            Clients[Count].SendGenericWebResponse( Buffer, RightNow.GetIndex(), UniqueEntityTag, "text/html" );
            // MForm.ServerLog.AddToLog( "Finished Web Request", FileName, Clients[Count].GetRemoteAddress() );
            continue;
            }

              if( FileName.EndsWith( ".txt" ))
            {
            Clients[Count].SendGenericWebResponse( Buffer, RightNow.GetIndex(), UniqueEntityTag, "text/plain" );
            // MForm.ServerLog.AddToLog( "Finished Web Request", FileName, Clients[Count].GetRemoteAddress() );
            continue;
            }

              if( FileName.EndsWith( ".pdf" ))
            {
            Clients[Count].SendGenericWebResponse( Buffer, RightNow.GetIndex(), UniqueEntityTag, "application/pdf" );
            // MForm.ServerLog.AddToLog( "Finished Web Request", FileName, Clients[Count].GetRemoteAddress() );
            continue;
            }

              if( FileName == "favicon.ico" )
            {
            Clients[Count].SendGenericWebResponse( Buffer, RightNow.GetIndex(), UniqueEntityTag, "image/vnd.microsoft.icon" );
            // MForm.ServerLog.AddToLog( "Finished Web Request", FileName, Clients[Count].GetRemoteAddress() );
            continue;
            }

              // Default to sending text unless there's some other way to send it.
              Clients[Count].SendGenericWebResponse( Buffer, RightNow.GetIndex(), UniqueEntityTag, "text/plain" );
              // MForm.ServerLog.AddToLog( "Finished Web Request", FileName, Clients[Count].GetRemoteAddress() );
              }
        }
Exemplo n.º 21
0
        internal bool ClearMidnightValues()
        {
            try
            {
            // The IP stuff is also kept in the server log.
            ECTime RecTime = new ECTime();
            ECTime OldTime = new ECTime();
            OldTime.SetToNow();
            OldTime.AddMinutes( -(60 * 24 * 30)); // 30 days.
            ulong OldIndex = OldTime.GetIndex();

            SortedDictionary<string, IPStatusRec> TempIPsDictionary = new SortedDictionary<string, IPStatusRec>();

            foreach( KeyValuePair<string, IPStatusRec> Kvp in IPsDictionary )
              {
              RecTime.SetFromIndex( Kvp.Value.TimeIndex );
              if( RecTime.GetIndex() < OldIndex )
            continue;

              // Keep totals on things like bad reg key count.
              IPStatusRec Rec = Kvp.Value;
              Rec.TimedOutCount = 0;
              Rec.GoodWebRequestCount = 0;
              // TotalGoodWebRequestCount
              // BadWebPageCount
              Rec.GetPublicKeyCount = 0;
              // Rec.TotalGetPublicKeyCount
              Rec.ConfirmBillingCount = 0;
              // Rec.TotalConfirmBillingCount

              TempIPsDictionary[Kvp.Key] = Rec;
              }

            IPsDictionary = TempIPsDictionary;
            return true;

            }
            catch( Exception Except )
              {
              MForm.ShowStatus( "Exception in ClearMidnightValues():" );
              MForm.ShowStatus( Except.Message );
              return false;
              }
        }
Exemplo n.º 22
0
        internal void AddToPort80Count( string IP )
        {
            if( IsBadIP( IP ))
              return;

            try
            {
            IPStatusRec StatusRec;
            if( IPsDictionary.ContainsKey( IP ))
              StatusRec = IPsDictionary[IP];
            else
              StatusRec = MakeNewStatusRec();

            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            StatusRec.TimeIndex = RightNow.GetIndex();
            StatusRec.Port80Count++;

            IPsDictionary[IP] = StatusRec;
            }
            catch( Exception Except )
              {
              MForm.ShowStatus( "Exception in AddToPort80Count():" );
              MForm.ShowStatus( Except.Message );
              }
        }
Exemplo n.º 23
0
        private void DoCRTTest( Integer StartingNumber )
        {
            CRTMath CRTMath1 = new CRTMath( Worker );
            ECTime CRTTestTime = new ECTime();
            ChineseRemainder CRTTest = new ChineseRemainder( IntMath );
            ChineseRemainder CRTTest2 = new ChineseRemainder( IntMath );
            ChineseRemainder CRTAccumulate = new ChineseRemainder( IntMath );
            ChineseRemainder CRTToTest = new ChineseRemainder( IntMath );
            ChineseRemainder CRTTempEqual = new ChineseRemainder( IntMath );
            ChineseRemainder CRTTestEqual = new ChineseRemainder( IntMath );
            Integer BigBase = new Integer();
            Integer ToTest = new Integer();
            Integer Accumulate = new Integer();
            Integer Test1 = new Integer();
            Integer Test2 = new Integer();

            CRTTest.SetFromTraditionalInteger( StartingNumber );
            // If the digit array size isn't set right in relation to
            // Integer.DigitArraySize then it can cause an error here.
            CRTMath1.GetTraditionalInteger( Accumulate, CRTTest );

            if( !Accumulate.IsEqual( StartingNumber ))
              throw( new Exception( "  !Accumulate.IsEqual( Result )." ));

            CRTTestEqual.SetFromTraditionalInteger( Accumulate );
            if( !CRTMath1.IsEqualToInteger( CRTTestEqual, Accumulate ))
              throw( new Exception( "IsEqualToInteger() didn't work." ));

            // Make sure it works with even numbers too.
            Test1.Copy( StartingNumber );
            Test1.SetD( 0, Test1.GetD( 0 ) & 0xFE );
            CRTTest.SetFromTraditionalInteger( Test1 );
            CRTMath1.GetTraditionalInteger( Accumulate, CRTTest );

            if( !Accumulate.IsEqual( Test1 ))
              throw( new Exception( "For even numbers.  !Accumulate.IsEqual( Test )." ));
            ////////////

            // Make sure the size of this works with the Integer size because
            // an overflow is hard to find.
            CRTTestTime.SetToNow();
            Test1.SetToMaxValueForCRT();
            CRTTest.SetFromTraditionalInteger( Test1 );
            CRTMath1.GetTraditionalInteger( Accumulate, CRTTest );

            if( !Accumulate.IsEqual( Test1 ))
              throw( new Exception( "For the max value. !Accumulate.IsEqual( Test1 )." ));

            // Worker.ReportProgress( 0, "CRT Max test seconds: " + CRTTestTime.GetSecondsToNow().ToString( "N1" ));
            // Worker.ReportProgress( 0, "MaxValue: " + IntMath.ToString10( Accumulate ));
            // Worker.ReportProgress( 0, "MaxValue.Index: " + Accumulate.GetIndex().ToString());

            // Multiplicative Inverse test:
            Integer TestDivideBy = new Integer();
            Integer TestProduct = new Integer();
            ChineseRemainder CRTTestDivideBy = new ChineseRemainder( IntMath );
            ChineseRemainder CRTTestProduct = new ChineseRemainder( IntMath );

            TestDivideBy.Copy( StartingNumber );
            TestProduct.Copy( StartingNumber );
            IntMath.Multiply( TestProduct, TestDivideBy );

            CRTTestDivideBy.SetFromTraditionalInteger( TestDivideBy );
            CRTTestProduct.SetFromTraditionalInteger( TestDivideBy );
            CRTTestProduct.Multiply( CRTTestDivideBy );

            CRTMath1.GetTraditionalInteger( Accumulate, CRTTestProduct );

            if( !Accumulate.IsEqual( TestProduct ))
              throw( new Exception( "Multiply test was bad." ));

            IntMath.Divide( TestProduct, TestDivideBy, Quotient, Remainder );
            if( !Remainder.IsZero())
              throw( new Exception( "This test won't work unless it divides it exactly." ));

            ChineseRemainder CRTTestQuotient = new ChineseRemainder( IntMath );
            CRTMath1.MultiplicativeInverse( CRTTestProduct, CRTTestDivideBy, CRTTestQuotient );

            // Yes, multiplicative inverse is the same number
            // as with regular division.
            Integer TestQuotient = new Integer();
            CRTMath1.GetTraditionalInteger( TestQuotient, CRTTestQuotient );
            if( !TestQuotient.IsEqual( Quotient ))
              throw( new Exception( "Modular Inverse in DoCRTTest didn't work." ));

            // Subtract
            Test1.Copy( StartingNumber );
            IntMath.SetFromString( Test2, "12345678901234567890123456789012345" );

            CRTTest.SetFromTraditionalInteger( Test1 );
            CRTTest2.SetFromTraditionalInteger( Test2 );

            CRTTest.Subtract( CRTTest2 );
            IntMath.Subtract( Test1, Test2 );

            CRTMath1.GetTraditionalInteger( Accumulate, CRTTest );

            if( !Accumulate.IsEqual( Test1 ))
              throw( new Exception( "Subtract test was bad." ));

            // Add
            Test1.Copy( StartingNumber );
            IntMath.SetFromString( Test2, "12345678901234567890123456789012345" );

            CRTTest.SetFromTraditionalInteger( Test1 );
            CRTTest2.SetFromTraditionalInteger( Test2 );

            CRTTest.Add( CRTTest2 );
            IntMath.Add( Test1, Test2 );

            CRTMath1.GetTraditionalInteger( Accumulate, CRTTest );

            if( !Accumulate.IsEqual( Test1 ))
              throw( new Exception( "Add test was bad." ));

            /////////
            CRTBaseMath CBaseMath = new CRTBaseMath( Worker, CRTMath1 );

            ChineseRemainder CRTInput = new ChineseRemainder( IntMath );
            CRTInput.SetFromTraditionalInteger( StartingNumber );

            Test1.Copy( StartingNumber );
            IntMath.SetFromString( Test2, "12345678901234567890123456789012345" );
            IntMath.Add( Test1, Test2 );

            Integer TestModulus = new Integer();
            TestModulus.Copy( Test1 );
            ChineseRemainder CRTTestModulus = new ChineseRemainder( IntMath );
            CRTTestModulus.SetFromTraditionalInteger( TestModulus );

            Integer Exponent = new Integer();
            Exponent.SetFromULong( PubKeyExponentUint );

            CBaseMath.ModularPower( CRTInput, Exponent, CRTTestModulus, false );
            IntMath.IntMathNew.ModularPower( StartingNumber, Exponent, TestModulus, false );

            if( !CRTMath1.IsEqualToInteger( CRTInput, StartingNumber ))
              throw( new Exception( "CRTBase ModularPower() didn't work." ));

            CRTBase ExpTest = new CRTBase( IntMath );
            CBaseMath.SetFromCRTNumber( ExpTest, CRTInput );
            CBaseMath.GetExponentForm( ExpTest, 37 );

            // Worker.ReportProgress( 0, "CRT was good." );
        }
Exemplo n.º 24
0
        internal bool FindTwoFactorsWithFermat( Integer Product, Integer P, Integer Q, ulong MinimumX )
        {
            ECTime StartTime = new ECTime();
            StartTime.SetToNow();

            Integer TestSqrt = new Integer();
            Integer TestSquared = new Integer();
            Integer SqrRoot = new Integer();

            TestSquared.Copy( Product );
            IntMath.Multiply( TestSquared, Product );
            IntMath.SquareRoot( TestSquared, SqrRoot );
            TestSqrt.Copy( SqrRoot );
            IntMath.DoSquare( TestSqrt );
            // IntMath.Multiply( TestSqrt, SqrRoot );
            if( !TestSqrt.IsEqual( TestSquared ))
              throw( new Exception( "The square test was bad." ));

            // Some primes:
            // 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,
            // 101, 103, 107

            P.SetToZero();
            Q.SetToZero();
            Integer TestX = new Integer();
            SetupQuadResArray( Product );

            ulong BaseTo37 = QuadResBigBase * 29UL * 31UL * 37UL;
            // ulong BaseTo31 = QuadResBigBase * 29UL * 31UL;
            ulong ProdModTo37 = IntMath.GetMod64( Product, BaseTo37 );
            // ulong ProdModTo31 = IntMath.GetMod64( Product, BaseTo31 );
            for( ulong BaseCount = 0; BaseCount < (29 * 31 * 37); BaseCount++ )
              {
              if( (BaseCount & 0xF) == 0 )
            Worker.ReportProgress( 0, "Find with Fermat BaseCount: " + BaseCount.ToString() );

              if( Worker.CancellationPending )
            return false;

              ulong Base = (BaseCount + 1) * QuadResBigBase; // BaseCount times 223,092,870.
              if( Base < MinimumX )
            continue;

              Base = BaseCount * QuadResBigBase; // BaseCount times 223,092,870.
              for( uint Count = 0; Count < QuadResArrayLast; Count++ )
            {
            // The maximum CountPart can be is just under half the size of
            // the Product. (Like if Y - X was equal to 1, and Y + X was
            // equal to the Product.)  If it got anywhere near that big it
            // would be inefficient to try and find it this way.
            ulong CountPart = Base + QuadResArray[Count];
            ulong Test = ProdModTo37 + (CountPart * CountPart);
            // ulong Test = ProdModTo31 + (CountPart * CountPart);
            Test = Test % BaseTo37;
            // Test = Test % BaseTo31;
            if( !IntegerMath.IsQuadResidue29( Test ))
              continue;

            if( !IntegerMath.IsQuadResidue31( Test ))
              continue;

            if( !IntegerMath.IsQuadResidue37( Test ))
              continue;

            ulong TestBytes = (CountPart & 0xFFFFF);
            TestBytes *= (CountPart & 0xFFFFF);
            ulong ProdBytes = Product.GetD( 1 );
            ProdBytes <<= 8;
            ProdBytes |= Product.GetD( 0 );

            uint FirstBytes = (uint)(TestBytes + ProdBytes);
            if( !IntegerMath.FirstBytesAreQuadRes( FirstBytes ))
              {
              // Worker.ReportProgress( 0, "First bytes aren't quad res." );
              continue;
              }

            TestX.SetFromULong( CountPart );
            IntMath.MultiplyULong( TestX, CountPart );
            TestX.Add( Product );

            // uint Mod37 = (uint)IntMath.GetMod32( TestX, 37 );
            // if( !IntegerMath.IsQuadResidue37( Mod37 ))
              // continue;

            // Do more of these tests with 41, 43, 47...
            // if( !IntegerMath.IsQuadResidue41( Mod37 ))
              // continue;

            // Avoid doing this square root at all costs.
            if( IntMath.SquareRoot( TestX, SqrRoot ))
              {
              Worker.ReportProgress( 0, " " );
              if( (CountPart & 1) == 0 )
            Worker.ReportProgress( 0, "CountPart was even." );
              else
            Worker.ReportProgress( 0, "CountPart was odd." );

              // Found an exact square root.
              // P + (CountPart * CountPart) = Y*Y
              // P = (Y + CountPart)Y - CountPart)

              P.Copy( SqrRoot );
              Integer ForSub = new Integer();
              ForSub.SetFromULong( CountPart );
              IntMath.Subtract( P, ForSub );

              // Make Q the bigger one and put them in order.
              Q.Copy( SqrRoot );
              Q.AddULong( CountPart );

              if( P.IsOne() || Q.IsOne())
            {
            // This happens when testing with small primes.
            Worker.ReportProgress( 0, " " );
            Worker.ReportProgress( 0, " " );
            Worker.ReportProgress( 0, "Went all the way to 1 in FindTwoFactorsWithFermat()." );
            Worker.ReportProgress( 0, " " );
            Worker.ReportProgress( 0, " " );
            P.SetToZero(); // It has no factors.
            Q.SetToZero();
            return true; // Tested everything, so it's a prime.
            }

              Worker.ReportProgress( 0, "Found P: " + IntMath.ToString10( P ) );
              Worker.ReportProgress( 0, "Found Q: " + IntMath.ToString10( Q ) );
              Worker.ReportProgress( 0, "Seconds: " + StartTime.GetSecondsToNow().ToString( "N1" ));
              Worker.ReportProgress( 0, " " );
              throw( new Exception( "Testing this." ));
              // return true; // With P and Q.
              }
            // else
              // Worker.ReportProgress( 0, "It was not an exact square root." );

            }
              }

            // P and Q would still be zero if it never found them.
            return false;
        }
Exemplo n.º 25
0
        private void CheckTimer_Tick(object sender, EventArgs e)
        {
            // This timer event only gets called when the server isn't otherwise busy.
            // Even though the timer interval is set to once every 50 milliseconds it
            // doesn't mean it will get called that often.
            // It has TestTime to check on how busy it is.

            if( !IsEnabled )
              return;

            CheckTimer.Stop();
            try // for finally
            {

            try // for catch
            {
            ECTime TestTime = new ECTime();
            TestTime.SetToNow();

            // 100 clients queued up per timer tick is 2,000 per second max,
            // assuming the server isn't busy and the timer events get called that often.
            // But if there were that many clients connecting you'd need more front end
            // servers to handle the I/O.  Or it's a denial of service attack, and you'd
            // need to deal with that.
            for( int Count = 0; Count < 100; Count++ )
              {
              if( !IsEnabled )
            return;

              if( Listener.Pending() )
            QueueConnectedClient();
              else
            break;

              }

            CloseTimedOut();
            if( !IsEnabled )
              return;

            FreeClosed();
            if( !IsEnabled )
              return;

            ProcessOuterMessages();
            if( !IsEnabled )
              return;

            double Seconds = TestTime.GetSecondsToNow();
            if( Seconds > 1.0 )
              {
              ShowStatus( " " );
              ShowStatus( "**************************************************" );
              ShowStatus( "TLS Listener Test time seconds: " + Seconds.ToString( "N0" ));
              ShowStatus( "Test time:: " + TestTime.ToLocalTimeString());
              ShowStatus( "**************************************************" );
              ShowStatus( " " );
              }
            }
            catch( Exception Except )
              {
              ShowStatus( "Exception in CheckTimerTick: \r\n" + Except.Message );
              return;
              }

            }
            finally
              {
              CheckTimer.Start();
              }
        }
Exemplo n.º 26
0
        internal void AddToUserAgentAndReferer( string Address, string Referer, string UserAgent )
        {
            try
            {
            Referer = Utility.CleanAsciiString( Referer, 1000 );
            UserAgent = Utility.CleanAsciiString( UserAgent, 1000 );

            IPStatusRec StatusRec;
            if( IPsDictionary.ContainsKey( Address ))
              StatusRec = IPsDictionary[Address];
            else
              StatusRec = MakeNewStatusRec();

            ECTime RightNow = new ECTime();
            RightNow.SetToNow();
            StatusRec.TimeIndex = RightNow.GetIndex();
            StatusRec.Referer = Utility.CleanAsciiString( Referer, 2048 );
            StatusRec.UserAgent = Utility.CleanAsciiString( UserAgent, 2048 );

            if( RefererDictionary.ContainsKey( Referer ))
              RefererDictionary[Referer] = RefererDictionary[Referer] + 1;
            else
              RefererDictionary[Referer] = 1;

            if( UserAgentDictionary.ContainsKey( UserAgent ))
              UserAgentDictionary[UserAgent] = UserAgentDictionary[UserAgent] + 1;
            else
              UserAgentDictionary[UserAgent] = 1;

            IPsDictionary[Address] = StatusRec;
            }
            catch( Exception Except )
              {
              MForm.ShowStatus( "Exception in AddToUserAgentAndReferer():" );
              MForm.ShowStatus( Except.Message );
              }
        }
Exemplo n.º 27
0
        internal bool DecryptWithQInverse( Integer EncryptedNumber,
                                     Integer DecryptedNumber,
                                     Integer TestDecryptedNumber,
                                     Integer PubKeyN,
                                     Integer PrivKInverseExponentDP,
                                     Integer PrivKInverseExponentDQ,
                                     Integer PrimeP,
                                     Integer PrimeQ,
                                     BackgroundWorker Worker )
        {
            Worker.ReportProgress( 0, " " );
            Worker.ReportProgress( 0, "Top of DecryptWithQInverse()." );

            // QInv and the dP and dQ numbers are normally already set up before
            // you start your listening socket.
            ECTime DecryptTime = new ECTime();
            DecryptTime.SetToNow();

            // See section 5.1.2 of RFC 2437 for these steps:
            // http://tools.ietf.org/html/rfc2437
            //      2.2 Let m_1 = c^dP mod p.
            //      2.3 Let m_2 = c^dQ mod q.
            //      2.4 Let h = qInv ( m_1 - m_2 ) mod p.
            //      2.5 Let m = m_2 + hq.

            Worker.ReportProgress( 0, "EncryptedNumber: " + IntMath.ToString10( EncryptedNumber ));

            //      2.2 Let m_1 = c^dP mod p.
            TestForDecrypt.Copy( EncryptedNumber );
            IntMathNewForP.ModularPower( TestForDecrypt, PrivKInverseExponentDP, PrimeP, true );
            if( Worker.CancellationPending )
              return false;

            M1ForInverse.Copy( TestForDecrypt );

            //      2.3 Let m_2 = c^dQ mod q.
            TestForDecrypt.Copy( EncryptedNumber );
            IntMathNewForQ.ModularPower( TestForDecrypt, PrivKInverseExponentDQ, PrimeQ, true );

            if( Worker.CancellationPending )
              return false;

            M2ForInverse.Copy( TestForDecrypt );

            //      2.4 Let h = qInv ( m_1 - m_2 ) mod p.

            // How many is optimal to avoid the division?
            int HowManyIsOptimal = (PrimeP.GetIndex() * 3);
            for( int Count = 0; Count < HowManyIsOptimal; Count++ )
              {
              if( M1ForInverse.ParamIsGreater( M2ForInverse ))
            M1ForInverse.Add( PrimeP );
              else
            break;

              }

            if( M1ForInverse.ParamIsGreater( M2ForInverse ))
              {
              M1M2SizeDiff.Copy( M2ForInverse );
              IntMath.Subtract( M1M2SizeDiff, M1ForInverse );
              // Unfortunately this long Divide() has to be done.
              IntMath.Divide( M1M2SizeDiff, PrimeP, Quotient, Remainder );
              Quotient.AddULong( 1 );
              Worker.ReportProgress( 0, "The Quotient for M1M2SizeDiff is: " + IntMath.ToString10( Quotient ));
              IntMath.Multiply( Quotient, PrimeP );
              M1ForInverse.Add( Quotient );
              }

            M1MinusM2.Copy( M1ForInverse );
            IntMath.Subtract( M1MinusM2, M2ForInverse );

            if( M1MinusM2.IsNegative )
              throw( new Exception( "This is a bug. M1MinusM2.IsNegative is true." ));

            if( QInv.IsNegative )
              throw( new Exception( "This is a bug. QInv.IsNegative is true." ));

            HForQInv.Copy( M1MinusM2 );
            IntMath.Multiply( HForQInv, QInv );

            if( HForQInv.IsNegative )
              throw( new Exception( "This is a bug. HForQInv.IsNegative is true." ));

            if( PrimeP.ParamIsGreater( HForQInv ))
              {
              IntMath.Divide( HForQInv, PrimeP, Quotient, Remainder );
              HForQInv.Copy( Remainder );
              }

            //      2.5 Let m = m_2 + hq.
            DecryptedNumber.Copy( HForQInv );
            IntMath.Multiply( DecryptedNumber, PrimeQ );
            DecryptedNumber.Add( M2ForInverse );
            if( !TestDecryptedNumber.IsEqual( DecryptedNumber ))
              throw( new Exception( "!TestDecryptedNumber.IsEqual( DecryptedNumber )." ));

            Worker.ReportProgress( 0, " " );
            Worker.ReportProgress( 0, "DecryptedNumber: " + IntMath.ToString10( DecryptedNumber ));
            Worker.ReportProgress( 0, " " );
            Worker.ReportProgress( 0, "TestDecryptedNumber: " + IntMath.ToString10( TestDecryptedNumber ));
            Worker.ReportProgress( 0, " " );
            Worker.ReportProgress( 0, "Decrypt with QInv time seconds: " + DecryptTime.GetSecondsToNow().ToString( "N2" ));
            Worker.ReportProgress( 0, " " );
            return true;
        }