Exemplo n.º 1
0
        public static StatusCode SecureSymmetric(
            MemoryBuffer respBuf,
            int messageEncodedBlockStart,
            SLChannel.Keyset localKeyset,
            SLChannel.Keyset remoteKeyset,
            SecurityPolicy policy,
            MessageSecurityMode securityMode)
        {
            if (securityMode == MessageSecurityMode.None)
            {
                return(StatusCode.Good);
            }

            int num1 = UASecurity.SignatureSizeForSecurityPolicy(policy);

            if (securityMode >= MessageSecurityMode.SignAndEncrypt)
            {
                int    symmetricPaddingSize = UASecurity.CalculateSymmetricPaddingSize(localKeyset.SymEncKey.Length, num1 + respBuf.Position - messageEncodedBlockStart);
                byte   num2 = (byte)(symmetricPaddingSize - 1 & byte.MaxValue);
                byte[] Add  = new byte[symmetricPaddingSize];
                for (int index = 0; index < symmetricPaddingSize; ++index)
                {
                    Add[index] = num2;
                }

                respBuf.Append(Add);
            }
            int num3 = respBuf.Position + num1;

            if (securityMode >= MessageSecurityMode.SignAndEncrypt)
            {
                num3 = messageEncodedBlockStart + UASecurity.CalculateSymmetricEncryptedSize(localKeyset.SymEncKey.Length, num3 - messageEncodedBlockStart);
            }

            if (num3 >= respBuf.Capacity)
            {
                return(StatusCode.BadEncodingLimitsExceeded);
            }

            UASecurity.MarkUAMessageSize(respBuf, (uint)num3);
            byte[] Add1 = UASecurity.SymmetricSign(localKeyset.SymSignKey, new ArraySegment <byte>(respBuf.Buffer, 0, respBuf.Position), policy);
            respBuf.Append(Add1);
            if (num3 != respBuf.Position)
            {
                throw new Exception();
            }

            if (securityMode >= MessageSecurityMode.SignAndEncrypt)
            {
                UASecurity.RijndaelEncryptInplace(new ArraySegment <byte>(respBuf.Buffer, messageEncodedBlockStart, num3 - messageEncodedBlockStart), localKeyset.SymEncKey, localKeyset.SymIV);
            }

            return(StatusCode.Good);
        }