public static void C_DestroyObject(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE obj)
 {
     CKR_Exception.check(isWindows ?
                         LibraryWindows.fl.C_DestroyObject(session.Handle, obj.Handle):
                         LibraryUnix.fl.C_DestroyObject(session.Handle, obj.Handle)
                         , "C_DestroyObject");
 }
 public static void C_SeedRandom(CK_SESSION_HANDLE session, byte[] data)
 {
     CKR_Exception.check(isWindows ?
                         LibraryWindows.fl.C_SeedRandom(session.Handle, data, (uint)data.Length):
                         LibraryUnix.fl.C_SeedRandom(session.Handle, data, (uint)data.Length)
                         , "C_SeedRandom");
 }
 public static void C_FindObjectsFinal(CK_SESSION_HANDLE session)
 {
     CKR_Exception.check(isWindows ?
                         LibraryWindows.fl.C_FindObjectsFinal(session.Handle):
                         LibraryUnix.fl.C_FindObjectsFinal(session.Handle)
                         , "C_FindObjectsFinal");
 }
 public static void C_Logout(CK_SESSION_HANDLE session)
 {
     CKR_Exception.check(isWindows ?
                         LibraryWindows.fl.C_Logout(session.Handle) :
                         LibraryUnix.fl.C_Logout(session.Handle)
                         , "C_Logout");
 }
 public static void C_CloseSession(CK_SESSION_HANDLE session)
 {
     CKR_Exception.check(isWindows ?
                         LibraryWindows.fl.C_CloseSession(session.Handle) :
                         LibraryUnix.fl.C_CloseSession(session.Handle)
                         , "C_OpenSession");
 }
 public static void C_DigestKey(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key)
 {
     CKR_Exception.check(isWindows ?
                         LibraryWindows.fl.C_DigestKey(session.Handle, key.Handle):
                         LibraryUnix.fl.C_DigestKey(session.Handle, key.Handle)
                         , "C_DigestKey");
 }
        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 int C_DigestFinal(CK_SESSION_HANDLE session, byte[] output)
        {
            int outSize = output == null ? 0 : output.Length;

            CKR_Exception.check(fl.C_DigestFinal(session.Handle, output, ref outSize), "C_DigestFinal");
            return(outSize);
        }
        public static void C_Verify(CK_SESSION_HANDLE session, byte[] input, byte[] signature)
        {
            int inSize  = input == null ? 0 : input.Length;
            int sigSize = signature == null ? 0 : signature.Length;

            CKR_Exception.check(fl.C_Verify(session.Handle, input, inSize, signature, sigSize), "C_Verify");
        }
        public static CK_OBJECT_HANDLE[] C_FindObjects(CK_SESSION_HANDLE session, int ulMaxObjectCount)
        {
            uint[]  buf     = null;
            ulong[] bufUnix = null;

            if (isWindows)
            {
                buf = new uint[ulMaxObjectCount];
            }
            else
            {
                bufUnix = new ulong[ulMaxObjectCount];
            }

            int  count     = 0;
            long countUnix = 0;

            CKR_Exception.check(isWindows ?
                                LibraryWindows.fl.C_FindObjects(session.Handle, buf, ulMaxObjectCount, out count):
                                LibraryUnix.fl.C_FindObjects(session.Handle, bufUnix, ulMaxObjectCount, out countUnix)
                                , "C_FindObjectsInit");

            if (!isWindows)
            {
                count = (int)countUnix;
            }
            CK_OBJECT_HANDLE[] res = new CK_OBJECT_HANDLE[count];
            for (int i = 0; i < count; i++)
            {
                res[i] = new CK_OBJECT_HANDLE(isWindows ? buf[i] : (uint)bufUnix[i]);
            }
            return(res);
        }
        public static CK_SESSION_INFO C_GetSessionInfo(CK_SESSION_HANDLE session)
        {
            CK_SESSION_INFO info = new CK_SESSION_INFO();

            CKR_Exception.check(fl.C_GetSessionInfo(session.Handle, out info), "C_GetSessionInfo");
            return(info);
        }
 public static void C_Login(CK_SESSION_HANDLE session, uint userType, string pin)
 {
     byte[] bytes = Encoding.UTF8.GetBytes(pin);
     CKR_Exception.check(isWindows ?
                         LibraryWindows.fl.C_Login(session.Handle, userType, bytes, (uint)bytes.Length):
                         LibraryUnix.fl.C_Login(session.Handle, userType, bytes, (uint)bytes.Length)
                         , "C_Login");
 }
        public static int C_Sign(CK_SESSION_HANDLE session, byte[] input, byte[] output)
        {
            int inSize  = input == null ? 0 : input.Length;
            int outSize = output == null ? 0 : output.Length;

            CKR_Exception.check(fl.C_Sign(session.Handle, input, inSize, output, ref outSize), "C_Sign");
            return(outSize);
        }
        public static byte[] C_WrapKey(CK_SESSION_HANDLE session, CK_MECHANISM mech, CK_OBJECT_HANDLE key, CK_OBJECT_HANDLE wrappedKey)
        {
            int outSize = C_WrapKey(session, mech, key, wrappedKey, null);

            byte[] output = new byte[outSize];
            outSize = C_WrapKey(session, mech, key, wrappedKey, output);
            return(SubArray(output, outSize));
        }
        public static byte[] C_Digest(CK_SESSION_HANDLE session, byte[] input)
        {
            int outSize = C_Digest(session, input, null);

            byte[] output = new byte[outSize];
            outSize = C_Digest(session, input, output);
            return(SubArray(output, outSize));
        }
 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 int C_WrapKey(CK_SESSION_HANDLE session, CK_MECHANISM mech, CK_OBJECT_HANDLE key, CK_OBJECT_HANDLE wrappedKey, byte[] output)
        {
            CK_MECHANISM.Native m = new CK_MECHANISM.Native(mech);
            int outSize           = output == null ? 0 : output.Length;

            try { CKR_Exception.check(fl.C_WrapKey(session.Handle, m, key.Handle, wrappedKey.Handle, output, ref outSize), "C_WrapKey"); }
            finally { m.Free(); }
            return(outSize);
        }
        public static void C_VerifyFinal(CK_SESSION_HANDLE session, byte[] signature)
        {
            int sigSize = signature == null ? 0 : signature.Length;

            CKR_Exception.check(isWindows ?
                                LibraryWindows.fl.C_VerifyFinal(session.Handle, signature, sigSize):
                                LibraryUnix.fl.C_VerifyFinal(session.Handle, signature, sigSize)
                                , "C_VerifyFinal");
        }
        public static void C_DigestUpdate(CK_SESSION_HANDLE session, byte[] input)
        {
            int inSize = input == null ? 0 : input.Length;

            CKR_Exception.check(isWindows ?
                                LibraryWindows.fl.C_DigestUpdate(session.Handle, input, inSize):
                                LibraryUnix.fl.C_DigestUpdate(session.Handle, input, inSize)
                                , "C_DigestUpdate");
        }
 public static void C_DigestInit(CK_SESSION_HANDLE session, CK_MECHANISM mech)
 {
     CK_MECHANISM.Native m = new CK_MECHANISM.Native(mech);
     try { CKR_Exception.check(isWindows ?
                               LibraryWindows.fl.C_DigestInit(session.Handle, m.windows):
                               LibraryUnix.fl.C_DigestInit(session.Handle, ref m.unix)
                               , "C_DigestInit"); }
     finally { m.Free(); }
 }
 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_VerifyInit(CK_SESSION_HANDLE session, CK_MECHANISM mech, CK_OBJECT_HANDLE key)
 {
     CK_MECHANISM.Native m = new CK_MECHANISM.Native(mech);
     try { CKR_Exception.check(isWindows ?
                               LibraryWindows.fl.C_VerifyInit(session.Handle, m.windows, key.Handle):
                               LibraryUnix.fl.C_VerifyInit(session.Handle, ref m.unix, key.Handle)
                               , "C_VerifyInit"); }
     finally { m.Free(); }
 }
        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;

            try { CKR_Exception.check(fl.C_CreateObject(session.Handle, t, t.Length, out objHandle), "C_CreateObject"); }
            finally { CK_ATTRIBUTE.Free(t); }
            return(new CK_OBJECT_HANDLE(objHandle));
        }
        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;

            try { CKR_Exception.check(fl.C_GenerateKey(session.Handle, m, t, t.Length, out keyHandle), "C_GenerateKey"); }
            finally { m.Free(); CK_ATTRIBUTE.Free(t); }
            return(new CK_OBJECT_HANDLE(keyHandle));
        }
 public static byte[] C_GenerateRandom(CK_SESSION_HANDLE session, uint len)
 {
     byte[] dst = new byte[len];
     CKR_Exception.check(isWindows ?
                         LibraryWindows.fl.C_GenerateRandom(session.Handle, dst, len) :
                         LibraryUnix.fl.C_GenerateRandom(session.Handle, dst, len)
                         , "C_GenerateRandom"
                         );
     return(dst);
 }
        public static int C_DigestFinal(CK_SESSION_HANDLE session, byte[] output)
        {
            int  outSize     = output == null ? 0 : output.Length;
            long outSizeUnix = output == null ? 0 : output.Length;

            CKR_Exception.check(isWindows ?
                                LibraryWindows.fl.C_DigestFinal(session.Handle, output, ref outSize):
                                LibraryUnix.fl.C_DigestFinal(session.Handle, output, ref outSizeUnix)
                                , "C_DigestFinal");
            return(isWindows ? outSize : (int)outSizeUnix);
        }
        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;

            try { CKR_Exception.check(fl.C_UnwrapKey(session.Handle, m, key.Handle, input, inSize, t, t.Length, out unwrappedKeyHandle), "C_UnwrapKey"); }
            finally { m.Free(); CK_ATTRIBUTE.Free(t); }
            return(new CK_OBJECT_HANDLE(unwrappedKeyHandle));
        }
        public static int C_DecryptUpdate(CK_SESSION_HANDLE session, byte[] input, byte[] output)
        {
            int  inSize      = input == null ? 0 : input.Length;
            int  outSize     = output == null ? 0 : output.Length;
            long outSizeUnix = output == null ? 0 : output.Length;

            CKR_Exception.check(isWindows ?
                                LibraryWindows.fl.C_DecryptUpdate(session.Handle, input, inSize, output, ref outSize):
                                LibraryUnix.fl.C_DecryptUpdate(session.Handle, input, inSize, output, ref outSizeUnix)
                                , "C_DecryptUpdate");
            return(isWindows ? outSize : (int)outSizeUnix);
        }
        public static int C_WrapKey(CK_SESSION_HANDLE session, CK_MECHANISM mech, CK_OBJECT_HANDLE key, CK_OBJECT_HANDLE wrappedKey, byte[] output)
        {
            CK_MECHANISM.Native m = new CK_MECHANISM.Native(mech);
            int  outSize          = output == null ? 0 : output.Length;
            long outSizeUnix      = output == null ? 0 : output.Length;

            try { CKR_Exception.check(isWindows ?
                                      LibraryWindows.fl.C_WrapKey(session.Handle, m.windows, key.Handle, wrappedKey.Handle, output, ref outSize):
                                      LibraryUnix.fl.C_WrapKey(session.Handle, ref m.unix, key.Handle, wrappedKey.Handle, output, ref outSizeUnix)
                                      , "C_WrapKey"); }
            finally { m.Free(); }
            return(isWindows ? outSize : (int)outSizeUnix);
        }
        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));
        }