添加自定义密码协议及逻辑

This commit is contained in:
魏少阳 2023-08-30 18:36:02 +08:00
parent a487a22580
commit 3a43d89725
8 changed files with 496 additions and 46 deletions

View File

@ -0,0 +1,146 @@
import 'dart:convert';
import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart';
import 'io_reply.dart';
import 'io_sender.dart';
import 'io_type.dart';
import 'package:crypto/crypto.dart' as crypto;
//TODO:
/*
pwd 6 0UseCountLimit 0pwd 6 0UseCountLimit 0pwdNo 255userId DeleteAll !@#
**/
class SenderCustomPasswordsCommand extends SenderProtocol {
String? keyID;
String? userID;
int? pwdNo;
String? pwd;
int? useCountLimit;
List<int>? token;
int? startTime;
int? endTime;
int? needAuthor;
List<int>? publicKey;
List<int>? privateKey;
SenderCustomPasswordsCommand({
this.keyID,
this.userID,
this.pwdNo,
this.pwd,
this.useCountLimit,
this.token,
this.startTime,
this.endTime,
this.needAuthor,
this.publicKey,
this.privateKey,
}) : super(CommandType.generalExtendedCommond);
@override
List<int> messageDetail() {
List<int> data = [];
List<int> subData = [];
List<int> ebcData = [];
//
int type = commandType!.typeValue;
double typeDouble = type / 256;
int type1 = typeDouble.toInt();
int type2 = type % 256;
data.add(type1);
data.add(type2);
//
data.add(3);
// keyID 40
int keyIDLength = utf8.encode(keyID!).length;
// print("${commandType!.typeValue}LockIDLength:$lockIDLength utf8.encode(lockID!)${utf8.encode(lockID!)}");
subData.addAll(utf8.encode(keyID!));
subData = getFixedLengthList(subData, 40 - keyIDLength);
//userID 20
int userIDLength = utf8.encode(userID!).length;
// print("${commandType!.typeValue}IDLength:$authUserIDLength utf8.encode(authUserID!)${utf8.encode(authUserID!)}");
subData.addAll(utf8.encode(userID!));
subData = getFixedLengthList(subData, 20 - userIDLength);
// PwdNo
subData.add(1);
// pwd 20
int pwdLength = utf8.encode(pwd!).length;
// print("${commandType!.typeValue}keyIDLength:$keyIDLength utf8.encode(keyID!)${utf8.encode(keyID!)}");
subData.addAll(utf8.encode(pwd!));
subData = getFixedLengthList(subData, 20 - pwdLength);
// UseCountLimit
subData.add(0xff);
// token
subData.addAll(token!);
// startTime 4
subData.add((startTime! & 0xff000000) >> 24);
subData.add((startTime! & 0xff0000) >> 16);
subData.add((startTime! & 0xff00) >> 8);
subData.add((startTime! & 0xff));
// endTime 4
subData.add((endTime! & 0xff000000) >> 24);
subData.add((endTime! & 0xff0000) >> 16);
subData.add((endTime! & 0xff00) >> 8);
subData.add((endTime! & 0xff));
if(needAuthor == 0){
//AuthCodeLen 1
subData.add(0);
} else {
List<int> authCodeData = [];
//authUserID
authCodeData.addAll(utf8.encode(userID!));
//KeyID
authCodeData.addAll(utf8.encode(keyID!));
//token 4 Token 0
authCodeData.addAll(token!);
authCodeData.addAll(publicKey!);
print("${commandType!.typeValue}-authCodeData:$authCodeData");
// KeyIDauthUserIDmd5加密之后就是authCode
var authCode = crypto.md5.convert(authCodeData);
subData.add(authCode.bytes.length);
subData.addAll(authCode.bytes);
}
data.add(subData.length);
data.addAll(subData);
if ((data.length % 16) != 0) {
int add = (16 - data.length % 16);
for (int i = 0; i < add; i++) {
data.add(0);
}
}
print("${commandType!.typeName} SM4Data:$data");
// LockId进行SM4 ECB加密 key:544d485f633335373034383064613864
ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB);
return ebcData;
}
}
class SenderCustomPasswordsReply extends Reply {
SenderCustomPasswordsReply.parseData(CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
}
}

View File

