| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568 | 
							- // This code is derived from jcifs smb client library <jcifs at samba dot org>
 
- // Ported by J. Arturo <webmaster at komodosoft dot net>
 
- //  
 
- // This library is free software; you can redistribute it and/or
 
- // modify it under the terms of the GNU Lesser General Public
 
- // License as published by the Free Software Foundation; either
 
- // version 2.1 of the License, or (at your option) any later version.
 
- // 
 
- // This library is distributed in the hope that it will be useful,
 
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
 
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
- // Lesser General Public License for more details.
 
- // 
 
- // You should have received a copy of the GNU Lesser General Public
 
- // License along with this library; if not, write to the Free Software
 
- // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
- using System;
 
- namespace SharpCifs.Util
 
- {
 
- 	/// <summary>
 
- 	/// This code is derived from the above source
 
- 	/// JCIFS API
 
- 	/// Norbert Hranitzky
 
- 	/// <p>and modified again by Michael B.
 
- 	/// </summary>
 
- 	/// <remarks>
 
- 	/// This code is derived from the above source
 
- 	/// JCIFS API
 
- 	/// Norbert Hranitzky
 
- 	/// <p>and modified again by Michael B. Allen
 
- 	/// </remarks>
 
- 	public class DES
 
- 	{
 
- 		private int[] _encryptKeys = new int[32];
 
- 		private int[] _decryptKeys = new int[32];
 
- 		private int[] _tempInts = new int[2];
 
- 		public DES()
 
- 		{
 
- 		}
 
- 		public DES(byte[] key)
 
- 		{
 
- 			// DesCipher - the DES encryption method
 
- 			//
 
- 			// The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is:
 
- 			//
 
- 			// Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved.
 
- 			//
 
- 			// Permission to use, copy, modify, and distribute this software
 
- 			// and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
 
- 			// without fee is hereby granted, provided that this copyright notice is kept
 
- 			// intact.
 
- 			//
 
- 			// WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
 
- 			// OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 
- 			// TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 
- 			// PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE
 
- 			// FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 
- 			// DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 
- 			//
 
- 			// THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
 
- 			// CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
 
- 			// PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
 
- 			// NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
 
- 			// SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
 
- 			// SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
 
- 			// PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  WIDGET WORKSHOP
 
- 			// SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
 
- 			// HIGH RISK ACTIVITIES.
 
- 			//
 
- 			//
 
- 			// The rest is:
 
- 			//
 
- 			// Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>.  All rights reserved.
 
- 			//
 
- 			// Copyright (C) 1996 by Wolfgang Platzer
 
- 			// email: wplatzer@iaik.tu-graz.ac.at
 
- 			//
 
- 			// All rights reserved.
 
- 			//
 
- 			// Redistribution and use in source and binary forms, with or without
 
- 			// modification, are permitted provided that the following conditions
 
- 			// are met:
 
- 			// 1. Redistributions of source code must retain the above copyright
 
- 			//    notice, this list of conditions and the following disclaimer.
 
- 			// 2. Redistributions in binary form must reproduce the above copyright
 
- 			//    notice, this list of conditions and the following disclaimer in the
 
- 			//    documentation and/or other materials provided with the distribution.
 
- 			//
 
- 			// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 
- 			// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
- 			// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
- 			// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 
- 			// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
- 			// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
- 			// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
- 			// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 
- 			// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 
- 			// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 
- 			// SUCH DAMAGE.
 
- 			//
 
- 			// Constructor, byte-array key.
 
- 			if (key.Length == 7)
 
- 			{
 
- 				byte[] key8 = new byte[8];
 
- 				MakeSmbKey(key, key8);
 
- 				SetKey(key8);
 
- 			}
 
- 			else
 
- 			{
 
- 				SetKey(key);
 
- 			}
 
- 		}
 
- 		public static void MakeSmbKey(byte[] key7, byte[] key8)
 
- 		{
 
- 			int i;
 
- 			key8[0] = unchecked((byte)((key7[0] >> 1) & unchecked(0xff)));
 
- 			key8[1] = unchecked((byte)((((key7[0] & unchecked(0x01)) << 6) | (((key7[1
 
- 				] & unchecked(0xff)) >> 2) & unchecked(0xff))) & unchecked(0xff)));
 
- 			key8[2] = unchecked((byte)((((key7[1] & unchecked(0x03)) << 5) | (((key7[2
 
- 				] & unchecked(0xff)) >> 3) & unchecked(0xff))) & unchecked(0xff)));
 
- 			key8[3] = unchecked((byte)((((key7[2] & unchecked(0x07)) << 4) | (((key7[3
 
- 				] & unchecked(0xff)) >> 4) & unchecked(0xff))) & unchecked(0xff)));
 
- 			key8[4] = unchecked((byte)((((key7[3] & unchecked(0x0F)) << 3) | (((key7[4
 
- 				] & unchecked(0xff)) >> 5) & unchecked(0xff))) & unchecked(0xff)));
 
- 			key8[5] = unchecked((byte)((((key7[4] & unchecked(0x1F)) << 2) | (((key7[5
 
- 				] & unchecked(0xff)) >> 6) & unchecked(0xff))) & unchecked(0xff)));
 
- 			key8[6] = unchecked((byte)((((key7[5] & unchecked(0x3F)) << 1) | (((key7[6
 
- 				] & unchecked(0xff)) >> 7) & unchecked(0xff))) & unchecked(0xff)));
 
- 			key8[7] = unchecked((byte)(key7[6] & unchecked(0x7F)));
 
- 			for (i = 0; i < 8; i++)
 
- 			{
 
- 				key8[i] = unchecked((byte)(key8[i] << 1));
 
- 			}
 
- 		}
 
- 		/// Set the key.
 
- 		public virtual void SetKey(byte[] key)
 
- 		{
 
- 			// CHECK PAROTY TBD
 
- 			Deskey(key, true, _encryptKeys);
 
- 			Deskey(key, false, _decryptKeys);
 
- 		}
 
- 		// Turn an 8-byte key into internal keys.
 
- 		private void Deskey(byte[] keyBlock, bool encrypting, int[] knL)
 
- 		{
 
- 			int i;
 
- 			int j;
 
- 			int l;
 
- 			int m;
 
- 			int n;
 
- 			int[] pc1M = new int[56];
 
- 			int[] pcr = new int[56];
 
- 			int[] kn = new int[32];
 
- 			for (j = 0; j < 56; ++j)
 
- 			{
 
- 				l = _pc1[j];
 
- 				m = l & 0x7;
 
- 				pc1M[j] = ((keyBlock[(int)(((uint)l) >> 3)] & _bytebit[m]) != 0) ? 1 : 0;
 
- 			}
 
- 			for (i = 0; i < 16; ++i)
 
- 			{
 
- 				if (encrypting)
 
- 				{
 
- 					m = i << 1;
 
- 				}
 
- 				else
 
- 				{
 
- 					m = (15 - i) << 1;
 
- 				}
 
- 				n = m + 1;
 
- 				kn[m] = kn[n] = 0;
 
- 				for (j = 0; j < 28; ++j)
 
- 				{
 
- 					l = j + _totrot[i];
 
- 					if (l < 28)
 
- 					{
 
- 						pcr[j] = pc1M[l];
 
- 					}
 
- 					else
 
- 					{
 
- 						pcr[j] = pc1M[l - 28];
 
- 					}
 
- 				}
 
- 				for (j = 28; j < 56; ++j)
 
- 				{
 
- 					l = j + _totrot[i];
 
- 					if (l < 56)
 
- 					{
 
- 						pcr[j] = pc1M[l];
 
- 					}
 
- 					else
 
- 					{
 
- 						pcr[j] = pc1M[l - 28];
 
- 					}
 
- 				}
 
- 				for (j = 0; j < 24; ++j)
 
- 				{
 
- 					if (pcr[_pc2[j]] != 0)
 
- 					{
 
- 						kn[m] |= _bigbyte[j];
 
- 					}
 
- 					if (pcr[_pc2[j + 24]] != 0)
 
- 					{
 
- 						kn[n] |= _bigbyte[j];
 
- 					}
 
- 				}
 
- 			}
 
- 			Cookey(kn, knL);
 
- 		}
 
- 		private void Cookey(int[] raw, int[] knL)
 
- 		{
 
- 			int raw0;
 
- 			int raw1;
 
- 			int rawi;
 
- 			int knLi;
 
- 			int i;
 
- 			for (i = 0, rawi = 0, knLi = 0; i < 16; ++i)
 
- 			{
 
- 				raw0 = raw[rawi++];
 
- 				raw1 = raw[rawi++];
 
- 				knL[knLi] = (raw0 & unchecked(0x00fc0000)) << 6;
 
- 				knL[knLi] |= (raw0 & unchecked(0x00000fc0)) << 10;
 
- 				knL[knLi] |= (int)(((uint)(raw1 & unchecked(0x00fc0000))) >> 10);
 
- 				knL[knLi] |= (int)(((uint)(raw1 & unchecked(0x00000fc0))) >> 6);
 
- 				++knLi;
 
- 				knL[knLi] = (raw0 & unchecked(0x0003f000)) << 12;
 
- 				knL[knLi] |= (raw0 & unchecked(0x0000003f)) << 16;
 
- 				knL[knLi] |= (int)(((uint)(raw1 & unchecked(0x0003f000))) >> 4);
 
- 				knL[knLi] |= (raw1 & unchecked(0x0000003f));
 
- 				++knLi;
 
- 			}
 
- 		}
 
- 		/// Encrypt a block of eight bytes.
 
- 		private void Encrypt(byte[] clearText, int clearOff, byte[] cipherText, int cipherOff
 
- 			)
 
- 		{
 
- 			SquashBytesToInts(clearText, clearOff, _tempInts, 0, 2);
 
- 			Des(_tempInts, _tempInts, _encryptKeys);
 
- 			SpreadIntsToBytes(_tempInts, 0, cipherText, cipherOff, 2);
 
- 		}
 
- 		/// Decrypt a block of eight bytes.
 
- 		private void Decrypt(byte[] cipherText, int cipherOff, byte[] clearText, int clearOff
 
- 			)
 
- 		{
 
- 			SquashBytesToInts(cipherText, cipherOff, _tempInts, 0, 2);
 
- 			Des(_tempInts, _tempInts, _decryptKeys);
 
- 			SpreadIntsToBytes(_tempInts, 0, clearText, clearOff, 2);
 
- 		}
 
- 		// The DES function.
 
- 		private void Des(int[] inInts, int[] outInts, int[] keys)
 
- 		{
 
- 			int fval;
 
- 			int work;
 
- 			int right;
 
- 			int leftt;
 
- 			int round;
 
- 			int keysi = 0;
 
- 			leftt = inInts[0];
 
- 			right = inInts[1];
 
- 			work = (((int)(((uint)leftt) >> 4)) ^ right) & unchecked(0x0f0f0f0f);
 
- 			right ^= work;
 
- 			leftt ^= (work << 4);
 
- 			work = (((int)(((uint)leftt) >> 16)) ^ right) & unchecked(0x0000ffff);
 
- 			right ^= work;
 
- 			leftt ^= (work << 16);
 
- 			work = (((int)(((uint)right) >> 2)) ^ leftt) & unchecked(0x33333333);
 
- 			leftt ^= work;
 
- 			right ^= (work << 2);
 
- 			work = (((int)(((uint)right) >> 8)) ^ leftt) & unchecked(0x00ff00ff);
 
- 			leftt ^= work;
 
- 			right ^= (work << 8);
 
- 			right = (right << 1) | (((int)(((uint)right) >> 31)) & 1);
 
- 			work = (leftt ^ right) & unchecked((int)(0xaaaaaaaa));
 
- 			leftt ^= work;
 
- 			right ^= work;
 
- 			leftt = (leftt << 1) | (((int)(((uint)leftt) >> 31)) & 1);
 
- 			for (round = 0; round < 8; ++round)
 
- 			{
 
- 				work = (right << 28) | ((int)(((uint)right) >> 4));
 
- 				work ^= keys[keysi++];
 
- 				fval = _sp7[work & unchecked(0x0000003f)];
 
- 				fval |= _sp5[((int)(((uint)work) >> 8)) & unchecked(0x0000003f)];
 
- 				fval |= _sp3[((int)(((uint)work) >> 16)) & unchecked(0x0000003f)];
 
- 				fval |= _sp1[((int)(((uint)work) >> 24)) & unchecked(0x0000003f)];
 
- 				work = right ^ keys[keysi++];
 
- 				fval |= _sp8[work & unchecked(0x0000003f)];
 
- 				fval |= _sp6[((int)(((uint)work) >> 8)) & unchecked(0x0000003f)];
 
- 				fval |= _sp4[((int)(((uint)work) >> 16)) & unchecked(0x0000003f)];
 
- 				fval |= _sp2[((int)(((uint)work) >> 24)) & unchecked(0x0000003f)];
 
- 				leftt ^= fval;
 
- 				work = (leftt << 28) | ((int)(((uint)leftt) >> 4));
 
- 				work ^= keys[keysi++];
 
- 				fval = _sp7[work & unchecked(0x0000003f)];
 
- 				fval |= _sp5[((int)(((uint)work) >> 8)) & unchecked(0x0000003f)];
 
- 				fval |= _sp3[((int)(((uint)work) >> 16)) & unchecked(0x0000003f)];
 
- 				fval |= _sp1[((int)(((uint)work) >> 24)) & unchecked(0x0000003f)];
 
- 				work = leftt ^ keys[keysi++];
 
- 				fval |= _sp8[work & unchecked(0x0000003f)];
 
- 				fval |= _sp6[((int)(((uint)work) >> 8)) & unchecked(0x0000003f)];
 
- 				fval |= _sp4[((int)(((uint)work) >> 16)) & unchecked(0x0000003f)];
 
- 				fval |= _sp2[((int)(((uint)work) >> 24)) & unchecked(0x0000003f)];
 
- 				right ^= fval;
 
- 			}
 
- 			right = (right << 31) | ((int)(((uint)right) >> 1));
 
- 			work = (leftt ^ right) & unchecked((int)(0xaaaaaaaa));
 
- 			leftt ^= work;
 
- 			right ^= work;
 
- 			leftt = (leftt << 31) | ((int)(((uint)leftt) >> 1));
 
- 			work = (((int)(((uint)leftt) >> 8)) ^ right) & unchecked(0x00ff00ff);
 
- 			right ^= work;
 
- 			leftt ^= (work << 8);
 
- 			work = (((int)(((uint)leftt) >> 2)) ^ right) & unchecked(0x33333333);
 
- 			right ^= work;
 
- 			leftt ^= (work << 2);
 
- 			work = (((int)(((uint)right) >> 16)) ^ leftt) & unchecked(0x0000ffff);
 
- 			leftt ^= work;
 
- 			right ^= (work << 16);
 
- 			work = (((int)(((uint)right) >> 4)) ^ leftt) & unchecked(0x0f0f0f0f);
 
- 			leftt ^= work;
 
- 			right ^= (work << 4);
 
- 			outInts[0] = right;
 
- 			outInts[1] = leftt;
 
- 		}
 
- 		/// Encrypt a block of bytes.
 
- 		public virtual void Encrypt(byte[] clearText, byte[] cipherText)
 
- 		{
 
- 			Encrypt(clearText, 0, cipherText, 0);
 
- 		}
 
- 		/// Decrypt a block of bytes.
 
- 		public virtual void Decrypt(byte[] cipherText, byte[] clearText)
 
- 		{
 
- 			Decrypt(cipherText, 0, clearText, 0);
 
- 		}
 
- 		/// <summary>encrypts an array where the length must be a multiple of 8</summary>
 
- 		public virtual byte[] Encrypt(byte[] clearText)
 
- 		{
 
- 			int length = clearText.Length;
 
- 			if (length % 8 != 0)
 
- 			{
 
- 				Console.Out.WriteLine("Array must be a multiple of 8");
 
- 				return null;
 
- 			}
 
- 			byte[] cipherText = new byte[length];
 
- 			int count = length / 8;
 
- 			for (int i = 0; i < count; i++)
 
- 			{
 
- 				Encrypt(clearText, i * 8, cipherText, i * 8);
 
- 			}
 
- 			return cipherText;
 
- 		}
 
- 		/// <summary>decrypts an array where the length must be a multiple of 8</summary>
 
- 		public virtual byte[] Decrypt(byte[] cipherText)
 
- 		{
 
- 			int length = cipherText.Length;
 
- 			if (length % 8 != 0)
 
- 			{
 
- 				Console.Out.WriteLine("Array must be a multiple of 8");
 
- 				return null;
 
- 			}
 
- 			byte[] clearText = new byte[length];
 
- 			int count = length / 8;
 
- 			for (int i = 0; i < count; i++)
 
- 			{
 
- 				Encrypt(cipherText, i * 8, clearText, i * 8);
 
- 			}
 
- 			return clearText;
 
- 		}
 
- 		private static byte[] _bytebit = { unchecked(unchecked(0x80)), unchecked(unchecked(0x40)), unchecked(unchecked(0x20)), unchecked(unchecked(0x10)), unchecked(unchecked(0x08)), unchecked(unchecked(0x04)), unchecked(unchecked(0x02)), unchecked(unchecked(0x01)) };
 
- 		private static int[] _bigbyte = { unchecked(0x800000), unchecked(
 
- 			0x400000), unchecked(0x200000), unchecked(0x100000), unchecked(
 
- 			0x080000), unchecked(0x040000), unchecked(0x020000), unchecked(
 
- 			0x010000), unchecked(0x008000), unchecked(0x004000), unchecked(
 
- 			0x002000), unchecked(0x001000), unchecked(0x000800), unchecked(
 
- 			0x000400), unchecked(0x000200), unchecked(0x000100), unchecked(
 
- 			0x000080), unchecked(0x000040), unchecked(0x000020), unchecked(
 
- 			0x000010), unchecked(0x000008), unchecked(0x000004), unchecked(
 
- 			0x000002), unchecked(0x000001) };
 
- 		private static byte[] _pc1 = { unchecked(56), unchecked(48)
 
- 			, unchecked(40), unchecked(32), unchecked(24), unchecked(16), unchecked(8), unchecked(0), unchecked(57), unchecked(49), unchecked(41), unchecked(33), unchecked(25), unchecked(17), unchecked(9), unchecked(1), unchecked(58), unchecked(
 
- 			50), unchecked(42), unchecked(34), unchecked(26), unchecked(
 
- 			18), unchecked(10), unchecked(2), unchecked(59), unchecked(
 
- 			51), unchecked(43), unchecked(35), unchecked(62), unchecked(
 
- 			54), unchecked(46), unchecked(38), unchecked(30), unchecked(
 
- 			22), unchecked(14), unchecked(6), unchecked(61), unchecked(
 
- 			53), unchecked(45), unchecked(37), unchecked(29), unchecked(
 
- 			21), unchecked(13), unchecked(5), unchecked(60), unchecked(
 
- 			52), unchecked(44), unchecked(36), unchecked(28), unchecked(
 
- 			20), unchecked(12), unchecked(4), unchecked(27), unchecked(
 
- 			19), unchecked(11), unchecked(3) };
 
- 		private static int[] _totrot = { 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 
 
- 			21, 23, 25, 27, 28 };
 
- 		private static byte[] _pc2 = { unchecked(13), unchecked(16)
 
- 			, unchecked(10), unchecked(23), unchecked(0), unchecked(4), unchecked(2), unchecked(27), unchecked(14), unchecked(5), unchecked(20), unchecked(9), unchecked(22), unchecked(18), unchecked(11), unchecked(3), unchecked(25), unchecked(7), unchecked(15), unchecked(6), unchecked(26), unchecked(19), unchecked(12), unchecked(1), unchecked(40), unchecked(51), unchecked(30), unchecked(36), unchecked(46), unchecked(54), unchecked(29), unchecked(39), unchecked(50), unchecked(
 
- 			44), unchecked(32), unchecked(47), unchecked(43), unchecked(
 
- 			48), unchecked(38), unchecked(55), unchecked(33), unchecked(
 
- 			52), unchecked(45), unchecked(41), unchecked(49), unchecked(
 
- 			35), unchecked(28), unchecked(31) };
 
- 		private static int[] _sp1 = { unchecked(0x01010400), unchecked(0x00000000), unchecked(0x00010000), unchecked(0x01010404), unchecked(
 
- 			0x01010004), unchecked(0x00010404), unchecked(0x00000004), 
 
- 			unchecked(0x00010000), unchecked(0x00000400), unchecked(0x01010400), unchecked(0x01010404), unchecked(0x00000400), unchecked(0x01000404), unchecked(0x01010004), unchecked(0x01000000), unchecked(
 
- 			0x00000004), unchecked(0x00000404), unchecked(0x01000400), 
 
- 			unchecked(0x01000400), unchecked(0x00010400), unchecked(0x00010400), unchecked(0x01010000), unchecked(0x01010000), unchecked(0x01000404), unchecked(0x00010004), unchecked(0x01000004), unchecked(
 
- 			0x01000004), unchecked(0x00010004), unchecked(0x00000000), 
 
- 			unchecked(0x00000404), unchecked(0x00010404), unchecked(0x01000000), unchecked(0x00010000), unchecked(0x01010404), unchecked(0x00000004), unchecked(0x01010000), unchecked(0x01010400), unchecked(
 
- 			0x01000000), unchecked(0x01000000), unchecked(0x00000400), 
 
- 			unchecked(0x01010004), unchecked(0x00010000), unchecked(0x00010400), unchecked(0x01000004), unchecked(0x00000400), unchecked(0x00000004), unchecked(0x01000404), unchecked(0x00010404), unchecked(
 
- 			0x01010404), unchecked(0x00010004), unchecked(0x01010000), 
 
- 			unchecked(0x01000404), unchecked(0x01000004), unchecked(0x00000404), unchecked(0x00010404), unchecked(0x01010400), unchecked(0x00000404), unchecked(0x01000400), unchecked(0x01000400), unchecked(
 
- 			0x00000000), unchecked(0x00010004), unchecked(0x00010400), 
 
- 			unchecked(0x00000000), unchecked(0x01010004) };
 
- 		private static int[] _sp2 = { unchecked((int)(0x80108020)), unchecked((int
 
- 			)(0x80008000)), unchecked(0x00008000), unchecked(0x00108020), unchecked(
 
- 			0x00100000), unchecked(0x00000020), unchecked((int)(0x80100020)), 
 
- 			unchecked((int)(0x80008020)), unchecked((int)(0x80000020)), unchecked((int)(0x80108020
 
- 			)), unchecked((int)(0x80108000)), unchecked((int)(0x80000000)), unchecked((int)(
 
- 			0x80008000)), unchecked(0x00100000), unchecked(0x00000020), unchecked(
 
- 			(int)(0x80100020)), unchecked(0x00108000), unchecked(0x00100020), 
 
- 			unchecked((int)(0x80008020)), unchecked(0x00000000), unchecked((int)(0x80000000
 
- 			)), unchecked(0x00008000), unchecked(0x00108020), unchecked((int)(
 
- 			0x80100000)), unchecked(0x00100020), unchecked((int)(0x80000020)), unchecked(
 
- 			0x00000000), unchecked(0x00108000), unchecked(0x00008020), 
 
- 			unchecked((int)(0x80108000)), unchecked((int)(0x80100000)), unchecked(0x00008020), unchecked(0x00000000), unchecked(0x00108020), unchecked((int)(
 
- 			0x80100020)), unchecked(0x00100000), unchecked((int)(0x80008020)), unchecked(
 
- 			(int)(0x80100000)), unchecked((int)(0x80108000)), unchecked(0x00008000), 
 
- 			unchecked((int)(0x80100000)), unchecked((int)(0x80008000)), unchecked(0x00000020), unchecked((int)(0x80108020)), unchecked(0x00108020), unchecked(0x00000020), unchecked(0x00008000), unchecked((int)(0x80000000)), unchecked(
 
- 			0x00008020), unchecked((int)(0x80108000)), unchecked(0x00100000), 
 
- 			unchecked((int)(0x80000020)), unchecked(0x00100020), unchecked((int)(0x80008020
 
- 			)), unchecked((int)(0x80000020)), unchecked(0x00100020), unchecked(0x00108000), unchecked(0x00000000), unchecked((int)(0x80008000)), unchecked(
 
- 			0x00008020), unchecked((int)(0x80000000)), unchecked((int)(0x80100020)), 
 
- 			unchecked((int)(0x80108020)), unchecked(0x00108000) };
 
- 		private static int[] _sp3 = { unchecked(0x00000208), unchecked(0x08020200), unchecked(0x00000000), unchecked(0x08020008), unchecked(
 
- 			0x08000200), unchecked(0x00000000), unchecked(0x00020208), 
 
- 			unchecked(0x08000200), unchecked(0x00020008), unchecked(0x08000008), unchecked(0x08000008), unchecked(0x00020000), unchecked(0x08020208), unchecked(0x00020008), unchecked(0x08020000), unchecked(
 
- 			0x00000208), unchecked(0x08000000), unchecked(0x00000008), 
 
- 			unchecked(0x08020200), unchecked(0x00000200), unchecked(0x00020200), unchecked(0x08020000), unchecked(0x08020008), unchecked(0x00020208), unchecked(0x08000208), unchecked(0x00020200), unchecked(
 
- 			0x00020000), unchecked(0x08000208), unchecked(0x00000008), 
 
- 			unchecked(0x08020208), unchecked(0x00000200), unchecked(0x08000000), unchecked(0x08020200), unchecked(0x08000000), unchecked(0x00020008), unchecked(0x00000208), unchecked(0x00020000), unchecked(
 
- 			0x08020200), unchecked(0x08000200), unchecked(0x00000000), 
 
- 			unchecked(0x00000200), unchecked(0x00020008), unchecked(0x08020208), unchecked(0x08000200), unchecked(0x08000008), unchecked(0x00000200), unchecked(0x00000000), unchecked(0x08020008), unchecked(
 
- 			0x08000208), unchecked(0x00020000), unchecked(0x08000000), 
 
- 			unchecked(0x08020208), unchecked(0x00000008), unchecked(0x00020208), unchecked(0x00020200), unchecked(0x08000008), unchecked(0x08020000), unchecked(0x08000208), unchecked(0x00000208), unchecked(
 
- 			0x08020000), unchecked(0x00020208), unchecked(0x00000008), 
 
- 			unchecked(0x08020008), unchecked(0x00020200) };
 
- 		private static int[] _sp4 = { unchecked(0x00802001), unchecked(0x00002081), unchecked(0x00002081), unchecked(0x00000080), unchecked(
 
- 			0x00802080), unchecked(0x00800081), unchecked(0x00800001), 
 
- 			unchecked(0x00002001), unchecked(0x00000000), unchecked(0x00802000), unchecked(0x00802000), unchecked(0x00802081), unchecked(0x00000081), unchecked(0x00000000), unchecked(0x00800080), unchecked(
 
- 			0x00800001), unchecked(0x00000001), unchecked(0x00002000), 
 
- 			unchecked(0x00800000), unchecked(0x00802001), unchecked(0x00000080), unchecked(0x00800000), unchecked(0x00002001), unchecked(0x00002080), unchecked(0x00800081), unchecked(0x00000001), unchecked(
 
- 			0x00002080), unchecked(0x00800080), unchecked(0x00002000), 
 
- 			unchecked(0x00802080), unchecked(0x00802081), unchecked(0x00000081), unchecked(0x00800080), unchecked(0x00800001), unchecked(0x00802000), unchecked(0x00802081), unchecked(0x00000081), unchecked(
 
- 			0x00000000), unchecked(0x00000000), unchecked(0x00802000), 
 
- 			unchecked(0x00002080), unchecked(0x00800080), unchecked(0x00800081), unchecked(0x00000001), unchecked(0x00802001), unchecked(0x00002081), unchecked(0x00002081), unchecked(0x00000080), unchecked(
 
- 			0x00802081), unchecked(0x00000081), unchecked(0x00000001), 
 
- 			unchecked(0x00002000), unchecked(0x00800001), unchecked(0x00002001), unchecked(0x00802080), unchecked(0x00800081), unchecked(0x00002001), unchecked(0x00002080), unchecked(0x00800000), unchecked(
 
- 			0x00802001), unchecked(0x00000080), unchecked(0x00800000), 
 
- 			unchecked(0x00002000), unchecked(0x00802080) };
 
- 		private static int[] _sp5 = { unchecked(0x00000100), unchecked(0x02080100), unchecked(0x02080000), unchecked(0x42000100), unchecked(
 
- 			0x00080000), unchecked(0x00000100), unchecked(0x40000000), 
 
- 			unchecked(0x02080000), unchecked(0x40080100), unchecked(0x00080000), unchecked(0x02000100), unchecked(0x40080100), unchecked(0x42000100), unchecked(0x42080000), unchecked(0x00080100), unchecked(
 
- 			0x40000000), unchecked(0x02000000), unchecked(0x40080000), 
 
- 			unchecked(0x40080000), unchecked(0x00000000), unchecked(0x40000100), unchecked(0x42080100), unchecked(0x42080100), unchecked(0x02000100), unchecked(0x42080000), unchecked(0x40000100), unchecked(
 
- 			0x00000000), unchecked(0x42000000), unchecked(0x02080100), 
 
- 			unchecked(0x02000000), unchecked(0x42000000), unchecked(0x00080100), unchecked(0x00080000), unchecked(0x42000100), unchecked(0x00000100), unchecked(0x02000000), unchecked(0x40000000), unchecked(
 
- 			0x02080000), unchecked(0x42000100), unchecked(0x40080100), 
 
- 			unchecked(0x02000100), unchecked(0x40000000), unchecked(0x42080000), unchecked(0x02080100), unchecked(0x40080100), unchecked(0x00000100), unchecked(0x02000000), unchecked(0x42080000), unchecked(
 
- 			0x42080100), unchecked(0x00080100), unchecked(0x42000000), 
 
- 			unchecked(0x42080100), unchecked(0x02080000), unchecked(0x00000000), unchecked(0x40080000), unchecked(0x42000000), unchecked(0x00080100), unchecked(0x02000100), unchecked(0x40000100), unchecked(
 
- 			0x00080000), unchecked(0x00000000), unchecked(0x40080000), 
 
- 			unchecked(0x02080100), unchecked(0x40000100) };
 
- 		private static int[] _sp6 = { unchecked(0x20000010), unchecked(0x20400000), unchecked(0x00004000), unchecked(0x20404010), unchecked(
 
- 			0x20400000), unchecked(0x00000010), unchecked(0x20404010), 
 
- 			unchecked(0x00400000), unchecked(0x20004000), unchecked(0x00404010), unchecked(0x00400000), unchecked(0x20000010), unchecked(0x00400010), unchecked(0x20004000), unchecked(0x20000000), unchecked(
 
- 			0x00004010), unchecked(0x00000000), unchecked(0x00400010), 
 
- 			unchecked(0x20004010), unchecked(0x00004000), unchecked(0x00404000), unchecked(0x20004010), unchecked(0x00000010), unchecked(0x20400010), unchecked(0x20400010), unchecked(0x00000000), unchecked(
 
- 			0x00404010), unchecked(0x20404000), unchecked(0x00004010), 
 
- 			unchecked(0x00404000), unchecked(0x20404000), unchecked(0x20000000), unchecked(0x20004000), unchecked(0x00000010), unchecked(0x20400010), unchecked(0x00404000), unchecked(0x20404010), unchecked(
 
- 			0x00400000), unchecked(0x00004010), unchecked(0x20000010), 
 
- 			unchecked(0x00400000), unchecked(0x20004000), unchecked(0x20000000), unchecked(0x00004010), unchecked(0x20000010), unchecked(0x20404010), unchecked(0x00404000), unchecked(0x20400000), unchecked(
 
- 			0x00404010), unchecked(0x20404000), unchecked(0x00000000), 
 
- 			unchecked(0x20400010), unchecked(0x00000010), unchecked(0x00004000), unchecked(0x20400000), unchecked(0x00404010), unchecked(0x00004000), unchecked(0x00400010), unchecked(0x20004010), unchecked(
 
- 			0x00000000), unchecked(0x20404000), unchecked(0x20000000), 
 
- 			unchecked(0x00400010), unchecked(0x20004010) };
 
- 		private static int[] _sp7 = { unchecked(0x00200000), unchecked(0x04200002), unchecked(0x04000802), unchecked(0x00000000), unchecked(
 
- 			0x00000800), unchecked(0x04000802), unchecked(0x00200802), 
 
- 			unchecked(0x04200800), unchecked(0x04200802), unchecked(0x00200000), unchecked(0x00000000), unchecked(0x04000002), unchecked(0x00000002), unchecked(0x04000000), unchecked(0x04200002), unchecked(
 
- 			0x00000802), unchecked(0x04000800), unchecked(0x00200802), 
 
- 			unchecked(0x00200002), unchecked(0x04000800), unchecked(0x04000002), unchecked(0x04200000), unchecked(0x04200800), unchecked(0x00200002), unchecked(0x04200000), unchecked(0x00000800), unchecked(
 
- 			0x00000802), unchecked(0x04200802), unchecked(0x00200800), 
 
- 			unchecked(0x00000002), unchecked(0x04000000), unchecked(0x00200800), unchecked(0x04000000), unchecked(0x00200800), unchecked(0x00200000), unchecked(0x04000802), unchecked(0x04000802), unchecked(
 
- 			0x04200002), unchecked(0x04200002), unchecked(0x00000002), 
 
- 			unchecked(0x00200002), unchecked(0x04000000), unchecked(0x04000800), unchecked(0x00200000), unchecked(0x04200800), unchecked(0x00000802), unchecked(0x00200802), unchecked(0x04200800), unchecked(
 
- 			0x00000802), unchecked(0x04000002), unchecked(0x04200802), 
 
- 			unchecked(0x04200000), unchecked(0x00200800), unchecked(0x00000000), unchecked(0x00000002), unchecked(0x04200802), unchecked(0x00000000), unchecked(0x00200802), unchecked(0x04200000), unchecked(
 
- 			0x00000800), unchecked(0x04000002), unchecked(0x04000800), 
 
- 			unchecked(0x00000800), unchecked(0x00200002) };
 
- 		private static int[] _sp8 = { unchecked(0x10001040), unchecked(0x00001000), unchecked(0x00040000), unchecked(0x10041040), unchecked(
 
- 			0x10000000), unchecked(0x10001040), unchecked(0x00000040), 
 
- 			unchecked(0x10000000), unchecked(0x00040040), unchecked(0x10040000), unchecked(0x10041040), unchecked(0x00041000), unchecked(0x10041000), unchecked(0x00041040), unchecked(0x00001000), unchecked(
 
- 			0x00000040), unchecked(0x10040000), unchecked(0x10000040), 
 
- 			unchecked(0x10001000), unchecked(0x00001040), unchecked(0x00041000), unchecked(0x00040040), unchecked(0x10040040), unchecked(0x10041000), unchecked(0x00001040), unchecked(0x00000000), unchecked(
 
- 			0x00000000), unchecked(0x10040040), unchecked(0x10000040), 
 
- 			unchecked(0x10001000), unchecked(0x00041040), unchecked(0x00040000), unchecked(0x00041040), unchecked(0x00040000), unchecked(0x10041000), unchecked(0x00001000), unchecked(0x00000040), unchecked(
 
- 			0x10040040), unchecked(0x00001000), unchecked(0x00041040), 
 
- 			unchecked(0x10001000), unchecked(0x00000040), unchecked(0x10000040), unchecked(0x10040000), unchecked(0x10040040), unchecked(0x10000000), unchecked(0x00040000), unchecked(0x10001040), unchecked(
 
- 			0x00000000), unchecked(0x10041040), unchecked(0x00040040), 
 
- 			unchecked(0x10000040), unchecked(0x10040000), unchecked(0x10001000), unchecked(0x10001040), unchecked(0x00000000), unchecked(0x10041040), unchecked(0x00041000), unchecked(0x00041000), unchecked(
 
- 			0x00001040), unchecked(0x00001040), unchecked(0x00040040), 
 
- 			unchecked(0x10000000), unchecked(0x10041000) };
 
- 		// Tables, permutations, S-boxes, etc.
 
- 		/// Squash bytes down to ints.
 
- 		public static void SquashBytesToInts(byte[] inBytes, int inOff, int[] outInts, int
 
- 			 outOff, int intLen)
 
- 		{
 
- 			for (int i = 0; i < intLen; ++i)
 
- 			{
 
- 				outInts[outOff + i] = ((inBytes[inOff + i * 4] & unchecked(0xff)) << 24) |
 
- 					 ((inBytes[inOff + i * 4 + 1] & unchecked(0xff)) << 16) | ((inBytes[inOff
 
- 					 + i * 4 + 2] & unchecked(0xff)) << 8) | (inBytes[inOff + i * 4 + 3] & unchecked(
 
- 					0xff));
 
- 			}
 
- 		}
 
- 		/// Spread ints into bytes.
 
- 		public static void SpreadIntsToBytes(int[] inInts, int inOff, byte[] outBytes, int
 
- 			 outOff, int intLen)
 
- 		{
 
- 			for (int i = 0; i < intLen; ++i)
 
- 			{
 
- 				outBytes[outOff + i * 4] = unchecked((byte)((int)(((uint)inInts[inOff + i]) >> 24
 
- 					)));
 
- 				outBytes[outOff + i * 4 + 1] = unchecked((byte)((int)(((uint)inInts[inOff + i]) >>
 
- 					 16)));
 
- 				outBytes[outOff + i * 4 + 2] = unchecked((byte)((int)(((uint)inInts[inOff + i]) >>
 
- 					 8)));
 
- 				outBytes[outOff + i * 4 + 3] = unchecked((byte)inInts[inOff + i]);
 
- 			}
 
- 		}
 
- 	}
 
- }
 
 
  |