34 CFStringRef key_ref = CFStringCreateWithCString(
35 kCFAllocatorDefault, key.c_str(), kCFStringEncodingUTF8);
36 const void* keys[] = {kSecClass, kSecAttrAccount, kSecReturnData,
38 const void* values[] = {kSecClassGenericPassword, key_ref, kCFBooleanTrue,
40 CFDictionaryRef query = CFDictionaryCreate(
41 kCFAllocatorDefault, keys, values,
42 static_cast<CFIndex
>(
sizeof(keys) /
sizeof(keys[0])),
43 &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
44 CFTypeRef item =
nullptr;
45 OSStatus status = SecItemCopyMatching(query, &item);
52 if (status == errSecItemNotFound) {
55 if (status != errSecSuccess || !item) {
61 CFDataRef data_ref =
static_cast<CFDataRef
>(item);
62 const UInt8* data_ptr = CFDataGetBytePtr(data_ref);
63 CFIndex data_len = CFDataGetLength(data_ref);
64 std::string value(
reinterpret_cast<const char*
>(data_ptr),
65 static_cast<size_t>(data_len));