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)#include "base/logging.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/mock_apple_keychain.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace crypto {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OSStatus MockAppleKeychain::FindGenericPassword(
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CFTypeRef keychainOrArray,
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt32 serviceNameLength,
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* serviceName,
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt32 accountNameLength,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* accountName,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt32* passwordLength,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void** passwordData,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SecKeychainItemRef* itemRef) const {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When simulating |noErr|, return canned |passwordData| and
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |passwordLength|.  Otherwise, just return given code.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (find_generic_result_ == noErr) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const char kPassword[] = "my_password";
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(passwordData);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The function to free this data is mocked so the cast is fine.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *passwordData = const_cast<char*>(kPassword);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(passwordLength);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *passwordLength = arraysize(kPassword);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    password_data_count_++;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return find_generic_result_;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OSStatus MockAppleKeychain::ItemFreeContent(SecKeychainAttributeList* attrList,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            void* data) const {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No-op.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_data_count_--;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return noErr;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OSStatus MockAppleKeychain::AddGenericPassword(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SecKeychainRef keychain,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt32 serviceNameLength,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* serviceName,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt32 accountNameLength,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* accountName,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UInt32 passwordLength,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const void* passwordData,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SecKeychainItemRef* itemRef) const {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  called_add_generic_ = true;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(passwordLength, 0U);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(passwordData);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  add_generic_password_ =
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(const_cast<char*>(static_cast<const char*>(passwordData)),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  passwordLength);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return noErr;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace crypto
62