01 May 15, Mithgol the Webmaster ==> Pavel Gulchouck:
PG>> Потом появилась NTLM-авторизация, криптование, компрессия и т.д. - PG>> я не помню точно, в каком порядке в каком из мейлеров это всё PG>> появлялось.
MtW> Существует ли документ, в котором крипто и компрессия (шифрование и сжатие) MtW> описаны в таком виде, в каком они реализованы в нынешнем binkd?
Насколько мне известно - нет. Скорее всего, описание должно быть где-то в архивах этой эхи, но найти его не очень просто.
Если в двух словах.
Компрессия. Если при установке сессии была заявлена опция EXTCMD, то в команде FILE после четырёх необязательных параметров (имя файла, размер, mtime, offset) могут идти необязательные. Также в хендшейке любая сторона может заявить опции GZ и BZ2, что означает, соответственно, поддержку компресии gzip и bzip2. Если при передаче файла в команде FILE пятым (или больше) параметром было указано GZ или BZ2, файл передаётся сжатым. Смещение в командах FILE и GET в любом случае относится к оригинальному, несжатому файлу. Кроме того, в команде GET может быть опция NZ, что означает просьбу отправлять файл в несжатом виде (binkd эту опцию всегда исполняет, но в общем случае на это нельзя твёрдо рассчитывать).
Криптование. При хендшейке любая сторона может заявить опцию CRYPT, что означает поддержку криптования сессии. Криптование включается, если обе стороны предъявили опцию CRYPT, и только при парольной сессии, и только в случае CRAM-аутентификации. Если обе стороны поддерживают криптование и заявили об этом в хендшейке, но сессия непарольная, либо пароль был передан в открытом виде, криптование не включается. Если же обе стороны передали CRYPT, пароль проверен, и не был передан открытым текстом, весь трафик после сообщений M_PWD и M_OK криптуется алгоритмом InfoZIP. Этот алгоритм представляет собой xor потока псевдослучайной последовательностью байт (на основе CRC32, т.е. полиномиальной), начальное состояние которой в binkd инициализируется паролем на сессию (с небольшой модификацией для звонящей и отвечающей стороны, чтобы эти последовательности не были одинаковыми). Конкретную реализацию проще посмотреть в исходниках infozip или binkd, чем пересказывать: