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