Example #1
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.");
            }
        }