public bool TryGetSecret(KeychainSecretName name, out KeychainSecret secret) { using (var serviceName = new KeychainMemory(name.Service)) using (var accountName = new KeychainMemory(name.Account)) { var itemRef = IntPtr.Zero; var result = SecKeychainFindGenericPassword( IntPtr.Zero, serviceName.Length, serviceName.Buffer, accountName.Length, accountName.Buffer, out var secretValueLength, out var secretValuePtr, ref itemRef); if (result == SecStatus.ItemNotFound) { secret = null; return(false); } if (result != SecStatus.Success) { throw new AppleSecurityException( nameof(SecKeychainFindGenericPassword), result); } try { var passwordData = new byte [secretValueLength]; Marshal.Copy(secretValuePtr, passwordData, 0, (int)secretValueLength); secret = KeychainSecret.Create(name, passwordData); return(true); } finally { SecKeychainItemFreeContent(IntPtr.Zero, secretValuePtr); } } }
public void RoundtripString(string key, string value) { KeychainSecretName name = (serviceName, key); keychain.StoreSecret(KeychainSecret.Create(name, value)); Assert.True(keychain.TryGetSecret(name, out var secret)); Assert.Equal(value, secret.GetUtf8StringValue()); }
public void StoreSecret() { KeychainSecretName name = (serviceName, "dont-update-me"); keychain.StoreSecret(KeychainSecret.Create(name, "initial value")); Assert.Throws <KeychainItemAlreadyExistsException> (() => keychain.StoreSecret( KeychainSecret.Create(name, "new value"), updateExisting: false)); }
public void RoundtripBytes() { var random = new Random(); var value = new byte [1024 * 1024]; random.NextBytes(value); KeychainSecretName name = (serviceName, "randomblob"); keychain.StoreSecret(KeychainSecret.Create(name, value)); Assert.True(keychain.TryGetSecret(name, out var secret)); Assert.Equal(value, secret.Value); }
public bool TryGetSecret(KeychainSecretName name, out KeychainSecret secret) { var secretPath = GetSecretPath(name); if (!File.Exists(secretPath)) { secret = null; return(false); } secret = KeychainSecret.Create( name, Unprotect(File.ReadAllBytes(secretPath))); return(true); }
public bool TryGetSecret(KeychainSecretName name, out KeychainSecret secret) => keychain.TryGetSecret(name, out secret);
static string GetSecretPath(KeychainSecretName secretName) => Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DPAPIKeychain", secretName.Service, secretName.Account);
public void Deconstruct() { var(service, account) = new KeychainSecretName("a", "b"); Assert.Equal("a", service); Assert.Equal("b", account); }