⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hash.cs

📁 本源码为OpenNETCF源代码
💻 CS
字号:
//==========================================================================================
//
//		OpenNETCF.Windows.Forms.Hash
//		Copyright (c) 2003, OpenNETCF.org
//
//		This library is free software; you can redistribute it and/or modify it under 
//		the terms of the OpenNETCF.org Shared Source License.
//
//		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 OpenNETCF.org Shared Source License 
//		for more details.
//
//		You should have received a copy of the OpenNETCF.org Shared Source License 
//		along with this library; if not, email licensing@opennetcf.org to request a copy.
//
//		If you wish to contact the OpenNETCF Advisory Board to discuss licensing, please 
//		email licensing@opennetcf.org.
//
//		For general enquiries, email enquiries@opennetcf.org or visit our website at:
//		http://www.opennetcf.org
//
//		!!! A HUGE thank-you goes out to Casey Chesnut for supplying this class library !!!
//      !!! You can contact Casey at http://www.brains-n-brawn.com                      !!!
//
//==========================================================================================
using System;
using System.Text;

namespace OpenNETCF.Security.Cryptography.NativeMethods
{
	[CLSCompliant(false)]
	public class Hash
	{
		public static byte [] ComputeHashSsl3Shamd5(byte [] data)
		{
			IntPtr prov = Context.AcquireContext();
			byte [] md5 = ComputeHash(prov, CalgHash.MD5, data);
			byte [] sha = ComputeHash(prov, CalgHash.SHA1, data);
			byte [] md5Sha = new byte[md5.Length + sha.Length];
			Buffer.BlockCopy(md5, 0, md5Sha, 0, md5.Length);
			Buffer.BlockCopy(sha, 0, md5Sha, md5.Length, sha.Length);

			IntPtr hash = Hash.CreateHash(prov, CalgHash.SSL3_SHAMD5);
			Hash.SetHashParam(hash, HashParam.HASHVAL, md5Sha);
			byte [] sig = Hash.SignHash(hash, KeySpec.KEYEXCHANGE); //64 bytes
			Hash.DestroyHash(hash);
			Context.ReleaseContext(prov);
			return sig;
		}

		public static byte [] ComputeHash(CalgHash algId, byte [] data)
		{
			IntPtr key = IntPtr.Zero;
			return ComputeKeyedHash(algId, data, key);
		}

		public static byte [] ComputeKeyedHash(CalgHash algId, byte [] data, IntPtr key)
		{
			//dont have to specify enhanced provider,
			//because hash sizes i care about dont change
			IntPtr prov = Context.AcquireContext(ProvType.RSA_FULL);
			byte [] baHash = ComputeKeyedHash(prov, algId, data, key);
			Context.ReleaseContext(prov);
			return baHash;
		}

		public static byte [] ComputeHash(IntPtr prov, CalgHash algId, byte [] data)
		{
			IntPtr key = IntPtr.Zero;
			return ComputeKeyedHash(prov, algId, data, key);
		}

		public static byte [] ComputeKeyedHash(IntPtr prov, CalgHash algId, byte [] data, IntPtr key)
		{
			IntPtr hash = CreateHash(prov, algId, key);
			HashData(hash, data);
			byte [] baHash = GetHashParam(hash);
			DestroyHash(hash);
			return baHash;
		}

		public static IntPtr CreateHash(IntPtr prov, CalgHash algId)
		{
			IntPtr key = IntPtr.Zero; //non-keyed hash
			return CreateHash(prov, algId, key);
		}

		public static IntPtr CreateHash(IntPtr prov, CalgHash algId, IntPtr key)
		{
			uint flags = 0;
			IntPtr hash;
			bool retVal = Crypto.CryptCreateHash(prov, (uint) algId, key, flags, out hash);
			ErrCode ec = Error.HandleRetVal(retVal);
			return hash;
		}

		public static void HashData(IntPtr hash, byte[] data)
		{
			uint flags = 0;
			byte [] tempData = (byte[]) data.Clone();
			bool retVal = Crypto.CryptHashData(hash, tempData, tempData.Length, flags);
			ErrCode ec = Error.HandleRetVal(retVal);
		}

		public static byte[] GetHashParam(IntPtr hash)
		{
			byte [] data = new byte[0];
			uint dataLen = 0;
			uint flags = 0;
			//size
			bool retVal = Crypto.CryptGetHashParam(hash, (uint) HashParam.HASHVAL, data, ref dataLen, flags);
			ErrCode ec = Error.HandleRetVal(retVal, ErrCode.MORE_DATA);
			if(ec == ErrCode.MORE_DATA)
			{
				//data
				data = new byte[dataLen];
				retVal = Crypto.CryptGetHashParam(hash, (uint) HashParam.HASHVAL, data, ref dataLen, flags);
				ec = Error.HandleRetVal(retVal);
			}
			return data;
		}

		public static void DestroyHash(IntPtr hash)
		{
			if(hash != IntPtr.Zero)
			{
				bool retVal = Crypto.CryptDestroyHash(hash);
				ErrCode ec = Error.HandleRetVal(retVal); //dont exception
			}
		}

		public static void SetHashParam(IntPtr hash, HashParam param, byte[] data)
		{
			uint flags = 0;
			bool retVal = Crypto.CryptSetHashParam(hash, (uint) param, data, flags);
			ErrCode ec = Error.HandleRetVal(retVal);
		}

		/// <summary>
		/// INVALID_PARAMETER
		/// </summary>
		public static IntPtr DuplicateHash(IntPtr hash)
		{
			uint reserved = 0;
			uint flags = 0;
			IntPtr outHash = IntPtr.Zero;
			bool retVal = Crypto.CryptDuplicateHash(hash, ref reserved, flags, out outHash);
			ErrCode ec = Error.HandleRetVal(retVal);
			return outHash;
		}

		public static byte[] SignHash(IntPtr hash, KeySpec keySpec)
		{
			string desc = null; //String.Empty
			uint flags = 0;
			byte [] sig = new byte[0];
			uint sigLen = 0;
			//length
			bool retVal = Crypto.CryptSignHash(hash, (uint) keySpec, desc, flags, sig, ref sigLen);
			ErrCode ec = Error.HandleRetVal(retVal, ErrCode.MORE_DATA);
			if(ec == ErrCode.MORE_DATA)
			{
				//sign
				sig = new byte[sigLen];
				retVal = Crypto.CryptSignHash(hash, (uint) keySpec, desc, flags, sig, ref sigLen);
				ec = Error.HandleRetVal(retVal);
			}
			return sig;
		}

		public static void VerifySignature(IntPtr hash, byte[] sig, IntPtr pubKey)
		{
			string desc = null; //String.Empty
			uint flags = 0;
			bool retVal = Crypto.CryptVerifySignature(hash, sig, (uint) sig.Length, pubKey, desc, flags);
			ErrCode ec = Error.HandleRetVal(retVal); //2148073478 if doesnt verify
		}

		public static void HashSessionKey(IntPtr hash, IntPtr key)
		{
			uint flags = 0;
			bool retVal = Crypto.CryptHashSessionKey(hash, key, flags);
			ErrCode ec = Error.HandleRetVal(retVal);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -