[Примечание: этот файл не обновлялся после выхода OpenSSH 1.2 и должен считаться
УСТАРЕВШИМ. Так как часть информации всё ещё может быть полезной для 
разработчиков, файл оставлен в дистрибутиве.]

Этот документ предназначен для тех, кто хочет разобраться в исходном код ssh. 
Это попытка дать обзор структуры кода.

Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>
Обновление 17 ноября 1995.
Обновление 19 октября 1999 для OpenSSH-1.2
Обновление 20 мая 2001 примечание - устарел для OpenSSH > 1.2

Программное обеспечение состоит из ssh (клиент), sshd (сервер), scp, sdist
и вспомогательных программ ssh-keygen, ssh-agent, ssh-add и 
make-ssh-known-hosts. Основной код для каждой из них находится в файле .c
с соответствующим именем.

Существует несколько подсистем/абстракций, используемых этими программами.

 Функции манипулирования буфером.

	- Предоставляют буфер произвольного размера, в который может быть
	добавлены данные. Содержимое может быть получено с обоих концов 
	буфера. Эти функции	широко используется в ssh. Базовые функции
	манипулирования буфером находятся в файле buffer.c (заголовочный 
	файл buffer.h), дополнительный код для манипулирования специфическими
	типами данных находится в bufaux.c.

 Библиотека сжатия данных

	- Ssh использует библиотеку сжатия данных GNU GZIP (ZLIB).

 Шифрование/расшифровка

	- Ssh содержит несколько алгоритмов шифрования. Они все доступны через
  интерфейсы, описанные в cipher.h. Код находится в файле cipher.c, 
  реализация - в libc.

 Библиотека для работы с целыми числами переменной точности.

	- Используется подбиблиотека SSLeay BIGNUM.

 Случайные числа

	- Используется arc4random() и аналогичные функции.

 Генерация ключей RSA, шифрование, расшифровка

	- Ssh использует RSA-функции из libssl.

 Файлы ключей RSA

	- ключи RSA хранятся в файлах определенного формата. Код для чтения/записи
	этих файлов находится в authfile.c. Файлы, как правило, зашифрованы
	паролем. Функции для чтения паролей находятся в readpass.c
	
 Двоичный пакетный протокол

	- Двоичный пакетный протокол ssh реализован в packet.c. Код в packet.c не
	интересуется типами пакетов или их исполнением; он содержит код для 
	построения пакетов, их получения, извлечения данных из них, а также 
	для сжатия и/или шифрования пакетов. Код вычисления CRC изначально 
	взят из crc32.c.

	- Код в packet.c использует функции манипулирования буфером (buffer.c,
	bufaux.c), функции сжатия (compress.c, zlib) и шифрования.

 X11, TCP/IP и агент перенаправление данных

	- Код для различных типов перенаправления (forwarding) каналов находится в
	channels.c.	Этот файл определяет общий каркас (framework) для различных
	каналов	связи внутри защищённого канала, и использует этот каркас для
	перенаправления соединений X11,	TCP/IP и агента аутентификации.	Новая
	реализация каналов (Protocol 1.5) находится в nchan.c

 Агент аутентификации

	- Код для общения с агентом аутентификации находится в authfd.c

 Методы аутентификации

	- Код для различных методов аутентификации находится в auth-*.c
	(auth-passwd.c, auth-rh-rsa.c, auth-rhosts.c, auth-rsa.c). Он скомпонован
	c сервером. Эти функции также манипулируют известными файлами hosts через
	функции в hostfile.c. Код в canohost.c используется для извлечения 
	канонического имени удалённого хоста. Код в match.c используется для 
	сравнения имён хостов.

	- Для клиента код аутентификации находится в sshconnect.c. Он читает
	пароли, используя код в readpass.c, и RSA ключи, используя authfile.c. Код
	общается с агентом аутентификации при помощи authfd.c.

 Клиент ssh

	- Основная программа клиента находится в ssh.c. При запуске, программа
	сначала обрабатывает аргументы и читает конфигурацию (readconf.c), 
	затем вызывает ssh_connect (в sshconnect.c) чтобы открыть соединение с
	сервером (возможно, через прокси-сервер), и выполняет аутентификацию
	(ssh_login в sshconnect.c). После этого выполняются все запросы
	псевдо-терминала (pty), перенаправление и прочие запросы. Программа 
	может вызывать функции в ttymodes для кодирования текущих режимов 
	терминала. В конце программа вызывает client_loop в clientloop.c, 
	который выполняет основную работу текущей сессии.

	- Клиент запускается с запускается с битом suid root, но отказывается
	от этой привилегии при чтении конфигурации. Права администратора 
	используются только для создания соединения (используя привилегированный
	сокет). Все дополнительные привилегии доступа отключаются перед вызовом
	ssh_login.

 Манипуляция псевдо-терминалом и его режимами.

	- Код для создания псевдо-терминала находится в pty.c. Код для кодирования
	и установки режимов терминала находится в ttymodes.c.

 Начало сеанса (обновление utmp, lastlog, и т.д.)

	- Код, отвечающий за действия, выполняемые при подключении пользователя,
	находится в login.c. Он включает такие действия, как обновление файлов
	utmp, wtmp	и lastlog. Часть этого кода находится в sshd.c.

 Запись в системный журнал и терминал

	- Программы во многих случаях используют функции fatal(), log(), debug(),
	error() чтобы выводить сообщения в системный журнал или пользовательский
	терминал. Реализация, использующая системный журнал, находится в файле
	log-server.c, используемом программой сервера. Остальные программы
	используют реализацию, которая отправляет сообщения на стандартный поток
	ошибок. Она находится в log-client.c. Определения находится в ssh.h.

 sshd сервер (демон)

	- Демон sshd начинает работу с обработки аргументов и чтения файла
	конфигурации (servconf.c). Затем он читает ключ хоста (host
	key), начинает ожидать входящие соединения и генерирует ключ сервера.
	Ключ сервера перегенерируется каждый час.

	- При появлении входящего соединения сервер вызывает fork, отключает
	перегенерацию ключа и начинает обмен данными с клиентом.
	Сначала происходит обмен идентификационными строками, включается 
	шифрование,	после чего происходит аутентификации, подготовительные 
	операции, и, наконец, сервер переключается в нормальный режим сессии 
	при помощи вызова server_loop в serverloop.c, который делает основную 
	работу, вызывая функции в остальных модулях.

	- Код сервера находится в sshd.c. Он выполняет множество функций, включая:
	- основную программу сервера
	- ожидание соединений
	- обработку новых соединений
	- аутентификацию
	- подготовительные операции
	- создание среды выполнения для программы пользователя.
	- запуск программы пользователя.

 Вспомогательные файлы.

	- В дистрибутиве содержатся несколько вспомогательных файлов, выполняющих
	различные вспомогательные функции:
	ssh.h	   основной заголовочный файл ssh (различные определения)
	uidswap.c  смена uid
	xmalloc.c  "безопасные" функции malloc

$OpenBSD: OVERVIEW,v 1.11 2006/08/03 03:34:41 deraadt Exp $
$Перевод Виктор Ерёмин <ErV2005@rambler.ru> 2007 $