• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CRYPTO_KEYCHAIN_MAC_H_
6 #define CRYPTO_KEYCHAIN_MAC_H_
7 
8 #include <Security/Security.h>
9 
10 #include "base/macros.h"
11 #include "build/build_config.h"
12 #include "crypto/crypto_export.h"
13 
14 #if defined (OS_IOS)
15 typedef void* SecKeychainRef;
16 typedef void* SecKeychainItemRef;
17 typedef void SecKeychainAttributeList;
18 #endif
19 
20 namespace crypto {
21 
22 // Wraps the KeychainServices API in a very thin layer, to allow it to be
23 // mocked out for testing.
24 
25 // See Keychain Services documentation for function documentation, as these call
26 // through directly to their Keychain Services equivalents (Foo ->
27 // SecKeychainFoo). The only exception is Free, which should be used for
28 // anything returned from this class that would normally be freed with
29 // CFRelease (to aid in testing).
30 class CRYPTO_EXPORT AppleKeychain {
31  public:
32   AppleKeychain();
33   virtual ~AppleKeychain();
34 
35   virtual OSStatus FindGenericPassword(CFTypeRef keychainOrArray,
36                                        UInt32 serviceNameLength,
37                                        const char* serviceName,
38                                        UInt32 accountNameLength,
39                                        const char* accountName,
40                                        UInt32* passwordLength,
41                                        void** passwordData,
42                                        SecKeychainItemRef* itemRef) const;
43 
44   virtual OSStatus ItemFreeContent(SecKeychainAttributeList* attrList,
45                                    void* data) const;
46 
47   virtual OSStatus AddGenericPassword(SecKeychainRef keychain,
48                                       UInt32 serviceNameLength,
49                                       const char* serviceName,
50                                       UInt32 accountNameLength,
51                                       const char* accountName,
52                                       UInt32 passwordLength,
53                                       const void* passwordData,
54                                       SecKeychainItemRef* itemRef) const;
55 
56 #if !defined(OS_IOS)
57   virtual OSStatus ItemCopyAttributesAndData(
58       SecKeychainItemRef itemRef,
59       SecKeychainAttributeInfo* info,
60       SecItemClass* itemClass,
61       SecKeychainAttributeList** attrList,
62       UInt32* length,
63       void** outData) const;
64 
65   virtual OSStatus ItemModifyAttributesAndData(
66       SecKeychainItemRef itemRef,
67       const SecKeychainAttributeList* attrList,
68       UInt32 length,
69       const void* data) const;
70 
71   virtual OSStatus ItemFreeAttributesAndData(SecKeychainAttributeList* attrList,
72                                              void* data) const;
73 
74   virtual OSStatus ItemDelete(SecKeychainItemRef itemRef) const;
75 
76   virtual OSStatus SearchCreateFromAttributes(
77       CFTypeRef keychainOrArray,
78       SecItemClass itemClass,
79       const SecKeychainAttributeList* attrList,
80       SecKeychainSearchRef* searchRef) const;
81 
82   virtual OSStatus SearchCopyNext(SecKeychainSearchRef searchRef,
83                                   SecKeychainItemRef* itemRef) const;
84 
85   virtual OSStatus AddInternetPassword(SecKeychainRef keychain,
86                                        UInt32 serverNameLength,
87                                        const char* serverName,
88                                        UInt32 securityDomainLength,
89                                        const char* securityDomain,
90                                        UInt32 accountNameLength,
91                                        const char* accountName,
92                                        UInt32 pathLength, const char* path,
93                                        UInt16 port, SecProtocolType protocol,
94                                        SecAuthenticationType authenticationType,
95                                        UInt32 passwordLength,
96                                        const void* passwordData,
97                                        SecKeychainItemRef* itemRef) const;
98 
99   // Calls CFRelease on the given ref, after checking that |ref| is non-NULL.
100   virtual void Free(CFTypeRef ref) const;
101 #endif  // !defined(OS_IOS)
102 
103  private:
104   DISALLOW_COPY_AND_ASSIGN(AppleKeychain);
105 };
106 
107 }  // namespace crypto
108 
109 #endif  // CRYPTO_KEYCHAIN_MAC_H_
110