DAT ​

DAT — строка ASCII, разделённая точками (.). Каждое поле встречается ровно один раз в фиксированном порядке, а подпись подтверждает, что предыдущие поля переданы без изменений.

expire
uint64 (decimal)
.
cid
uint64 (hex)
.
plain
Base64Url
.
secure
Base64Url
.
signature
Base64Url
Порядок полей и разделители являются частью спецификации.
text
expire.cid.plain.secure.signature

Поля ​

ПолеПредставлениеЗначение
expireДесятичное unsigned integerUnix-время истечения DAT
cidСтрочное шестнадцатеричное unsigned integerID сертификата для проверки
plainBase64Url без paddingНезашифрованные bytes
secureBase64Url без paddingBytes, защищённые алгоритмом шифрования сертификата
signatureBase64Url без paddingПодпись исходных ASCII bytes строки expire.cid.plain.secure

Поле plain покрыто подписью, поэтому его нельзя изменить, но любой может его декодировать. Секреты, персональные данные и значения, напрямую используемые для авторизации, помещайте в secure. Пустое поле secure допустимо.

Каноническое представление ​

  • Весь DAT должен состоять из ASCII.
  • Числа записываются без знаков, пробелов, префиксов и лишних начальных нулей. Только ноль записывается как 0.
  • Base64Url использует URL-safe alphabet и не допускает padding = или пробелы.
  • Неканонические строки Base64Url, представляющие одни bytes несколькими способами, отклоняются.
  • Строка с другим количеством или порядком полей не является DAT.

Эти правила не позволяют разным реализациям принимать разные строки за один DAT.

Выпуск ​

  1. Выберите сертификат, который сейчас доступен для выпуска.
  2. Добавьте TTL сертификата к текущему времени и получите expire.
  3. Закодируйте plain в Base64Url.
  4. Зашифруйте secure алгоритмом шифрования сертификата.
  5. Соедините предыдущие поля точками и подпишите их ASCII bytes.

Выпуск разрешён только в окне выпуска сертификата: start <= now <= start + duration.

Проверка ​

  1. Разберите DAT по каноническим правилам.
  2. Проверьте, что expire > now. DAT с expire == now уже истёк.
  3. Найдите сертификат с соответствующим cid и убедитесь, что он ещё действителен для проверки.
  4. Проверьте подпись исходных bytes expire.cid.plain.secure.
  5. Аутентифицируйте и расшифруйте secure, затем верните его вместе с plain.

API разбора без проверки подписи предназначен только для наблюдения и диагностики. Никогда не используйте его результат для аутентификации или авторизации.

Обязанности вне спецификации ​

DAT не определяет user store, способ входа, модель авторизации, заголовок передачи токена или список отзыва. Приложение само решает, какие запросы могут использовать проверенный payload.