CPF/CPF.Mac/Mac/Security/KeysAccessible.cs

143 lines
3.2 KiB
C#
Raw Permalink Normal View History

2023-11-21 23:05:03 +08:00
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");
}
}
}