-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathEmbeddedOSSupport.m
More file actions
111 lines (93 loc) · 3.96 KB
/
EmbeddedOSSupport.m
File metadata and controls
111 lines (93 loc) · 3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
* EmbeddedOSSupport.m
* Support for embedded OS operations (T2 chip, biometrics)
*
* Uses private frameworks:
* - BiometricKit
* - NearField (for NFC/Secure Element)
*/
#import "EmbeddedOSSupport.h"
// Private framework class declarations
@class BKDeviceManager;
@class BKDevice;
@class BKDeviceDescriptor;
@class NFHardwareManager;
@class NFSecureElementManagerSession;
@implementation EmbeddedOSSupport
- (void)clearEmbeddedSystem {
// Clear NFC Secure Element applets
Class NFHardwareManagerClass = NSClassFromString(@"NFHardwareManager");
if (NFHardwareManagerClass) {
id hwManager = [NFHardwareManagerClass performSelector:@selector(sharedManager)];
// Get Secure Element session
Class NFSESessionClass = NSClassFromString(@"NFSecureElementManagerSession");
if (NFSESessionClass) {
id session = [[NFSESessionClass alloc] init];
// Clear all applets - uses completion handler
SEL clearSelector = NSSelectorFromString(@"clearAllAppletsWithCompletion:");
if ([session respondsToSelector:clearSelector]) {
void (^completion)(NFSecureElementManagerSession *, NSError *) =
^(NFSecureElementManagerSession *sess, NSError *error) {
if (error) {
NSLog(@"Error clearing applets: %@", error);
} else {
NSLog(@"ClearingAllApplets completed");
}
};
NSMethodSignature *sig = [session methodSignatureForSelector:clearSelector];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
[inv setTarget:session];
[inv setSelector:clearSelector];
[inv setArgument:&completion atIndex:2];
[inv invoke];
}
}
}
}
- (NSError *)disableBiometricID {
// Use BiometricKit to disable biometric authentication
Class BKDeviceManagerClass = NSClassFromString(@"BKDeviceManager");
if (!BKDeviceManagerClass) {
return [NSError errorWithDomain:@"EmbeddedOSSupport"
code:-1
userInfo:@{NSLocalizedDescriptionKey: @"BiometricKit not available"}];
}
id deviceManager = [BKDeviceManagerClass performSelector:@selector(sharedManager)];
// Get device descriptor for biometric device
Class BKDeviceDescriptorClass = NSClassFromString(@"BKDeviceDescriptor");
id descriptor = [[BKDeviceDescriptorClass alloc] init];
// Get the device
SEL deviceSelector = NSSelectorFromString(@"deviceForDescriptor:");
if ([deviceManager respondsToSelector:deviceSelector]) {
id device = [deviceManager performSelector:deviceSelector withObject:descriptor];
if (device) {
// Disable biometry on the device
SEL disableSelector = NSSelectorFromString(@"disableBiometry");
if ([device respondsToSelector:disableSelector]) {
[device performSelector:disableSelector];
return nil; // Success
}
}
}
return [NSError errorWithDomain:@"EmbeddedOSSupport"
code:-2
userInfo:@{NSLocalizedDescriptionKey: @"Couldn't disable biometry"}];
}
- (NSNumber *)bioLockState {
// Check biometric lock state using LocalAuthentication or BiometricKit
Class BKDeviceManagerClass = NSClassFromString(@"BKDeviceManager");
if (!BKDeviceManagerClass) {
return nil;
}
id deviceManager = [BKDeviceManagerClass performSelector:@selector(sharedManager)];
// Get bioLock state
SEL stateSelector = NSSelectorFromString(@"bioLockState");
if ([deviceManager respondsToSelector:stateSelector]) {
id state = [deviceManager performSelector:stateSelector];
if ([state isKindOfClass:[NSNumber class]]) {
return state;
}
}
return nil;
}
@end