]> git.saurik.com Git - apple/security.git/blob - keychain/ot/OTDeviceInformationAdapter.m
Security-59306.11.20.tar.gz
[apple/security.git] / keychain / ot / OTDeviceInformationAdapter.m
1 #import "OTDeviceInformationAdapter.h"
2 #import "keychain/ckks/CKKS.h"
3
4 #include <SystemConfiguration/SystemConfiguration.h>
5 #import <Security/SecInternalReleasePriv.h>
6
7 #if TARGET_OS_OSX
8 #include <sys/sysctl.h>
9 #include <IOKit/IOKitLib.h>
10 #else
11 #import <sys/utsname.h>
12 #include <MobileGestalt.h>
13 #endif
14
15 @implementation OTDeviceInformationActualAdapter
16
17 - (NSString*)modelID
18 {
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")];
25 #elif TARGET_OS_OSX
26 size_t size;
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];
31 free(sysctlString);
32
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];
38 }
39 #else
40 struct utsname systemInfo;
41 uname(&systemInfo);
42
43 hwModel = [NSString stringWithCString:systemInfo.machine
44 encoding:NSUTF8StringEncoding];
45 #endif
46 });
47 return hwModel;
48 }
49
50 - (NSString* _Nullable)deviceName
51 {
52 if (SecIsInternalRelease()) {
53 NSString *deviceName = CFBridgingRelease(SCDynamicStoreCopyComputerName(NULL, NULL));
54 return deviceName;
55 } else {
56 return nil;
57 }
58 }
59
60 - (NSString*)osVersion
61 {
62 return SecCKKSHostOSVersion();
63 }
64
65 #if TARGET_OS_IPHONE
66
67 #include <MobileGestalt.h>
68
69 - (NSString*)serialNumber
70 {
71 int mgError = kMGNoError;
72 NSString *serialNumber = CFBridgingRelease(MGCopyAnswerWithError(kMGQSerialNumber, NULL, &mgError));
73 if (![serialNumber isKindOfClass:[NSString class]]) {
74 serialNumber = nil;
75 secnotice("octagon", "failed getting serial number: %d", mgError);
76 }
77 return serialNumber;
78 }
79
80 #else
81
82 - (NSString*)serialNumber
83 {
84 io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
85 if (platformExpert == MACH_PORT_NULL) {
86 secnotice("octagon", "failed getting serial number (platform IOPlatformExpertDevice)");
87 return nil;
88 }
89 NSString *serialNumber = CFBridgingRelease(IORegistryEntryCreateCFProperty(platformExpert, CFSTR(kIOPlatformSerialNumberKey), kCFAllocatorDefault, 0));
90 if (![serialNumber isKindOfClass:[NSString class]]) {
91 serialNumber = nil;
92 secnotice("octagon", "failed getting serial number (IORegistryEntry)");
93 }
94 IOObjectRelease(platformExpert);
95 return serialNumber;
96 }
97
98 #endif
99
100 @end
101