Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Side by Side Diff: crypto/mock_apple_keychain_mac.cc

Issue 10875029: Rename MacKeychain to AppleKeychain (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/logging.h" 5 #include "base/logging.h"
6 #include "base/time.h" 6 #include "base/time.h"
7 #include "crypto/mock_keychain_mac.h" 7 #include "crypto/mock_apple_keychain.h"
8 8
9 namespace crypto { 9 namespace crypto {
10 10
11 // static 11 // static
12 const SecKeychainSearchRef MockKeychain::kDummySearchRef = 12 const SecKeychainSearchRef MockAppleKeychain::kDummySearchRef =
13 reinterpret_cast<SecKeychainSearchRef>(1000); 13 reinterpret_cast<SecKeychainSearchRef>(1000);
14 14
15 MockKeychain::MockKeychain() 15 MockAppleKeychain::MockAppleKeychain()
16 : next_item_key_(0), 16 : next_item_key_(0),
17 search_copy_count_(0), 17 search_copy_count_(0),
18 keychain_item_copy_count_(0), 18 keychain_item_copy_count_(0),
19 attribute_data_copy_count_(0), 19 attribute_data_copy_count_(0),
20 find_generic_result_(noErr), 20 find_generic_result_(noErr),
21 called_add_generic_(false), 21 called_add_generic_(false),
22 password_data_count_(0) {} 22 password_data_count_(0) {}
23 23
24 void MockKeychain::InitializeKeychainData(MockKeychainItemType key) const { 24 void MockAppleKeychain::InitializeKeychainData(MockKeychainItemType key) const {
25 UInt32 tags[] = { kSecAccountItemAttr, 25 UInt32 tags[] = { kSecAccountItemAttr,
26 kSecServerItemAttr, 26 kSecServerItemAttr,
27 kSecPortItemAttr, 27 kSecPortItemAttr,
28 kSecPathItemAttr, 28 kSecPathItemAttr,
29 kSecProtocolItemAttr, 29 kSecProtocolItemAttr,
30 kSecAuthenticationTypeItemAttr, 30 kSecAuthenticationTypeItemAttr,
31 kSecSecurityDomainItemAttr, 31 kSecSecurityDomainItemAttr,
32 kSecCreationDateItemAttr, 32 kSecCreationDateItemAttr,
33 kSecNegativeItemAttr, 33 kSecNegativeItemAttr,
34 kSecCreatorItemAttr }; 34 kSecCreatorItemAttr };
(...skipping 22 matching lines...) Expand all
57 data_size = sizeof(OSType); 57 data_size = sizeof(OSType);
58 break; 58 break;
59 } 59 }
60 if (data_size > 0) { 60 if (data_size > 0) {
61 keychain_attr_list_[key].attr[i].length = data_size; 61 keychain_attr_list_[key].attr[i].length = data_size;
62 keychain_attr_list_[key].attr[i].data = calloc(1, data_size); 62 keychain_attr_list_[key].attr[i].data = calloc(1, data_size);
63 } 63 }
64 } 64 }
65 } 65 }
66 66
67 MockKeychain::~MockKeychain() { 67 MockAppleKeychain::~MockAppleKeychain() {
68 for (std::map<MockKeychainItemType, SecKeychainAttributeList>::iterator it = 68 typedef std::map<MockKeychainItemType, SecKeychainAttributeList> mockMap;
Ryan Sleevi 2012/08/23 22:22:58 style nit: typedefs follow class naming rules Moc
msarda 2012/08/27 14:24:07 Done.
69 keychain_attr_list_.begin(); it != keychain_attr_list_.end(); ++it) { 69 for (mockMap::iterator it = keychain_attr_list_.begin();
70 it != keychain_attr_list_.end();
71 ++it) {
70 for (unsigned int i = 0; i < it->second.count; ++i) { 72 for (unsigned int i = 0; i < it->second.count; ++i) {
71 if (it->second.attr[i].data) 73 if (it->second.attr[i].data)
72 free(it->second.attr[i].data); 74 free(it->second.attr[i].data);
73 } 75 }
74 free(it->second.attr); 76 free(it->second.attr);
75 if (keychain_data_[it->first].data) 77 if (keychain_data_[it->first].data)
76 free(keychain_data_[it->first].data); 78 free(keychain_data_[it->first].data);
77 } 79 }
78 keychain_attr_list_.clear(); 80 keychain_attr_list_.clear();
79 keychain_data_.clear(); 81 keychain_data_.clear();
80 } 82 }
81 83
82 SecKeychainAttribute* MockKeychain::AttributeWithTag( 84 SecKeychainAttribute* MockAppleKeychain::AttributeWithTag(
83 const SecKeychainAttributeList& attribute_list, 85 const SecKeychainAttributeList& attribute_list,
84 UInt32 tag) { 86 UInt32 tag) {
85 int attribute_index = -1; 87 int attribute_index = -1;
86 for (unsigned int i = 0; i < attribute_list.count; ++i) { 88 for (unsigned int i = 0; i < attribute_list.count; ++i) {
87 if (attribute_list.attr[i].tag == tag) { 89 if (attribute_list.attr[i].tag == tag) {
88 attribute_index = i; 90 attribute_index = i;
89 break; 91 break;
90 } 92 }
91 } 93 }
92 if (attribute_index == -1) { 94 if (attribute_index == -1) {
93 NOTREACHED() << "Unsupported attribute: " << tag; 95 NOTREACHED() << "Unsupported attribute: " << tag;
94 return NULL; 96 return NULL;
95 } 97 }
96 return &(attribute_list.attr[attribute_index]); 98 return &(attribute_list.attr[attribute_index]);
97 } 99 }
98 100
99 void MockKeychain::SetTestDataBytes(MockKeychainItemType item, 101 void MockAppleKeychain::SetTestDataBytes(MockKeychainItemType item,
100 UInt32 tag, 102 UInt32 tag,
101 const void* data, 103 const void* data,
102 size_t length) { 104 size_t length) {
103 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[item], 105 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[item],
104 tag); 106 tag);
105 attribute->length = length; 107 attribute->length = length;
106 if (length > 0) { 108 if (length > 0) {
107 if (attribute->data) 109 if (attribute->data)
108 free(attribute->data); 110 free(attribute->data);
109 attribute->data = malloc(length); 111 attribute->data = malloc(length);
110 CHECK(attribute->data); 112 CHECK(attribute->data);
111 memcpy(attribute->data, data, length); 113 memcpy(attribute->data, data, length);
112 } else { 114 } else {
113 attribute->data = NULL; 115 attribute->data = NULL;
114 } 116 }
115 } 117 }
116 118
117 void MockKeychain::SetTestDataString( 119 void MockAppleKeychain::SetTestDataString(MockKeychainItemType item,
118 MockKeychainItemType item, 120 UInt32 tag,
119 UInt32 tag, 121 const char* value) {
120 const char* value) {
121 SetTestDataBytes(item, tag, value, value ? strlen(value) : 0); 122 SetTestDataBytes(item, tag, value, value ? strlen(value) : 0);
122 } 123 }
123 124
124 void MockKeychain::SetTestDataPort(MockKeychainItemType item, UInt32 value) { 125 void MockAppleKeychain::SetTestDataPort(MockKeychainItemType item,
126 UInt32 value) {
125 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[item], 127 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[item],
126 kSecPortItemAttr); 128 kSecPortItemAttr);
127 UInt32* data = static_cast<UInt32*>(attribute->data); 129 UInt32* data = static_cast<UInt32*>(attribute->data);
128 *data = value; 130 *data = value;
129 } 131 }
130 132
131 void MockKeychain::SetTestDataProtocol(MockKeychainItemType item, 133 void MockAppleKeychain::SetTestDataProtocol(MockKeychainItemType item,
132 SecProtocolType value) { 134 SecProtocolType value) {
133 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[item], 135 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[item],
134 kSecProtocolItemAttr); 136 kSecProtocolItemAttr);
135 SecProtocolType* data = static_cast<SecProtocolType*>(attribute->data); 137 SecProtocolType* data = static_cast<SecProtocolType*>(attribute->data);
136 *data = value; 138 *data = value;
137 } 139 }
138 140
139 void MockKeychain::SetTestDataAuthType( 141 void MockAppleKeychain::SetTestDataAuthType(MockKeychainItemType item,
140 MockKeychainItemType item, 142 SecAuthenticationType value) {
141 SecAuthenticationType value) {
142 SecKeychainAttribute* attribute = AttributeWithTag( 143 SecKeychainAttribute* attribute = AttributeWithTag(
143 keychain_attr_list_[item], kSecAuthenticationTypeItemAttr); 144 keychain_attr_list_[item], kSecAuthenticationTypeItemAttr);
144 SecAuthenticationType* data = static_cast<SecAuthenticationType*>( 145 SecAuthenticationType* data = static_cast<SecAuthenticationType*>(
145 attribute->data); 146 attribute->data);
146 *data = value; 147 *data = value;
147 } 148 }
148 149
149 void MockKeychain::SetTestDataNegativeItem(MockKeychainItemType item, 150 void MockAppleKeychain::SetTestDataNegativeItem(MockKeychainItemType item,
150 Boolean value) { 151 Boolean value) {
151 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[item], 152 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[item],
152 kSecNegativeItemAttr); 153 kSecNegativeItemAttr);
153 Boolean* data = static_cast<Boolean*>(attribute->data); 154 Boolean* data = static_cast<Boolean*>(attribute->data);
154 *data = value; 155 *data = value;
155 } 156 }
156 157
157 void MockKeychain::SetTestDataCreator(MockKeychainItemType item, OSType value) { 158 void MockAppleKeychain::SetTestDataCreator(MockKeychainItemType item,
159 OSType value) {
158 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[item], 160 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[item],
159 kSecCreatorItemAttr); 161 kSecCreatorItemAttr);
160 OSType* data = static_cast<OSType*>(attribute->data); 162 OSType* data = static_cast<OSType*>(attribute->data);
161 *data = value; 163 *data = value;
162 } 164 }
163 165
164 void MockKeychain::SetTestDataPasswordBytes(MockKeychainItemType item, 166 void MockAppleKeychain::SetTestDataPasswordBytes(MockKeychainItemType item,
165 const void* data, 167 const void* data,
166 size_t length) { 168 size_t length) {
167 keychain_data_[item].length = length; 169 keychain_data_[item].length = length;
168 if (length > 0) { 170 if (length > 0) {
169 if (keychain_data_[item].data) 171 if (keychain_data_[item].data)
170 free(keychain_data_[item].data); 172 free(keychain_data_[item].data);
171 keychain_data_[item].data = malloc(length); 173 keychain_data_[item].data = malloc(length);
172 memcpy(keychain_data_[item].data, data, length); 174 memcpy(keychain_data_[item].data, data, length);
173 } else { 175 } else {
174 keychain_data_[item].data = NULL; 176 keychain_data_[item].data = NULL;
175 } 177 }
176 } 178 }
177 179
178 void MockKeychain::SetTestDataPasswordString( 180 void MockAppleKeychain::SetTestDataPasswordString(MockKeychainItemType item,
179 MockKeychainItemType item, 181 const char* value) {
180 const char* value) {
181 SetTestDataPasswordBytes(item, value, value ? strlen(value) : 0); 182 SetTestDataPasswordBytes(item, value, value ? strlen(value) : 0);
182 } 183 }
183 184
184 OSStatus MockKeychain::ItemCopyAttributesAndData( 185 OSStatus MockAppleKeychain::ItemCopyAttributesAndData(
185 SecKeychainItemRef itemRef, 186 SecKeychainItemRef itemRef,
186 SecKeychainAttributeInfo* info, 187 SecKeychainAttributeInfo* info,
187 SecItemClass* itemClass, 188 SecItemClass* itemClass,
188 SecKeychainAttributeList** attrList, 189 SecKeychainAttributeList** attrList,
189 UInt32* length, 190 UInt32* length,
190 void** outData) const { 191 void** outData) const {
191 DCHECK(itemRef); 192 DCHECK(itemRef);
192 MockKeychainItemType key = 193 MockKeychainItemType key =
193 reinterpret_cast<MockKeychainItemType>(itemRef) - 1; 194 reinterpret_cast<MockKeychainItemType>(itemRef) - 1;
194 if (keychain_attr_list_.find(key) == keychain_attr_list_.end()) 195 if (keychain_attr_list_.find(key) == keychain_attr_list_.end())
195 return errSecInvalidItemRef; 196 return errSecInvalidItemRef;
196 197
197 DCHECK(!itemClass); // itemClass not implemented in the Mock. 198 DCHECK(!itemClass); // itemClass not implemented in the Mock.
198 if (attrList) 199 if (attrList)
199 *attrList = &(keychain_attr_list_[key]); 200 *attrList = &(keychain_attr_list_[key]);
200 if (outData) { 201 if (outData) {
201 *outData = keychain_data_[key].data; 202 *outData = keychain_data_[key].data;
202 DCHECK(length); 203 DCHECK(length);
203 *length = keychain_data_[key].length; 204 *length = keychain_data_[key].length;
204 } 205 }
205 206
206 ++attribute_data_copy_count_; 207 ++attribute_data_copy_count_;
207 return noErr; 208 return noErr;
208 } 209 }
209 210
210 OSStatus MockKeychain::ItemModifyAttributesAndData( 211 OSStatus MockAppleKeychain::ItemModifyAttributesAndData(
211 SecKeychainItemRef itemRef, 212 SecKeychainItemRef itemRef,
212 const SecKeychainAttributeList* attrList, 213 const SecKeychainAttributeList* attrList,
213 UInt32 length, 214 UInt32 length,
214 const void* data) const { 215 const void* data) const {
215 DCHECK(itemRef); 216 DCHECK(itemRef);
216 const char* fail_trigger = "fail_me"; 217 const char* fail_trigger = "fail_me";
217 if (length == strlen(fail_trigger) && 218 if (length == strlen(fail_trigger) &&
218 memcmp(data, fail_trigger, length) == 0) { 219 memcmp(data, fail_trigger, length) == 0) {
219 return errSecAuthFailed; 220 return errSecAuthFailed;
220 } 221 }
221 222
222 MockKeychainItemType key = 223 MockKeychainItemType key =
223 reinterpret_cast<MockKeychainItemType>(itemRef) - 1; 224 reinterpret_cast<MockKeychainItemType>(itemRef) - 1;
224 if (keychain_attr_list_.find(key) == keychain_attr_list_.end()) 225 if (keychain_attr_list_.find(key) == keychain_attr_list_.end())
225 return errSecInvalidItemRef; 226 return errSecInvalidItemRef;
226 227
227 MockKeychain* mutable_this = const_cast<MockKeychain*>(this); 228 MockAppleKeychain* mutable_this = const_cast<MockAppleKeychain*>(this);
228 if (attrList) { 229 if (attrList) {
229 for (UInt32 change_attr = 0; change_attr < attrList->count; ++change_attr) { 230 for (UInt32 change_attr = 0; change_attr < attrList->count; ++change_attr) {
230 if (attrList->attr[change_attr].tag == kSecCreatorItemAttr) { 231 if (attrList->attr[change_attr].tag == kSecCreatorItemAttr) {
231 void* data = attrList->attr[change_attr].data; 232 void* data = attrList->attr[change_attr].data;
232 mutable_this->SetTestDataCreator(key, *(static_cast<OSType*>(data))); 233 mutable_this->SetTestDataCreator(key, *(static_cast<OSType*>(data)));
233 } else { 234 } else {
234 NOTIMPLEMENTED(); 235 NOTIMPLEMENTED();
235 } 236 }
236 } 237 }
237 } 238 }
238 if (data) 239 if (data)
239 mutable_this->SetTestDataPasswordBytes(key, data, length); 240 mutable_this->SetTestDataPasswordBytes(key, data, length);
240 return noErr; 241 return noErr;
241 } 242 }
242 243
243 OSStatus MockKeychain::ItemFreeAttributesAndData( 244 OSStatus MockAppleKeychain::ItemFreeAttributesAndData(
244 SecKeychainAttributeList* attrList, 245 SecKeychainAttributeList* attrList,
245 void* data) const { 246 void* data) const {
246 --attribute_data_copy_count_; 247 --attribute_data_copy_count_;
247 return noErr; 248 return noErr;
248 } 249 }
249 250
250 OSStatus MockKeychain::ItemDelete(SecKeychainItemRef itemRef) const { 251 OSStatus MockAppleKeychain::ItemDelete(SecKeychainItemRef itemRef) const {
251 MockKeychainItemType key = 252 MockKeychainItemType key =
252 reinterpret_cast<MockKeychainItemType>(itemRef) - 1; 253 reinterpret_cast<MockKeychainItemType>(itemRef) - 1;
253 254
254 for (unsigned int i = 0; i < keychain_attr_list_[key].count; ++i) { 255 for (unsigned int i = 0; i < keychain_attr_list_[key].count; ++i) {
255 if (keychain_attr_list_[key].attr[i].data) 256 if (keychain_attr_list_[key].attr[i].data)
256 free(keychain_attr_list_[key].attr[i].data); 257 free(keychain_attr_list_[key].attr[i].data);
257 } 258 }
258 free(keychain_attr_list_[key].attr); 259 free(keychain_attr_list_[key].attr);
259 if (keychain_data_[key].data) 260 if (keychain_data_[key].data)
260 free(keychain_data_[key].data); 261 free(keychain_data_[key].data);
261 262
262 keychain_attr_list_.erase(key); 263 keychain_attr_list_.erase(key);
263 keychain_data_.erase(key); 264 keychain_data_.erase(key);
264 added_via_api_.erase(key); 265 added_via_api_.erase(key);
265 return noErr; 266 return noErr;
266 } 267 }
267 268
268 OSStatus MockKeychain::SearchCreateFromAttributes( 269 OSStatus MockAppleKeychain::SearchCreateFromAttributes(
269 CFTypeRef keychainOrArray, 270 CFTypeRef keychainOrArray,
270 SecItemClass itemClass, 271 SecItemClass itemClass,
271 const SecKeychainAttributeList* attrList, 272 const SecKeychainAttributeList* attrList,
272 SecKeychainSearchRef* searchRef) const { 273 SecKeychainSearchRef* searchRef) const {
273 // Figure out which of our mock items matches, and set up the array we'll use 274 // Figure out which of our mock items matches, and set up the array we'll use
274 // to generate results out of SearchCopyNext. 275 // to generate results out of SearchCopyNext.
275 remaining_search_results_.clear(); 276 remaining_search_results_.clear();
276 for (std::map<MockKeychainItemType, SecKeychainAttributeList>::const_iterator 277 typedef std::map<MockKeychainItemType, SecKeychainAttributeList> mockMap;
277 it = keychain_attr_list_.begin(); 278 for (mockMap::const_iterator it = keychain_attr_list_.begin();
278 it != keychain_attr_list_.end(); 279 it != keychain_attr_list_.end();
279 ++it) { 280 ++it) {
280 bool mock_item_matches = true; 281 bool mock_item_matches = true;
281 for (UInt32 search_attr = 0; search_attr < attrList->count; ++search_attr) { 282 for (UInt32 search_attr = 0; search_attr < attrList->count; ++search_attr) {
282 SecKeychainAttribute* mock_attribute = 283 SecKeychainAttribute* mock_attribute =
283 AttributeWithTag(it->second, attrList->attr[search_attr].tag); 284 AttributeWithTag(it->second, attrList->attr[search_attr].tag);
284 if (mock_attribute->length != attrList->attr[search_attr].length || 285 if (mock_attribute->length != attrList->attr[search_attr].length ||
285 memcmp(mock_attribute->data, attrList->attr[search_attr].data, 286 memcmp(mock_attribute->data, attrList->attr[search_attr].data,
286 attrList->attr[search_attr].length) != 0) { 287 attrList->attr[search_attr].length) != 0) {
287 mock_item_matches = false; 288 mock_item_matches = false;
288 break; 289 break;
289 } 290 }
290 } 291 }
291 if (mock_item_matches) 292 if (mock_item_matches)
292 remaining_search_results_.push_back(it->first); 293 remaining_search_results_.push_back(it->first);
293 } 294 }
294 295
295 DCHECK(searchRef); 296 DCHECK(searchRef);
296 *searchRef = kDummySearchRef; 297 *searchRef = kDummySearchRef;
297 ++search_copy_count_; 298 ++search_copy_count_;
298 return noErr; 299 return noErr;
299 } 300 }
300 301
301 bool MockKeychain::AlreadyContainsInternetPassword( 302 bool MockAppleKeychain::AlreadyContainsInternetPassword(
302 UInt32 serverNameLength, 303 UInt32 serverNameLength,
303 const char* serverName, 304 const char* serverName,
304 UInt32 securityDomainLength, 305 UInt32 securityDomainLength,
305 const char* securityDomain, 306 const char* securityDomain,
306 UInt32 accountNameLength, 307 UInt32 accountNameLength,
307 const char* accountName, 308 const char* accountName,
308 UInt32 pathLength, 309 UInt32 pathLength,
309 const char* path, 310 const char* path,
310 UInt16 port, 311 UInt16 port,
311 SecProtocolType protocol, 312 SecProtocolType protocol,
312 SecAuthenticationType authenticationType) const { 313 SecAuthenticationType authenticationType) const {
313 for (std::map<MockKeychainItemType, SecKeychainAttributeList>::const_iterator 314 typedef std::map<MockKeychainItemType, SecKeychainAttributeList> mockMap;
314 it = keychain_attr_list_.begin(); 315 for (mockMap::const_iterator it = keychain_attr_list_.begin();
315 it != keychain_attr_list_.end(); 316 it != keychain_attr_list_.end();
316 ++it) { 317 ++it) {
317 SecKeychainAttribute* attribute; 318 SecKeychainAttribute* attribute;
318 attribute = AttributeWithTag(it->second, kSecServerItemAttr); 319 attribute = AttributeWithTag(it->second, kSecServerItemAttr);
319 if ((attribute->length != serverNameLength) || 320 if ((attribute->length != serverNameLength) ||
320 (attribute->data == NULL && *serverName != '\0') || 321 (attribute->data == NULL && *serverName != '\0') ||
321 (attribute->data != NULL && *serverName == '\0') || 322 (attribute->data != NULL && *serverName == '\0') ||
322 strncmp(serverName, 323 strncmp(serverName,
323 (const char*) attribute->data, 324 (const char*) attribute->data,
324 serverNameLength) != 0) { 325 serverNameLength) != 0) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 *(static_cast<SecAuthenticationType*>(attribute->data)))) { 368 *(static_cast<SecAuthenticationType*>(attribute->data)))) {
368 continue; 369 continue;
369 } 370 }
370 // The keychain already has this item, since all fields other than the 371 // The keychain already has this item, since all fields other than the
371 // password match. 372 // password match.
372 return true; 373 return true;
373 } 374 }
374 return false; 375 return false;
375 } 376 }
376 377
377 OSStatus MockKeychain::AddInternetPassword( 378 OSStatus MockAppleKeychain::AddInternetPassword(
378 SecKeychainRef keychain, 379 SecKeychainRef keychain,
379 UInt32 serverNameLength, 380 UInt32 serverNameLength,
380 const char* serverName, 381 const char* serverName,
381 UInt32 securityDomainLength, 382 UInt32 securityDomainLength,
382 const char* securityDomain, 383 const char* securityDomain,
383 UInt32 accountNameLength, 384 UInt32 accountNameLength,
384 const char* accountName, 385 const char* accountName,
385 UInt32 pathLength, 386 UInt32 pathLength,
386 const char* path, 387 const char* path,
387 UInt16 port, 388 UInt16 port,
(...skipping 16 matching lines...) Expand all
404 authenticationType)) { 405 authenticationType)) {
405 return errSecDuplicateItem; 406 return errSecDuplicateItem;
406 } 407 }
407 408
408 // Pick the next unused slot. 409 // Pick the next unused slot.
409 MockKeychainItemType key = next_item_key_++; 410 MockKeychainItemType key = next_item_key_++;
410 411
411 // Initialize keychain data storage at the target location. 412 // Initialize keychain data storage at the target location.
412 InitializeKeychainData(key); 413 InitializeKeychainData(key);
413 414
414 MockKeychain* mutable_this = const_cast<MockKeychain*>(this); 415 MockAppleKeychain* mutable_this = const_cast<MockAppleKeychain*>(this);
415 mutable_this->SetTestDataBytes(key, kSecServerItemAttr, serverName, 416 mutable_this->SetTestDataBytes(key, kSecServerItemAttr, serverName,
416 serverNameLength); 417 serverNameLength);
417 mutable_this->SetTestDataBytes(key, kSecSecurityDomainItemAttr, 418 mutable_this->SetTestDataBytes(key, kSecSecurityDomainItemAttr,
418 securityDomain, securityDomainLength); 419 securityDomain, securityDomainLength);
419 mutable_this->SetTestDataBytes(key, kSecAccountItemAttr, accountName, 420 mutable_this->SetTestDataBytes(key, kSecAccountItemAttr, accountName,
420 accountNameLength); 421 accountNameLength);
421 mutable_this->SetTestDataBytes(key, kSecPathItemAttr, path, pathLength); 422 mutable_this->SetTestDataBytes(key, kSecPathItemAttr, path, pathLength);
422 mutable_this->SetTestDataPort(key, port); 423 mutable_this->SetTestDataPort(key, port);
423 mutable_this->SetTestDataProtocol(key, protocol); 424 mutable_this->SetTestDataProtocol(key, protocol);
424 mutable_this->SetTestDataAuthType(key, authenticationType); 425 mutable_this->SetTestDataAuthType(key, authenticationType);
425 mutable_this->SetTestDataPasswordBytes(key, passwordData, 426 mutable_this->SetTestDataPasswordBytes(key, passwordData,
426 passwordLength); 427 passwordLength);
427 base::Time::Exploded exploded_time; 428 base::Time::Exploded exploded_time;
428 base::Time::Now().UTCExplode(&exploded_time); 429 base::Time::Now().UTCExplode(&exploded_time);
429 char time_string[128]; 430 char time_string[128];
430 snprintf(time_string, sizeof(time_string), "%04d%02d%02d%02d%02d%02dZ", 431 snprintf(time_string, sizeof(time_string), "%04d%02d%02d%02d%02d%02dZ",
431 exploded_time.year, exploded_time.month, exploded_time.day_of_month, 432 exploded_time.year, exploded_time.month, exploded_time.day_of_month,
432 exploded_time.hour, exploded_time.minute, exploded_time.second); 433 exploded_time.hour, exploded_time.minute, exploded_time.second);
433 mutable_this->SetTestDataString(key, kSecCreationDateItemAttr, time_string); 434 mutable_this->SetTestDataString(key, kSecCreationDateItemAttr, time_string);
434 435
435 added_via_api_.insert(key); 436 added_via_api_.insert(key);
436 437
437 if (itemRef) { 438 if (itemRef) {
438 *itemRef = reinterpret_cast<SecKeychainItemRef>(key + 1); 439 *itemRef = reinterpret_cast<SecKeychainItemRef>(key + 1);
439 ++keychain_item_copy_count_; 440 ++keychain_item_copy_count_;
440 } 441 }
441 return noErr; 442 return noErr;
442 } 443 }
443 444
444 OSStatus MockKeychain::SearchCopyNext(SecKeychainSearchRef searchRef, 445 OSStatus MockAppleKeychain::SearchCopyNext(SecKeychainSearchRef searchRef,
445 SecKeychainItemRef* itemRef) const { 446 SecKeychainItemRef* itemRef) const {
446 if (remaining_search_results_.empty()) 447 if (remaining_search_results_.empty())
447 return errSecItemNotFound; 448 return errSecItemNotFound;
448 MockKeychainItemType key = remaining_search_results_.front(); 449 MockKeychainItemType key = remaining_search_results_.front();
449 remaining_search_results_.erase(remaining_search_results_.begin()); 450 remaining_search_results_.erase(remaining_search_results_.begin());
450 *itemRef = reinterpret_cast<SecKeychainItemRef>(key + 1); 451 *itemRef = reinterpret_cast<SecKeychainItemRef>(key + 1);
451 ++keychain_item_copy_count_; 452 ++keychain_item_copy_count_;
452 return noErr; 453 return noErr;
453 } 454 }
454 455
455 OSStatus MockKeychain::FindGenericPassword(CFTypeRef keychainOrArray, 456 void MockAppleKeychain::Free(CFTypeRef ref) const {
456 UInt32 serviceNameLength,
457 const char* serviceName,
458 UInt32 accountNameLength,
459 const char* accountName,
460 UInt32* passwordLength,
461 void** passwordData,
462 SecKeychainItemRef* itemRef) const {
463 // When simulating |noErr| we return canned |passwordData| and
464 // |passwordLenght|. Otherwise, just return given code.
465 if (find_generic_result_ == noErr) {
466 static char password[] = "my_password";
467
468 DCHECK(passwordData);
469 *passwordData = static_cast<void*>(password);
470 DCHECK(passwordLength);
471 *passwordLength = strlen(password);
472 password_data_count_++;
473 }
474
475 return find_generic_result_;
476 }
477
478 OSStatus MockKeychain::ItemFreeContent(SecKeychainAttributeList* attrList,
479 void* data) const {
480 // No-op.
481 password_data_count_--;
482 return noErr;
483 }
484
485 OSStatus MockKeychain::AddGenericPassword(SecKeychainRef keychain,
486 UInt32 serviceNameLength,
487 const char* serviceName,
488 UInt32 accountNameLength,
489 const char* accountName,
490 UInt32 passwordLength,
491 const void* passwordData,
492 SecKeychainItemRef* itemRef) const {
493 called_add_generic_ = true;
494
495 DCHECK(passwordLength > 0);
496 DCHECK(passwordData);
497 add_generic_password_ =
498 std::string(const_cast<char*>(static_cast<const char*>(passwordData)),
499 passwordLength);
500 return noErr;
501 }
502
503 void MockKeychain::Free(CFTypeRef ref) const {
504 if (!ref) 457 if (!ref)
505 return; 458 return;
506 459
507 if (ref == kDummySearchRef) { 460 if (ref == kDummySearchRef) {
508 --search_copy_count_; 461 --search_copy_count_;
509 } else { 462 } else {
510 --keychain_item_copy_count_; 463 --keychain_item_copy_count_;
511 } 464 }
512 } 465 }
513 466
514 int MockKeychain::UnfreedSearchCount() const { 467 int MockAppleKeychain::UnfreedSearchCount() const {
515 return search_copy_count_; 468 return search_copy_count_;
516 } 469 }
517 470
518 int MockKeychain::UnfreedKeychainItemCount() const { 471 int MockAppleKeychain::UnfreedKeychainItemCount() const {
519 return keychain_item_copy_count_; 472 return keychain_item_copy_count_;
520 } 473 }
521 474
522 int MockKeychain::UnfreedAttributeDataCount() const { 475 int MockAppleKeychain::UnfreedAttributeDataCount() const {
523 return attribute_data_copy_count_; 476 return attribute_data_copy_count_;
524 } 477 }
525 478
526 bool MockKeychain::CreatorCodesSetForAddedItems() const { 479 bool MockAppleKeychain::CreatorCodesSetForAddedItems() const {
527 for (std::set<MockKeychainItemType>::const_iterator 480 for (std::set<MockKeychainItemType>::const_iterator
528 i = added_via_api_.begin(); 481 i = added_via_api_.begin();
529 i != added_via_api_.end(); 482 i != added_via_api_.end();
530 ++i) { 483 ++i) {
531 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[*i], 484 SecKeychainAttribute* attribute = AttributeWithTag(keychain_attr_list_[*i],
532 kSecCreatorItemAttr); 485 kSecCreatorItemAttr);
533 OSType* data = static_cast<OSType*>(attribute->data); 486 OSType* data = static_cast<OSType*>(attribute->data);
534 if (*data == 0) 487 if (*data == 0)
535 return false; 488 return false;
536 } 489 }
537 return true; 490 return true;
538 } 491 }
539 492
540 void MockKeychain::AddTestItem(const KeychainTestData& item_data) { 493 void MockAppleKeychain::AddTestItem(const KeychainTestData& item_data) {
541 MockKeychainItemType key = next_item_key_++; 494 MockKeychainItemType key = next_item_key_++;
542 495
543 InitializeKeychainData(key); 496 InitializeKeychainData(key);
544 SetTestDataAuthType(key, item_data.auth_type); 497 SetTestDataAuthType(key, item_data.auth_type);
545 SetTestDataString(key, kSecServerItemAttr, item_data.server); 498 SetTestDataString(key, kSecServerItemAttr, item_data.server);
546 SetTestDataProtocol(key, item_data.protocol); 499 SetTestDataProtocol(key, item_data.protocol);
547 SetTestDataString(key, kSecPathItemAttr, item_data.path); 500 SetTestDataString(key, kSecPathItemAttr, item_data.path);
548 SetTestDataPort(key, item_data.port); 501 SetTestDataPort(key, item_data.port);
549 SetTestDataString(key, kSecSecurityDomainItemAttr, 502 SetTestDataString(key, kSecSecurityDomainItemAttr,
550 item_data.security_domain); 503 item_data.security_domain);
551 SetTestDataString(key, kSecCreationDateItemAttr, item_data.creation_date); 504 SetTestDataString(key, kSecCreationDateItemAttr, item_data.creation_date);
552 SetTestDataString(key, kSecAccountItemAttr, item_data.username); 505 SetTestDataString(key, kSecAccountItemAttr, item_data.username);
553 SetTestDataPasswordString(key, item_data.password); 506 SetTestDataPasswordString(key, item_data.password);
554 SetTestDataNegativeItem(key, item_data.negative_item); 507 SetTestDataNegativeItem(key, item_data.negative_item);
555 } 508 }
556 509
557 } // namespace crypto 510 } // namespace crypto
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698