public static void C_GetAttributeValue(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE obj, CK_ATTRIBUTE[] pTemplate)
        {
            CK_ATTRIBUTE.Native t = null;
            IntPtr buf            = IntPtr.Zero;

            try
            {
                bool isKnownSize;
                t = CK_ATTRIBUTE.ToNativeReadSize(pTemplate, out isKnownSize);

                if (!isKnownSize)
                {
                    CKR_Exception.check(isWindows ?
                                        LibraryWindows.fl.C_GetAttributeValue(session.Handle, obj.Handle, t.windows, t.Length):
                                        LibraryUnix.fl.C_GetAttributeValue(session.Handle, obj.Handle, t.unix, t.Length)
                                        , "C_GetAttributeValue(null)");
                }

                CK_ATTRIBUTE.ToNativeRead(t);
                CKR_Exception.check(isWindows ?
                                    LibraryWindows.fl.C_GetAttributeValue(session.Handle, obj.Handle, t.windows, t.Length):
                                    LibraryUnix.fl.C_GetAttributeValue(session.Handle, obj.Handle, t.unix, t.Length)
                                    , "C_GetAttributeValue");
                CK_ATTRIBUTE.FromNative(pTemplate, t);
            }
            finally
            {
                CK_ATTRIBUTE.Free(t);
            }
        }
 public static void C_FindObjectsInit(CK_SESSION_HANDLE session, CK_ATTRIBUTE[] pTemplate)
 {
     CK_ATTRIBUTE.Native t = CK_ATTRIBUTE.ToNative(pTemplate);
     try { CKR_Exception.check(isWindows ?
                               LibraryWindows.fl.C_FindObjectsInit(session.Handle, t.windows, t.Length):
                               LibraryUnix.fl.C_FindObjectsInit(session.Handle, t.unix, t.Length)
                               , "C_FindObjectsInit"); }
     finally { CK_ATTRIBUTE.Free(t); }
 }
 public static void C_SetAttributeValue(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE obj, CK_ATTRIBUTE[] pTemplate)
 {
     CK_ATTRIBUTE.Native t = CK_ATTRIBUTE.ToNative(pTemplate);
     try { CKR_Exception.check(isWindows ?
                               LibraryWindows.fl.C_SetAttributeValue(session.Handle, obj.Handle, t.windows, t.Length):
                               LibraryUnix.fl.C_SetAttributeValue(session.Handle, obj.Handle, t.unix, t.Length)
                               , "C_SetAttributeValue"); }
     finally { CK_ATTRIBUTE.Free(t); }
 }
        public static CK_OBJECT_HANDLE C_CreateObject(CK_SESSION_HANDLE session, CK_ATTRIBUTE[] pTemplate)
        {
            CK_ATTRIBUTE.Native t = CK_ATTRIBUTE.ToNative(pTemplate);
            uint  objHandle       = 0;
            ulong objHandleUnix   = 0;

            try { CKR_Exception.check(isWindows ?
                                      LibraryWindows.fl.C_CreateObject(session.Handle, t.windows, t.Length, out objHandle):
                                      LibraryUnix.fl.C_CreateObject(session.Handle, t.unix, t.Length, out objHandleUnix)
                                      , "C_CreateObject"); }
            finally { CK_ATTRIBUTE.Free(t); }
            return(new CK_OBJECT_HANDLE(isWindows ? objHandle : (uint)objHandleUnix));
        }
        public static CK_OBJECT_HANDLE C_GenerateKey(CK_SESSION_HANDLE session, CK_MECHANISM mech, CK_ATTRIBUTE[] pTemplate)
        {
            CK_MECHANISM.Native m = new CK_MECHANISM.Native(mech);
            CK_ATTRIBUTE.Native t = CK_ATTRIBUTE.ToNative(pTemplate);
            uint  keyHandle       = 0;
            ulong keyHandleUnix   = 0;

            try { CKR_Exception.check(isWindows ?
                                      LibraryWindows.fl.C_GenerateKey(session.Handle, m.windows, t.windows, t.Length, out keyHandle):
                                      LibraryUnix.fl.C_GenerateKey(session.Handle, ref m.unix, t.unix, t.Length, out keyHandleUnix)
                                      , "C_GenerateKey"); }
            finally { m.Free(); CK_ATTRIBUTE.Free(t); }
            return(new CK_OBJECT_HANDLE(isWindows ? keyHandle : (uint)keyHandleUnix));
        }
        public static CK_OBJECT_HANDLE C_UnwrapKey(CK_SESSION_HANDLE session, CK_MECHANISM mech, CK_OBJECT_HANDLE key, byte[] input, CK_ATTRIBUTE[] pTemplate)
        {
            CK_MECHANISM.Native m        = new CK_MECHANISM.Native(mech);
            CK_ATTRIBUTE.Native t        = CK_ATTRIBUTE.ToNative(pTemplate);
            int   inSize                 = input == null ? 0 : input.Length;
            uint  unwrappedKeyHandle     = 0;
            ulong unwrappedKeyHandleUnix = 0;

            try { CKR_Exception.check(isWindows ?
                                      LibraryWindows.fl.C_UnwrapKey(session.Handle, m.windows, key.Handle, input, inSize, t.windows, t.Length, out unwrappedKeyHandle):
                                      LibraryUnix.fl.C_UnwrapKey(session.Handle, ref m.unix, key.Handle, input, inSize, t.unix, t.Length, out unwrappedKeyHandleUnix)
                                      , "C_UnwrapKey"); }
            finally { m.Free(); CK_ATTRIBUTE.Free(t); }
            return(new CK_OBJECT_HANDLE(isWindows ? unwrappedKeyHandle : (uint)unwrappedKeyHandleUnix));
        }
        public static void C_GenerateKeyPair(CK_SESSION_HANDLE session, CK_MECHANISM mech,
                                             CK_ATTRIBUTE[] tPub,
                                             CK_ATTRIBUTE[] tPrv,
                                             out CK_OBJECT_HANDLE pubKey,
                                             out CK_OBJECT_HANDLE prvKey)
        {
            CK_ATTRIBUTE.Native tPubRaw = CK_ATTRIBUTE.ToNative(tPub);
            CK_ATTRIBUTE.Native tPrvRaw = CK_ATTRIBUTE.ToNative(tPrv);
            CK_MECHANISM.Native m       = new CK_MECHANISM.Native(mech);
            uint  pubKeyHandle          = 0;
            uint  prvKeyHandle          = 0;
            ulong pubKeyHandleUnix      = 0;
            ulong prvKeyHandleUnix      = 0;

            try { CKR_Exception.check(isWindows ?
                                      LibraryWindows.fl.C_GenerateKeyPair(session.Handle, m.windows, tPubRaw.windows, tPub.Length, tPrvRaw.windows, tPrv.Length, out pubKeyHandle, out prvKeyHandle):
                                      LibraryUnix.fl.C_GenerateKeyPair(session.Handle, ref m.unix, tPubRaw.unix, tPub.Length, tPrvRaw.unix, tPrv.Length, out pubKeyHandleUnix, out prvKeyHandleUnix)
                                      , "C_GenerateKeyPair"); }
            finally { CK_ATTRIBUTE.Free(tPubRaw); CK_ATTRIBUTE.Free(tPrvRaw); m.Free(); }
            pubKey = new CK_OBJECT_HANDLE(isWindows ? pubKeyHandle : (uint)pubKeyHandleUnix);
            prvKey = new CK_OBJECT_HANDLE(isWindows ? prvKeyHandle : (uint)prvKeyHandleUnix);
        }