verify static method

Future<Package> verify(
  1. Token token, {
  2. required SimplePublicKey publicKey,
  3. List<int>? implicit,
})

Проверяет подпись 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,
  );
}