コード例 #1
0
        /// <summary>
        /// Processes the encrypted message.
        /// </summary>
        /// <param name="transactID">Secure transaction identifier.</param>
        /// <param name="sinkStack">The sink stack.</param>
        /// <param name="requestMsg">Request message.</param>
        /// <param name="requestHeaders">Request transport headers.</param>
        /// <param name="requestStream">Request stream.</param>
        /// <param name="responseMsg">Response message.</param>
        /// <param name="responseHeaders">Response transport headers.</param>
        /// <param name="responseStream">Response stream.</param>
        public ServerProcessing ProcessEncryptedMessage(Guid transactID, IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            // Get the client connection data
            ClientConnectionData connectionData;

            lock (_connections.SyncRoot)
            {
                connectionData = (ClientConnectionData)_connections[transactID.ToString()];
            }

            if (connectionData == null)
            {
                throw new CryptoRemotingException(LanguageResource.CryptoRemotingException_ClientConnectionInfoMissing);
            }

            // Update the timestamp and indicate that method call is in progress
            connectionData.UpdateTimestamp();
            connectionData.BeginMethodCall();

            try
            {
                // Decrypt the data stream
                Stream decryptedStream = CryptoTools.GetDecryptedStream(requestStream, connectionData.CryptoProvider);
                requestStream.Close();

                // Pass decrypted message for further processing to the next channel sink
                ServerProcessing processingResult = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, decryptedStream, out responseMsg, out responseHeaders, out responseStream);

                // Update secure transaction state
                responseHeaders[CommonHeaderNames.SECURE_TRANSACTION_STATE] = ((int)SecureTransactionStage.SendingEncryptedResult).ToString();

                // Encrypt the response stream and close the original response stream now that we're done with it
                Stream encryptedStream = CryptoTools.GetEncryptedStream(responseStream, connectionData.CryptoProvider);
                responseStream.Close();                 //

                // Use encrypted data stream as a response stream
                responseStream = encryptedStream;
                return(processingResult);
            }
            finally
            {
                // Method call is finished, so the connection data can be swept
                connectionData.EndMethodCall();
                connectionData.UpdateTimestamp();
            }
        }
コード例 #2
0
        /// <summary>
        /// Decrypts the incoming response stream.
        /// </summary>
        /// <param name="responseStream">The response stream.</param>
        /// <param name="responseHeaders">The response headers.</param>
        private Stream DecryptResponse(Stream responseStream, ITransportHeaders responseHeaders)
        {
            try
            {
                if (responseHeaders != null && (SecureTransactionStage)Convert.ToInt32((string)responseHeaders[CommonHeaderNames.SECURE_TRANSACTION_STATE]) == SecureTransactionStage.SendingEncryptedResult)
                {
                    // Decrypt the response stream and close it as we won't be using it anymore
                    Stream decryptedStream = CryptoTools.GetDecryptedStream(responseStream, _provider);
                    responseStream.Close();
                    return(decryptedStream);
                }
            }
            catch { }

            // Failed to decrypt server's response
            return(null);
        }
コード例 #3
0
        /// <summary>
        /// Entschlüsselt die eingehende Nachricht vom Client.
        /// </summary>
        /// <param name="transactID">Sicherheitstransaktionskennung</param>
        /// <param name="sinkStack">Senkenstapel</param>
        /// <param name="requestMsg">Anfrage-Nachricht vom Client</param>
        /// <param name="requestHeaders">Anfrage-Header vom Cient</param>
        /// <param name="requestStream">Anfrage-Datenstrom</param>
        /// <param name="responseMsg">Antwort-Nachricht</param>
        /// <param name="responseHeaders">Antwort-Header</param>
        /// <param name="responseStream">Antwort-Datenstrom</param>
        /// <returns>Verarbeitungsstatus</returns>
        public ServerProcessing ProcessEncryptedMessage(Guid transactID, IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            // Variable für Client-Verbindungsinformationen
            ClientConnectionData connectionData;

            lock (_connections.SyncRoot)
            {
                // Client-Verbindungsdaten über die angegebene Sicherheitstransaktionskennung abrufen
                connectionData = (ClientConnectionData)_connections[transactID.ToString()];
            }
            // Wenn keine Verbindungsdaten zu dieser Sicherheitstransaktionskennung gefunden wurden ...
            if (connectionData == null)
            {
                // Ausnahme werfen
                throw new CryptoRemotingException(LanguageResource.CryptoRemotingException_ClientConnectionInfoMissing);
            }

            // Zeitstempel aktualisieren
            connectionData.UpdateTimestamp();

            // Datenstrom entschlüsseln
            Stream decryptedStream = CryptoTools.GetDecryptedStream(requestStream, connectionData.CryptoProvider);

            // Verschlüsselten-Quelldatenstrom schließen
            requestStream.Close();

            // Entschlüsselte Nachricht zur Weiterverarbeitung an die nächste Kanalsenke weitergeben
            ServerProcessing processingResult = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, decryptedStream, out responseMsg, out responseHeaders, out responseStream);

            // Status der Sicherheitstransaktion auf "verschlüsselte Atwortnachricht senden" einstellen
            responseHeaders[CommonHeaderNames.SECURE_TRANSACTION_STATE] = ((int)SecureTransactionStage.SendingEncryptedResult).ToString();

            // Antwortnachricht verschlüsseln
            Stream encryptedStream = CryptoTools.GetEncryptedStream(responseStream, connectionData.CryptoProvider);

            // Unverschlüsselten Quell-Datenstrom schließen
            responseStream.Close();             // close the plaintext stream now that we're done with it

            // Verschlüsselten Datenstrom als Antwort-Datenstrom verwenden
            responseStream = encryptedStream;

            // Verarbeitungsstatus zurückgeben
            return(processingResult);
        }
コード例 #4
0
        /// <summary>Entschlüsselt den eingehenden Antwort-Datenstrom</summary>
        /// <param name="responseStream">Antwort-Datenstrom</param>
        /// <param name="responseHeaders">Antwort-Transportheader</param>
        /// <returns>Entschlüsselter Datenstrom (oder null, wenn die Verschlüsselung fehlgeschlagen ist)</returns>
        private Stream DecryptResponse(Stream responseStream, ITransportHeaders responseHeaders)
        {
            try
            {
                // Wenn laut Header verschlüsselte Daten vom Server zurückgesendet wurden ...
                if (responseHeaders != null && (SecureTransactionStage)Convert.ToInt32((string)responseHeaders[CommonHeaderNames.SECURE_TRANSACTION_STATE]) == SecureTransactionStage.SendingEncryptedResult)
                {
                    // Antwort-Datenstrom entschlüsseln
                    Stream decryptedStream = CryptoTools.GetDecryptedStream(responseStream, _provider);
                    responseStream.Close();                     // close the old stream as we won't be using it anymore

                    // Entschlüsselten Datenstrom zurückgeben
                    return(decryptedStream);
                }
            }
            catch {}

            // Nichts zurückgeben
            return(null);
        }