1 #import "OTDeviceInformationAdapter.h"
2 #import "keychain/ckks/CKKS.h"
4 #include <SystemConfiguration/SystemConfiguration.h>
5 #import <Security/SecInternalReleasePriv.h>
8 #include <sys/sysctl.h>
9 #include <IOKit/IOKitLib.h>
11 #import <sys/utsname.h>
12 #include <MobileGestalt.h>
15 @implementation OTDeviceInformationActualAdapter
19 static NSString *hwModel = nil;
20 static dispatch_once_t onceToken;
21 dispatch_once(&onceToken, ^{
22 #if TARGET_OS_SIMULATOR
23 // Asking for a real value in the simulator gives the results for the underlying mac. Not particularly useful.
24 hwModel = [NSString stringWithFormat:@"%s", getenv("SIMULATOR_MODEL_IDENTIFIER")];
27 sysctlbyname("hw.model", NULL, &size, NULL, 0);
28 char *sysctlString = malloc(size);
29 sysctlbyname("hw.model", sysctlString, &size, NULL, 0);
30 hwModel = [[NSString alloc] initWithUTF8String:sysctlString];
33 // macOS running virtualized sometimes has new and unknown model IDs.
34 // So, if we don't recognize the model ID, return something more useful.
35 if(!([hwModel hasPrefix:@"iMac"] ||
36 [hwModel hasPrefix:@"Mac"])) {
37 hwModel = [NSString stringWithFormat:@"MacUnknown-%@", hwModel];
40 struct utsname systemInfo;
43 hwModel = [NSString stringWithCString:systemInfo.machine
44 encoding:NSUTF8StringEncoding];
50 - (NSString* _Nullable)deviceName
52 if (SecIsInternalRelease()) {
53 NSString *deviceName = CFBridgingRelease(SCDynamicStoreCopyComputerName(NULL, NULL));
60 - (NSString*)osVersion
62 return SecCKKSHostOSVersion();
67 #include <MobileGestalt.h>
69 - (NSString*)serialNumber
71 int mgError = kMGNoError;
72 NSString *serialNumber = CFBridgingRelease(MGCopyAnswerWithError(kMGQSerialNumber, NULL, &mgError));
73 if (![serialNumber isKindOfClass:[NSString class]]) {
75 secnotice("octagon", "failed getting serial number: %d", mgError);
82 - (NSString*)serialNumber
84 io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
85 if (platformExpert == MACH_PORT_NULL) {
86 secnotice("octagon", "failed getting serial number (platform IOPlatformExpertDevice)");
89 NSString *serialNumber = CFBridgingRelease(IORegistryEntryCreateCFProperty(platformExpert, CFSTR(kIOPlatformSerialNumberKey), kCFAllocatorDefault, 0));
90 if (![serialNumber isKindOfClass:[NSString class]]) {
92 secnotice("octagon", "failed getting serial number (IORegistryEntry)");
94 IOObjectRelease(platformExpert);