mirror of
https://gitee.com/csharpui/CPF.git
synced 2025-04-05 17:37:51 +08:00
143 lines
3.2 KiB
C#
143 lines
3.2 KiB
C#
![]() |
using CPF.Mac.ObjCRuntime;
|
||
|
using System;
|
||
|
|
||
|
namespace CPF.Mac.Security
|
||
|
{
|
||
|
internal static class KeysAccessible
|
||
|
{
|
||
|
private static IntPtr _WhenUnlocked;
|
||
|
|
||
|
private static IntPtr _AfterFirstUnlock;
|
||
|
|
||
|
private static IntPtr _Always;
|
||
|
|
||
|
private static IntPtr _WhenUnlockedThisDeviceOnly;
|
||
|
|
||
|
private static IntPtr _AfterFirstUnlockThisDeviceOnly;
|
||
|
|
||
|
private static IntPtr _AlwaysThisDeviceOnly;
|
||
|
|
||
|
public static IntPtr WhenUnlocked
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (_WhenUnlocked == IntPtr.Zero)
|
||
|
{
|
||
|
_WhenUnlocked = Dlfcn.GetIntPtr(SecItem.securityLibrary, "kSecAttrAccessibleWhenUnlocked");
|
||
|
}
|
||
|
return _WhenUnlocked;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static IntPtr AfterFirstUnlock
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (_AfterFirstUnlock == IntPtr.Zero)
|
||
|
{
|
||
|
_AfterFirstUnlock = Dlfcn.GetIntPtr(SecItem.securityLibrary, "kSecAttrAccessibleAfterFirstUnlock");
|
||
|
}
|
||
|
return _AfterFirstUnlock;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static IntPtr Always
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (_Always == IntPtr.Zero)
|
||
|
{
|
||
|
_Always = Dlfcn.GetIntPtr(SecItem.securityLibrary, "kSecAttrAccessibleAlways");
|
||
|
}
|
||
|
return _Always;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static IntPtr WhenUnlockedThisDeviceOnly
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (_WhenUnlockedThisDeviceOnly == IntPtr.Zero)
|
||
|
{
|
||
|
_WhenUnlockedThisDeviceOnly = Dlfcn.GetIntPtr(SecItem.securityLibrary, "kSecAttrAccessibleWhenUnlockedThisDeviceOnly");
|
||
|
}
|
||
|
return _WhenUnlockedThisDeviceOnly;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static IntPtr AfterFirstUnlockThisDeviceOnly
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (_AfterFirstUnlockThisDeviceOnly == IntPtr.Zero)
|
||
|
{
|
||
|
_AfterFirstUnlockThisDeviceOnly = Dlfcn.GetIntPtr(SecItem.securityLibrary, "kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly");
|
||
|
}
|
||
|
return _AfterFirstUnlockThisDeviceOnly;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static IntPtr AlwaysThisDeviceOnly
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (_AlwaysThisDeviceOnly == IntPtr.Zero)
|
||
|
{
|
||
|
_AlwaysThisDeviceOnly = Dlfcn.GetIntPtr(SecItem.securityLibrary, "kSecAttrAccessibleAlwaysThisDeviceOnly");
|
||
|
}
|
||
|
return _AlwaysThisDeviceOnly;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static IntPtr FromSecAccessible(SecAccessible accessible)
|
||
|
{
|
||
|
switch (accessible)
|
||
|
{
|
||
|
case SecAccessible.WhenUnlocked:
|
||
|
return WhenUnlocked;
|
||
|
case SecAccessible.AfterFirstUnlock:
|
||
|
return AfterFirstUnlock;
|
||
|
case SecAccessible.Always:
|
||
|
return Always;
|
||
|
case SecAccessible.WhenUnlockedThisDeviceOnly:
|
||
|
return WhenUnlockedThisDeviceOnly;
|
||
|
case SecAccessible.AfterFirstUnlockThisDeviceOnly:
|
||
|
return AfterFirstUnlockThisDeviceOnly;
|
||
|
case SecAccessible.AlwaysThisDeviceOnly:
|
||
|
return AlwaysThisDeviceOnly;
|
||
|
default:
|
||
|
throw new ArgumentException("accessible");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static SecAccessible ToSecAccessible(IntPtr handle)
|
||
|
{
|
||
|
if (handle == WhenUnlocked)
|
||
|
{
|
||
|
return SecAccessible.WhenUnlocked;
|
||
|
}
|
||
|
if (handle == AfterFirstUnlock)
|
||
|
{
|
||
|
return SecAccessible.AfterFirstUnlock;
|
||
|
}
|
||
|
if (handle == Always)
|
||
|
{
|
||
|
return SecAccessible.Always;
|
||
|
}
|
||
|
if (handle == WhenUnlockedThisDeviceOnly)
|
||
|
{
|
||
|
return SecAccessible.WhenUnlockedThisDeviceOnly;
|
||
|
}
|
||
|
if (handle == AfterFirstUnlockThisDeviceOnly)
|
||
|
{
|
||
|
return SecAccessible.AfterFirstUnlockThisDeviceOnly;
|
||
|
}
|
||
|
if (handle == AlwaysThisDeviceOnly)
|
||
|
{
|
||
|
return SecAccessible.AlwaysThisDeviceOnly;
|
||
|
}
|
||
|
throw new ArgumentException("obj");
|
||
|
}
|
||
|
}
|
||
|
}
|