调试添加用户协议

This commit is contained in:
魏少阳 2023-08-12 18:32:49 +08:00
parent fae49d89b0
commit dfc5dc433f
9 changed files with 297 additions and 84 deletions

View File

@ -1,13 +1,16 @@
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:
class AddUserCommand extends SenderProtocol {
int? cmdID;
String? lockID;
String? authUserID;
String? keyID;
@ -18,11 +21,10 @@ class AddUserCommand extends SenderProtocol {
int? expireDate;
int? role;
String? password;
int? token;
int? authCodeLen;
String? authCode;
int? needAuthor;
List<int>? userPperationToken;
List<int>? publicKeyData;
AddUserCommand({
this.cmdID,
this.lockID,
this.authUserID,
this.keyID,
@ -33,20 +35,133 @@ class AddUserCommand extends SenderProtocol {
this.expireDate,
this.role,
this.password,
this.token,
this.authCodeLen,
this.authCode,
this.needAuthor,
this.userPperationToken,
this.publicKeyData
}) : super(CommandType.addUser);
@override
List<int> messageDetail() {
List<int> data = [];
// data.add(0x21);
// int d = direction!.toInt();
// data.addAll(intToByte2ListHigh(d));
// data.add(0x22);
// int s = speed!.toInt();
// data.add(s);
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);
// id 40
int lockIDLength = utf8.encode(lockID!).length;
data.addAll(utf8.encode(lockID!));
data = getFixedLengthList(data, 40 - lockIDLength);
//authUserID 20
int authUserIDLength = utf8.encode(authUserID!).length;
data.addAll(utf8.encode(authUserID!));
data = getFixedLengthList(data, 20 - authUserIDLength);
//KeyID 40
int keyIDLength = utf8.encode(keyID!).length;
data.addAll(utf8.encode(keyID!));
data = getFixedLengthList(data, 40 - keyIDLength);
//userID useid 20
int userIDLength = utf8.encode(authUserID!).length;
data.addAll(utf8.encode(authUserID!));
data = getFixedLengthList(data, 20 - authUserIDLength);
// openModel
data.add(openMode!);
// keyType
data.add(keyType!);
int? d1, d2;
if(role == 255){
d1 = 0;//Date.parse(new Date()) / 1000;
d2 = 0xffffffff;//d1 + 86440;
}else{
d1 = startDate;
d2 = expireDate;
}
// StartDate 4
data.add((d1! & 0xff000000) >> 24);
data.add((d1 & 0xff0000) >> 16);
data.add((d1 & 0xff00) >> 8);
data.add((d1 & 0xff));
// expireDate 4
data.add((d2! & 0xff000000) >> 24);
data.add((d2 & 0xff0000) >> 16);
data.add((d2 & 0xff00) >> 8);
data.add((d2 & 0xff));
// role 1 010xff
data.add(role!);
//password 20
int passwordLength = utf8.encode(password!).length;
data.addAll(utf8.encode(password!));
data = getFixedLengthList(data, 20 - passwordLength);
if(needAuthor == 0){
// token失效或者第一次发送的时候token为0
//Token 4
data.addAll([0, 0, 0, 0]);
//AuthCodeLen 1
data.add(0);
} else {
// token 4 Token 0
data.addAll(userPperationToken!);
List<int> authCodeData = [];
//KeyID
authCodeData.addAll(utf8.encode(keyID!));
//authUserID
authCodeData.addAll(utf8.encode(authUserID!));
//token 4
authCodeData.addAll(userPperationToken!);
// String pubKey = "";
// Storage.getData("bluePublicKey").then((res) => {
// pubKey = res
// });
// var pubKey = "ovOvAHuL5+dBCw7L3Qt7IQ==";
// print("pubKey:$pubKey");
// List<int> pubKeyData = base64.decode(pubKey.toString());
// print("pubKeyData:$pubKeyData");
authCodeData.addAll(publicKeyData!);
// KeyIDauthUserIDmd5加密之后就是authCode
var authCode = crypto.md5.convert(authCodeData);
// print("authCodeData:$authCodeData \nauthCode:$authCode \nauthCodeBytes:${authCode.bytes}");
data.add(authCode.bytes.length);
data.addAll(authCode.bytes);
}
if ((data.length % 16) != 0) {
int add = (16 - data.length % 16);
for (int i = 0; i < add; i++) {
data.add(0);
}
}
print("SM4Data:$data");
// LockId进行SM4 ECB加密 key:544d485f633335373034383064613864
String key = SM4.createHexKey(key: 'TMH_c3570480da8d');
ebcData = SM4.encrypt(data, key: key, mode: SM4CryptoMode.ECB);
ebcData.removeRange(ebcData.length - 16, ebcData.length);
// ebcData = utf8.encode(getSM4Str(data, "TMH_c3570480da8d"));
print("ebcData:$ebcData");
return data;
}
}

View File

@ -2,14 +2,12 @@ import 'dart:convert';
import 'package:star_lock/blue/sm4Encipher/sm4.dart';
import '../../tools/storage.dart';
import '../io_tool/io_tool.dart';
import 'io_reply.dart';
import 'io_sender.dart';
import 'io_type.dart';
import 'package:crypto/crypto.dart' as a;
import 'package:convert/convert.dart';
import 'package:crypto/crypto.dart' as crypto;
class GetPrivateKeyCommand extends SenderProtocol {
String? lockID;
@ -99,7 +97,7 @@ class GetPrivateKeyCommand extends SenderProtocol {
authCodeData.addAll(publicKeyData!);
// KeyIDauthUserIDmd5加密之后就是authCode
var authCode = a.md5.convert(authCodeData);
var authCode = crypto.md5.convert(authCodeData);
// print("authCodeData:$authCodeData \nauthCode:$authCode \nauthCodeBytes:${authCode.bytes}");
data.add(authCode.bytes.length);
@ -126,22 +124,30 @@ class GetPrivateKeyCommand extends SenderProtocol {
class GetPrivateKeyReply extends Reply {
GetPrivateKeyReply.parseData(CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
print('获取私钥');
switch(dataDetail[0]){
var getData = dataDetail.sublist(2);
// print("getData:$getData");
switch(getData[0]){
case 0x00:
//
print('获取私钥成功');
getData.removeAt(0);
List commKey = getData.sublist(0, 16);
List signKey = getData.sublist(16);
print("commKey:$commKey signKey:$signKey");
break;
case 0x07:
//
//
print('获取私钥无权限');
break;
case 0x0f:
//
//
print('获取私钥:用户已存在');
break;
default:
//
//
print('获取私钥失败');
break;
}

View File

@ -26,15 +26,15 @@ class GetPublicKeyCommand extends SenderProtocol {
int type2 = type%256;
data.add(type1);
data.add(type2);
print("type:$type");
print("type1:$type1");
print("type2:$type2");
// print("type:$type");
// print("type1:$type1");
// print("type2:$type2");
print("lockID${lockID!} lockID.utf8.encode${utf8.encode(lockID!)}");
int length = utf8.encode(lockID!).length;
data.addAll(utf8.encode(lockID!));
data = getFixedLengthList(data, 40 - length);
print("dataaaaaa:$data");
// print("dataaaaaa:$data");
return data;
}
}
@ -50,7 +50,7 @@ class GetPublicKeyReply extends Reply {
String stringEncoded = base64.encode(tokenData);
print('获取公钥成功 publickey:$stringEncoded');
//
Storage.setData("bluePublicKey", stringEncoded);
// Storage.setData("bluePublicKey", stringEncoded);
IoSenderManage.getPrivateKey("TMH_c3570480da8d", "1", "1", 1, tokenData, 1);
break;
case 0x07:

View File

@ -4,28 +4,44 @@ import 'dart:typed_data';
import 'package:crypto/crypto.dart';
import 'package:flutter/services.dart';
import 'package:encrypt/encrypt.dart' as ddd;
// import 'package:sm_crypto/sm_crypto.dart';
// String getSM4Str(List<int>data, String key) {
// String dataStr = radixString(data);
// String iv = SM4.createHexKey(key: key);
List<String> changeIntListToStringList(List<int> list){
List<String> strList = [];
for(int i = 0; i<list.length; i++)
{
strList.add(list[i].toRadixString(16));
}
return strList;
}
// String cbcEncryptData = SM4.encrypt(
// data: dataStr,
// key: iv,
// mode: SM4CryptoMode.ECB,
// iv: iv,
// );
List<int> changeStringListToIntList(List<String> list){
List<int> intList = [];
for(int i = 0; i<list.length; i++)
{
intList.add(_hexToInt(list[i]));
}
return intList;
}
// print("getDNSAPIStrData:$data \ngetDNSAPIStrkey:$key \ngetDNSAPIStrDataStr:$dataStr \niv:$iv\ncbcEncryptData:$cbcEncryptData");
// return cbcEncryptData;
// // final iv = ddd.IV.fromLength(32);
// // final encrypter = ddd.Encrypter(ddd.AES(ddd.Key.fromUtf8(key), mode: ddd.AESMode.ecb, padding: 'PKCS7'));
// // final encrypted = encrypter.encrypt(key, iv: iv);
// //
// // return encrypted;
// }
int _hexToInt(String hex) {
int val = 0;
int len = hex.length;
for (int i = 0; i < len; i++) {
int hexDigit = hex.codeUnitAt(i);
if (hexDigit >= 48 && hexDigit <= 57) {
val += (hexDigit - 48) * (1 << (4 * (len - 1 - i)));
} else if (hexDigit >= 65 && hexDigit <= 70) {
// A..F
val += (hexDigit - 55) * (1 << (4 * (len - 1 - i)));
} else if (hexDigit >= 97 && hexDigit <= 102) {
// a..f
val += (hexDigit - 87) * (1 << (4 * (len - 1 - i)));
} else {
throw new FormatException("Invalid hexadecimal value");
}
}
return val;
}
String md5Crypto(List<int> data) {
final dig = md5.convert(data);

View File

@ -22,7 +22,7 @@ class CommandReciverManager {
if(data_size < 13){
return;
}
print("appDataReceiveData:$data");
// print("appDataReceiveData:$data");
if((data[0] == 0xEF)&&(data[1] == 0x01)&&(data[2] == 0xEE)&&(data[3] == 0x02)&&(data[4] == 0x11)){
var tmpType = (data[7] & 0x0f);//
print("temType:$tmpType");
@ -36,19 +36,24 @@ class CommandReciverManager {
// for (var i = 0; i < oriLen ; i++) {
// oriDataList.add(data[12 + i]);
// }
oriDataList = data.sublist(12, 12 + oriLen);
oriDataList = data.sublist(12, 12 + dataLen);
print("不加密 oriDataList:$oriDataList");
break;
case 1:
//AES128
break;
case 2:
//SM4
// SM4
//
var getDataList = data.sublist(12, 12 + dataLen);
String key = SM4.createHexKey(key: 'TMH_c3570480da8d');
oriDataList = SM4.decrypt(data, key: key, mode: SM4CryptoMode.ECB);
//
oriDataList = SM4.decrypt(getDataList, key: key, mode: SM4CryptoMode.ECB);
oriDataList = oriDataList.sublist(0, oriLen);
print("SM4 oriDataList:$oriDataList");
break;
case 3: //SM4
case 3:
//SM4
// for (var i = 0; i < dataLen ; i++) {
// dataView[i] = uint8Recv[12 + i];
// }

View File

@ -411,9 +411,11 @@ class SM4 {
}
return paddedList;
} else {
final lastByte = input.last;
final cutLen = input.length - lastByte;
return input.sublist(0, cutLen);
// final lastByte = input.last;
// final cutLen = input.length - lastByte;
// print("object input.length${input.length} lastByte:$lastByte input:$input cutLen:$cutLen");
// return input.sublist(0, cutLen);
return input;
}
}

View File

@ -14,13 +14,13 @@ class StarLockMineState {
///
void saveLoginData(LoginEntity data) async {
print("saveLoginData:${data.data!.mobile}");
await Storage.setData('userLoginData',jsonEncode(data));
await Storage.setString('userLoginData',jsonEncode(data));
loginData.value=data;
}
///
void initLoginData() async {
final data = await Storage.getData<String>('userLoginData');
final data = await Storage.getString('userLoginData');
print("getLoginData:$data");
if(data != null && data.isNotEmpty){
loginData.value = LoginEntity.fromJson(jsonDecode(data));
@ -29,7 +29,7 @@ class StarLockMineState {
///退
void logOut() async {
await Storage.setData('userLoginData','');
await Storage.setString('userLoginData','');
loginData.value = LoginEntity();
}

View File

@ -17,7 +17,7 @@ FutureOr<Request> requestInterceptor(Request request) async {
// request.headers['token'] = StoreService.to.userToken!;
// print("11111${StoreService.to.userToken}");
String? xToken = '';
final data = await Storage.getData<String>('userLoginData');
final data = await Storage.getString('userLoginData');
if(data != null && data.isNotEmpty){
xToken = LoginEntity.fromJson(jsonDecode(data)).data!.accessToken;
}

View File

@ -4,33 +4,102 @@
import 'package:shared_preferences/shared_preferences.dart';
class Storage{
///
static Future<void> setData(key, value) async {
// ///
// static Future<void> setData(key, value) async {
// SharedPreferences sp = await SharedPreferences.getInstance();
// if (value is int) {
// await sp.setInt(key, value);
// } else if (value is bool) {
// await sp.setBool(key, value);
// } else if (value is double) {
// await sp.setDouble(key, value);
// } else if (value is String) {
// await sp.setString(key, value);
// } else if (value is List<String>) {
// await sp.setStringList(key, value);
// }
// }
//
// ///
// ///
// static Future<T?> getData<T>(key) async {
// SharedPreferences sp = await SharedPreferences.getInstance();
// switch(T){
// case int: return (sp.getInt(key) ?? 0) as T;
// case bool: return (sp.getBool(key) ?? false) as T;
// case double: return (sp.getDouble(key) ?? 0.0) as T;
// case String: return (sp.getString(key) ?? '') as T;
// case List: return (sp.getStringList(key) ?? []) as T;
// default: return null;
// }
// }
// int
static Future<void> setInt(key,value) async{
SharedPreferences sp = await SharedPreferences.getInstance();
if (value is int) {
await sp.setInt(key, value);
} else if (value is bool) {
await sp.setBool(key, value);
} else if (value is double) {
await sp.setDouble(key, value);
} else if (value is String) {
await sp.setString(key, value);
} else if (value is List<String>) {
await sp.setStringList(key, value);
}
sp.setInt(key, value);
}
///
///
static Future<T?> getData<T>(key) async {
static Future<int?> getInt(key) async{
SharedPreferences sp = await SharedPreferences.getInstance();
switch(T){
case int: return (sp.getInt(key) ?? 0) as T;
case bool: return (sp.getBool(key) ?? false) as T;
case double: return (sp.getDouble(key) ?? 0.0) as T;
case String: return (sp.getString(key) ?? '') as T;
case List: return (sp.getStringList(key) ?? []) as T;
default: return null;
}
return sp.getInt(key);
}
// bool
static Future<void> setBool(key,value) async{
SharedPreferences sp = await SharedPreferences.getInstance();
sp.setBool(key, value);
}
static Future<bool?> getBool(key) async{
SharedPreferences sp = await SharedPreferences.getInstance();
return sp.getBool(key);
}
// double
static Future<void> setDouble(key,value) async{
SharedPreferences sp = await SharedPreferences.getInstance();
sp.setDouble(key, value);
}
static Future<double?> getDouble(key) async{
SharedPreferences sp = await SharedPreferences.getInstance();
return sp.getDouble(key);
}
// string
static Future<void> setString(key,value) async{
SharedPreferences sp = await SharedPreferences.getInstance();
sp.setString(key, value);
}
static Future<String?> getString(key) async{
SharedPreferences sp = await SharedPreferences.getInstance();
return sp.getString(key);
}
//
static Future<void> setStringList(key,value) async{
SharedPreferences sp = await SharedPreferences.getInstance();
sp.setStringList(key, value);
}
static Future<List<String>?> getStringList(key) async{
SharedPreferences sp = await SharedPreferences.getInstance();
return sp.getStringList(key);
}
//
static Future<void> removeData(key) async{
SharedPreferences sp = await SharedPreferences.getInstance();
sp.remove(key);
}
//
static Future<void> clearAll() async{
SharedPreferences sp = await SharedPreferences.getInstance();
sp.clear();
}
}