ver 0.0.1

This commit is contained in:
2026-08-09 23:47:39 +03:00
parent 411b00c3ee
commit 8c431c1742
6 changed files with 506 additions and 3 deletions

View File

@@ -0,0 +1,65 @@
import 'dart:typed_data';
import 'package:potato_pass_core/src/encoding/compact_text_encoder.dart';
import 'package:potato_pass_core/src/models/pass_payload.dart';
/// Утилита для упаковки PassPayload в бинарный массив и обратно
abstract class BinarySerializer {
/// Упаковывает модель PassPayload в бинарный массив Uint8List
static Uint8List serialize(PassPayload pass) {
final List<int> bytes = [];
//Добавляем тело (Текст + Зоны + PubKey)
bytes.addAll(pass.getSignedBodyBytes());
//Добавляем 64 байта подписи Службы Безопасности
bytes.addAll(pass.securityDepartmentSignature);
//Добавляем 64 байта подписи Соли
bytes.addAll(pass.challengeSignature);
return Uint8List.fromList(bytes);
}
/// Распаковывает байтовый массив обратно в объект PassPayload
static PassPayload deserialize(Uint8List bytes) {
int offset = 0;
String readField() {
final int length = bytes[offset++];
final Uint8List fieldBytes = Uint8List.sublistView(bytes, offset, offset + length);
offset += length;
return CompactTextEncoder.decode(fieldBytes);
}
final String lastName = readField();
final String firstName = readField();
final String middleName = readField();
final String position = readField();
final String department = readField();
final int zoneMaskLength = bytes[offset++];
final Uint8List zoneMask = Uint8List.sublistView(bytes, offset, offset + zoneMaskLength);
offset += zoneMaskLength;
final Uint8List clientPublicKey = Uint8List.sublistView(bytes, offset, offset + 32);
offset += 32;
final Uint8List securityDepartmentSignature = Uint8List.sublistView(bytes, offset, offset + 64);
offset += 64;
final Uint8List challengeSignature = Uint8List.sublistView(bytes, offset, offset + 64);
offset += 64;
return PassPayload(
lastName: lastName,
firstName: firstName,
middleName: middleName,
position: position,
department: department,
zoneMask: zoneMask,
clientPublicKey: clientPublicKey,
securityDepartmentSignature: securityDepartmentSignature,
challengeSignature: challengeSignature,
);
}
}