public void HashCore(byte[] data, int start, int length) { if (data == null) { throw new ArgumentNullException("data"); } if (start < 0) { throw new ArgumentException("start"); } if (length < 0) { throw new ArgumentException("length"); } if (length == 0) { return; } // avoid copying data unless required (API limitation) if (start == 0) { MHashWrapper.mhash(handle, data, (IntPtr)length); } else { byte[] partial = new byte [length]; Buffer.BlockCopy(data, start, partial, 0, length); MHashWrapper.mhash(handle, partial, (IntPtr)length); } }
public void Initialize() { if (handle == IntPtr.Zero) { GC.ReRegisterForFinalize(this); } handle = MHashWrapper.mhash_init(type); }
public void Dispose() { if (handle != IntPtr.Zero) { // this frees the hashing structure, but allocates the digest IntPtr digest = MHashWrapper.mhash_end(handle); // so we still have a second free to make to complete dispose Marshal.FreeHGlobal(digest); handle = IntPtr.Zero; GC.SuppressFinalize(this); } }
public MHashHelper(MHashId type) { this.type = type; handle = MHashWrapper.mhash_init(type); if (handle == IntPtr.Zero) { string msg = String.Format("Unknown mhash id '{0}'.", type); throw new CryptographicException(msg); } blocksize = (int)MHashWrapper.mhash_get_block_size(type); }
public byte[] HashFinal() { byte[] result = new byte [blocksize]; IntPtr digest = MHashWrapper.mhash_end(handle); try { Marshal.Copy(digest, result, 0, blocksize); } finally { Marshal.FreeHGlobal(digest); handle = IntPtr.Zero; } return(result); }