В этом подразделе дается детальное описание последовательности действий, производимых клиентом и сервером в ходе выполнения протокола выработки ключей.
Действия, описываемые в 5.7.1 и 5.7.3, выполняются клиентом; действия, описываемые в 5.7.2 и 5.7.4, выполняются сервером.
5.7.1 Формирование сообщения ClientHelloMessage
На первом этапе протокола выработки ключей клиентом выполняется процедура инициализации, в ходе которой клиент формирует сообщение ClientHelloMessage, см. В.5.1, а также, при необходимости, дополнительные расширения.
Для формирования сообщения ClientHelloMessage клиент выполняет последовательность действий:
а) клиент вырабатывает случайную последовательность октетов длиной 32 октета и помещает ее в поле ClientHelloMessage.random;
б) клиент выбирает идентификатор одной из эллиптических кривых, определяемых типом данных EllipticCurvelD, см. В.3.9;
Рисунок 5 - Схема выработки ключей для протокола передачи прикладных данных
в) клиент вырабатывает случайное целое число , удовлетворяющее неравенствам , где q порядок точки P, определяемой параметрами эллиптической кривой, выбранной клиентом на предыдущем шаге.
Примечания
1 Вырабатываемое клиентом значение является криптографически опасной информацией, знание которой может привести к определению вырабатываемой ключевой информации и нарушению конфиденциальности передаваемой информации. В связи с этим рекомендуется удалять значение на следующем шаге, сразу после использования.
2 Использование одного и того же генератора случайных чисел для выработки значения и случайной последовательности октетов длиной 32 октета может быть потенциально опасным - нарушитель может использовать передаваемые в открытом виде элементы последовательности для определения секретного значения . В связи с этим рекомендуется использование различных генераторов случайных чисел для генерации значения и случайной последовательности октетов длиной 32 октета. В случае невозможности применения различных генераторов, рекомендуется использовать генератор, удовлетворяющий Р 1323565.1.012-2017;
г) клиент вычисляет точку кривой и помещает координаты вычисленной точки в поля структуры ClientHelloMessage.EllipticCurvePoint, т.е.
;
;
;
д) если клиент хочет использовать для аутентификации сервера предварительно распределенный ключ аутентификации ePSK, то клиент определяет:
ClientHelloMessage.idpsk.present = isPresent;
ClientHelloMessage.idpsk.type = ePSKKey;