MachineKey.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Web / Security / MachineKey.cs / 1305376 / MachineKey.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

/* 
 * MachineKey 
 *
 * Copyright (c) 2009 Microsoft Corporation 
 */

namespace System.Web.Security {
 
    using System.Web.Configuration;
    ///////////////////////////////////////////////////////////////////////////// 
    ///////////////////////////////////////////////////////////////////////////// 
    public enum MachineKeyProtection {
        All, 
        Encryption,
        Validation
    }
 
    /////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////// 
    public static class MachineKey { 
        /////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////// 
        public static string Encode(byte[] data, MachineKeyProtection protectionOption) {

            if (data == null)
                throw new ArgumentNullException("data"); 

            ////////////////////////////////////////////////////////////////////// 
            // Step 1: Get the MAC and add to the blob 
            if (protectionOption == MachineKeyProtection.All || protectionOption == MachineKeyProtection.Validation) {
                byte [] bHash = MachineKeySection.HashData(data, null, 0, data.Length); 
                byte [] bAll = new byte[bHash.Length + data.Length];
                Buffer.BlockCopy(data, 0, bAll, 0, data.Length);
                Buffer.BlockCopy(bHash, 0, bAll, data.Length, bHash.Length);
                data = bAll; 
            }
 
            if (protectionOption == MachineKeyProtection.All || protectionOption == MachineKeyProtection.Encryption) { 
                //////////////////////////////////////////////////////////////////////
                // Step 2: Encryption 
                data = MachineKeySection.EncryptOrDecryptData(true, data, null, 0, data.Length, false, false, IVType.Random);
            }

            ////////////////////////////////////////////////////////////////////// 
            // Step 3: Covert the buffer to HEX string and return it
            return MachineKeySection.ByteArrayToHexString(data, 0); 
        } 

        ///////////////////////////////////////////////////////////////////////////// 
        /////////////////////////////////////////////////////////////////////////////
        public static byte [] Decode(string encodedData, MachineKeyProtection protectionOption) {
            if (encodedData == null)
                throw new ArgumentNullException("encodedData"); 

            if ((encodedData.Length % 2) != 0) 
                throw new ArgumentException(null, "encodedData"); 

            byte [] data = null; 
            try {
                //////////////////////////////////////////////////////////////////////
                // Step 1: Covert the HEX string to byte array
                data = MachineKeySection.HexStringToByteArray(encodedData); 
            } catch {
                throw new ArgumentException(null, "encodedData"); 
            } 

            if (data == null || data.Length < 1) 
                throw new ArgumentException(null, "encodedData");

            if (protectionOption == MachineKeyProtection.All || protectionOption == MachineKeyProtection.Encryption) {
                ////////////////////////////////////////////////////////////////// 
                // Step 2: Decrypt the data
                data = MachineKeySection.EncryptOrDecryptData(false, data, null, 0, data.Length, false, false, IVType.Random); 
                if (data == null) 
                    return null;
            } 

            if (protectionOption == MachineKeyProtection.All || protectionOption == MachineKeyProtection.Validation) {
                //////////////////////////////////////////////////////////////////
                // Step 3a: Remove the hash from the end of the data 
                if (data.Length < MachineKeySection.HashSize)
                    return null; 
                byte [] originalData = data; 
                data = new byte[originalData.Length - MachineKeySection.HashSize];
                Buffer.BlockCopy(originalData, 0, data, 0, data.Length); 

                //////////////////////////////////////////////////////////////////
                // Step 3b: Calculate the hash and make sure it matches
                byte [] bHash = MachineKeySection.HashData(data, null, 0, data.Length); 
                if (bHash == null || bHash.Length != MachineKeySection.HashSize)
                    return null; // Sizes don't match 
                for(int iter=0; iter

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK