Example #1
0
        /// <summary>
        /// Wait for the client to send its response
        /// </summary>
        /// <param name="data"></param>
        public void Wait(object data)
        {
            try
            {
                if (data == null)
                {
                    Exception e = new System.ArgumentNullException("data");
                    options.LogThrownException(e);
                    throw e;
                }

                ClientTransaction client = (ClientTransaction)data;

                // We will wait until the timeout
                // During this time, if the client sends its response then the server shall kill this Wait Thread for the client transaction
                // to prevent removal of the client from the Client database
                bool timeOut = TimedOut();

                // If timed out, remove the client from the database
                if (timeOut)
                {
                    log.Debug("Client " + client.ID + " timed out");
                    ClientDatabase.RemoveTransaction(client);
                }
            }
            catch (Exception e)
            {
                if (e.Message.Contains("Thread was being aborted"))
                {
                    log.Debug("Client Thread was killed. ");
                }
                else
                {
                    log.Debug("ThreadWait: Wait failed. " + e.Message);
                }
            }
        }
        public async Task <IHttpActionResult> Msg3()
        {
            log.Debug("SpSequenceCheck(.) started.");

            bool              error      = false;
            HttpStatusCode    errorCode  = System.Net.HttpStatusCode.InternalServerError;
            M4ResponseMessage m4Response = null;

            try
            {
                m4Response = await ClientDatabase.Message3(this.Request);
            }
            catch (WebException we)
            {
                error = true;
                log.Debug("Web Exception in Provisioning Request: " + we.Message);
                HttpWebResponse webResponse = we.Response as HttpWebResponse;
                errorCode = (HttpStatusCode)webResponse.StatusCode;
            }
            catch (HttpResponseException re)
            {
                error = true;
                log.Debug("HttpResponseException in Message 3/4: " + re.Message);
                errorCode = (HttpStatusCode)re.Response.StatusCode;
            }
            catch (Exception e)
            {
                error = true;
                log.Debug("Error occurred processing Message 3 or 4. " + e.Message);
                errorCode = System.Net.HttpStatusCode.InternalServerError;
            }

            // always cleanup database on Message 4
            try
            {
                ClientDatabase.RemoveTransaction(this.Request, Constants.msg3Str);
            }
            catch (HttpResponseException re)
            {
                log.Debug("HttpResponseException in Message 3/4 RemoveTransaction: " + re.Message);
                if (!error)
                {
                    error     = true;
                    errorCode = (HttpStatusCode)re.Response.StatusCode;
                }
            }
            catch (Exception e)
            {
                log.Debug("Error occurred processing Message 3 or 4 RemoveTransaction: " + e.Message);
                if (!error)
                {
                    error     = true;
                    errorCode = System.Net.HttpStatusCode.InternalServerError;
                }
            }

            if (error)
            {
                log.DebugFormat("Msg3(.) returning HTTP status code {0}.", errorCode);
                return(StatusCode(errorCode));
            }
            else
            {
                log.Debug("Msg3(.) returning HTTP status success.");
                return(Json(m4Response));
            }
        }
Example #3
0
        /// <summary>
        /// Create a new Provision/Remote Attestation request
        /// Processes provision request and creates a Challenge response to send to a client
        /// </summary>
        /// <param name="data">Thread Data, input parameter (HttpRequestMessage) from the client</param>
        public void CreateNewRequest(object data)
        {
            challengeResponse = null;

            log.Debug("CreateNewRequest(.) started.");

            try
            {
                if (data == null)
                {
                    HttpResponseException e = new HttpResponseException(System.Net.HttpStatusCode.InternalServerError);
                    options.LogThrownException(e);
                    throw e;
                }

                HttpRequestMessage request = (HttpRequestMessage)data;

                var    result                     = request.Content.ReadAsStringAsync();
                string jsonMsgRequest             = result.Result;
                ProvisionRequestMessage pReceived = JsonConvert.DeserializeObject <ProvisionRequestMessage>(jsonMsgRequest);


                // Get client ID so we can track it
                string clientID = ClientDatabase.GetClientID(request, Constants.ProvisionStr);
                mClient = new ClientTransaction(clientID);
                mClient.sigmaSequenceCheck.currentNonce = pReceived.reqHeader.nonce;


                ProvisionRequest  provRequest        = new ProvisionRequest();
                ChallengeResponse tChallengeResponse = provRequest.ProcessProvisionRequest(request, mClient);

                // Add new client to request database only if successful
                if (!ClientDatabase.AddClient(mClient))
                {
                    HttpResponseException e = new HttpResponseException(System.Net.HttpStatusCode.Conflict);
                    options.LogThrownException(e);
                    throw e;
                }

                log.Info("\n ***** State: Starting Provision request for client: " + mClient.ID + "\n");

                // Update client state
                if (!mClient.sigmaSequenceCheck.UpdateState(Constants.SequenceState.Challenge))
                {
                    HttpResponseException e = new HttpResponseException(System.Net.HttpStatusCode.PreconditionFailed);
                    options.LogThrownException(e);
                    throw e;
                }

                // Set Client State
                challengeResponse = tChallengeResponse;
            }
            catch (HttpResponseException re)
            {
                options.LogCaughtException(re);
                httpRE = re;
            }
            catch (Exception ex)
            {
                options.LogCaughtException(ex);
                threadException = ex;
            }
            finally
            {
                log.Debug("CreateNewRequest(.) returning.");
            }
        }