@ -16,6 +16,7 @@ import 'io_protocol/io_getPrivateKey.dart';
import 'io_protocol/io_getPublicKey.dart';
import 'io_protocol/io_openLock.dart';
import 'io_protocol/io_reply.dart';
import 'io_protocol/io_senderCustomPasswords.dart';
import 'io_protocol/io_type.dart';
import 'io_tool/io_manager.dart';
import 'io_tool/io_tool.dart';
@ -143,8 +144,36 @@ class CommandReciverManager {
reply = FactoryDataResetReply.parseData(commandType, data);
}
break;
case CommandType.generalExtendedCommond:
{
//
int subType = data[3];
switch(subType){
case 3:
{
//
reply = SenderCustomPasswordsReply.parseData(commandType, data);
}
break;
}
}
break;
}
return reply;
}
}
static Future<Reply?> replySubCommand(CommandType commandType, List<int> data){
int subType = data[3];
var reply;
switch(subType){
case 3:
{
//
reply = SenderCustomPasswordsReply.parseData(commandType, data);
}
break;
}
return reply;
}
}

View File

@ -8,6 +8,7 @@ import 'io_protocol/io_factoryDataReset.dart';
import 'io_protocol/io_getPrivateKey.dart';
import 'io_protocol/io_getPublicKey.dart';
import 'io_protocol/io_openLock.dart';
import 'io_protocol/io_senderCustomPasswords.dart';
import 'io_protocol/io_transferPermissions.dart';
import 'sender_data.dart';
@ -175,15 +176,15 @@ class IoSenderManage {
//todo:
static void senderTransferPermissions({
String? lockID,
String? authUserID,
String? keyID,
String? oldUserID,
String? newUserID,
int? needAuthor,
List<int>? publicKey,
List<int>? privateKey,
List<int>? token,
required String? lockID,
required String? authUserID,
required String? keyID,
required String? oldUserID,
required String? newUserID,
required int? needAuthor,
required List<int>? publicKey,
required List<int>? privateKey,
required List<int>? token,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: TransferPermissionsCommand(
@ -201,13 +202,13 @@ class IoSenderManage {
//todo:
static void senderFactoryDataReset({
String? lockID,
String? userID,
String? keyID,
List<int>? publicKey,
List<int>? privateKey,
List<int>? token,
int? needAuthor,
required String? lockID,
required String? userID,
required String? keyID,
required List<int>? publicKey,
required List<int>? privateKey,
required List<int>? token,
required int? needAuthor,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: FactoryDataResetCommand(
@ -221,4 +222,33 @@ class IoSenderManage {
), callBack:callBack);
}
//todo:
static void senderCustomPasswordsCommand({
required String? keyID,
required String? userID,
required int? pwdNo,
required String? pwd,
required int? useCountLimit,
required List<int>? token,
required int? startTime,
required int? endTime,
required int? needAuthor,
required List<int>? publicKey,
required List<int>? privateKey,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: SenderCustomPasswordsCommand(
keyID: keyID,
userID: userID,
pwdNo: pwdNo,
pwd:pwd,
useCountLimit: useCountLimit,
token: token,
startTime: startTime,
endTime: endTime,
needAuthor: needAuthor,
publicKey: publicKey,
privateKey: privateKey,
), callBack:callBack);
}
}

View File

@ -0,0 +1,133 @@
import 'dart:async';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:star_lock/blue/io_protocol/io_type.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_reply.dart';
import '../../../../blue/io_protocol/io_transferPermissions.dart';
import '../../../../blue/io_tool/io_manager.dart';
import '../../../../blue/io_tool/io_tool.dart';
import '../../../../blue/io_tool/manager_event_bus.dart';
import '../../../../blue/sender_manage.dart';
import '../../../../tools/baseGetXController.dart';
import '../../../../tools/storage.dart';
import 'authorizedAdmin_state.dart';
class AuthorizedAdminLogic extends BaseGetXController {
final AuthorizedAdminState state = AuthorizedAdminState();
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((reply) async {
//
if(reply is TransferPermissionsReply) {
var token = reply.data.sublist(2, 6);
var saveStrList = changeIntListToStringList(token);
print("_replyFactoryDataResetKeyToken:$token");
Storage.setStringList(saveBlueToken, saveStrList);
int status = reply.data[6];
print("status:$status");
switch(status){
case 0x00:
//
print("${reply.commandType!.typeValue} 数据解析成功");
break;
case 0x06:
//
print("${reply.commandType!.typeValue} 需要鉴权");
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderFactoryDataReset(
lockID:BlueManage().connectDeviceName,
userID:await Storage.getUserId(),
keyID:"1",
needAuthor:1,
publicKey:publicKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList
);
break;
case 0x07:
//
print("${reply.commandType!.typeValue} 用户无权限");
break;
case 0x09:
//
print("${reply.commandType!.typeValue} 权限校验错误");
break;
default:
//
print("${reply.commandType!.typeValue} 失败");
break;
}
}
});
}
//
Future<void> transferPermissionsAction() async {
BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async {
if (state == DeviceConnectionState.connected){
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
print("openDoorTokenPubToken:$getTokenList");
IoSenderManage.senderTransferPermissions(
lockID:BlueManage().connectDeviceName,
authUserID:await Storage.getUserId(),
keyID:"1",
oldUserID:await Storage.getUserId(),
newUserID:"100002",
needAuthor:1,
publicKey:publicKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList
);
}
});
}
@override
void onReady() {
// TODO: implement onReady
super.onReady();
_initReplySubscription();
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
@override
void onClose() {
// TODO: implement onClose
_replySubscription.cancel();
}
}

View File

@ -13,16 +13,20 @@ import '../../../../app_settings/app_colors.dart';
import '../../../../tools/commonItem.dart';
import '../../../../tools/submitBtn.dart';
import '../../../../translations/trans_lib.dart';
import 'authorizedAdmin_logic.dart';
class AuthorizedAdminPage extends StatefulWidget {
final String type;
AuthorizedAdminPage({Key? key, required this.type}) : super(key: key);
const AuthorizedAdminPage({Key? key, required this.type}) : super(key: key);
@override
State<AuthorizedAdminPage> createState() => _AuthorizedAdminPageState();
}
class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
final logic = Get.put(AuthorizedAdminLogic());
final state = Get.find<AuthorizedAdminLogic>().state;
final FlutterContactPicker _contactPicker = FlutterContactPicker();
late Contact _contact;

View File

@ -0,0 +1,4 @@
class AuthorizedAdminState {
}

View File

@ -373,35 +373,6 @@ class LockDetailLogic extends BaseGetXController{
});
}
//
Future<void> transferPermissionsAction() async {
BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async {
if (state == DeviceConnectionState.connected){
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
print("openDoorTokenPubToken:$getTokenList");
IoSenderManage.senderTransferPermissions(
lockID:BlueManage().connectDeviceName,
authUserID:await Storage.getUserId(),
keyID:"1",
oldUserID:await Storage.getUserId(),
newUserID:"100002",
needAuthor:1,
publicKey:publicKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList
);
}
});
}
//
Future<void> factoryDataResetAction() async {
BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async {

View File

@ -0,0 +1,133 @@
import 'dart:async';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:star_lock/blue/io_protocol/io_type.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_reply.dart';
import '../../../../blue/io_protocol/io_senderCustomPasswords.dart';
import '../../../../blue/io_tool/io_manager.dart';
import '../../../../blue/io_tool/io_tool.dart';
import '../../../../blue/io_tool/manager_event_bus.dart';
import '../../../../blue/sender_manage.dart';
import '../../../../tools/baseGetXController.dart';
import '../../../../tools/storage.dart';
class PasswordKeyPerpetualLogic extends BaseGetXController {
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((reply) async {
//
if(reply is SenderCustomPasswordsReply) {
var token = reply.data.sublist(2, 6);
var saveStrList = changeIntListToStringList(token);
print("_replyFactoryDataResetKeyToken:$token");
Storage.setStringList(saveBlueToken, saveStrList);
int status = reply.data[6];
print("status:$status");
switch(status){
case 0x00:
//
print("${reply.commandType!.typeValue} 数据解析成功");
break;
case 0x06:
//
print("${reply.commandType!.typeValue} 需要鉴权");
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
IoSenderManage.senderCustomPasswordsCommand(
keyID:"1",
userID:await Storage.getUserId(),
pwdNo:1,
pwd: "123456",
useCountLimit:0xff,
startTime:0x11223344,
endTime:0x11223344,
needAuthor:1,
publicKey:publicKeyDataList,
privateKey:getPrivateKeyList,
token: token
);
break;
case 0x07:
//
print("${reply.commandType!.typeValue} 用户无权限");
break;
case 0x09:
//
print("${reply.commandType!.typeValue} 权限校验错误");
break;
default:
//
print("${reply.commandType!.typeValue} 失败");
break;
}
}
});
}
//
Future<void> senderCustomPasswords() async {
BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async {
if (state == DeviceConnectionState.connected){
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
print("openDoorTokenPubToken:$getTokenList");
IoSenderManage.senderCustomPasswordsCommand(
keyID:"1",
userID:await Storage.getUserId(),
pwdNo:1,
pwd: "123456",
useCountLimit:0xff,
startTime:0x11223344,
endTime:0x11223344,
needAuthor:1,
publicKey:publicKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList
);
}
});
}
@override
void onReady() {
// TODO: implement onReady
super.onReady();
_initReplySubscription();
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
@override
void onClose() {
// TODO: implement onClose
_replySubscription.cancel();
}
}