pae function
Pre-Authentication Encoding (PAE) для PASETO
Реализация PAE (Pre-Authentication Encoding) согласно спецификации PASETO: https://github.com/paseto-standard/paseto-spec/blob/master/docs/01-Protocol-Versions/Common.md#pae-definition
PAE принимает массив байтов и кодирует их для защиты от атак канонизации. Первые 8 байт содержат количество элементов в little-endian формате. Затем для каждого элемента сначала записывается его длина (8 байт в little-endian), а затем сам элемент.
Implementation
Uint8List pae(List<Uint8List> pieces) {
// Создаем результирующий буфер
final count = pieces.length;
// Считаем общую длину результата
// 8 байт для количества элементов + (8 байт длины + длина элемента) для каждого элемента
var totalLength = 8;
for (final piece in pieces) {
totalLength += 8 + piece.length;
}
// Создаем результирующий буфер
final result = Uint8List(totalLength);
var offset = 0;
// Записываем количество элементов в little-endian формате (64 бита)
// с установкой старшего бита в 0 для межъязыковой совместимости
_writeLE64(result, offset, count);
offset += 8;
// Записываем каждый элемент
for (final piece in pieces) {
// Записываем длину элемента в little-endian формате (64 бита)
_writeLE64(result, offset, piece.length);
offset += 8;
// Записываем сам элемент
result.setRange(offset, offset + piece.length, piece);
offset += piece.length;
}
return result;
}