109 lines
4.3 KiB
C++
109 lines
4.3 KiB
C++
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef CRYPTO_KEYCHAIN_MAC_H_
|
|
#define CRYPTO_KEYCHAIN_MAC_H_
|
|
|
|
#include <Security/Security.h>
|
|
|
|
#include "base/macros.h"
|
|
#include "build/build_config.h"
|
|
#include "crypto/crypto_export.h"
|
|
|
|
#if defined (OS_IOS)
|
|
typedef void* SecKeychainRef;
|
|
typedef void* SecKeychainItemRef;
|
|
typedef void SecKeychainAttributeList;
|
|
#endif
|
|
|
|
namespace crypto {
|
|
|
|
// Wraps the KeychainServices API in a very thin layer, to allow it to be
|
|
// mocked out for testing.
|
|
|
|
// See Keychain Services documentation for function documentation, as these call
|
|
// through directly to their Keychain Services equivalents (Foo ->
|
|
// SecKeychainFoo). The only exception is Free, which should be used for
|
|
// anything returned from this class that would normally be freed with
|
|
// CFRelease (to aid in testing).
|
|
class CRYPTO_EXPORT AppleKeychain {
|
|
public:
|
|
AppleKeychain();
|
|
virtual ~AppleKeychain();
|
|
|
|
virtual OSStatus FindGenericPassword(CFTypeRef keychainOrArray,
|
|
UInt32 serviceNameLength,
|
|
const char* serviceName,
|
|
UInt32 accountNameLength,
|
|
const char* accountName,
|
|
UInt32* passwordLength,
|
|
void** passwordData,
|
|
SecKeychainItemRef* itemRef) const;
|
|
|
|
virtual OSStatus ItemFreeContent(SecKeychainAttributeList* attrList,
|
|
void* data) const;
|
|
|
|
virtual OSStatus AddGenericPassword(SecKeychainRef keychain,
|
|
UInt32 serviceNameLength,
|
|
const char* serviceName,
|
|
UInt32 accountNameLength,
|
|
const char* accountName,
|
|
UInt32 passwordLength,
|
|
const void* passwordData,
|
|
SecKeychainItemRef* itemRef) const;
|
|
|
|
#if !defined(OS_IOS)
|
|
virtual OSStatus ItemCopyAttributesAndData(
|
|
SecKeychainItemRef itemRef,
|
|
SecKeychainAttributeInfo* info,
|
|
SecItemClass* itemClass,
|
|
SecKeychainAttributeList** attrList,
|
|
UInt32* length,
|
|
void** outData) const;
|
|
|
|
virtual OSStatus ItemModifyAttributesAndData(
|
|
SecKeychainItemRef itemRef,
|
|
const SecKeychainAttributeList* attrList,
|
|
UInt32 length,
|
|
const void* data) const;
|
|
|
|
virtual OSStatus ItemFreeAttributesAndData(SecKeychainAttributeList* attrList,
|
|
void* data) const;
|
|
|
|
virtual OSStatus ItemDelete(SecKeychainItemRef itemRef) const;
|
|
|
|
virtual OSStatus SearchCreateFromAttributes(
|
|
CFTypeRef keychainOrArray,
|
|
SecItemClass itemClass,
|
|
const SecKeychainAttributeList* attrList,
|
|
SecKeychainSearchRef* searchRef) const;
|
|
|
|
virtual OSStatus SearchCopyNext(SecKeychainSearchRef searchRef,
|
|
SecKeychainItemRef* itemRef) const;
|
|
|
|
virtual OSStatus AddInternetPassword(SecKeychainRef keychain,
|
|
UInt32 serverNameLength,
|
|
const char* serverName,
|
|
UInt32 securityDomainLength,
|
|
const char* securityDomain,
|
|
UInt32 accountNameLength,
|
|
const char* accountName,
|
|
UInt32 pathLength, const char* path,
|
|
UInt16 port, SecProtocolType protocol,
|
|
SecAuthenticationType authenticationType,
|
|
UInt32 passwordLength,
|
|
const void* passwordData,
|
|
SecKeychainItemRef* itemRef) const;
|
|
|
|
// Calls CFRelease on the given ref, after checking that |ref| is non-NULL.
|
|
virtual void Free(CFTypeRef ref) const;
|
|
#endif // !defined(OS_IOS)
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(AppleKeychain);
|
|
};
|
|
|
|
} // namespace crypto
|
|
|
|
#endif // CRYPTO_KEYCHAIN_MAC_H_
|