TEST_F(CACertsTests, test_certificate_properties) { CFDataRef property; CFTypeRef oid; std::string prop_string; oid = kSecOIDCommonName; property = CreatePropertyFromCertificate(cert, oid); prop_string = genCommonNameProperty(property); EXPECT_EQ("localhost.localdomain", prop_string); CFRelease(property); oid = kSecOIDSubjectKeyIdentifier; property = CreatePropertyFromCertificate(cert, oid); prop_string = genKIDProperty(property); EXPECT_EQ("f2b99b00e0ee60d57c426ce3e64e3fdc6f6411c0", prop_string); CFRelease(property); oid = kSecOIDX509V1ValidityNotBefore; property = CreatePropertyFromCertificate(cert, oid); prop_string = stringFromCFNumber(property); EXPECT_EQ("430168336", prop_string); CFRelease(property); oid = kSecOIDBasicConstraints; property = CreatePropertyFromCertificate(cert, oid); prop_string = genCAProperty(property); EXPECT_EQ("1", prop_string); CFRelease(property); }
std::string DiskArbitrationEventPublisher::getProperty( const CFStringRef& property, const CFDictionaryRef& dict) { CFTypeRef value = (CFTypeRef)CFDictionaryGetValue(dict, property); if (value == nullptr) { return ""; } if (CFStringCompare(property, CFSTR(kDAAppearanceTime_), kNilOptions) == kCFCompareEqualTo) { return stringFromCFAbsoluteTime((CFDataRef)value); } if (CFGetTypeID(value) == CFNumberGetTypeID()) { return stringFromCFNumber((CFDataRef)value, CFNumberGetType((CFNumberRef)value)); } else if (CFGetTypeID(value) == CFStringGetTypeID()) { return stringFromCFString((CFStringRef)value); } else if (CFGetTypeID(value) == CFBooleanGetTypeID()) { return (CFBooleanGetValue((CFBooleanRef)value)) ? "1" : "0"; } else if (CFGetTypeID(value) == CFUUIDGetTypeID()) { return stringFromCFString( CFUUIDCreateString(kCFAllocatorDefault, (CFUUIDRef)value)); } return ""; }
std::string getIOKitProperty(const CFMutableDictionaryRef& details, const std::string& key) { std::string value; // Get a property from the device. auto cfkey = CFStringCreateWithCString( kCFAllocatorDefault, key.c_str(), kCFStringEncodingUTF8); auto property = CFDictionaryGetValue(details, cfkey); CFRelease(cfkey); // Several supported ways of parsing IOKit-encoded data. if (property) { if (CFGetTypeID(property) == CFNumberGetTypeID()) { value = stringFromCFNumber((CFDataRef)property); } else if (CFGetTypeID(property) == CFStringGetTypeID()) { value = stringFromCFString((CFStringRef)property); } else if (CFGetTypeID(property) == CFDataGetTypeID()) { value = stringFromCFData((CFDataRef)property); } else if (CFGetTypeID(property) == CFBooleanGetTypeID()) { value = (CFBooleanGetValue((CFBooleanRef)property)) ? "1" : "0"; } } return value; }
std::string IOKitHIDEventPublisher::getProperty(const IOHIDDeviceRef &device, const CFStringRef &property) { CFTypeRef value = IOHIDDeviceGetProperty(device, property); if (value == nullptr) { return ""; } // Only support CFNumber and CFString types. if (CFGetTypeID(value) == CFNumberGetTypeID()) { return stringFromCFNumber((CFDataRef)value); } else if (CFGetTypeID(value) == CFStringGetTypeID()) { return stringFromCFString((CFStringRef)value); } return ""; }
std::string getUSBProperty(const CFMutableDictionaryRef& details, const std::string& key) { // Get a property from the device. auto cfkey = CFStringCreateWithCString(kCFAllocatorDefault, key.c_str(), kCFStringEncodingUTF8); auto property = CFDictionaryGetValue(details, cfkey); CFRelease(cfkey); if (property) { if (CFGetTypeID(property) == CFNumberGetTypeID()) { return stringFromCFNumber((CFDataRef)property); } else if (CFGetTypeID(property) == CFStringGetTypeID()) { return stringFromCFString((CFStringRef)property); } } return ""; }
void genOSXPrefValues(const CFTypeRef& value, const Row& base, QueryData& results, size_t depth) { if (value == nullptr) { return; } // Since we recurse when parsing Arrays/Dicts, monitor stack limits. if (++depth > kPreferenceDepthLimit) { TLOG << "The macOS preference: " << base.at("domain") << " exceeded subkey depth limit: " << kPreferenceDepthLimit; return; } // Emit a string representation for each preference type. Row r = base; if (CFGetTypeID(value) == CFNumberGetTypeID()) { r["value"] = stringFromCFNumber(static_cast<CFDataRef>(value)); } else if (CFGetTypeID(value) == CFStringGetTypeID()) { r["value"] = stringFromCFString(static_cast<CFStringRef>(value)); } else if (CFGetTypeID(value) == CFDateGetTypeID()) { auto unix_time = CFDateGetAbsoluteTime(static_cast<CFDateRef>(value)) + kCFAbsoluteTimeIntervalSince1970; r["value"] = boost::lexical_cast<std::string>(std::llround(unix_time)); } else if (CFGetTypeID(value) == CFBooleanGetTypeID()) { r["value"] = (CFBooleanGetValue(static_cast<CFBooleanRef>(value)) == TRUE) ? "true" : "false"; } else if (CFGetTypeID(value) == CFDataGetTypeID()) { // Do not include data preferences. } else if (CFGetTypeID(value) == CFArrayGetTypeID()) { genOSXListPref(static_cast<CFArrayRef>(value), base, results, depth); return; } else if (CFGetTypeID(value) == CFDictionaryGetTypeID()) { // Generate a row for each hash key. TRowResults trow(base, results, depth); CFDictionaryApplyFunction( static_cast<CFDictionaryRef>(value), &genOSXHashPref, &trow); return; } results.push_back(std::move(r)); }
std::string stringFromCFNumber(const CFDataRef& cf_number) { return stringFromCFNumber(cf_number, kCFNumberIntType); }
inline std::string getKextBigInt(const CFDictionaryRef &value, const CFStringRef key) { auto num = (CFDataRef)CFDictionaryGetValue(value, key); return stringFromCFNumber(num, kCFNumberSInt64Type); }
std::string stringFromCFNumber(const CFDataRef& cf_number) { return stringFromCFNumber(cf_number, CFNumberGetType((CFNumberRef)cf_number)); }