#ifndef CRYPTO_APPLE_KEYCHAIN_H_
#define CRYPTO_APPLE_KEYCHAIN_H_
#include <Security/Security.h>
#include "build/build_config.h"
#include "crypto/crypto_export.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace crypto {
#if BUILDFLAG(IS_IOS)
using AppleSecKeychainItemRef = void*;
#else
using AppleSecKeychainItemRef = SecKeychainItemRef;
#endif
class CRYPTO_EXPORT AppleKeychain {
public:
AppleKeychain();
AppleKeychain(const AppleKeychain&) = delete;
AppleKeychain& operator=(const AppleKeychain&) = delete;
virtual ~AppleKeychain();
virtual OSStatus FindGenericPassword(UInt32 service_name_length,
const char* service_name,
UInt32 account_name_length,
const char* account_name,
UInt32* password_length,
void** password_data,
AppleSecKeychainItemRef* item) const;
virtual OSStatus ItemFreeContent(void* data) const;
virtual OSStatus AddGenericPassword(UInt32 service_name_length,
const char* service_name,
UInt32 account_name_length,
const char* account_name,
UInt32 password_length,
const void* password_data,
AppleSecKeychainItemRef* item) const;
#if BUILDFLAG(IS_MAC)
virtual OSStatus ItemDelete(AppleSecKeychainItemRef item) const;
#endif
};
#if BUILDFLAG(IS_MAC)
class CRYPTO_EXPORT ScopedKeychainUserInteractionAllowed {
public:
ScopedKeychainUserInteractionAllowed(
const ScopedKeychainUserInteractionAllowed&) = delete;
ScopedKeychainUserInteractionAllowed& operator=(
const ScopedKeychainUserInteractionAllowed&) = delete;
explicit ScopedKeychainUserInteractionAllowed(Boolean allowed,
OSStatus* status = nullptr);
~ScopedKeychainUserInteractionAllowed();
private:
absl::optional<Boolean> was_allowed_;
};
#endif
}
#endif