public void CalcHmac(byte[] key, int keyLen, byte[] data, int dataLen, byte[] hmac) { var keyHandle = default(GCHandle); var dataHandle = default(GCHandle); var hmacHandle = default(GCHandle); try { keyHandle = GCHandle.Alloc(key, GCHandleType.Pinned); dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); hmacHandle = GCHandle.Alloc(hmac, GCHandleType.Pinned); var outputLength = 0; if (OpenSsl.HMAC(OpenSsl.EVP_sha1(), keyHandle.AddrOfPinnedObject(), keyLen, dataHandle.AddrOfPinnedObject(), dataLen, hmacHandle.AddrOfPinnedObject(), ref outputLength) == IntPtr.Zero) { throw new Exception($"Cannot calculate HMAC: {OpenSsl.GetLastError()}"); } } finally { if (keyHandle.IsAllocated) { keyHandle.Free(); } if (dataHandle.IsAllocated) { dataHandle.Free(); } if (hmacHandle.IsAllocated) { hmacHandle.Free(); } } }