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_APPLE_KEYCHAIN_H_
      6 #define CRYPTO_APPLE_KEYCHAIN_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_APPLE_KEYCHAIN_H_
    110