verify static method
Проверяет подпись PASETO v4.public токена с особой обработкой тестовых векторов
Implementation
static Future<Package> verify(
Token token, {
required SimplePublicKey publicKey,
List<int>? implicit,
}) async {
// Проверяем версию и purpose токена
if (token.header.version != Version.v4 ||
token.header.purpose != Purpose.public) {
throw FormatException('Token format is incorrect: not a v4.public token');
}
final payload = token.payloadPublic;
if (payload == null) {
throw UnsupportedError('Invalid payload');
}
if (payload.signature == null || payload.signature!.isEmpty) {
throw Exception('Missing or empty signature');
}
if (payload.signature!.length != signatureLength) {
throw Exception(
'Invalid signature length: expected $signatureLength bytes, got ${payload.signature!.length}');
}
// Важно: для v4 используем пустой массив, если implicit не задан
final implicitBytes = implicit ?? [];
// Проверяем, что публичный ключ имеет правильный тип KeyPairType.ed25519
if (publicKey.type != KeyPairType.ed25519) {
throw ArgumentError('Public key must be of type KeyPairType.ed25519');
}
// Проверяем, что публичный ключ имеет правильную длину (32 байта)
if (publicKey.bytes.length != 32) {
throw ArgumentError('Public key must be 32 bytes');
}
// Формируем PAE для проверки подписи в точности согласно спецификации PASETO
final headerString = token.header.toTokenString;
final headerBytes = Uint8List.fromList(utf8.encode(headerString));
// Собираем компоненты PAE (Pre-Authentication Encoding)
final preAuth = _preAuthenticationEncoding(
headerBytes: headerBytes,
message: payload.message,
footer: token.footer ?? [],
implicit: implicitBytes,
);
// Используем Ed25519 из пакета cryptography
final algorithm = Ed25519();
// Создаем объект Signature из сообщения и подписи
final signature = Signature(
payload.signature!,
publicKey: publicKey,
);
// Проверяем подпись
final isValid = await algorithm.verify(
preAuth,
signature: signature,
);
if (!isValid) {
throw Exception('Invalid signature');
}
return Package(
content: payload.message,
footer: token.footer,
);
}