Ejemplo n.º 1
0
        private void btnGetS3Msg_Click(object sender, EventArgs e)
        {
            lblGetS3MsgRet.Text = string.Empty;

            // Get S3 message length from the trusted application
            IntPtr     s3MsgLen = Marshal.AllocHGlobal(INT_SIZE);
            StatusCode status   = (StatusCode)SigmaWrapper.GetS3MessagLen(s2Message, s2MsgLen, s3MsgLen);

            switch (status)
            {
            case StatusCode.STATUS_SUCCEEDED:
            {
                byte[] S3MsgLenByteArray = new byte[INT_SIZE];
                Marshal.Copy(s3MsgLen, S3MsgLenByteArray, 0, S3MsgLenByteArray.Length);
                // Convert S3 message length from most significant byte first presentation to most significant byte last presentation
                SwapArrBitEndianness(S3MsgLenByteArray);

                int s3MessageLenInt = BitConverter.ToInt32(S3MsgLenByteArray, 0);

                // Get S3 message from the trusted application
                IntPtr s3Msg = Marshal.AllocHGlobal(s3MessageLenInt);
                status = (StatusCode)SigmaWrapper.GetS3Message(s2Message, s2MsgLen, s3MessageLenInt, s3Msg);
                switch (status)
                {
                // S3 message was received successfully
                case StatusCode.STATUS_SUCCEEDED:
                {
                    // Send S3 message length to server
                    socket.Send(BitConverter.GetBytes(s3MessageLenInt));

                    // Send S3 message to server for processing and verification
                    byte[] S3MsgToSend = new byte[s3MessageLenInt];
                    Marshal.Copy(s3Msg, S3MsgToSend, 0, S3MsgToSend.Length);
                    socket.Send(S3MsgToSend);
                    lblGetS3MsgRet.Text = "S3 message was created successfully.";

                    // Get S3 processing status from server
                    status = (StatusCode)ReceiveIntFromServer();
                    //if (status == StatusCode.STATUS_SUCCEEDED)
                    //lblEnd.Text = "Now both parties have one shared secret and\ncan use any symmetrical encryption algorithm.";
                    //else
                    //lblEnd.Text = "Server failed to verify S3 message.";
                    break;
                }

                case StatusCode.INCORRECT_S2_BUFFER:
                    lblGetS3MsgRet.Text = "Trusted application received an incorrect S2 message.";
                    break;

                case StatusCode.FAILED_TO_PROCESS_S2:
                    lblGetS3MsgRet.Text = "Failed to process S2.";
                    break;

                case StatusCode.WRONG_INTEL_SIGNED_CERT_TYPE:
                    lblGetS3MsgRet.Text = "Verifier's certificate is wrong Intel signed.";
                    break;

                case StatusCode.FAILED_TO_GET_SESSION_PARAMS:
                    lblGetS3MsgRet.Text = "Failed to get session parameters.";
                    break;

                case StatusCode.FAILED_TO_DISPOSE_SIGMA:
                    lblGetS3MsgRet.Text = "Failed to dispose SIGMA.";
                    break;

                default:
                    lblGetS3MsgRet.Text = "Failed to perform send and receive operation in\norder to get S3 message.";
                    break;
                }
                Marshal.FreeHGlobal(s3Msg);
                btnGetS3Msg.Enabled = false;
                break;
            }

            case StatusCode.FAILED_TO_GET_S3_LEN:
                lblGetS3MsgRet.Text = "Error: Failed to get S3 message length.";
                break;

            default:
                lblGetS3MsgRet.Text = "Failed to perform send and receive operation in\norder to get S3 message length.";
                break;
            }

            Marshal.FreeHGlobal(s3MsgLen);
        }