188814912C85766B009299A9 /* AiDeviceAuthManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1888148D2C85766B009299A9 /* AiDeviceAuthManager.m */; };
188814BD2C85BB76009299A9 /* AiBkzhAuthManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 188814BB2C85BB76009299A9 /* AiBkzhAuthManager.h */; };
188814BE2C85BB76009299A9 /* AiBkzhAuthManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 188814BC2C85BB76009299A9 /* AiBkzhAuthManager.m */; };
- 188814C22C85C2BB009299A9 /* MSUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 188814C02C85C2BA009299A9 /* MSUtils.h */; };
- 188814C32C85C2BB009299A9 /* MSUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 188814C02C85C2BA009299A9 /* MSUtils.h */; };
- 188814C42C85C2BB009299A9 /* MSUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 188814C12C85C2BA009299A9 /* MSUtils.m */; };
- 188814C52C85C2BB009299A9 /* MSUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 188814C12C85C2BA009299A9 /* MSUtils.m */; };
+ 188814C22C85C2BB009299A9 /* AESCBCHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 188814C02C85C2BA009299A9 /* AESCBCHelper.h */; };
+ 188814C32C85C2BB009299A9 /* AESCBCHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 188814C02C85C2BA009299A9 /* AESCBCHelper.h */; };
+ 188814C42C85C2BB009299A9 /* AESCBCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 188814C12C85C2BA009299A9 /* AESCBCHelper.m */; };
+ 188814C52C85C2BB009299A9 /* AESCBCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 188814C12C85C2BA009299A9 /* AESCBCHelper.m */; };
18AD83252BFAE8B9009BDE3B /* AiDeviceInfoManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18AD83232BFAE8B9009BDE3B /* AiDeviceInfoManager.h */; };
18AD83262BFAE8B9009BDE3B /* AiDeviceInfoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AD83242BFAE8B9009BDE3B /* AiDeviceInfoManager.m */; };
18AD83292BFB22DE009BDE3B /* AiSender.h in Headers */ = {isa = PBXBuildFile; fileRef = 18AD83272BFB22DE009BDE3B /* AiSender.h */; };
1888148D2C85766B009299A9 /* AiDeviceAuthManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiDeviceAuthManager.m; sourceTree = "<group>"; };
188814BB2C85BB76009299A9 /* AiBkzhAuthManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiBkzhAuthManager.h; sourceTree = "<group>"; };
188814BC2C85BB76009299A9 /* AiBkzhAuthManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiBkzhAuthManager.m; sourceTree = "<group>"; };
- 188814C02C85C2BA009299A9 /* MSUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSUtils.h; sourceTree = "<group>"; };
- 188814C12C85C2BA009299A9 /* MSUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSUtils.m; sourceTree = "<group>"; };
+ 188814C02C85C2BA009299A9 /* AESCBCHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AESCBCHelper.h; sourceTree = "<group>"; };
+ 188814C12C85C2BA009299A9 /* AESCBCHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AESCBCHelper.m; sourceTree = "<group>"; };
18AD83232BFAE8B9009BDE3B /* AiDeviceInfoManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiDeviceInfoManager.h; sourceTree = "<group>"; };
18AD83242BFAE8B9009BDE3B /* AiDeviceInfoManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiDeviceInfoManager.m; sourceTree = "<group>"; };
18AD83272BFB22DE009BDE3B /* AiSender.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiSender.h; sourceTree = "<group>"; };
180E7B4A2BD7BD80008558E8 /* AiMouseTools.m */,
180E7B532BD7BD82008558E8 /* AiMouseTools2.h */,
180E7B4F2BD7BD81008558E8 /* AiMouseTools2.m */,
- 188814C02C85C2BA009299A9 /* MSUtils.h */,
- 188814C12C85C2BA009299A9 /* MSUtils.m */,
+ 188814C02C85C2BA009299A9 /* AESCBCHelper.h */,
+ 188814C12C85C2BA009299A9 /* AESCBCHelper.m */,
180E7AB82BD7BD7D008558E8 /* AiRecordManager.h */,
180E7B4E2BD7BD81008558E8 /* AiRecordManager.m */,
);
180E7CF22BD8FC4F008558E8 /* d3d11va.h in Headers */,
180E7CBC2BD8FC4E008558E8 /* eval.h in Headers */,
180E7CF72BD8FC4F008558E8 /* bsf.h in Headers */,
- 188814C22C85C2BB009299A9 /* MSUtils.h in Headers */,
+ 188814C22C85C2BB009299A9 /* AESCBCHelper.h in Headers */,
180E7CD22BD8FC4E008558E8 /* ripemd.h in Headers */,
18862A2B2C8064E300D3564D /* HidManager.h in Headers */,
180E7CD52BD8FC4E008558E8 /* hwcontext_qsv.h in Headers */,
18862B212C806BD900D3564D /* version.h in Headers */,
18862B222C806BD900D3564D /* base64.h in Headers */,
18862B232C806BD900D3564D /* mastering_display_metadata.h in Headers */,
- 188814C32C85C2BB009299A9 /* MSUtils.h in Headers */,
+ 188814C32C85C2BB009299A9 /* AESCBCHelper.h in Headers */,
18862B242C806BD900D3564D /* crc.h in Headers */,
18862B252C806BD900D3564D /* hwcontext_cuda.h in Headers */,
18862B262C806BD900D3564D /* hwcontext_vaapi.h in Headers */,
18EF7AFB2C7603E800AC5223 /* TlwTools.m in Sources */,
18EF7AFA2C7603E800AC5223 /* TlwMouseSdk.m in Sources */,
18862A282C8064E300D3564D /* BleManager.m in Sources */,
- 188814C42C85C2BB009299A9 /* MSUtils.m in Sources */,
+ 188814C42C85C2BB009299A9 /* AESCBCHelper.m in Sources */,
180E7BDF2BD7BD84008558E8 /* AiMouseConfig.m in Sources */,
18EF7AFC2C7603E800AC5223 /* TlwConnectManager.m in Sources */,
181CE5C22C6EED9900EF8D07 /* AiAliAuthManager.m in Sources */,
18862BC32C806BD900D3564D /* TlwTools.m in Sources */,
18862BC42C806BD900D3564D /* TlwMouseSdk.m in Sources */,
18862BC52C806BD900D3564D /* BleManager.m in Sources */,
- 188814C52C85C2BB009299A9 /* MSUtils.m in Sources */,
+ 188814C52C85C2BB009299A9 /* AESCBCHelper.m in Sources */,
18862BC62C806BD900D3564D /* AiMouseConfig.m in Sources */,
18862BC72C806BD900D3564D /* TlwConnectManager.m in Sources */,
18862BC82C806BD900D3564D /* AiAliAuthManager.m in Sources */,
#import "AiSecretModel.h"
-#define kBaseUrl @"http://dmp.raisound.com/bz-api"
+#define kBaseUrl @"https://dmp.raisound.com/bz-api"
-#define kProductKey @"LtKXtGcvk2tAe53uzMKT";
-#define kSecretKey @"5QYRLYKfitcUaYYUTw4ZVxKPUUVaRyND";
+#define kProductId @"LtKXtGcvk2tAe53uzMKT"
+#define kProductKey @"5QYRLYKfitcUaYYUTw4ZVxKPUUVaRyND"
//#define kProductKey @"4EepovakpbqhZUnUDwH42KAADYGv4UUe";
//#define kSecretKey @"5QYRLYKfitcUaYYUTw4ZVxKPUUVaRyND";
if (self.outputLog) self.outputLog([NSString stringWithFormat:@"[auth]%@",log]);
}
+- (void)testAes{
+ // 密钥(16 字节,例如:"1234567890abcdef")
+ NSString *key = @"yourKey1234567890";
+ // 初始化向量(16 字节,例如:"iv1234567890abc")
+ NSString *iv = @"yourIV1234567890";
+
+ // 要加密的明文
+ NSString *plainText = @"Hello, AES-CBC!";
+
+ // 加密
+ NSData *encryptedData = [AiMouseTools aesCbcEncryptWithKey:key iv:iv plainText:plainText];
+ if (encryptedData) {
+ NSLog(@"Encrypted Data: %@", encryptedData);
+
+ // 解密
+ NSString *decryptedText = [AiMouseTools aesCbcDecryptWithKey:key iv:iv cipherText:encryptedData];
+ if (decryptedText) {
+ NSLog(@"Decrypted Text: %@", decryptedText);
+ } else {
+ NSLog(@"Decryption failed.");
+ }
+ } else {
+ NSLog(@"Encryption failed.");
+ }
+}
+
- (void)registerReuest{
- NSString *productKey = kProductKey;
NSString *deviceId = self.deviceInfo.mac;
NSString *timeStamp = [NSString stringWithFormat:@"%ld",(NSInteger)[NSDate date].timeIntervalSince1970*1000];
- NSString *value = [NSString stringWithFormat:@"%@%@%@", deviceId,productKey,timeStamp];
- NSString *signValue = [AiMouseTools stringToHmacSha1:productKey text:value];
+ NSString *value = [NSString stringWithFormat:@"%@%@%@", deviceId,kProductId,timeStamp];
+ NSString *signValue = [AiMouseTools stringToHmacSha1:kProductKey text:value];
NSDictionary *params = @{
- @"pid":productKey,
+ @"pid":kProductId,
@"deviceId":deviceId,
@"signMethod":@"HMACSHA1",
@"sign":signValue,
};
[self showLog:[NSString stringWithFormat:@"value %@",value]];
- [self showLog:[NSString stringWithFormat:@"productKey %@",productKey]];
+ [self showLog:[NSString stringWithFormat:@"kProductKey %@",kProductKey]];
[self showLog:[NSString stringWithFormat:@"signValue %@",signValue]];
NSString *url = [NSString stringWithFormat:@"%@/dev/auth/active",kBaseUrl];
NSString *code = dict[@"code"];
NSString *deviceSecret = [dict valueForKeyPath:@"data.password"];
if(code.integerValue == 20000 && deviceSecret){
+ [self testAes];
NSString *nonce = [dict valueForKeyPath:@"data.nonce"];
-
-// [self sendDeviceSecretCmd:deviceSecret];
+ NSData *pwsData = [[NSData alloc]initWithBase64EncodedString:deviceSecret options:0];
+ NSString *pwd = [AiMouseTools aesCbcDecryptWithKey:kProductKey iv:nonce cipherText:pwsData];
+ [self sendDeviceSecretCmd:pwd];
[self showLog:@"激活成功"];
}
else{
NSString *nonce = [AiMouseTools generateRandomString16];
NSString *key = kProductKey;
NSString *originPwd = [self.deviceInfo valueForKey:@"deviceSecret"];//注册返回的密码
- NSString *pwd = originPwd;
+ NSString *pwd = [[AiMouseTools aesCbcEncryptWithKey:key iv:nonce plainText:originPwd] base64EncodedStringWithOptions:0];
NSDictionary *params = @{
@"deviceId":deviceId,
@"password":pwd,
NSString *code = dict[@"code"];
NSString *token = [dict valueForKeyPath:@"data.token"];
if(code.integerValue == 20001){
+ [self showLog:@"登录成功"];
self.token = token;
if(self.authCallBack)self.authCallBack(true);
//[self tokenRequest];
+(NSString *)getCurrentTime;
+ (NSString *)generateRandomString16;
+
+
++ (NSData *)aesCbcEncryptWithKey:(NSString *)key iv:(NSString *)iv plainText:(NSString *)plainText;
+
++ (NSString *)aesCbcDecryptWithKey:(NSString *)key iv:(NSString *)iv cipherText:(NSData *)cipherText;
@end
NS_ASSUME_NONNULL_END
}
return randomString;
}
+
+
+
+
+// AES-CBC 加密
++ (NSData *)aesCbcEncryptWithKey:(NSString *)key iv:(NSString *)iv plainText:(NSString *)plainText {
+ const char *keyPtr = [key UTF8String];
+ const char *ivPtr = [iv UTF8String];
+ const char *plainTextPtr = [plainText UTF8String];
+ size_t plainTextLength = strlen(plainTextPtr);
+
+ size_t bufferSize = plainTextLength + kCCBlockSizeAES128;
+ uint8_t buffer[bufferSize];
+
+ CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
+ kCCAlgorithmAES128,
+ kCCOptionPKCS7Padding,
+ keyPtr,
+ kCCKeySizeAES128,
+ ivPtr,
+ plainTextPtr,
+ plainTextLength,
+ buffer,
+ bufferSize,
+ NULL);
+
+ if (cryptStatus == kCCSuccess) {
+ return [NSData dataWithBytes:buffer length:bufferSize];
+ } else {
+ return nil;
+ }
+}
+
+// AES-CBC 解密
++ (NSString *)aesCbcDecryptWithKey:(NSString *)key iv:(NSString *)iv cipherText:(NSData *)cipherText {
+ const char *keyPtr = [key UTF8String];
+ const char *ivPtr = [iv UTF8String];
+ size_t cipherTextLength = [cipherText length];
+ uint8_t *buffer = malloc(cipherTextLength);
+
+ CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
+ kCCAlgorithmAES128,
+ kCCOptionPKCS7Padding,
+ keyPtr,
+ kCCKeySizeAES128,
+ ivPtr,
+ [cipherText bytes],
+ cipherTextLength,
+ buffer,
+ cipherTextLength,
+ NULL);
+
+ if (cryptStatus == kCCSuccess) {
+ NSString *decryptedString = [[NSString alloc] initWithBytes:buffer length:cipherTextLength encoding:NSUTF8StringEncoding];
+ free(buffer);
+ return decryptedString;
+ } else {
+ free(buffer);
+ return nil;
+ }
+}
@end
- (void)showHidAlert{
- NSAlert *alert = [[NSAlert alloc] init];
- [alert setMessageText:@"请前往设置-隐私与安全性-输入监控,将输入监控打开并重启app才能使用AI功能"];
- [alert addButtonWithTitle:@"确定"];
-// [alert addButtonWithTitle:@"取消"];
- NSInteger result = [alert runModal];
- if (result == NSAlertFirstButtonReturn) {
- NSLog(@"用户点击了确定");
- [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_ListenEvent"]];
- } else if (result == NSAlertSecondButtonReturn) {
- NSLog(@"用户点击了取消");
- }
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:@"请前往设置-隐私与安全性-输入监控,将输入监控打开并重启app才能使用AI功能"];
+ [alert addButtonWithTitle:@"确定"];
+ // [alert addButtonWithTitle:@"取消"];
+ NSInteger result = [alert runModal];
+ if (result == NSAlertFirstButtonReturn) {
+ NSLog(@"用户点击了确定");
+ [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_ListenEvent"]];
+ } else if (result == NSAlertSecondButtonReturn) {
+ NSLog(@"用户点击了取消");
+ }
+ [NSApp terminate:nil];
}
- (void)showMicrophoneAlert{
- NSAlert *alert = [[NSAlert alloc] init];
- [alert setMessageText:@"请前往设置-隐私与安全性-麦克风,将麦克风打开并重启app才能使用AI功能"];
- [alert addButtonWithTitle:@"确定"];
-// [alert addButtonWithTitle:@"取消"];
- NSInteger result = [alert runModal];
- if (result == NSAlertFirstButtonReturn) {
- NSLog(@"用户点击了确定");
- [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone"]];
- } else if (result == NSAlertSecondButtonReturn) {
- NSLog(@"用户点击了取消");
- }
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:@"请前往设置-隐私与安全性-麦克风,将麦克风打开并重启app才能使用AI功能"];
+ [alert addButtonWithTitle:@"确定"];
+ // [alert addButtonWithTitle:@"取消"];
+ NSInteger result = [alert runModal];
+ if (result == NSAlertFirstButtonReturn) {
+ NSLog(@"用户点击了确定");
+ [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone"]];
+ } else if (result == NSAlertSecondButtonReturn) {
+ NSLog(@"用户点击了取消");
+ }
+ [NSApp terminate:nil];
}
@end
- (void)getFullDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))finished{
self.getFullInfoCallBack = finished;
- self.questTimes = 0;
- [self checkFullInfoAction];
-}
-
-- (void)checkFullInfoAction{
- self.questTimes++;
- if (self.questTimes > 3) {
- self.getFullInfoCallBack(nil,[NSError errorWithDomain:@"AiMouse SDK Error" code:AiMouseErrorCode_unknown userInfo:@{@"NSLocalizedDescriptionKey":@"请求失败"}]);
- [self switchConnect:AiMouseConnectType_hid isConnected:false ];
- return;
- }
- if (self.getFullInfoCallBack) {
- [self reGetFullInfoAction];
- }
-}
-- (void)reGetFullInfoAction{
- if(self.getFullInfoCallBack == nil)return;;
__weak typeof(self) ws = self;
[self getDeviceInfo:^(TlwDeviceInfo *deviceInfo, NSError *error) {
if(deviceInfo != nil){
info.mac = snInfo.mac;
[ws showLog:info.description];
if(ws.getFullInfoCallBack)ws.getFullInfoCallBack(info, nil);
- ws.getFullInfoCallBack = nil;
}
else{
if(ws.getFullInfoCallBack)ws.getFullInfoCallBack(nil,error);
- ws.getFullInfoCallBack = nil;
+ [ws TlwConnectManager:nil connectStateDidChange:false];
}
}];
}
else{
if(ws.getFullInfoCallBack) ws.getFullInfoCallBack(nil,error);
- ws.getFullInfoCallBack = nil;
+ [ws TlwConnectManager:nil connectStateDidChange:false];
}
}];
-
- [self performSelector:@selector(checkFullInfoAction) withObject:nil afterDelay:1];
}
+
#pragma mark - check dongle
- (void)checkDongleState{
self.dongleTimes = 0;
}
#pragma mark - action
-- (void)scanAction{
-// [[HidManager shared] open];
-// return;
- ScanVC *vc = [[ScanVC alloc] initWithNibName:nil bundle:nil];
- [self presentViewControllerAsModalWindow:vc];
-}
- (void)setupDeviceManger{
// [AiHidManager shared];
DeviceManger *manager = [DeviceManger shared];