コード例 #1
0
        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();
                }
            }
        }