15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CRYPTO_KEYCHAIN_MAC_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CRYPTO_KEYCHAIN_MAC_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <Security/Security.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/crypto_export.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (OS_IOS)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void* SecKeychainRef;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void* SecKeychainItemRef;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void SecKeychainAttributeList;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace crypto {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Wraps the KeychainServices API in a very thin layer, to allow it to be
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mocked out for testing.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See Keychain Services documentation for function documentation, as these call
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// through directly to their Keychain Services equivalents (Foo ->
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SecKeychainFoo). The only exception is Free, which should be used for
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// anything returned from this class that would normally be freed with
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CFRelease (to aid in testing).
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CRYPTO_EXPORT AppleKeychain {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppleKeychain();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AppleKeychain();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual OSStatus FindGenericPassword(CFTypeRef keychainOrArray,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       UInt32 serviceNameLength,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const char* serviceName,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       UInt32 accountNameLength,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const char* accountName,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       UInt32* passwordLength,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       void** passwordData,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       SecKeychainItemRef* itemRef) const;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual OSStatus ItemFreeContent(SecKeychainAttributeList* attrList,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   void* data) const;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual OSStatus AddGenericPassword(SecKeychainRef keychain,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      UInt32 serviceNameLength,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const char* serviceName,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      UInt32 accountNameLength,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const char* accountName,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      UInt32 passwordLength,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const void* passwordData,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      SecKeychainItemRef* itemRef) const;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_IOS)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual OSStatus ItemCopyAttributesAndData(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SecKeychainItemRef itemRef,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SecKeychainAttributeInfo* info,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SecItemClass* itemClass,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SecKeychainAttributeList** attrList,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UInt32* length,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void** outData) const;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual OSStatus ItemModifyAttributesAndData(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SecKeychainItemRef itemRef,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SecKeychainAttributeList* attrList,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UInt32 length,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const void* data) const;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual OSStatus ItemFreeAttributesAndData(SecKeychainAttributeList* attrList,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             void* data) const;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual OSStatus ItemDelete(SecKeychainItemRef itemRef) const;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual OSStatus SearchCreateFromAttributes(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CFTypeRef keychainOrArray,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SecItemClass itemClass,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SecKeychainAttributeList* attrList,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SecKeychainSearchRef* searchRef) const;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual OSStatus SearchCopyNext(SecKeychainSearchRef searchRef,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  SecKeychainItemRef* itemRef) const;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual OSStatus AddInternetPassword(SecKeychainRef keychain,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       UInt32 serverNameLength,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const char* serverName,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       UInt32 securityDomainLength,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const char* securityDomain,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       UInt32 accountNameLength,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const char* accountName,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       UInt32 pathLength, const char* path,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       UInt16 port, SecProtocolType protocol,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       SecAuthenticationType authenticationType,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       UInt32 passwordLength,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const void* passwordData,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       SecKeychainItemRef* itemRef) const;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls CFRelease on the given ref, after checking that |ref| is non-NULL.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Free(CFTypeRef ref) const;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_IOS)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppleKeychain);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace crypto
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CRYPTO_KEYCHAIN_MAC_H_
109