fix:调整新的中继协议中的上报签名逻辑

This commit is contained in:
liyi 2024-11-29 14:18:22 +08:00
parent fec9933c0a
commit 3a27c83c62
6 changed files with 142 additions and 24 deletions

View File

@ -235,13 +235,13 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
: null)),
SubmitBtn(
btnName: '发送上线请求',
onClick: () {
onClick: () async {
//
StartChartManage().clientRegister();
await StartChartManage().clientRegister();
//
StartChartManage().relayQuery();
await StartChartManage().relayQuery();
// 线
StartChartManage().onlineRelayService();
await StartChartManage().onlineRelayService();
},
),
SubmitBtn(

View File

@ -289,4 +289,6 @@ abstract class Api {
'/SL-A-1.0/relay/query'; // --
final String reportInformationDataURL =
'/SL-A-1.0/peer/login'; // --
final String analyzeInformationOtherEndURL =
'/SL-A-1.0/peer/nslookup'; // --
}

View File

@ -55,4 +55,15 @@ class StartChartApi extends BaseProvider {
isUserBaseUrl: false,
);
}
// --
Future<void> analyzeInformationOtherEnd({
required String peerId,
}) async {
final response = await get(
_startChartHost + analyzeInformationOtherEndURL.toUrl + '?id=$peerId',
isUnShowLoading: true,
isUserBaseUrl: false,
);
}
}

View File

