ver 0.0.1
This commit is contained in:
65
lib/src/serializer/binary_serializer.dart
Normal file
65
lib/src/serializer/binary_serializer.dart
Normal 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,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user