@ -1,12 +1,10 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:convert/convert.dart';
import 'package:crypto/crypto.dart';
import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';
import 'package:pointycastle/asn1/asn1_parser.dart';
import 'package:pointycastle/asn1/primitives/asn1_integer.dart';
import 'package:pointycastle/asn1/primitives/asn1_sequence.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/network/start_chart_api.dart';
@ -20,6 +18,12 @@ import 'package:star_lock/tools/deviceInfo_utils.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:uuid/uuid.dart';
import 'dart:convert';
import 'dart:typed_data';
import 'package:crypto/crypto.dart';
import 'package:pointycastle/export.dart' as pc; // Pointy Castle
import 'package:asn1lib/asn1lib.dart' as asn1lib; // Prefix for asn1lib
class StartChartManage {
// new对象
StartChartManage._internal();
@ -225,7 +229,7 @@ class StartChartManage {
//
final sign = await _generateSign(
currentTimestamp: currentTimestamp,
privateKey: privateKey,
privateKeyHex: privateKey,
);
// ip地址和中继返回的外网地址
@ -341,28 +345,127 @@ class StartChartManage {
// sing
Future<String> _generateSign({
required int currentTimestamp,
required String privateKey,
required String privateKeyHex,
}) async {
String resultSign = '';
try {
// 2. Little Endian
// 1.
Uint8List signData = Uint8List(4);
signData.buffer
.asByteData()
ByteData.view(signData.buffer)
.setUint32(0, currentTimestamp, Endian.little);
// 3. 使 SHA-256 signData
final sha256Hash = sha256.convert(signData);
var parser = RSAKeyParser();
final RSAPrivateKey parsePrivateKey =
parser.parse('-----BEGIN RSA PRIVATE KEY-----\n' + privateKey)
as RSAPrivateKey;
// 2. SHA-256
Digest hash = sha256.convert(signData);
// 3. 使 RSA ( RsaPrivateKey)
pc.RSAPrivateKey privateKey =
loadPrivateKey(privateKeyHex); // RSA
Uint8List signature = rsaSign(privateKey, hash.bytes);
// 4.
String hexSignature = signature
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join();
resultSign = hexSignature;
} catch (e) {
_log(text: '❌--->生成签名时出现错误: $e');
_log(text: '❌--->上报信息生成签名时出现错误: $e');
}
return resultSign ?? '';
}
/// PEM RSA
pc.RSAPrivateKey loadPrivateKey(String privateKeyHex) {
//
final uint8list = Uint8List.fromList(hexToBytes(privateKeyHex));
try {
// 使 asn1lib ASN1Parser
final asn1Parser = asn1lib.ASN1Parser(uint8list);
final topLevelSeq = asn1Parser.nextObject() as asn1lib.ASN1Sequence;
final modulus = bytesToBigInt(
(topLevelSeq.elements[1] as asn1lib.ASN1Integer).valueBytes());
final privateExponent = bytesToBigInt(
(topLevelSeq.elements[3] as asn1lib.ASN1Integer).valueBytes());
final p = bytesToBigInt(
(topLevelSeq.elements[4] as asn1lib.ASN1Integer).valueBytes());
final q = bytesToBigInt(
(topLevelSeq.elements[5] as asn1lib.ASN1Integer).valueBytes());
return pc.RSAPrivateKey(modulus, privateExponent, p, q);
} catch (e) {
//
print("Error decoding private key: $e");
rethrow;
}
}
//
Future<void> analyzeInformationOtherEnd() async {
await StartChartApi.to.analyzeInformationOtherEnd(peerId: ToPeerId);
}
//
List<int> hexToBytes(String hex) {
return List<int>.generate(hex.length ~/ 2,
(i) => int.parse(hex.substring(i * 2, i * 2 + 2), radix: 16));
}
BigInt bytesToBigInt(Uint8List bytes) {
return BigInt.parse(
bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(),
radix: 16,
);
}
/// 使 RSA PKCS#1 v1.5
Uint8List rsaSign(pc.RSAPrivateKey privateKey, List<int> data) {
final signer = pc.RSASigner(pc.SHA256Digest(), '06052b24030203')
..init(true, pc.PrivateKeyParameter<pc.RSAPrivateKey>(privateKey));
return signer.generateSignature(Uint8List.fromList(data)).bytes;
}
// RSA
// RSAPrivateKey parseRSAPrivateKey1(Uint8List bytes) {
// // PKCS#1 DER
// ASN1Parser parser = ASN1Parser(bytes);
// ASN1Sequence seq = parser.nextObject() as ASN1Sequence;
// if (seq.elements == null || seq.elements!.length < 9) {
// throw ArgumentError("Invalid RSA private key");
// }
//
// //
// ASN1Integer version = seq.elements![0] as ASN1Integer;
// ASN1Integer modulus = seq.elements![1] as ASN1Integer;
// // ASN1Integer publicExponent = seq.elements![2] as ASN1Integer;
// ASN1Integer privateExponent = seq.elements![3] as ASN1Integer;
// ASN1Integer p = seq.elements![2] as ASN1Integer;
// ASN1Integer q = seq.elements![4] as ASN1Integer;
// ASN1Integer dP = seq.elements![5] as ASN1Integer;
// ASN1Integer dQ = seq.elements![6] as ASN1Integer;
// ASN1Integer qInv = seq.elements![7] as ASN1Integer;
//
// // ASN1Integer BigInt
// BigInt modulusValue = _convertToBigInt(modulus);
// // BigInt publicExponentValue = _convertToBigInt(publicExponent);
// BigInt privateExponentValue = _convertToBigInt(privateExponent);
// BigInt pValue = _convertToBigInt(p);
// BigInt qValue = _convertToBigInt(q);
// BigInt dPValue = _convertToBigInt(dP);
// BigInt dQPValue = _convertToBigInt(dQ);
// BigInt qInvQPValue = _convertToBigInt(qInv);
//
// // RSAPrivateKey
// return RSAPrivateKey(modulusValue, privateExponentValue, pValue, qValue);
// }
//
// // ASN1Integer BigInt
// BigInt _convertToBigInt(ASN1Integer integer) {
// // ASN1Integer
// Uint8List bytes = integer.valueBytes!;
// // BigInt
// return BigInt.parse(hex.encode(bytes), radix: 16);
// }
Future<String> getPublicKey() async {
//
final StarChartRegisterNodeEntity? starChartRegisterNodeInfo =

View File

@ -20,7 +20,7 @@ class CommandUDPReciverManager {
if (dataSize < 4) {
return;
}
// AppLog.log('appReceiveUDPData:$data');
AppLog.log('appReceiveUDPData:$data');
final Uint8List data1 = Uint8List.fromList(data);
if (data1.length == 1) {

View File

@ -184,7 +184,7 @@ dependencies:
#加密解密
encrypt: ^5.0.1
crypto: ^3.0.3
pointycastle: ^3.3.0
pointycastle: ^3.4.0
date_format: ^2.0.7
# 下拉刷新
@ -248,7 +248,8 @@ dependencies:
open_filex: ^4.4.0
crc32_checksum: ^0.0.2
fast_rsa: ^3.6.6
cryptography: ^2.7.0
asn1lib: ^1.0.0
dependency_overrides:
@ -256,6 +257,7 @@ dependency_overrides:
google_maps_flutter_ios: 2.5.2
flutter_plugin_android_lifecycle: 2.0.18
dev_dependencies:
flutter_test:
sdk: flutter