RFC 6074 Provisioning, Auto-Discovery, and Signaling in Layer 2 Virtual Private Networks (L2VPNs)

Internet Engineering Task Force (IETF)                          E. Rosen
Request for Comments: 6074                                      B. Davie
Category: Standards Track                            Cisco Systems, Inc.
ISSN: 2070-1721                                               V. Radoaca
                                                          Alcatel-Lucent
                                                                  W. Luo
                                                            January 2011

Provisioning, Auto-Discovery, and Signaling in Layer 2 Virtual Private Networks (L2VPNs)

Предоставление, автоматическое обнаружение и сигнализация L2VPN

PDF

Аннотация

Предоставляемые провайдером виртуальные частные сети канального уровня (Provider Provisioned Layer 2 Virtual Private Network или L2VPN) могут использовать разные модели предоставления, т. е. модели, указывающие настраиваемые элементы и их конфигурацию. После настройки сведения о предоставлении распространяются процессом обнаружения (discovery process). Когда этот процесс завершается, автоматически вызывается сигнальный протокол для организации mesh-сети псевдопроводов (PW), формирующей (виртуальную) опорную сеть L2VPN. Этот документ задаёт множество моделей предоставления L2VPN, а также семантическую структуру идентификаторов конечных точек, требуемых для каждой модели. Рассматривается распространение этих идентификаторов процессом обнаружения, особенно для случая использования протокола граничного шлюза Border Gateway Protocol или BGP). Указывается, что идентификаторы конечных точек передаются двумя сигнальными протоколами для организации PW — протоколом распространения меток (Label Distribution Protocol или LDP) и протоколом туннелирования на канальном уровне (Layer 2 Tunneling Protocol version 3 или L2TPv3).

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 5741.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке http://www.rfc-editor.org/info/rfc6074.

Авторские права

Авторские права (Copyright (c) 2011) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

Документ может содержать материалы из IETF Document или IETF Contribution, опубликованных или публично доступных до 10 ноября 2008 года. Лица, контролирующие авторские права на некоторые из таких документов, могли не предоставить IETF Trust права разрешать внесение изменений в такие документы за рамками процессов IETF Standards. Без получения соответствующего разрешения от лиц, контролирующих авторские права этот документ не может быть изменён вне рамок процесса IETF Standards, не могут также создаваться производные документы за рамками процесса IETF Standards за исключением форматирования документа для публикации или перевода с английского языка на другие языки.

1. Введение

В [RFC4664] описано несколько вариантов, где наборы псевдопроводов могут объединяться в предоставляемые провайдером L2 VPN (Provider Provisioned Layer 2 VPN, L2 PPVPN или L2VPN), дающих разные виды L2VPN. Эти виды могут иметь разные модели предоставления (provisioning), т. е. разные варианты информации, которая должна быть настроена и разные наборы элементов. После настройки сведения о предоставлении распространяются процессом обнаружения (discovery process), а после обнаружения информации автоматически вызывается сигнальный протокол для организации требуемых псевдопроводов. Семантика идентификаторов конечных точек, используемых протоколом сигнализации для конкретного типа L2VPN, определяется моделью предоставления. Т. е. для разных типов L2VPN с разными моделями предоставления требуются различные типы идентификаторов конечных точек. В этом документе задано несколько моделей предоставления L2VPN и семантические структуры идентификаторов конечных точек для этих моделей.

Протокол LDP ([RFC5036] с расширением [RFC4447]) или L2TP версии 3 ([RFC3931] с расширением [RFC4667]) может служить для сигнализации при установке и поддержке PW [RFC3985]. Любой протокол, организующий соединения, должен обеспечивать каждой конечной точке способ представить себя другим, каждый сигнальный протокол PW, таким образом, обеспечивает способ идентификации конечных точек PW. Поскольку каждый сигнальный протокол должен поддерживать все виды L2VPN и модели предоставления, такой протокол должен иметь очень общий способ представления идентификаторов конечных точек в соответствующих полях каждого протокола сигнализации. Этот документ задаёт способ кодирования идентификаторов конечных точек для каждой модели предоставления в протоколах сигнализации LDP и L2TPv3.

Здесь используются термины из [RFC3985], [RFC4026], [RFC4664], [RFC5659], в частности, устройство присоединения (Attachment Circuit), псевдопровод (pseudowire), PE (provider edge — граница провайдера), CE (customer edge — граница клиента), многосегментный псевдопровод (multi-segment pseudowire).

В разделе 2 представлен обзор относящихся к документу аспектов [RFC4447] и [RFC4667]. Раздел 3 подробно описывает модели предоставления и связывает их с сигнальным процессом и процессом обнаружения. Достаточно подробно рассмотрены способы интеграции сигнальных механизмов с процессом автоматического обнаружения на основе BGP. В разделе 4 описано, как процедуры обнаружения и сигнализации можно применять в среде с множеством AS и рассмотрено несколько вариантов организации multi-AS L2VPN.

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе должны интерпретироваться в соответствии с [RFC2119]

2. Модель сигнального протокола

2.1. Идентификация конечных точек

В соответствии с [RFC4664] псевдопровод (pseudowire или PW) можно считать связью между двумя узлами пересылки (Forwarder). В простых экземплярах службы виртуальных частных проводов (Virtual Private Wire Service или VPWS) узел пересылки связывает псевдопровод в одним устройством подключения (Attachment Circuit или AC) так, что кадры, полученные одной стороной пересылаются на другую и наоборот. В услугах виртуальных частных ЛВС (Virtual Private LAN Service или VPLS) узел пересылки связывает набор псевдопроводов с набором AC и при получении кадра любым из элементов набора выполняется обращение к таблице MAC3-адресов (и выполнение различных процедур 802.1d) для определения элемента или элементов набора, которым пересылается кадр. В более сложных вариантах узлы пересылки могут связывать PW с PW, тем самым соединяя их. Это нужно для поддержки распределенных VPLS и некоторых вариантов обмена между автономными системами (AS).

В простой VPWS, где Forwarder связывает один PW в одни AC, узел пересылки можно указать через его AC. В простых VPLS узел пересылки можно идентифицировать по его устройству PE и VPN.

Для организации PW между парой Forwarder сигнальный протокол должен позволять узлу пересылки одной конечной точки идентифицировать Forwarder в другой точке. В [RFC4447] применяется термин «идентификатор присоединения» (Attachment Identifier или AI) для указания элемента, идентифицирующего Forwarder. В [RFC4667] для этого же служит термин «идентификатор узла пересылки» (Forwarder Identifier). В этом документе применяются оба термина.

[RFC4447] задаёт два элемента классов эквивалентности пересылки (Forwarding Equivalence Class или FEC), которые можно использовать при организации псевдопроводов — это элементы PWid FEC и Generalized ID FEC. Элемент PWid FEC передаёт лишь один Forwarder identifier и может применяться лишь при использовании обоими узлами пересылки одного идентификатора, который можно представить 32-битовым значением. Элемент Generalized ID FEC передаёт два Forwarder identifier, по одному для каждого из соединённых узлов пересылки. Каждый идентификатор называют AI и сигнальное сообщение содержит идентификаторы источника (Source Attachment Identifier или SAI) и цели (Target Attachment Identifier или TAI).

Элемент Generalized ID FEC обеспечивает дополнительное структурирование идентификаторов. Предполагается, что SAI и TAI иногда будут иметь общую часть, называемую идентификатором группы присоединения (Attachment Group Identifier или AGI) так, что SAI и TAI могут быть конкатенацией AGI с соответствующим индивидуальным идентификатором присоединения (Attachment Individual Identifier или AII). Таким образом, пара идентификаторов представляется 3 полями: AGI, Source AII (SAII), Target AII (TAII). SAI будет конкатенацией AGI и SAII, TAI — AGI и TAII.

[RFC4667] позволяет использовать один или два Forwarder Identifier для организации псевдопроводов. При использовании одного Forwarder Identifier в сигнальных сообщениях L2TP предполагается одно значение у исходного и целевого узла пересылки. Если два Forwarder Identifier передаются в сигнальных сообщениях L2TP, каждый Forwarder использует локально значимый идентификатор.

Forwarder Identifier в [RFC4667] является эквивалентом Attachment Identifier из [RFC4447]. Forwarder Identifier состоит из идентификатора группы присоединения (AGI) и индивидуального идентификатора подключения (AII). В отличие от элемента Generalized ID FEC, AGI и AII передаются в разных парах «атрибут-значение» L2TP (Attribute-Value Pair или AVP). AGI кодируется в AGI AVP, а SAII и TAII в Local End ID AVP и Remote End ID AVP, соответственно. Forwarder Identifier источника является конкатенацией AGI и SAII, Forwarder Identifier цели — конкатенацией AGI и TAII.

В приложениях, группирующих PW в Layer 2 Virtual Private Network, AGI можно считать VPN Identifier.

Следует отметить, что хотя разные узлы пересылки поддерживают различные приложения, тип приложения (например, VPLS или VPWS) не всегда можно вывести из идентификаторов узлов пересылки. Маршрутизатор, получающий сигнальное сообщение с конкретным TAI, должен иметь возможность определить, какой из локальных узлов пересылки указывается данным TAI, и определить приложение, представляемое этим узлом пересылки. Но другие узлы могут быть не в состоянии определить приложение, просто просматривая сигнальные сообщения.

В этом документе предлагается некая дополнительная структура AGI и AII для ряда приложений L2VPN. Отметим, что [RFC4447] задаёт структуру TLV для полей AGI и AII. Таким образом, оператор, выбравший определённую здесь структуру AII, может также применять другие типы AGI или AII, если он хочет использовать иную структуру для этих идентификаторов для некоторых других приложений. Например, можно использовать тип длинного префикса [RFC5003] для обеспечения возможности передачи административных данных, возможно, с сочетании со сведениями, полученными при автоматическом обучении.

2.2. Создание одностороннего псевдопровода

При любой форме сигнализации на основе LDP каждая конечная точка PW должна инициировать создание одностороннего LSP. Пара таких LSP образует PW. В большинстве моделей предоставления L2VPN две конечных точки данного PW могут одновременно инициировать сигнализацию для псевдопровода. Поэтому им нужен способ определить, когда данная пара LSP предназначена для объединения в PW. Такой способ отличается в разных службах и моделях предоставления L2VPN, а детали представлены в последующих параграфах.

Сигнализация L2TP по своей природе организует двухстороннюю сессию, создающую PW между двумя конечными точками. Эти точки также могут одновременно инициировать сигнализацию для данного PW. Возможна организация между парой узлов пересылки двух PW. Чтобы избежать организации дублированных псевдопроводов между узлами Forwarder, каждый узел PE должен быть способен независимо обнаруживать такую связь между псевдопроводами. Процедуры обнаружения описаны в [RFC4667].

2.3. Идентификаторы присоединения и узлы пересылки

С каждым узлом Forwarder в PE должен быть связан идентификатор присоединения (AI) путём настройки или использования некого алгоритма. AI должны быть уникальными в контексте маршрутизатора PE, на котором размещается Forwarder. Комбинация <маршрутизатор PE, AI> должна быть уникальна в глобальном масштабе.

Как указано в [RFC4447], AI может состоять из группового (AGI) и индивидуального (AII) идентификаторов подключения. В контексте этого документа AGI можно рассматривать как VPN-ID или некий иной атрибут, общий для всех устройств присоединения, которым разрешено подключение.

Иногда полезно рассматривать устройства присоединения на одном PE как относящиеся к общему пулу. Например, набор устройств присоединения, подключающих отдельное устройство CE к данному PE можно считать пулом. Применение пулов рассмотрено в параграфе 3.3. Пулы с окрашиванием — полная связность псевдопроводов P2P.

Детали создания полей AGI и AII, указывающих конечные точки псевдопроводов в различных моделях предоставления, рассматриваются ниже.

Можно считать, что LSP для одного направления псевдопровода идентифицируется набором

<PE1, <AGI, AII1>, PE2, <AGI, AII2>>

а LSP двух противоположных направлений набором

<PE2, <AGI, AII2>, PE1, <AGI, AII1>>

Псевдопровод является парой таких LSP. При использовании сигнализации L2TP это относится к двум направлениям сессии L2TP.

Когда сигнальное сообщение передаётся от PE1 к PE2 и PE1 нужно указать, что AI для настройки является одно из его устройств присоединения (или пулов), AI называют идентификатором присоединения источника (SAI). Если PE1 нужно указать, что AI для настройки является одно из устройств присоединения (или пулов) PE2, AI называют идентификатором присоединения цели (TAI). SAI относится к одной конечной точке, а TAI — к другой (удалённой).

В сигнальном протоколе определяется кодирование трёх указанных ниже полей.

  • Групповой идентификатор присоединения (Attachment Group Identifier или AGI).

  • Индивидуальный идентификатор присоединения источника (Source Attachment Individual Identifier или SAII).

  • Индивидуальный идентификатор присоединения цели (Target Attachment Individual Identifier или TAII).

Если поле AGI не пусто (non-null), SAI состоит из AGI и SAII, а TAI — из AGI и TAII. При пустом AGI в качестве SAI и TAI выступают SAII и TAII, соответственно.

Цель состоит в том, чтобы узел PE, получающий сообщение LDP Label Mapping или L2TP Incoming Call Request (ICRQ) с TAI, был способен однозначно сопоставить TAI с одним из своих устройств присоединения (или пулов). Способ сопоставления следует задавать локально (включая использование для этого части или всех байтов TAI). В части процедур сигнализации TAI на деле представляет собой просто строку байтов (cookie).

3. Применение

В этом разделе указано, как применяется сигнализация псевдопроводов с использованием обозначения исходного и целевого узла пересылки для различных приложений. Для некоторых из них указываются способы применения различных моделей предоставления. Однако описания не являются исчерпывающими.

3.1. Индивидуальные псевдопровода «точка-точка»

Заданная в этом документе сигнализация может служить для организации индивидуально предоставляемых псевдопроводов «точка-точка». В этом случае каждый узел пересылки связывает один PW с одним устройством присоединения. Каждый узел PE должен предоставляться с необходимым набором устройств присоединения, а затем этим устройствам должны предоставляться некоторые параметры.

3.1.1. Модели предоставления

3.1.1.1. Двухстороннее предоставление

В этой модели устройство присоединения должно обеспечиваться локальным именем, адресом удалённого PE и удаленным именем. При сигнализации локальное имя передаётся как SAII, удалённое — как TAII, а AGI остаётся пустым. Если два устройства присоединения подключены к PW, локальное имя одного должно быть удаленным именем для другого.

Отметим, что при совпадении локального и удалённого имени можно применять элемент PWid FEC вместо элемента Generalized ID FEC в сигнализации на основе LDP.

При сигнализации L2TP локальное имя передаётся в Local End ID AVP, удалённое — в Remote End ID AVP. AGI AVP использовать необязательно и при наличии оно содержит значение AGI нулевого размера. Если локальное имя совпадает с удаленным, Local End ID AVP можно не включать в сигнальные сообщения L2TP.

3.1.1.2. Одностороннее предоставление с обнаружением

В этой модели каждое устройство присоединения должно иметь локальное имя. Имя состоит из VPN-ID (передаётся как AGI) и идентификатора AII, который уникален в рамках AGI. Если два устройства присоединения связаны PW, лишь одному из них требуется удалённое имя (локальное имя другого устройства). Ни одному из них не требуется адрес удалённого PE, но оба должны иметь одно значение VPN-ID.

В рамках процедуры автоматического обнаружения каждый узел PE анонсирует свою пару <VPN-id, local AII> и каждый PE сравнивает свою пару <VPN-id, remote AII> с парами <VPN-id, local AII>, анонсируемыми другими PE. Если у PE1 имеется пара <VPN-id, remote AII> со значением <V, fred>, а у PE2 — <VPN-id, local AII> с <V, fred>, PE1 сможет понять, что ему нужно соединиться с PE2. При сигнализации узел будет использовать значение fred для TAII и V для AGI. Локальное имя PE1 для устройства присоединения передаётся как SAII.

Основное преимущество этой модели по сравнению с двухсторонним предоставлением заключается в том, что она позволяет переносить устройство присоединения от одного PE к другому без перенастройки удалённой конечной точки. Однако по сравнению с подходом, описанным в параграфе 3.3. Пулы с окрашиванием — полная связность псевдопроводов P2P, эта модель сильнее загружает механизм обнаружения, поскольку каждое имя устройства присоединения должно анонсироваться отдельно (имена устройств присоединения в этой схеме не объединяются).

3.1.2. Сигнализация

Сигнализация на основе LDP следует процедурам, заданным в [RFC4447], т. е. один узел PE (PE1) передаёт сообщение Label Mapping другому PE (PE2) для организации LSP в одном направлении. Если сообщение успешно обработано и ещё нет LSP для псевдопровода в обратном направлении (PE1->PE2), PE2 передаёт сообщение Label Mapping узлу PE1.

В дополнение к процедурам [RFC4447] при получении узлом PE сообщения Label Mapping с указанием в TAI конкретного устройства присоединения, настроенного на привязку к PW «точка-точка» должны быть выполнены указанные ниже проверки.

Если устройство присоединения уже связано с псевдопроводом (включая случай наличия лишь одного из двух LSP) и удалённой конечной точкой является не PE1, PE2 передаёт PE1 сообщение Label Release со Status Code, указывающим, что устройство присоединения связано с другим PE, и обработка сообщения Mapping завершается.

Если устройство присоединения уже связано с псевдопроводом (включая случай наличия лишь одного из двух LSP) и AI на PE1 отличается от заданного в полях AGI/SAII сообщения Mapping, PE2 передаёт PE1 сообщение Label Release со Status Code, указывающим, что устройство присоединения связано с другим удаленным устройством присоединения, и обработка сообщения Mapping завершается.

Когда PE при использовании сигнализации на основе L2TP получает сообщение ICRQ и TAI указывает конкретное устройство присоединения, настроенное на привязку к PW «точка-точка», выполняются указанные ниже проверки.

Если устройство присоединения уже связано с псевдопроводом и удалённой конечной точкой является не PE1, PE2 передаёт PE1 сообщение Call Disconnect Notify (CDN) со Status Code, указывающим, что устройство присоединения связано с другим PE, и обработка сообщения ICRQ завершается.

Если устройство присоединения уже связано с псевдопроводом, но тот привязан к Forwarder на PE1 с AI, отличающимся от указанного в полях SAI сообщения ICRQ, PE2 передаёт PE1 сообщение CDN со Status Code, указывающим, что устройство присоединения связано с другим удаленным устройством присоединения, и обработка сообщения ICRQ завершается.

Указанные ошибки могут быть результатом некорректной конфигурации.

3.2. Виртуальные частные ЛВС

В VPLS [RFC4762] устройства присоединения можно считать интерфейсами ЛВС, подключёнными к «виртуальным коммутаторам ЛВС» или, в терминологии [RFC4664], к «экземплярам виртуальной коммутации» (Virtual Switching Instance или VSI). Каждый узел Forwarder является VSI, подключённым к множеству PW и множеству устройств присоединения. Служба VPLS требует создания одного псевдопровода между каждой парой VSI в одной сети VPLS. Каждое устройство PE может иметь несколько VSI, каждый из которых относится к своей VPLS.

3.2.1. Предоставление

У каждой сети VPLS должен быть глобально уникальный идентификатор, который в [RFC4762] назван VPLS identifier (или VPLS-id). На каждом VSI должен быть указан идентификатор VPLS-id сети VPLS, к которой он относится.

У каждого VSI должен быть уникальный идентификатор, который называется VSI-ID. Идентификатор может создаваться автоматически конкатенацией VPLS-id и IP-адреса его маршрутизатора PE. Отметим, что адрес PE здесь служит лишь формой уникального идентификатора и провайдер может выбрать иную схему нумерации, коль скоро она обеспечивает уникальность каждого идентификатора VSI в рамках экземпляра VPLS. В параграфе 4.4 рассматривается назначение идентификаторов при наличии нескольких провайдеров.

3.2.2. Автоматическое обнаружение

3.2.2.1. Автоматическое обнаружение на основе BGP

В этом параграфе описано применение BGP для обнаружения информации, требуемой при создании экземпляров VPLS. При автоматическом обнаружении на основе BGP для VPLS идентификаторами AFI/SAFI [RFC4760] являются:

  • AFI (25) для L2VPN (как для всех схем L2VPN);

  • SAFI (65) конкретно для службы L2VPN, псевдопровода которой организованы по процедурам, описанным в этом документе.

Назначение AFI/SAFI рассматривается в разделе 6. Взаимодействие с IANA.

Для автоматического обнаружения на основе BGP нужен хотя бы один глобально уникальный идентификатор, связанный с VPLS, и такие идентификаторы должны быть представимыми в форме 8-байтовых различителей маршрутов (Route Distinguisher или RD). Подойдёт любой метод назначения одного или нескольких уникальных идентификаторов VPLS и представления каждого в форме RD (с использованием кодирования из [RFC4364]).

Для каждого экземпляра VSI требуется уникальный идентификатор, кодируемый в форме BGP NLRI4. Он формируется путём добавления RD (см. выше) перед IP-адресом PE, содержащего VSI. Отметим, что этот адрес служит лишь легко доступным уникальным идентификатором VSI в сети VPN и не обязан быть маршрутизируемым в глобальном масштабе, но должен быть уникальным внутри экземпляра VPLS. При желании можно применять иную схему назначения уникальных идентификаторов для каждого VSI внутри экземпляра VPLS (например, нумерация VSI в одной сети VPN от 1 до n).

При использовании описанных в этом документе процедур требуется назначить один глобально уникальный идентификатор VPLS-id для каждого экземпляра VPLS [RFC4762]. Этот идентификатор должен кодироваться в форме расширенной группы BGP (Extended Community) [RFC4360]. Как указано в разделе 6. Взаимодействие с IANA, этот документ определяет два субтипа Extended Community, которые должны быть переходными.

Первым субтипом расширенной группы является 2-октетное значение AS Specific Extended Community, вторым — IPv4 Address Specific Extended Community. Их кодирование задано в [RFC4360] и обеспечивает сервис-провайдерам возможность выделять VPLS-id без риска возникновения конфликтов с другими провайдерами. Однако следует отметить, что для межпровайдерских L2VPN требуется координация VPLS-id, как описано в параграфе 4.4. Назначение RT и RD.

Каждый экземпляр VSI необходимо связать с одной или несколькими расширенными группами Route Target (RT). Это управляет распространением NLRI и поэтому будет контролировать формирование топологии псевдопроводов, образующих конкретную сеть VPLS.

Автоматическое обнаружение выполняется путём распространения каждым PE по протоколу BGP данных NLRI для каждого из своих VSI с указанием себя в качестве следующего интервала BGP (next hop) и подходящего RT для каждого NLRI. Обычно каждый узел PE будет клиентом небольшого числа рефлекторов BGP, которые будут распространять эти сведения другим клиентам.

Если PE получает обновление BGP, в котором отсутствуют какие-либо из указанных выше элементов, такое обновление следует игнорировать.

Если у PE имеется VSI с определенным RT, он может импортировать все NLRI с тем же RT и узнать из атрибута BGP next hop в этих NLRI адреса IP других маршрутизаторов PE, имеющих VSI с тем же RT. Для этого применимо использование маршрутных рефлекторов, описанное в параграфе 4.3.3 [RFC4364].

Если конкретная сеть VPLS предназначена для использования в качестве одной полностью подключённой ЛВС, все её VSI будут иметь общую цель RT и в этом случае RT может (но не обязательно) быть кодированием VPN-id. Экземпляр VSI можно разместить в нескольких VPLS, назначая ему несколько RT.

Отметим, что можно создать иерархическую VPLS, назначая несколько RT некоторым из VSI, механизм RT обеспечивает полный контроль над перекрытием псевдопроводов, входящих в топологию VPLS.

При реализации распределенной VPLS (параграф 3.5. Распределенные VPLS) в автоматическом обнаружении на основе BGP участвуют лишь обращенные в сеть PE (Network-facing PE или N-PE). Это значит, что N-PE должны анонсировать доступность каждому поддерживаемому VSI, включая на обращенные к пользователю PE (User-facing PE или U-PE), с которыми они соединены. Для создания виртуального идентификатора каждому VSI можно использовать IP-адрес каждого U-PE в комбинации с RD экземпляра VPLS.

Таким образом, анонс BGP для отдельного VSI на данном PE будет включать:

  • NLRI с AFI = L2VPN, SAFI = VPLS в форме RD:PE_addr;

  • loopback-адрес PE в качестве BGP next hop;

  • Extended Community Attribute с VPLS-id;

  • Extended Community Attribute с одним или несколькими RT.

Значения AFI и SAFI рассмотрены в разделе 6. Взаимодействие с IANA. Формат NLRI представлен ниже.

+------------------------------------+
|  Length (2 октета)                 |
+------------------------------------+
|  Route Distinguisher (8 октетов)   |
+------------------------------------+
|  PE_addr (4 октета)                |
+------------------------------------+

Отметим, что этот анонс похож на формат NLRI, определённый в [RFC4761], а основное отличие состоит в том, что [RFC4761] включает в NLRI блок меток. Взаимодействие между определённой здесь схемой VPLS и схемой [RFC4761] выходит за рамки этого документа.

3.2.3. Сигнализация

Необходимо создавать идентификаторы присоединения, указывающие VSI. В предыдущем параграфе указано кодирование VSI-ID как RD:PE_addr, и передача VPLS-id в BGP Extended Community. Здесь описано кодирование этой информации для сигнальных процессов. VPLS-id помещается в поле AGI, а PE_addr (точнее, VSI-ID из NLRI в BGP без RD) — в поле TAII. Комбинации AGI и TAII достаточно для полного указания VSI, к которому подключён данный псевдопровод в средах с одной или несколькими автономными системами (AS). Для SAII передающее устройство PE должно устанавливать значение PE_addr (точнее, VSI-ID без RD экземпляра VSI, связанного с данной сетью VPLS в передающем PE), чтобы включить при необходимости сигнализацию обратной половины (направления) PW.

Структура полей AGI и AII для Generalized ID FEC в LDP задана в [RFC4447]. Поле AGI в этом случае содержит Type = 1, размер 8 и поле VPLS-id размером 8 байтов. Поля AII содержат Type = 1, размер 4 и адрес или иной идентификатор PE размером 4 байта. Назначение типа AGI и AII описано в разделе 6. Взаимодействие с IANA.

Кодирование AGI и AII в L2TP описано в [RFC4667].

Отметим, что этот метод не позволяет организовать более одного PW на пару VSI.

3.2.4. Псевдопровода как устройства присоединения VPLS

Можно использовать этот метод для организации PW, подключённого одним концом к VSI, а другим — к конечной точке на устройстве присоединения. На данном VSI может быть множество PW, которые нужно различать, поэтому каждый псевдопровод (PW) должен иметь значение SAII, уникальной для VSI-ID.

3.3. Пулы с окрашиванием — полная связность псевдопроводов P2P

Модель пулов с окрашиванием (Colored Pools) обеспечивает автоматизированный способ предоставления услуг VPWS. В этой модели каждое устройство PE может включать несколько пулов устройств присоединения, каждый из которых связан со своей VPN. PE может включать несколько пулов VPN, поскольку каждый пул может соответствовать своему устройству CE. Может быть желательно создание одного псевдопровода между каждой парой пулов в одной VPN и результатом станет создание полносвязной (full mesh) сети виртуальных устройств CE-CE для каждой VPN.

3.3.1. Предоставление

Каждый пул настраивается и связывается с:

  • набором устройств присоединения;

  • «цветом», который можно считать неким идентификатором VPN-id;

  • относительным идентификатором пула, который уникален в рамках данного цвета.

Примечание. В зависимости от технологии, применяемой для устройств присоединения (AC), может потребоваться предоставление таких устройств. Например, если AC являются устройствами трансляции кадров (frame relay), может существовать отдельная система предоставления таких устройств. «Предоставление» AC может быть столь же простым, как выделение неиспользуемого VLAN ID на интерфейсе и указание его клиенту. Это не зависит от описанных в документе процедур.

Идентификатор пула и цвет совместно задают глобально уникальный идентификатор для пула. При наличии n пулов данного цвета их идентификаторами могут быть числа от 1 до n, но это не обязательно.

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

Если каждый пул является набором AC, ведущих к одному устройству CE, связность L2 между CE контролируется тем же способом, каким выделяются цвета для пулов. Для создания полной связности «цвет» будет просто VPN-id.

Можно настроить отдельное устройство присоединения с относительным идентификатором удалённого пула. Затем AC привязывается к определённому псевдопроводу, только когда удалённый конец PW является пулом с относительным идентификатором. В этом случае пары устройств AC всегда будут связаны псевдопроводами.

3.3.2. Автоматическое обнаружение

3.3.2.1. Автоматическое обнаружение на основе BGP

В этом параграфе описано, как можно использовать протокол BGP для обнаружения сведений, требуемых при создании экземпляров VPWS. При использовании автоматического обнаружения на основе BGP для VPWS поля AFI/SAFI имеют указанные ниже значения.

  • Значение AFI, заданное IANA для L2VPN (как и для всех схем L2VPN).

  • Значение SAFI, выделенное IANA специально для служб L2VPN, где псевдопровода создаются с использованием описанных в этом документе процедур.

Назначение AFI/SAFI рассматривается в разделе 6. Взаимодействие с IANA.

Для автоматического обнаружения на основе BGP с экземпляром VPWS должен быть связан хотя бы один уникальный идентификатор. Каждый из таких идентификаторов должен быть представим как RD (отличитель маршрута). Глобально уникальный идентификатор пула должен быть представим как NLRI, идентификатор пула, определённый как 4-байтовое значение, добавляется в конец RD для создания NLRI.

При использовании описанных в этом документе процедур необходимо назначить один уникальный в глобальном масштабе идентификатор каждому экземпляру VPWS. Этот идентификатор должен быть представим в виде BGP Extended Community [RFC4360]. Как указано в разделе 6, этот документ определяет для этого два субтипа Extended Community. Расширенные группы (Extended Community) должны быть переходными.

Первый субтип Extended Community является Two-octet AS Specific Extended Community, второй — IPv4 Address Specific Extended Community. Их кодирование определено в [RFC4360] и обеспечивает сервис-провайдерам возможность выделять идентификаторы VPWS без риска конфликтов с другими провайдерами. Однако следует отметить, что согласование идентификаторов VPWS требуется при создании межпровайдерских L2VPN, описанных в параграфе 4.4.

Каждый пул также должен быть связан со значением RT (цель маршрута), которое может также представлять цвет. Если желаемая топология является полносвязной сетью псевдопроводов, все пулы будут иметь одно значение RT. Другие варианты топологии рассмотрены в параграфе 3.4. Пулы с окрашиванием — частичная связность.

Автоматическое обнаружение основано на распространении каждым PE (через BGP) сведений NLRI для каждого из своих пулов с указанием себя как BGP и кодированием цвета пула в RT. Если у данного PE имеется пул с конкретным цветом (RT), он должен получать через BGP все NLRI с тем же цветом (RT). Обычно каждый PE является клиентом небольшого числа маршрутных рефлекторов BGP, которые будут распространять эти сведения другим клиентам.

Если PE получает обновление BGP, в котором отсутствует какой-либо из указанных выше элементов, обновление следует игнорировать.

Если у PE есть пул определённого цвета, он может получать все NLRI с тем же цветом а из атрибута BGP next hop в NLRI узнает адреса IP других маршрутизаторов PE, у который имеются пулы того же цвета. Он узнает также уникальный идентификатор каждого из этих удалённых пулов, поскольку он представлен в NLRI. Относительный идентификатор удалённого пула можно извлечь из NLRI и применять для сигнализации, как указано ниже.

Таким образом, анонс BGP для определённого пула устройств присоединения на данном PE будет содержать:

  • NLRI с AFI = L2VPN, SAFI = VPLS в форме RD:pool_num;

  • BGP next hop с loopback-адресом PE;

  • Extended Community Attribute с идентификатором VPWS;

  • Extended Community Attribute с одним или несколькими RT.

Значения AFI и SAFI приведены в разделе 6. Взаимодействие с IANA.

3.3.3. Сигнализация

Сигнализация на основе LDP следует процедурам, заданным в [RFC4447], т. е. узел PE (PE1) передаёт сообщение Label Mapping другому PE (PE2) для организации LSP в одном направлении. Адресом PE2 является адрес next-hop, полученный от BGP, как описано выше. Если сообщение успешно обработано и ещё нет LSP для псевдопровода в обратном направлении (PE1->PE2), PE2 передаёт сообщение Label Mapping узлу PE1. Сигнализация на основе L2TPv3 следует процедурам [RFC4667]. Детали использования протоколов сигнализации приведены ниже.

Когда PE отправляет сообщение Label Mapping или ICRQ для организации PW между двумя пулами, идентификатор VPWS (распространяемый BGP в Extended Community Attribute) кодируется как AGI, относительный идентификатор локального пула — как SAII, а относительный идентификатор удалённого пула — как TAII.

Структура полей AGI и AII для Generalized ID FEC в LDP задана в [RFC4447]. Поле AGI в этом случае включает Type = 1, размер 8 и идентификатор VPWS (8 байтов). TAII включает Type = 1, размер 4 и номер удалённого пула (4 байта). SAII включает Type = 1, размер 4 и номер локального пула (4 байта. Назначение типов AGI и AII описано в разделе 6. Взаимодействие с IANA. Отметим, что заданные в этом документе процедуры VPLS и VPWS могут применять те же типы AGI (1) и AII (1).

Кодирование AGI и AII в L2TP задано в [RFC4667].

Когда PE2 получает сообщение Label Mapping или ICRQ от PE1, а TAI указывает пул и уже есть псевдопровод, связывающий устройство присоединения этого пуля с устройством присоединения на PE1, а AI на PE1 этого псевдопровода совпадает с SAI из сообщения Label Mapping или ICRQ, узел PE2 передаёт сообщение Label Release или CDN узлу PE1 со Status Code, указывающим, что устройство присоединения уже связано с удаленным устройством присоединения. Это предотвращает создание множества псевдопроводов между данной парой пулов.

Отметим, что сама сигнализация идентифицирует лишь удалённый пул, к которому ведёт псевдопровод, а не удалённое устройство присоединения, связанное с псевдопроводом. Однако удалённый узел PE может проверить поле SAII для определения устройства присоединения, связанного с псевдопроводом.

3.4. Пулы с окрашиванием — частичная связность

Процедуры создания сети псевдопроводов без полной связности (partial mesh) между окрашенныеми пулами, по существу такие же, как при организации полной связности, и отличаются лишь в нескольких аспектах.

  • Для каждого пула можно задать наборы «импортируемых RT» и экспортируемых RT».

  • В процессе автоматического обнаружения на основе BGP цвет пула по-прежнему кодируется в RD, но если в пуле задан набор «экспортируемых RT», они представляются в RT сообщений BGP Update вместо цвета.

  • Если пул имеет экспортируемый RT со значением X, будет создаваться PW с каждым другим пулом, имеющим X в одном из своих экспортируемых RT. Сигнальные сообщения и процедуры соответствуют параграфу 3.3.3. Сигнализация.

В качестве простого примера рассмотрим задачу создания топологии «звезда» (hub-and-spoke) с одним хабом. Один пул (хаб) настраивается с экспортируемым RT_hub и импортируемым RT_spoke. Все остальные пулы (лучи) настраиваются с экспортирумым RT_spoke и импортируемым RT_hub. Таким образом, пул хаба соединяется с лучами и наоборот, но пулы лучей не соединяются между собой.

3.5. Распределенные VPLS

В Distributed VPLS ([RFC4664]) функциональность VPLS узла PE делится между двумя системами — U-PE и N-PE, U-PE размещается между пользователем и N-PE. Функциональность VSI (например, изучение MAC и функции моста) реализуется в U-PE. К N-PE может быть подключено несколько U-PE. Для каждой VPLS, поддерживаемой U-PE, обеспечивается псевдопровод к каждому из других U-PE той же VPLS. Однако U-PE не поддерживает управляющие сигнальные сообщения с другими, а вместо этого имеет лишь одно сигнальное соединение со своим N-PE. По сути, каждый псевдопровод между U-PE состоит из 3 псевдопроводов, соединённых вместе — от U-PE к N-PE, от N-PE к N-PE и от N-PE к U-PE. В терминологии [RFC5659] N-PE выполняют функцию коммутации псевдопроводов для организации многосегментных PW между U-PE.

Рассмотрим в качестве примера показанную на рисунке топологию, где 4 U-PE имеют общую сеть VPLS.

           U-PE A-----|             |----U-PE C
                      |             |
                      |             |
                    N-PE E--------N-PE F
                      |             |
                      |             |
           U-PE B-----|             |-----U-PE D

Покажем, как PW соединяются между собой в приведённой выше топологии для организации требуемых псевдопроводов от U-PE A к другим U-PE.

Имеется 3 PW от A к E. Обозначим их A-E/1, A-E/2, A-E/3. Для правильного подключения A к другим U-PE, нужны 2 PW от E к F (E-F/1 и E-F/2), 1 PW от E к B (E-B/1), 1 от F к C (F-C/1) и 1 от F к D (F-D/1).

N-PE должны затем «срастить» эти псевдопровода, чтобы получить эквивалент механизма нераспределенной сигнализации VPLS:

  • PW от A к B: A-E/1 сращивается с E-B/1.

  • PW от A к C: A-E/2 сращивается с E-F/1, а тот — с F-C/1.

  • PW от A к D: A-E/3 сращивается с E-F/2, а тот — с F-D/1.

Неважно, какие PW сращиваются, пока результат даёт псевдопровода от A в B, C и D.

Аналогично требуется срастить дополнительные PW для подобающего соединения U-PE B с U-PE C и D, а также U-PE C с U-PE D.

На рисунке ниже показаны PW от A к C и от B к D. Для простоты остальные 4 PW опущены.

                      Точки сращивания
                       |           |
                       V           V
      A-C PW    <-----><-----------><------>


           U-PE A-----|             |----U-PE C
                      |             |
                      |             |
                    N-PE E--------N-PE F
                      |             |
                      |             |
           U-PE B-----|             |-----U-PE D


      B-D PW    <-----><-----------><------>
                       ^           ^
                       |           |
                      Точки сращивания

Можно видеть, что распределенная VPLS не сокращает число PW на U-PE, но снижает число управляющих соединений на U-PE. Следует ли это делать, зависит от того, где находится узкое место (bottleneck).

3.5.1. Сигнализация

Сигнализацию для поддержки Distributed VPLS можно реализовать с помощью описанных здесь механизмов. Однако процедуры для VPLS (3.2.3. Сигнализация) требуют дополнительных механизмов, обеспечивающих приемлемое число PW между разными N-PE и U-PE, а также между N-PE.

На данном N-PE подключённые напрямую U-PE данной VPLS можно пронумеровать от 1 до n. Эти номера указывают U-PE для конкретных VPN-id и N-PE (т. е. для однозначного указания U-PE нужно знать N-PE, VPN-id и номер U-PE).

В результате настройки/обнаружения каждому U-PE должен быть предоставлен список пар <j, IP-адрес>. Каждый элемент этого списка указывает U-PE настроить j псевдопроводов к указанному адресу IP. Когда U-PE передаёт сигнал N-PE, для AGI устанавливается подобающий идентификатор VPN-id, для SAII — номер PW, а для TAII — null.

В приведённом выше примере U-PE A будет передано <3, E> для организации 3 PW к E. При сигнализации A установит для AGI подходящее значение VPN-id, а для SAII — значение 1, 2 или 3 (номер PW, для которого передаётся сигнал).

В результате настройки/обнаружения каждому N-PE должны быть предоставлены указанные ниже сведения для каждой VPLS.

  • «Локальный» список {<j, IP-адрес>}, где каждый элемент задаёт организацию j псевдопроводов к локально подключённому U-PE по указанному адресу. Число элементов в этом списке (n) будет число локально подключённых U-PE в этой сети VPLS. В приведённом выше примере E будет передан локальный список {<3, A>, <3, B>}, задающий организовать по 3 PW к A и B.

  • Локальная нумерация U-PE для конкретной сети VPLS и определённого N-PE. В приведённом выше примере E можно было бы указать, что U-PE A имеет номер 1, а U-PE B — 2.

  • «Удалённый» список {<IP-адрес, k>}, задающий организацию k псевдопроводов для каждого U-PE к указанному адресу IP. Каждый из IP-адресов указывает N-PE, а k — число U-PE на N-PE, входящих в VPLS. В приведённом выше примере E получит удалённый список {<2, F>}. Поскольку N-PE E имеет 2 U-PE, это задаёт создание 4 PW к N-PE F, по 2 для каждого из U-PE узла N-PE E.

Сигнализация PW от N-PE к U-PE основана на локальном списке и локальной нумерации U-PE. При передаче сигнализации определённого PW от N-PE к U-PE для AGI устанавливается подходящее значение VPN-id, SAII пусто (null), а для TAII устанавливается номер PW (для конкретных VPLS и U-PE). В приведённом выше примере при передаче сигнала от E к A для TAII будет устанавливаться значение 1, 2 или 3 в соответствии с тремя PW, которые нужно организовать к A. Аналогичным способом передаются 3 PW для B.

LSP, передаваемые от U-PE к N-PE, связаны с LSP от N-PE к U-PE обычным способом. PW между U-PE и N-PE называют U-PW.

Сигнализация соответствующего набора PW от N-PE к N-PE основана на удалённом списке. Все PW между N-PE можно считать эквивалентными. Пока установлено корректное число PW, N-PE могут сращивать эти PW с подходящими U-PW. Сигнализация корректного числа PW от N-PE к N-PE основана на удалённом списке, который задаёт число организуемых PW к конкретному удалённому N-PE на локальный U-PE.

При сигнализации конкретного PW от N-PE к N-PE для AGI устанавливается подходящее значение VPN-id. TAII указывает удалённый узел N-PE, как в нераспределенном случае, т. е. содержит IP-адрес удалённого N-PE. При наличии n таких PW, они различаются значениями SAII. Для поддержки множества значений SAII в одной сети VPLS передающему N-PE требуется столько VSI-ID, сколько у него U-PE. Как отмечено в параграфе 3.2.2, это можно обеспечить, например, использованием IP-адреса каждого подключённого U-PE. PW между N-PE называют N-PW.

Каждый U-PW должен быть «срощен» с N-PW. Это делается на основе удалённого списка. Если этот список содержит элемент <i, F>, то i псевдопроводов U-PW от каждого локального U-PE должны быть сращены с i псевдопроводов N-PW от удалённого N-PE F. Не имеет значения, какие U-PW срощены с какими N-PW, пока это ограничение соблюдается.

Если N-PE имеет более одного локальной U-PE для данной VPLS, он должен также обеспечивать сращивание U-PW от каждого такого U-PE с U-PW от каждого из других U-PE.

3.5.2. Предоставление и обнаружение

Каждый N-PE должен предоставляться с набором поддерживаемых экземпляров VPLS, VPN-id для каждого из них и списком локальных U-PE для каждой из этих VPLS. В рамках процедуры обнаружения N-PE анонсирует число U-PE для каждой VPLS (см. 3.2.2. Автоматическое обнаружение).

Может применяться автоматическое обнаружение (например, через BGP) для всех других N-PE в VPLS и для каждого из них — числа U-PE, локальных для этого N-PE. Исходя из этого можно найти общее число U-PE в VPLS. Этих сведений достаточно для расчёта локального и удалённого списка каждого N-PE.

3.5.3. Нераспределенная VPLS как частный случай

Узел PE, обеспечивающий «нераспределенную VPLS» (PE в роли U-PE и N-PE сразу) может взаимодействовать с парами N-PE-U-PE, обеспечивающими распределенную VPLS. Такой PE просто анонсирует в процедуре обнаружения, что он имеет один локальный узел U-PE на VPLS. Такой PE, естественно, не поддерживает коммутации PW.

Если каждый узел PE в VPLS поддерживает нераспределенную VPLS, т. е. анонсирует себя как N-PE с одним локальным U-PE, результирующая сигнализация будет совпадать с описанной в параграфе 3.2.3. Сигнализация.

3.5.4. Сращивание и плоскость данных

Сращивание двух PW вместе достаточно просто в плоскости данных MPLS, поскольку перемещение пакета из одного PW напрямую в другой является простой операцией замены для метки PW. Когда PW состоит из двух или более срощенных PW, предполагается, что данные пойдут к узлу, где организовано сращивание, т. е. путь данных будет проходить через узлы, участвующие в сигнализации PW.

Дополнительные сведения о сращивании приведены в [RFC6073].

4. Работа в разных AS

Механизмы обеспечения, автоматического обнаружения и сигнализации, описанные выше, можно применить в среде с разными автономными системами (AS). Как и в [RFC4364], имеется много вариантов работы в такой среде.

4.1. Распределение L2VPN NLRI через несколько этапов EBGP

Этот вариант более всего похож на (c) из [RFC4364], т. е. применяется распространение EBGP (External BGP) через несколько интервалов (hop) для L2VPN NLRI между исходной и целевой AS с передачей по EBGP помеченных маршрутов IPv4 или IPv6 из данной AS в соседнюю.

Граничный маршрутизатор AS (Autonomous System Border Router или ASBR) должен поддерживать помеченные маршруты IPv4 /32 (или IPv6 /128) к маршрутизаторам PE в его AS. Он применяет EBGP для распространения этих маршрутов в другие AS, указывая в них себя как BGP next hop. Маршрутизаторы ASBR в любой транзитной AS также используют EBGP для передачи помеченных маршрутов /32 (или /128). Это ведёт к созданию набора путей с коммутацией по меткам от всех входных маршрутизаторов PE ко всем выходным маршрутизаторам PE. В результате маршрутизаторы PE в разных AS могут создавать многоэтапные (multi-hop) соединения EBGP между собой и обмениваться L2VPN NLRI через эти соединения. После такого обмена пары PE в разных AS могут организовать между собой сессии LDP для сигнализации PW.

Для VPLS анонсы BGP и сигнализация PW соответствуют параграфу 3.2. В результате создания многоэтапной сессии EBGP между исходной и целевой AS узлы PE в одной AS, имеющие VSI той или иной VPLS, будут обнаруживать PE в другой AS с теми же VSI из той же VPLS. Эти PEs смогут организовать подходящий сеанс протокола сигнализации PW и создать полную связность (full mesh) псевдопроводов VSI-VSI для построения сети VPLS, как описано в параграфе 3.2.3. Сигнализация.

Для VPWS анонсы BGP и сигнализация PW соответствуют параграфу 3.3. В результате создания многоэтапной сессии EBGP между исходной и целевой AS узлы PE в одной AS, имеющие пулы того или иного цвета (VPN) , будут обнаруживать PE в другой AS с пулами того же цвета. Эти PEs смогут организовать подходящий сеанс протокола сигнализации PW и создать полную связность (full mesh) псевдопроводов, как описано в параграфе 3.2.3. Сигнализация. Аналогичным путём можно создать частичную связность по процедурам параграфа 3.4.

Как и в L3 VPN, создание L2VPN, охватывающей сети нескольких провайдеров, требует некоторой координации использования RT и RD. Этот вопрос рассматривается в параграфе 4.4. Назначение RT и RD.

4.2. Распространение L2VPN NLRI для EBGP с многосегментными PW

Возможным недостатком подхода из предыдущего параграфа является организация сигнальных сессий PW между всеми PE в данной сети L2VPN (VPLS или VPWS). Это ведёт к потенциально большому числу сессий LDP или L2TPv3 через границу AS и участие в этих сеансах большого числа устройств внутри AS. В случае AS, относящихся к разным провайдерам, можно предположить, что провайдеры захотят сократить число сигнальных сессий через границы AS и ограничить число устройств, участвующих в этих сеансах. Кроме того, принудительное завершение сигнальных сессий LDP или L2TPv3 на меньшем количестве ASBR, позволит провайдеру применять стандартные процедуры аутентификации для меньшего числа межпровайдерских сессий. Эти опасения стали мотивом разработки предложенного ниже решения.

В [RFC6073] описан подход для «коммутации» пакетов из одного псевдопровода в другой на конкретном узле. Это позволяет создать сквозной, многосегментный псевдопровод из нескольких сегментов псевдопроводов без поддержки сквозного управляющего соединения. Здесь этот подход служит для работы в нескольких AS, подобно варианту (b) из [RFC4364].

В этой модели применяется распространение EBGP для L2VPN NLRI из AS в соседнюю AS. Сначала маршрутизаторы PE используют IBGP (Internal BGP) для распространения L2VPN NLRI маршрутизатору ASBR или рефлектору маршрутов, клиентом которого является ASBR. Затем ASBR использует EBGP для распространения этих L2VPN NLRI маршрутизатору ASBR в другой AS, который распространяет их маршрутизаторам PE в своей AS или другому ASBR, который, в свою очередь, распространяет их и т. д.

В этом случае PE может узнать адрес ASBR, через который доступен другой PE, с которым нужно организовать PW. Локальный local PE будет получать анонсы BGP с записью L2VPN NLRI, соответствующей экземпляру L2VPNЭ в котором локальный PE имеет подключённые элементы. BGP next-hop в L2VPN NLRI будет ASBR локальной AS. Затем вместо организации управляющего соединения с удаленным PE локальный PE создаст соединение с ASBR. После этого можно организовать сегмент псевдопровода от PE к ASBR. Маршрутизатор ASBR может создать PW к ASBR в следующей AS и срастить его с PW от PE, как описано в параграфе 3.5.4 и [RFC6073]. Повторение процесса на каждом ASBR создаёт цепочку сегментов PW, которые посре сращивания соединяют два PE.

Отметим, что в этом случае локальный PE может не узнать IP-адрес удаленного PE. Он знает L2VPN NLRI от удалённого PE, где может не быть адреса удалённого PE, и IP-адрес ASBR, который является BGP next-hop для NLRI.

Использование этого подхода для VPLS или полносвязной VPWS ведёт к полносвязной сети псевдопроводов между PE как и в предыдущем параграфе, но не требует полной связности для управляющих соединений (сессии LDP или L2TPv3). Вместо этого управляющие соединения внутри AS организуются между всеми PE этой AS и маршрутизаторами ASBR в ней. Одно управляющее соединение между ASBR смежных AS может служить для поддержки множества псевдопроводных сегментов между AS.

Отметим, что описанные здесь процедуры ведут к совмещению точек сращивания (PW Switching PE или S-PE) в терминологии [RFC5659]) с маршрутизаторами ASBR. Между данной парой AS возможно несколько соединений ASBR-ASBR и в этом случае PE может выбирать доступные ASBR на основе ряда критериев, таких как метрика IGP, локальная конфигурация и т. п., аналогично выбору точек выхода при обычно маршрутизации IP. Использование нескольких ASBR повышает отказоустойчивость (в масштабе времени схождения маршрутов BGP), поскольку PE может выбрать другой маршрутизатор ASBR при отказе используемого.

Как и в L3 VPN, создание L2VPN через сети нескольких провайдеров требует некоторой координации использования RT и RD. Этот вопрос рассмотрен в параграфе 4.4. Назначение RT и RD.

4.3. Межпровайдерское применение распределенной сигнализации VPLS

Дополнительный вариант межпровайдерского решения VPLS можно вывести из описанного выше подхода Distributed VPLS. Рассмотрим показанную на рисунке топологию.

   PE A --- Сеть 1 ----- Граничный ----- Граничный ----- Сеть 2 --- PE B
                       маршрутизатор 12  маршрутизатор 21  |
                                                           |
                                                         PE C

Здесь A, B и C являются PE в одной VPLS, а сети 1 и 2 принадлежат разным сервис-провайдерам. Граничный маршрутизатор 12 (BR12) соединяет сеть 1 с сетью 2, а граничный маршрутизатор 21 (BR21) — сеть 2 с сетью 1. Предположим, что PE не являются «распределенными», т. е. каждый выполняет функции U-PE и N-PE. В этой топологии нужны лишь 2 псевдопровода между провайдерами — A-B и A-C.

Предположим, что сервис-провайдер по какой-то причине решил, что он не хочет, чтобы каждый из его PE имел управляющее соединение с любыми PE в другой сети. Взамен он хочет организовать межпровайдерское управляющее соединение между парой граничных маршрутизаторов. Это можно реализовать, используя методы из параграфа 3.5, где PE ведут себя подобно U-PE, а BR — подобно N-PE. В этом примере PE A будет вести себя как U-PE, локально подключённый к BR12, PE B и C — как U-PE, подключённые локально к BR21, а оба BR — подобно N-PE.

В результате PW от A к B будет состоять из 3 сегментов — A-BR12, BR12-BR21, BR21-B. Граничные маршрутизаторы будут сращивать соответствующие сегменты псевдопроводов.

Это требует нумерации PE внутри VPLS от 1 до n.

4.4. Назначение RT и RD

Отметим, что для корректной работы в разных AS по любой из описанных выше процедур в AS должны применяться согласованные значения RT и RD, как в L3 VPN [RFC4364]. Структура RT и RD делает риск случайных конфликтов небольшим. Основная проблема заключается в том, что оператору одной AS нужно знать RT в другой AS, выбранные для любой VPN, имеющей сайты в обеих AS. Как и в L3 VPN, имеется много способов сделать это, но все они требуют координации между провайдерами. Например, провайдер A может пометить все NLRI для данной сети VPN одним RT, скажем, RT_A, а затем провайдер B может настроить PE, подключённые к сайтам этой VPN для импорта NLRI, содержащих это значение RT. Провайдер B может выбрать своё значение RT (RT_B), помечая все NLRI для этой VPN данным RT и тогда провайдер A может импортировать эти NLRI с RT в соответствующих PE. Однако это требует от провайдеров обменяться своими значениями RT для каждой VPN. Провайдеры могут также договориться об использовании общего RT для данной VPN. В любом случае важно обменяться значениями RT между провайдерами. Как и в L3 VPN, провайдеры могут настроить фильтрацию RT, чтобы через границу AS проходили только согласованные значения RT.

Отметим, что требуется один идентификатор VPN (передаётся в BGP Extended Community) для каждого экземпляра VPLS или VPWS. Правила кодирования этих идентификаторов [RFC4360] обеспчивают отсутствие конфликтов с другими провайдерами. Однако для одного экземпляра VPLS или VPWS, охватывающего сети двух или более провайдеров, один провайдер должен назначить идентификатор и сообщить его другим, а те должны использовать это значение для сайтов того же экземпляра VPLS или VPWS.

5. Вопросы безопасности

В этом документе рассмотрено множество моделей предоставления услуг L2VPN и заданы идентификаторы конечных точек, требуемые для поддержки каждой из предложенных моделей. Указано также, как эти идентификаторы конечных точек сопоставляются с полями протоколов автоматического обнаружения и сигнализации.

Вопросы безопасности, связанные с сигнальными протоколами, рассмотрены в спецификациях соответствующих протоколов ([RFC5036], [RFC4447], [RFC3931], [RFC4667]).

Вопросы безопасности автоматического обнаружения на основе BGP, в том числе для работы в разных AS, рассмотрены в [RFC4364]. L2VPN использующие автоматическое обнаружение на основе BGP, могут автоматизировать и установку механизмов защиты. Задание автоматизированных механизмов защиты выходит за рамки этого документа и рекомендуется для будущих работ.

Вопросы безопасности, связанные с конкретными услугами L2VPN. Рассмотрены в [RFC4664], [RFC4665] и [RFC4762].

Способ сопоставления идентификаторов конечных точек с полями протоколов не создаёт дополнительных проблем безопасности.

6. Взаимодействие с IANA

Агентство IANA выделило AFI и SAFI для L2VPN NLRI, имеющие те же значения, которые заданы в [RFC4761], т. е. AFI = 25 (L2VPN) и SAFI = 65 (уже выделено для VPLS). Одни значения AFI и SAFI применяются для автоматического обнаружения VPLS и VPWS, описанного в этом документе.

В [RFC4446] заданы реестры Attachment Group Identifier (AGI) Type и Attachment Individual Identifier (AII) Type. Тип 1 в каждом из реестров назначен для форматов AGI и AII, определённых в этом документе.

Агентство IANA выделило два новых кода статуса LDP. IANA уже поддерживает реестр STATUS CODE NAME SPACE, заданный в [RFC5036]. В нем выделены указанные ниже значения.

0x00000030 Устройство присоединения связано с другим PE
0x0000002D Устройство присоединения связано с другим удаленным AC

Зарегистрированы два новых L2TP Result Code для сообщений CDN. IANA поддерживает реестр L2TP Result Code Values for the CDN message, заданный в [RFC3438]. В нем выделены указанные ниже значения.

   27: Устройство присоединения связано с другим PE
   28: Устройство присоединения связано с другим удаленным AC

В [RFC4360] задан реестр Two-octet AS Specific Extended Community, в котором агентство IANA выделило значение из «переходного» диапазона (0x0000-0x00FF), указанное ниже.

0x000A Связанный с 2-октетной AS идентификатор L2 VPN

В [RFC4360] задан реестр IPv4 Address Specific Extended Community, в котором агентство IANA выделило значение из «переходного» диапазона (0x0100-0x01FF), указанное ниже.

0x010A Идентификатор L2 VPN

7. Совместимость BGP-AD и VPLS-BGP

BGP-AD и VPLS-BGP [RFC4761] используют одни AFI и SAFI. Чтобы BGP-AD и VPLS-BGP могди работать вместе, размер NLRI должен применяться как демультиплексор. BGP-AD NLRI имеет размер 12 байтов и содержит 8-байтовое значение RD и 4-байтовое значение VSI-ID. В VPLS-BGP [RFC4761] применяются 17-батовый NLRI. Поэтому реализации BGP-AD должны игнорировать NLRI размером больше 12 байтов.

8. Благодарности

Спасибо Dan Tappan, Ted Qian, Ali Sajassi, Skip Booth, Luca Martini, Dave McDysan, Francois Le Faucheur, Russ Gardo, Keyur Patel, Sam Henderson, Matthew Bocci за комментарии, критику и полезные предложения.

Спасибо Tissa Senevirathne, Hamid Ould-Brahim, Yakov Rekhter за обсуждение вопросов автоматического обнаружения.

Спасибо Vach Kompella за обсуждение подходящей для обобщённых идентификаторов семантики.

9. Литература

9.1. Нормативные документы

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC3438] Townsley, W., «Layer Two Tunneling Protocol (L2TP) Internet Assigned Numbers Authority (IANA) Considerations Update», BCP 68, RFC 3438, December 2002.

[RFC3931] Lau, J., Townsley, M., and I. Goyret, «Layer Two Tunneling Protocol — Version 3 (L2TPv3)», RFC 3931, March 2005.

[RFC4360] Sangli, S., Tappan, D., and Y. Rekhter, «BGP Extended Communities Attribute», RFC 4360, February 2006.

[RFC4364] Rosen, E. and Y. Rekhter, «BGP/MPLS IP Virtual Private Networks (VPNs)», RFC 4364, February 2006.

[RFC4447] Martini, L., Rosen, E., El-Aawar, N., Smith, T., and G. Heron, «Pseudowire Setup and Maintenance Using the Label Distribution Protocol (LDP)», RFC 4447, April 2006.

[RFC4667] Luo, W., «Layer 2 Virtual Private Network (L2VPN) Extensions for Layer 2 Tunneling Protocol (L2TP)», RFC 4667, September 2006.

[RFC4760] Bates, T., Chandra, R., Katz, D., and Y. Rekhter, «Multiprotocol Extensions for BGP-4», RFC 4760, January 2007.

[RFC5036] Andersson, L., Minei, I., and B. Thomas, «LDP Specification», RFC 5036, October 2007.

[RFC6073] Martini, L., Metz, C., Nadeau, T., Bocci, M., and M. Aissaoui, «Segmented Pseudowire», RFC 6073, January 2011.

9.2. Дополнительная литература

[RFC3985] Bryant, S. and P. Pate, «Pseudo Wire Emulation Edge-to-Edge (PWE3) Architecture», RFC 3985, March 2005.

[RFC4026] Andersson, L. and T. Madsen, «Provider Provisioned Virtual Private Network (VPN) Terminology», RFC 4026, March 2005.

[RFC4446] Martini, L., «IANA Allocations for Pseudowire Edge to Edge Emulation (PWE3)», BCP 116, RFC 4446, April 2006.

[RFC4664] Andersson, L. and E. Rosen, «Framework for Layer 2 Virtual Private Networks (L2VPNs)», RFC 4664, September 2006.

[RFC4665] Augustyn, W. and Y. Serbest, «Service Requirements for Layer 2 Provider-Provisioned Virtual Private Networks», RFC 4665, September 2006.

[RFC4761] Kompella, K. and Y. Rekhter, «Virtual Private LAN Service (VPLS) Using BGP for Auto-Discovery and Signaling», RFC 4761, January 2007.

[RFC4762] Lasserre, M. and V. Kompella, «Virtual Private LAN Service (VPLS) Using Label Distribution Protocol (LDP) Signaling», RFC 4762, January 2007.

[RFC5003] Metz, C., Martini, L., Balus, F., and J. Sugimoto, «Attachment Individual Identifier (AII) Types for Aggregation», RFC 5003, September 2007.

[RFC5659] Bocci, M. and S. Bryant, «An Architecture for Multi-Segment Pseudowire Emulation Edge-to-Edge», RFC 5659, October 2009.

Адреса авторов

Eric Rosen
Cisco Systems, Inc.
1414 Mass. Ave.
Boxborough, MA 01719
USA
EMail: erosen@cisco.com
 
Bruce Davie
Cisco Systems, Inc.
1414 Mass. Ave.
Boxborough, MA 01719
USA
EMail: bsd@cisco.com
 
Vasile Radoaca
Alcatel-Lucent
Think Park Tower 6F
2-1-1 Osaki, Tokyo, 141-6006
Japan
EMail: vasile.radoaca@alcatel-lucent.com
 
Wei Luo
EMail: luo@weiluo.net

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

3Media Access Control — управление доступом к среде.

4Network Layer Reachability Information — информация о доступности на сетевом уровне.

Рубрика: RFC | Оставить комментарий

RFC 6063 Dynamic Symmetric Key Provisioning Protocol (DSKPP)

Internet Engineering Task Force (IETF)                        A. Doherty
Request for Comments: 6063             RSA, The Security Division of EMC
Category: Standards Track                                         M. Pei
ISSN: 2070-1721                                           VeriSign, Inc.
                                                              S. Machani
                                                        Diversinet Corp.
                                                              M. Nystrom
                                                         Microsoft Corp.
                                                           December 2010

Протокол обеспечения динамического обмена симметричными ключами

Dynamic Symmetric Key Provisioning Protocol (DSKPP)

PDF

Аннотация

DSKPP представляет собой клиент-серверный протокол для инициализации (и настройки) симметричных ключей на локальных и удаленных криптографических модулях. Протокол может работать с использованием или без использования функциональности секретных ключей в криптомодулях, а также с организацией инфраструктуры открытых ключей или без таковой.

Два варианта протокола поддерживают множество сценариев применения. В четырехпроходном варианте ключи выполняется взаимная генерация ключей обеспечивающим сервером и криптомодулем — созданные ключи не передаются по проводам или эфиру. Двухпроходный вариант обеспечивает безопасную и эффективную загрузку и установку в криптомодули заранее созданных симметричных ключей.

Статус документа

Этот документ содержит проект стандарта Internet (Internet Standards Track).

Документ является результатом работы IETF и выражает согласованное мнение сообщества IETF. Документ был представлен на публичное рассмотрение и одобрен для публикации IESG. Дополнительная информация о стандартах Internet доступна в разделе 2 RFC 5741.

Информацию о текущем статусе документа, обнаруженных ошибках и способах обратной связи можно получить, воспользовавшись ссылкой http://www.rfc-editor.org/info/rfc6063.

Авторские права

Авторские права ((c) 2010) принадлежат IETF Trust и лицам, указанным в числе авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

Документ может содержать материалы из IETF Document или IETF Contribution, опубликованных или публично доступных до 10 ноября 2008 года. Лица, контролирующие авторские права на некоторые из таких документов, могли не предоставить IETF Trust права разрешать внесение изменений в такие документы за рамками процессов IETF Standards. Без получения соответствующего разрешения от лиц, контролирующих авторские права этот документ не может быть изменен вне рамок процесса IETF Standards, не могут также создаваться производные документы за рамками процесса IETF Standards за исключением форматирования документа для публикации или перевода с английского языка на другие языки.

1. Введение

Криптографические системы с симметричными ключами (т. е., системы, обеспечивающие засвидетельствования типа однократных паролей или механизмов запрос-отклик) обеспечивают преимущества с точки зрения производительности и эксплуатации по сравнению с системами на базе открытых ключей. Для использования таких систем требуется механизм обеспечения симметричных ключей, обеспечивающий функциональность, эквивалентную возможностям протокола управления сертификатами CMP1 [RFC4210] и CMC2 [RFC5272] в инфраструктуре открытых ключей PKI3.

Традиционно криптографические модули обеспечиваются ключами в процессе производства и ключи импортируются в криптографический сервер с использованием, например, компакт-диска (CD-ROM) из комплекта поставки устройства. Некоторые производители предлагают также фирменные протоколы обеспечения ключами, которые зачастую не документируются в открытом виде (протокол CT-KIP4 [RFC4758] является единственным исключением).

В документе описан DSKPP — клиент-серверный протокол обеспечения симметричными ключами, используемый между криптомодулем (соответствует клиенту DSKPP) и сервером обеспечения ключами (соответствует серверу DSKPP).

DSKPP обеспечивает открытый и совместимый механизм инициализации и настройки симметричных ключей в криптомодулях, доступных через Internet. Описание основано на информации, приведенной в [RFC4758], и включает специфические расширения типа засвидетельствования пользователей и поддержки формата [RFC6030] для передачи ключевого материала.

DSKPP поддерживает два основных варианта. 4-проходный вариант обеспечивает возможность предоставления симметричных ключей, включающую вклад в генерацию случайных значений на стороне клиента и сервера. 2-проходному варианту нужен один круговой обход вместо двух и он позволяет обеспечить заданный сервером ключ.

1.1. Ключевые слова

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе должны интерпретироваться в соответствии с документом [RFC2119].

1.2. Поддержка версий

Обеспечение выполняется с использованием синтаксиса явного указания номера версии. В настоящее время поддерживается только версия «1.0».

Целью введения номера версии протокола является обеспечение механизма, с помощью которого изменения, требуемые для криптографических алгоритмов (например, SHA-256) и атрибутов (например, размер ключа) могут быть внесены без нарушения работы существующих реализаций. Кроме того, это позволит выводить устаревшие реализации из эксплуатации без нарушения работы новых версий протокола.

Номер версии DSKPP имеет вид <major>.<minor>. Значения старшего и младшего номеров должны трактоваться как раздельные целые числа и каждое из этих чисел может инкрементироваться более чем на 1. Таким образом, DSKPP 2.4 будет иметь более низкую (младшую) версию по сравнению с DSKPP 2.13, а та, в свою очередь, будет ниже DSKPP 12.3. Ведущие нули (например, DSKPP 6.01) должны игнорироваться получателями, а установка их недопустима.

Значение старшего номера версии следует увеличивать только для случаев, когда алгоритмы защиты или форматы данных изменены столь существенно, что старые версии не могут взаимодействовать с новой версией (например, отказ от поддержки считавшегося ранее обязательным алгоритма, который был сочтен небезопасным). Значение младшего номера версии показывает наличие новых возможностей (например, введение новой опции алгоритма) и должно игнорироваться объектами с меньшим значением младшего номера версии, но использоваться для информационных целей объектами с большим значением младшего номера версии протокола.

1.3. Идентификаторы пространства имен

В документе применяются идентификаторы ресурсов URI5 [RFC3986] для указания ресурсов, алгоритмов и семантики.

1.3.1. Определенные здесь идентификаторы

Пространство имен XML [XMLNS] URI для версии 1.0 протокола DSKPP представляет собой

   "urn:ietf:params:xml:ns:keyprov:dskpp"

Ссылки на элементы схемы DSKPP используют префикс dskpp, но может применяться и другой префикс.

1.3.2. Идентификаторы, определенные в связанных спецификациях

В этом документе используются элементы, определенные в пространстве имен PSKC6 [RFC6030], которые представлены с префиксом pskc и объявлены как

   xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"

1.3.3. Ссылочные идентификаторы

Кроме того, представленный в документе синтаксис DSKPP использует идентификаторы алгоритмов, определенные в пространстве имен XML Signature [XMLDSIG]:

   xmlns:ds="http://www.w3.org/2000/09/xmldsig#"

Ссылки на идентификаторы алгоритмов в пространстве имен XML Signature используют префикс ds.

2. Терминология

2.1. Определения

Ниже приведены определения терминов, используемых в данном документе. Использование этих терминов в других документах может быть иным.

Authentication Code (AC) — код засвидетельствования

Код аутентификации пользователя представляет собой строку шестнадцатеричных символов, известную устройству и серверу и содержащую, по крайней мере, идентификатор клиента и пароль. Комбинация ClientID/password используется лишь однократно и может иметь ограниченный срок действия, по истечении которого она отбрасывается.

Authentication Data (AD) — данные засвидетельствования

Данные засвидетельствования пользователя, полученные из кода засвидетельствования (AC).

Client ID — идентификатор клиента

Идентификатор, используемый сервером DSKPP для нахождения на сервере реального имени пользователя или идентификатора учетной записи. Идентификатор может представлять собой короткое случайное значение, никак не связанное с реальным именем пользователя.

Cryptographic Module — криптографический модуль (криптомодуль)

Компонента приложения, которая обеспечивает функциональность шифрования с симметричным ключом.

Device — устройство

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

Device ID (DeviceID) — идентификатор устройства

Уникальный идентификатор для устройства, содержащего криптомодуль (например, мобильный телефон).

DSKPP Client — клиент DSKPP

Управляет обменом данными между криптомодулем с симметричным ключом и сервером DSKPP.

DSKPP Server — сервер DSKPP

Сервер обеспечения симметричными ключами, участвующий в работе протокола DSKPP.

DSKPP Server ID (ServerID) — идентификатор сервера DSKPP

Уникальный идентификатор сервера DSKPP.

Key Agreement — согласование ключа

Протокол организации ключа, в котором две или более стороны могут согласовать ключ так, чтобы обе могли влиять на результат.

Key Confirmation — подтверждение ключа

Обеспечение правомочным участникам протокола организации ключа гарантии того, что предполагаемый получатель разделяемого ключа действительно владеет разделяемым ключом.

Key Issuer — эмитент ключа

Организация, выпускающая симметричные ключи для конечных пользователей.

Key Package (KP) — ключевой пакет

Объект, инкапсулирующий в себе симметричный ключ и его конфигурационные параметры.

Key ID (KeyID) — идентификатор ключа

Уникальный идентификатор симметричного ключа.

Key Protection Method (KPM) — метод защиты ключа

метод транспортировки ключа в процессе двухпроходного DSKPP.

Key Protection Method List (KPML) — список методов защиты ключей

Список методов защиты ключей, поддерживаемых криптомодулем.

Key Provisioning Server — сервер обеспечения ключами

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

Key Transport — транспортировка ключей

Процедура организации ключа, с помощью которой сервер DSKPP выбирает и шифрует ключевой материал, а потом передает его клиенту DSKPP [NIST-SP800-57].

Key Transport Key — ключ для транспортировки ключа

Секретный ключ, хранящийся в криптомодуле. Этот ключ образует пару с открытым ключом клиента DSKPP, применяемым сервером DSKPP для шифрования ключевого материала при доставке ключа [NIST-SP800-57]

Key Type — тип ключа

Тип криптографических методов симметричного ключа, для которых этот ключ будет использоваться (например, аутентификация OATH HOTP7 или RSA SecurID, шифрование AES и т. п.).

Key Wrapping — упаковка ключа

Метод шифрования ключей для транспортировки [NIST-SP800-57].

Key Wrapping Key — ключ для упаковки ключа

Ключ шифрования симметричного ключа для упаковки последнего [NIST-SP800-57]

Keying Material — ключевой материал

Данные (например, ключ и параметры конфигурации), требуемые для организации и поддержки отношений с криптографическими преобразованиями [NIST-SP800-57]

Manufacturer’s Key — ключ производителя

Уникальный первичный ключ (например, смарт-карта), установленный в оборудование при его производстве. При наличии такого ключа он может использоваться криптомодулем для создания секретных ключей.

Protocol Run — цикл работы протокола

Полное исполнение DSKPP, включающее один (двухпроходный) или два (четырехпроходный) обмена.

Security Attribute List (SAL) — список атрибутов защиты

Данные, включающие версию DSKPP, вариант DSKPP (двух- или четырехпроходный), форматы ключевых пакетов, типы ключей и криптографические алгоритмы, которые может поддерживать криптомодуль.

2.2. Обозначения

|| конкатенация (слияние) строк.

[x] необязательный элемент x.

A ^ B операция исключающее-ИЛИ над строками A и B, имеющими одинаковые размеры.

<XMLElement> типографическое соглашение, используемое в теле текста.

DSKPP-PRF(k,s,dsLen) псевдослучайная функция с ключом.

E(k,m) шифрование m с использованием ключа k.

K ключ, используемый для шифрования R_C (K_SERVER или K_SHARED) при расчете MAC или DSKPP_PRF.

K_AC секретный ключ, получаемый из кода засвидетельствования (AC) и используемый в целях засвидетельствования.

K_MAC секретный ключ, получаемый в процессе обмена DSKPP, для использования при подтверждении ключа.

K_MAC’ второй секретный ключ, используемый для засвидетельствования сервера.

K_PROV первичный ключ обеспечения, из которого создаются два ключа — K_TOKEN и K_MAC

K_SERVER открытый ключ сервера DSKPP, который используется для шифрования R_C в четырехпроходном варианте.

K_SHARED секретный ключ, который заранее известен клиенту и серверу DSKPP; используется для шифрования R_C в четырехпроходном варианте.

K_TOKEN секретный ключ, организуемый в криптомодуле с использованием DSKPP.

R псевдослучайное значение, выбранное клиентом DSKPP и используемое для расчета MAC.

R_C псевдослучайное значение, выбранное клиентом DSKPP и используемое в качестве входных данных для генерации K_TOKEN.

R_S псевдослучайное значение, выбранное сервером DSKPP и используемое в качестве входных данных для генерации K_TOKEN.

URL_S адрес сервера DSKPP в формате URL.

2.3. Сокращения

AC Authentication Code — код засвидетельствования.

AD Authentication Data — данные засвидетельствования.

DSKPP Dynamic Symmetric Key Provisioning Protocol — протокол динамического обеспечения симметричными ключами.

HTTP Hypertext Transfer Protocol — протокол передачи гипертекста.

KP Key Package — ключевой пакет.

KPM Key Protection Method — метод защиты ключа.

KPML Key Protection Method List — список методов защиты ключа.

MAC Message Authentication Code — код засвидетельствования ключа.

PC Personal Computer — персональный компьютер.

PDU Protocol Data Unit — модуль данных протокола.

PKCS Public Key Cryptography Standards — стандарты шифрования с открытым ключом.

PRF Pseudorandom Function — псевдослучайная функция.

PSKC Portable Symmetric Key Container — переносимый контейнер с симметричным ключом.

SAL Security Attribute List — список атрибутов защиты (см. параграф 2.1).

TLS Transport Layer Security — защита транспортного уровня.

URL Uniform Resource Locator — однотипный указатель ресурсов.

USB Universal Serial Bus — универсальная последовательная шина.

XML eXtensible Markup Language — расширенный язык разметки (текста).

3. Обзор DSKPP

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

3.1. Элементы протокола

Транзакция обеспечения ключами DSKPP включает три элемента:

Server — сервер

Сервер обеспечения DSKPP.

Cryptographic Module — криптомодуль

Криптографический модуль, которому обеспечиваются симметричные ключи (например, маркер аутентификации).

Client — клиент

Клиент DSKPP, управляющий обменом информацией между криптомодулем и сервером обеспечения ключами.

Основным синтаксисом является XML [XML] и его уровни для транспортных механизмов, таких, как HTTP [RFC2616] и HTTP Over TLS [RFC2818]. Несмотря на то, что крайне желательна защита всего обмена данными между клиентом и сервером DSKPP с помощью транспортных механизмов, обеспечивающих защиту конфиденциальности и целостности (таких, как HTTP over TLS), такой защиты не достаточно для обмена симметричными ключами между сервером и криптомодулем. Протокол DSKPP создан для того, чтобы обеспечить разработчикам возможность выполнения требований по защите обмена ключами.

Сервер обменивается информацией только с клиентом. При рассмотрении серверов клиента и криптомодуль можно считать единым целым.

С точки зрения защиты клиента, однако, клиент и криптомодуль представляют собой разные логические объекты, которые в отдельных реализациях могут быть разделены и на физическом уровне.

Предполагается, что на устройстве будет размещаться приложение, вышележащее по отношению к криптомодулю, и это приложение будет управлять обменом данными между клиентом DSKPP и криптомодулем. Способ передачи элементов DSKPP между приложением и криптомодулем прозрачен для сервера DSKPP. Один из методов такой передачи описан в [CT-KIP-P11].

3.2. Базовый обмен DSKPP

3.2.1. Засвидетельствование пользователя

В потоке сообщений DSKPP пользователь обретает новое оборудование или программное приложение со встроенным криптомодулем. Целью DSKPP является обеспечение единого симметричного ключа и связанной с ним информации криптомодулю и серверу управления ключами, а также привязка этого ключа к корректному имени (или учетной записи) пользователя на сервере. Для выполнения этих операций сервер DSKPP должен аутентифицировать (получить засвидетельствование) пользователя, чтобы обрести уверенность в том, что тот уполномочен на получение нового ключа.

Засвидетельствование пользователя выполняется в рамках самого протокола «после» того, как клиент DSKPP инициирует первое сообщение. В этом случае клиент DSKPP должен иметь доступ к URL сервера DSKPP.

Кроме того, засвидетельствование пользователя может выполняться с помощью web-сервиса DSKPP или иного webприложения «до» первого обмена сообщениями. В этом случае сервер DSKPP должен Server MUST запускать механизм (триггер) инициирования клиентом DSKPP первого сообщения в рамках протокольного взаимодействия.

3.2.2. Протокол, инициированный клиентом DSKPP

В приведенном ниже примере клиент DSKPP сначала инициирует DSKPP, а потом выполняется аутентификация пользователя с применением Client ID и кода засвидетельствования (AC).

Перед началом работы DSKPP:

  • Код засвидетельствования (AC) генерируется сервером DSKPP и доставляется через отдельный доверенный канал (например, в форме бумажного документа сотрудником департамента ИТ).

  • Пользователь обычно вводит значения Client ID и AC вручную (возможно, что устройство имеет лишь цифровую клавиатуру). По этой причине идентификатор и код зачастую представляют собой короткие числовые значения (например, 8 десятичных цифр). Однако сервер DSKPP может генерировать любые значения на свое усмотрение.

  • Клиенту DSKPP требуется URL [RFC3986] сервера DSKPP (этот указатель не является специфическим для пользователя или секретным и может быть задан заранее) и набор доверенных привязок для верификации сертификата сервера.

  • Для пользователя должна иметься учетная запись с идентификатором и долгосрочное имя в системе (или иной идентификатор учетной записи), с которым будет связан маркер. Сервер DSKPP будет использовать значение Client для поиска соответствующего кода AC, позволяющего аутентифицировать пользователя.

На этапе 1 клиент организует соединение TLS идентифицирует сервер (т. е., проверяет сертификат и сравнивает имя хоста в URL с полученным сертификатом), как описано в параграфе 3.1 [RFC2818].

После этого клиент и сервер DSKPP обмениваются сообщениями DSKPP, которые передаются по протоколу HTTPS. В этих сообщениях:

  • Клиент и сервер согласуют криптографические алгоритмы, которые они хотят применять, алгоритмы, поддерживаемые для защиты сообщений DSKPP, и другие детали DSKPP.

  • Клиент передает серверу значение Client ID и подтверждает, что ему известен соответствующий код AC.

  • Клиент и сервер согласуют секретный ключ (ключ маркера или K_TOKEN); в зависимости от согласованного варианта протокола это будет свежий ключ, полученный в процессе работы DSKPP (4-проходный вариант, включающий 4 сообщения DSKPP) или сгенерированный сервером (возможно, существующий на сервере) и переданный клиенту (2-проходный вариант, в котором передается 2 сообщения DSKPP).

  • Сервер передает ключевой пакет клиенту. Пакет в 2-проходном варианте включает только ключ, а в 4-проходном добавляются атрибуты, влияющие на то, как предоставленный ключ будет впоследствии применяться криптомодулем и криптографическим сервером. Точное содержимое пакета зависит от криптографического алгоритма (например, для алгоритма с одноразовым паролем, поддерживающего значения OTP8 переменного размера одним из атрибутов в ключевом пакете будет размер OTP).

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

Точное распределение операций между парой криптомодуль — клиент DSKPP и парой сервер обеспечения — сервер DSKPP не задается этим документом. На рисунке 1 показан один из возможных вариантов, но он предназначен лишь для иллюстрации.

Крипто-      Клиент                         Сервер Сервер обеспечения
модуль       DSKPP                          DSKPP        ключами
 |             |                              |             |
 |             |                              |     +---------------+
 |             |                              |     |Сервер создает |
 |             |                              |     |и хранит       |
 |             |                              |     |Client ID и AC,|
 |             |                              |     |а также        |
 |             |                              |     |доставляет их  |
 |             |                              |     |пользователю по|
 |             |                              |     |отдельн. каналу|
 |             |                              |     +---------------+
 |             |                              |             |
 |  +----------------------+                  |             |
 |  |Пользователь вводит   |                  |             |
 |  |Client ID, AC и URL   |                  |             |
 |  +----------------------+                  |             |
 |             |                              |             |
 |             |<-- 1. Согласование TLS с --->|             |
 |             |       засвидетельств. сервера|             |
 |             |                              |             |
 |             | 2. <KeyProvClientHello> ---->| Засвидет.-->|
 |             |                              | пользователя|
 |             |<-- [3. <KeyProvServerHello>] |             |
 |             |                              |             |
 |             | [4. <KeyProvClientNonce>] -->|             |
 |             |                              |             |
 |             |<- 5. <KeyProvServerFinished> |             |
 |             |                              |             |
 |             |                              |             |
 |<-- Ключевой |                              | Ключевой -->|
 |    пакет    |                              | пакет       |

Рисунок 1. Базовый обмен DSKPP.


3.2.3. Протокол, включенный сервером DSKPP

В первом потоке сообщений (предыдущий параграф) значения Client ID и AC доставлялись клиенту с использованием некого независимого канала (например, на бумаге).

Во втором потоке сообщений пользователь сначала аутентифицирует web-сервер (например, страница самообслуживания на внутреннем сервере департамента ИТ), используя обычный web-браузер и некие существующие «верительные грамоты».

После этого пользователь запрашивает (выбирая ссылку или заполняя форму) предоставление нового ключа для криптомодуля. Web-сервер будет возвращать в ответ сообщение <KeyProvTrigger>, содержащее значения Client ID, AC и URL сервера DSKPP. Эта информация требуется также серверу DSKPP; взаимодействие серверов web и DSKPP выходит за пределы этого документа.

Web-          Клиент                         Сервер           Web-
браузер       DSKPP                          DSKPP          сервер
  |              |                              |               |
  |<----- Просмотр HTTPS + некот. др. типы аутент. польз.------>|
  |              |                              |               |
  | некий запрос HTTP ----------------------------------------->|
  |              |                              |
  |              |                              |<------------->|
  |              |                              |               |
  |<---------------------------- Отклик HTTP с <KeyProvTrigger> |
  |              |                              |               |
  | Триггер ---->|                              |               |
  |              |                              |               |
  |              |<-- 1. TLS-согласование с --->|               |
  |              |       аутентификацией сервера|               |
  |              |                              |               |
  |              |     ... продолжение...       |               |

Рисунок 2. Обмен DSKPP с Web-аутентификацией.


Сообщение <KeyProvTrigger> передается в отклике HTTP и этот отклик маркируется MIMEтипом application/dskpp+xml. Предполагается, что web-браузер настроен на распознавание этого типа MIME; браузер запускается клиентом DSKPP и обеспечивает того сообщением <KeyProvTrigger>.

После этого клиент DSKPP обращается к серверу DSKPP и использует значения Client ID и AC (из сообщения <KeyProvTrigger>) так же, как было описано для первого потока сообщений.

3.2.4. Варианты

Как отмечено в предыдущем параграфе, после старта протокола клиент и сервер могут выбрать 2-х или 4-проходный обмен сообщениями. Эти варианты протокола подходят для разных сценариев развертывания. Основная разница между этими вариантами заключается в том, что 2-проходный вариант поддерживает доставку существующего ключа в криптомодуль, а 4-проходный включает генерацию ключа и его согласование «на лету». В любом случае оба варианта протокола поддерживают возможности алгоритма за счет согласования механизмов шифрования и типов ключей на начальном этапе работы.

3.2.4.1. Критерии использования четырехпроходного варианта

Четырехпроходный вариант требуется использовать при выполнении одного или нескольких перечисленных условий.

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

  • Криптомодуль не поддерживает работы с секретным ключом9.

  • Криптомодуль размещается на устройстве, которое не имеет ни заданного производителем, ни какого-либо иного заранее известного сторонам ключа (например, смарт-карты или SIM10-карты), ни клавиатуры, которая может послужить для ввода пароля (типа клавиатуры мобильного телефона).

3.2.4.2. Критерии использования двухпроходного варианта

Двухпроходный вариант требуется использовать при выполнении одного или нескольких перечисленных условий.

  • Должны быть обеспечены имеющиеся (унаследованные) ключи за счет транспортировки их в криптомодуль.

  • Криптомодуль размещается на устройстве, которое имеет заданный производителем ключ (такой ключ может находиться на смарт-карте) или иной вариант заранее известного сторонам ключа (такой ключ может размещаться на SIM-карте) и поддерживает операции с приватным ключом.

  • Криптомодуль размещается на устройстве, которое имеет встроенную клавиатуру, позволяющую пользователю ввести парольную фразу, полезную при создании ключа для упаковки ключей при распространении ключевого материала.

3.3. Коды состояния

При отправке или получении сообщения, в котором значение атрибута Status отлично от Success или Continue, принятое по умолчанию поведение (если ниже явно не указано иное) заключается в том, что клиент и сервер DSKPP должны незамедлительно прервать работу DSKPP. Сервер и клиент DSKPP должны удалить все секретные значения, сгенерированные в процессе работы отказавшего DSKPP. Идентификаторы сессий после успешного или аварийного завершения работы могут сохраняться в целях детектирования повторного использования, но эти сохраненные идентификаторы недопустимо использовать для последующих сеансов работы протокола.

По возможности клиенту DSKPP следует передавать пользователю подходящее сообщение об ошибке.

Приведенные ниже коды состояния применимы для всех сообщений DSKPP Response, если явно не указано иное.

Continue — продолжение

Сервер DSKPP готов к приему следующего запроса от клиента DSKPP. Этот код не может передаваться в финальном сообщении сервера.

Success — успех

Успешное завершение сеанса DSKPP. Этот код может передаваться только в финальном сообщении сервера.

Abort — прерывание

Сервер DSKPP отверг запрос клиента DSKPP без указания причины.

AccessDenied — отказ в доступе

Клиент DSKPP не имеет полномочий на контакт с этим сервером DSKPP.

MalformedRequest — некорректно сформирован запрос

Сервер DSKPP столкнулся с отказом при разборе запроса от клиента DSKPP.

UnknownRequest — непонятный запрос

Клиент DSKPP сделал запрос, который не известен серверу DSKPP.

UnknownCriticalExtension — непонятное критичное расширение

Расширение DSKPP, помеченное, как критичное (Critical), не удалось интерпретировать на приемной стороне.

UnsupportedVersion — неподдерживаемая версия

Клиент DSKPP использует версию протокола DSKPP, не поддерживаемую сервером DSKPP. Этот код допустим только в первом сообщении-отклике сервера DSKPP.

NoSupportedKeyTypes — неподдерживаемые типы ключей

Этот код показывает, что клиент DSKPP предложил только те типы ключей, которые не поддерживаются сервером DSKPP. Этот код допустим только в первом сообщении-отклике сервера DSKPP.

NoSupportedEncryptionAlgorithms — нет поддерживаемых алгоритмов шифрования

Этот код показывает, что клиент DSKPP предложил только те алгоритмы шифрования, которые не поддерживаются сервером DSKPP. Этот код допустим только в первом сообщении-отклике сервера DSKPP.

NoSupportedMacAlgorithms — нет поддерживаемых алгоритмов MAC

Этот код показывает, что клиент DSKPP предложил только те алгоритмы MAC, которые не поддерживаются сервером DSKPP. Этот код допустим только в первом сообщении-отклике сервера DSKPP.

NoProtocolVariants — нет вариантов протокола

Клиент DSKPP не предложил требуемый вариант протокола (2-х или 4-проходный). Этот код допустим только в первом сообщении-отклике сервера DSKPP.

NoSupportedKeyPackages — нет поддерживаемых ключевых пакетов

Этот код показывает, что клиент DSKPP предложил только те форматы ключевого пакета, которые не поддерживаются сервером DSKPP. Этот код допустим только в первом сообщении-отклике сервера DSKPP.

AuthenticationDataMissing — отсутствуют данные для аутентификации

Клиент DSKPP не предоставил серверу DSKPP требуемых для засвидетельствования данных.

AuthenticationDataInvalid — некорректны данные аутентификации

Клиент DSKPP предложил данные засвидетельствования пользователя, которые сервер DSKPP не мог проверить.

InitializationFailed — отказ при инициализации

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

ProvisioningPeriodExpired — закончилось время обеспечения

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

3.4. Базовые элементы

Приведенные ниже расчеты применимы для обоих вариантов DSKPP.

3.4.1. Данные засвидетельствования пользователя

Данные засвидетельствования пользователя (AD) создаются на основе значений Client ID и AC, которые пользователь вводит до передачи первого сообщения DSKPP.

Примечание. Пользователь обычно вводит значения Client ID и AC вручную (возможно, что устройство имеет лишь цифровую клавиатуру). Поэтому идентификатор и код зачастую представляют собой короткие числовые значения (например, 8 десятичных цифр). Однако сервер DSKPP может генерировать любые значения на свое усмотрение.

3.4.1.1. Формат кода засвидетельствования

AC представляется в формате TLV11. Код включает по крайней мере два TLV и может также включать дополнительные TLV, в зависимости от реализации.

Поля TLV определены ниже

Type (1 символ) — тип

шестнадцатеричный символ, идентифицирующий тип информации в поле Value.

Length (2 символа) — размер

Два шестнадцатеричных символа, задающих размер следующего поля Value, который может достигать 255 символов. Length = 00 может использоваться для тегов, не включающих поля значения.

Value (переменный размер) — значение

Строка шестнадцатеричных символов переменного размера, содержащая информацию для данного TLV.

В таблице приведены TLV, определенные в этом документе. Производители могут использовать дополнительные TLV для решения специфических задач с учетом того, что старший бит должен быть установлен для указания фирменного (vendor-specific) типа. В последующих версиях протокола могут быть определены дополнительные TLV.

 

Тип

Имя TLV

Поддержка

Пример использования

1

Client ID

Обязательно

{ "AC00000A" }

2

Password

Обязательно

{ "3582AF0C3E" }

3

Checksum

Необязательно

{ "4D5" }

 

Client ID является обязательным TLV и представляет собой идентификатор запрашивающей стороны с максимальным размером 255. Значение представляется в форме строки шестнадцатеричных символов, которая идентифицирует запрос ключа. В качестве примера предположим, что Client ID имеет значение AC00000A. Тогда Client ID TLV в AC будет представлено в форме 108AC00000A.

Обязательное TLV для пароля (Password) содержит одноразовый разделяемый секрет, который известен пользователю и серверу обеспечения. Значение Password является уникальным и следует использовать случайную последовательность символов, поскольку это затруднит угадывание AC. Строка должна только содержать шестнадцатеричные символы. Например, для пароля 3582AF0C3E Password TLV будет иметь вид 20A3582AF0C3E.

Необязательное TLV для контрольной суммы (Checksum) генерируется сервером-эмитентом и передается пользователю, как часть кода AC. Если TLV используется, значение контрольной суммы должно рассчитываться с использованием алгоритма CRC16 [ISO3309]. Когда пользователь вводит AC, для набранной строки символов AC вычисляется контрольная сумма и полученное значение сравнивается с заданным в TLV. Для AC с тегами Client ID и Password, имеющими вид 108AC00000A20A3582AF0C3E, контрольная сумма CRC16 будет иметь значение 0x356, что дает Checksum TLV = 334D5. Полная строка AC в этом случае будет иметь вид 108AC00000A20A3582AF0C3E3034D5.

Хотя данная спецификация рекомендует использовать шестнадцатеричные символы только для AC на уровне пользовательского интерфейса приложений и делать триплеты TLV непрозрачными для пользователя, как показано в приведенном выше примере, разработчики могут дополнительно выбрать использование других печатных символов Unicode [UNICODE] на уровне пользовательского интерфейса приложений с учетом специфических местных требований контекста и удобства использования. Когда на уровне пользовательского интерфейса желательно использовать отличные от шестнадцатеричных символы (например, другие печатные символы US-ASCII или символы иных языков), требуется использовать SASLprep [RFC4013] для нормализации пользовательского ввода перед тем, как преобразовать его в строку шестнадцатеричных символов. Например, если приложение позволяет использовать любые печатные символы US-ASCII и символы расширенного кода ASCII для полей Client ID и Password, для поля Client ID устанавливается значение myclient!D, а для поля Password — mYpas&#rD, пользователь будет вводить с клавиатуры (или иным способом) Client ID = myclient!D и Password = mYpas&#rD в раздельных полях формы или в соответствии с инструкциями провайдера. Прикладной уровень, обрабатывающий пользовательский ввод, должен преобразовать введенные пользователем строки для использования в протоколе. В результате получится строка 1146D79636C69656E7421442126D5970617326237244 (отметим, что в этом примере Checksum TLV не используется).

Ниже приведено более подробное описание примера.

Предположим, что необработанное поле Client ID имеет значение myclient!D12.

Значение Client ID в форме имен символов будет иметь вид:

      U+006D строчная латинская буква M
      U+0079 строчная латинская буква Y
      U+0063 строчная латинская буква C
      U+006C строчная латинская буква L
      U+0069 строчная латинская буква I
      U+0065 строчная латинская буква E
      U+006E строчная латинская буква N
      U+0074 строчная латинская буква T
      U+0021 восклицательный знак (!)
      U+0044 прописная латинская буква D

В кодировке UTF-8 поле Client ID имеет вид 6D 79 63 6C 69 65 6E 74 21 44.

Размер значения Client ID в шестнадцатеричном формате равен 14 (20 шестнадцатеричных символов).

TLV-представление для поля Client ID имеет вид:

   1146D79636C69656E742144

Необработанное значение Password имеет вид mYpas&#rD.

Значение Password в форме имен символов будет иметь вид:

      U+006D строчная латинская буква M
      U+0059 прописная латинская буква Y
      U+0070 строчная латинская буква P
      U+0061 строчная латинская буква A
      U+0073 строчная латинская буква S
      U+0026 символ амперсанда (&)
      U+0023 знак фунта (#)
      U+0072 строчная латинская буква R
      U+0044 прописная латинская буква D

В кодировке UTF-8 поле Password имеет вид 6D 59 70 61 73 26 23 72 44.

Размер значения Password в шестнадцатеричном формате равен 12.

TLV-представление для поля Password имеет вид

   2126D5970617326237244

После объединения полей Client ID и Password поле AC будет иметь вид

   1146D79636C69656E7421442126D5970617326237244
3.4.1.2. Расчет данных засвидетельствования пользователя

Данные засвидетельствования (Authentication Data) включают Client ID (извлекается из AC) и значение, получаемое из AC на основе преобразования (общее описание функции DSKPP-PRF приведено в параграфе 3.4.2, а в Приложении D дано описание DSKPP-PRF-AES)

   MAC = DSKPP-PRF(K_AC, AC->ClientID||URL_S||R_C||[R_S], 16)

В 4-проходном варианте DSKPP криптомодуль использует R_C, R_S и URL_S для расчета MAC. URL_S — указатель URL, который клиент DSKPP использует для контакта с сервером DSKPP. В 2-проходном варианте DSKPP криптомодуль не имеет доступа к R_S, поэтому для вычисления MAC используется только R_C в комбинации с URL_S. В обоих случаях значение K_AC должно получаться из AC->password с помощью преобразования [PKCS-5]:

   K_AC = PBKDF2(AC->password, R_C || K, iter_count, 16)

Должно использоваться одно из следующих значений K:

  1. 4-проходный вариант:

  • открытый ключ сервера DSKPP (K_SERVER) или (в варианте с заранее известным разделяемым ключом) ключ, известный клиенту и серверу (K_SHARED).

  1. 2-проходный вариант:

  • открытый ключ клиента DSKPP или открытый ключ устройства, если доступен сертификат устройства;

  • известный клиенту и серверу ключ (K_SHARED);

  • ключ, созданный из парольной фразы.

Счетчик итераций iter_count должен иметь значение не менее 100 000 за исключением двух последних вариантов 2-проходного режима (когда в качестве K используется K_SHARED или ключ, созданный из парольной фразы), когда должно использоваться значение iter_count = 1.

3.4.2. Необратимая псевдослучайная функция DSKPP — DSKPP-PRF

Независимо от реализованного варианта протокола существует требование к криптографическому примитиву, который определяет детерминированное преобразование секретного ключа k и строки октетов переменного размера в битовую строку заданного размера dsLen.

Этот примитив должен удовлетворять тем же требованиям, что и функция хэширования с ключом — он должен принимать на входе данные произвольного размера и генерировать результат, который не может быть обращен и не имеет коллизий (определения этих терминов можно найти в документе [FAQ]). Более того, результат работы примитива должен быть непредсказуемым даже в тех случаях, когда известны результаты преобразований других входных данных с тем же ключом.

С точки зрения этой спецификации DSKPP-PRF представляет собой функцию-»черный ящик», которая принимает входные данные, генерирует псевдослучайное значение и может быть реализована любыми подходящими криптографическими методами. В Приложении D даны два примера реализации DSKPP-PRF.

   DSKPP-PRF(k, s, dsLen)

Вход:

k секретный ключ в форме строки октетов;

s строка октетов переменной длины, содержащая произвольные данные, определяющие строку на выходе;

dsLen желаемый размер результата.

Выход:

DS псевдослучайная строка размером dsLen октетов.

Для целей этого документа размер секретного ключа k должен быть не менее 16 октетов.

3.4.3. Алгоритм хэширования сообщений DSKPP

Пр передаче своего последнего сообщения в сеансе работы протокола сервер DSKPP генерирует код MAC, который используется клиентом для подтверждения ключа. Расчет MAC должен включать хэш-значения для всех сообщений DSKPP, переданных клиентом и сервером в данной транзакции. Чтобы рассчитать хэш-значения для кода MAC данной последовательности сообщений DSKPP msg_1, …, msg_n, должны быть выполнены следующие операции:

  1. Берется последовательность сообщений DSKPP, содержащая все сообщения Request и Response, не включая данное сообщение.

  2. Переданные повторно сообщения исключаются из последовательности13.

  3. Сообщения объединяются в одну строку (конкатенация).

  4. Полученная строка хэшируется с использованием алгоритма SHA-256 в соответствии с [FIPS180-SHA].

4. Использование четырехпроходного варианта

В это разделе описаны методы и поток сообщений, которые образуют 4-проходный вариант. Работа DSKPP в этом варианте зависит от механизма согласования ключей между клиентом и сервером.

4.1. Механизм согласования ключа

Для 4-проходного DSKPP симметричный ключ, являющийся целью обеспечения, генерируется «на лету» без передачи его между клиентом и сервером DSKPP. Поток данных и расчеты описаны ниже.

4.1.1. Поток данных

Простой поток данных при генерации ключа в 4-проходном варианте протокола показан на рисунке 3.

+----------------------+                  +----------------------+
|    +------------+    |                  |                      |
|    |Ключ сервера|    |                  |                      |
| +<-|  открытый  |------>------------->-------------+---------+ |
| |  |  секретный |    |                  |          |         | |
| |  +------------+    |                  |          |         | |
| |        |           |                  |          |         | |
| V        V           |                  |          V         V |
| | +-----------+      |                  |        +---------+ | |
| | |расшифровка|<-------<-------------<-----------| шифровка| | |
| | +-----------+      |                  |        +---------+ | |
| |      | +---------+ |                  |            ^       | |
| |      | |Случ. зн.| |                  |            |       | |
| |      | | сервера |--->------------->------+  +----------+  | |
| |      | +---------+ |                  |   |  |Случ. знач|  | |
| |      |      |      |                  |   |  | клиента  |  | |
| |      |      |      |                  |   |  +----------+  | |
| |      |      |      |                  |   |        |       | |
| |      V      V      |                  |   V        V       | |
| |   +------------+   |                  | +------------+     | |
| +-->|  DSKPP PRF |   |                  | |  DSKPP PRF |<----+ |
|     +------------+   |                  | +------------+       |
|           |          |                  |       |              |
|           V          |                  |       V              |
|       +-------+      |                  |   +-------+          |
|       | Ключ  |      |                  |   | Ключ  |          |
|       +-------+      |                  |   +-------+          |
|       +-------+      |                  |   +-------+          |
|       |Key Id |-------->------------->------|Key Id |          |
|       +-------+      |                  |   +-------+          |
+----------------------+                  +----------------------+
      Сервер DSKPP                              Клиент DSKPP

Рисунок 3. Схема потоков данных при генерации ключа DSKPP с использованием открытого ключа сервера.


Включение двух случайных значений R_S и R_C в процесс генерации ключа обеспечивает обеим сторонам (криптомодулю и серверу DSKPP) гарантию того, что каждый будет вносить фактор случайности в создаваемый ключ и ключ будет уникальным. Включение ключа шифрования (K) гарантирует предотвращение MITM-атак14, а также отличие ключа, получаемого криптографическим модулем от ключа, хранящегося на легитимном сервере DSKPP.

Хотя R_C и является псевдослучайной строкой, концептуально ее можно рассматривать, как состоящую из двух частей — R_C1 и R_C2, где R_C1 генерируется в процессе работы протокола, а R_C2 может быть создана заранее и загружена в криптомодуль до его передачи пользователю. В этом случае следует обеспечивать уникальность второй части (R_C2) для каждого криптомодуля.

Человек, участвующий в MITM-атаке (с помощью поврежденной клиентской программы или при ошибочном подключении к другому серверу), может представить криптомодулю свой открытый ключ. Это позволит атакующему узнать клиентскую версию ключа K_TOKEN. Однако злоумышленник не сможет получить от легитимного сервера то же самое значение для K_TOKEN, поскольку K_TOKEN вычисляется с применением открытого ключа, а этот ключ будет отличаться у атакующего и сервера (или же атакующий не сможет расшифровать информацию, полученную от клиента). Поскольку атакующий уже «не находится между клиентом и сервером», те смогут определить, что они «рассинхронизированы», как только попытаются воспользоваться своими ключами. В случае расшифровки R_C с ключом K_SERVER важно проверить, что K_SERVER действительно является ключом легитимного сервера. Одним из способов является независимая проверка вновь созданного ключа K_TOKEN через соответствующую службу на сервере (например, с использованием канала, отличного от того, который применяется для генерации ключа).

4.1.2. Расчет

В 4-проходном DSKPP клиент и сервер будут генерировать ключи K_TOKEN и K_MAC на основе ключа обеспечения (K_PROV), используя DSKPP-PRF (см. параграф 3.4.2), как показано ниже

   K_PROV = DSKPP-PRF(k,s,dsLen)

где

   k = R_C

(т. е. секретное случайное значение, выбранное клиентом DSKPP);

   s = "Key generation" || K || R_S

K — ключ, применяемый для шифрования R_C и R_S, — случайное значение, выбранное сервером DSKPP

dsLen = (желаемый размер K_PROV, в котором первая половина задает K_MAC, а вторая - K_TOKEN)

Значения K_TOKEN и K_MAC создаются на основе K_PROV

       K_PROV = K_MAC || K_TOKEN

При расчете K_PROV созданные ключи K_MAC и K_TOKEN могут подвергаться определяемым алгоритмом преобразованиям перед тем, как использовать в качестве ключа выбранного типа. Одним из примеров такого преобразования является приведение к четности для ключей DES.

Отметим, что этот расчет выполняется только при 4-проходном варианте DSKPP.

4.2. Поток сообщений

Поток сообщений 4-проходного варианта включает два обмена:

1: Проход 1 = <KeyProvClientHello>, Проход 2 = <KeyProvServerHello>

2: Проход 3 = <KeyProvClientNonce>, Проход 4 = <KeyProvServerFinished>

В первой паре сообщений согласуются криптографические алгоритмы и выполняется обмен nonce. Вторая пара сообщений служит для организации симметричного ключа с использованием взаимного соглашения сторон о ключах.

Назначение и структура каждого сообщения описаны ниже. Формат XML и примеры даны в разделе 8 и Приложении B.

4.2.1. KeyProvTrigger

Клиент DSKPP                         Сервер DSKPP
------------                         ------------
                    [<---]        AD, [DeviceID],
                                 [KeyID], [URL_S]

«Триггерное» сообщение является необязательным. Сервер DSKPP передает такое сообщение после выполнения по автономному каналу перечисленных ниже действий.

  1. Пользователь направляется его браузером на web-приложение, обеспечивающее ключ и подпись для него (аутентификация).

  2. Пользователь запрашивает ключ.

  3. Web-приложение обрабатывает запрос и возвращает пользователю код AC (например, в ответ на запрос регистрации в защищенной web-сессии).

  4. Web-приложение получает код AC от пользователя (возможно, посредством запроса на ввод кода в с использованием web-формы или выбора пользователем указателя URL, в который встроен код AC).

  5. Web-приложение получает данные аутентификации (AD) из AC, как описано в параграфе 3.4.1.

  6. Web-приложение передает AD и, возможно, DeviceID (идентифицирует конкретное устройство, для которого будет предоставляться ключ) и/или KeyID (идентифицирует ключ, который будет заменен) серверу DSKPP.

Назначение сообщения

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

Таким путем система обеспечения ключей может указать клиенту DSKPP на конкретный криптомодуль, который был заранее сконфигурирован на сервере обеспечения ключами .

При обновлении ключей для идентификации заменяемого ключа.

Что содержится в сообщении

Должно обеспечиваться значение AD, чтобы обеспечить серверу DSKPP возможность засвидетельствования клиента до завершения сеанса работы протокола.

Может включаться значение DeviceID, позволяющее программе обеспечения ключами связать предоставляемый ключ с конкретным устройством.

Может включаться значение KeyID, позволяющее программе обеспечения ключами идентифицировать заменяемый ключ (например, в случае обновления ключа).

Может включаться значение Server URL, позволяющее программе обеспечения ключами указать клиенту DSKPP сервер, с которым нужно контактировать.

4.2.2. KeyProvClientHello

Клиент DSKPP                         Сервер DSKPP
------------                         ------------
SAL, [AD],
[DeviceID], [KeyID]     --->

При первом подключении клиента DSKPP к серверу DSKPP клиент должен передать сначала сообщение <KeyProvClientHello>. Это сообщение может быть также передано клиентом в ответ на <KeyProvTrigger>.

Что содержится в сообщении

Список атрибутов безопасности (SAL15), включаемый в <KeyProvClientHello>, содержит комбинации версий и вариантов DSKPP, форматов ключевых пакетов, типов ключей и криптографических алгоритмов, которые поддерживает клиент DSKPP, указывающие предпочтения клиента (желаемый вариант указывается первым).

Если сообщению <KeyProvClientHello> предшествовало сообщение <KeyProvTrigger>, в <KeyProvClientHello> должны быть включены значение AD, DeviceID и/или KeyID из сообщения-триггера.

Если сообщению <KeyProvClientHello> не было инициировано сообщением <KeyProvTrigger>, в <KeyProvClientHello> может быть включено значение DeviceID, которое известно и серверу DSKPP, а также идентификатор ключа, ранее предоставленного сервером обеспечения DSKPP.

Примечания для приложений

Если этому сообщению предшествует триггер <KeyProvTrigger>, у приложения уже имеется доступное значение AD (см. параграф 4.2.1). Однако, если перед сообщением не было передано триггера<KeyProvTrigger>, приложение должно получить значение кода засвидетельствования пользователя (возможно, запрашивая у того ввод AC вручную — например, с использованием цифровой клавиатуры).

Приложение должно также создать данные аутентификации (AD) из кода AC, как описано в параграфе 3.4.1, и сохранить эти данные для использования в следующем сообщении <KeyProvClientNonce>.

Как сервер DSKPP использует это сообщение

Сервер DSKPP будет искать в сообщении подходящую комбинацию версии DSKPP, варианта (в данном случае 4-проходного), формата ключевого пакета, типа ключа и набора криптографических алгоритмов. Если атрибуты SAL клиента DSKPP не соответствуют возможностям сервера DSKPP или не удовлетворяют требованиям к обеспечению ключами, сервер DSKPP будет устанавливать для атрибута Status значение, отличное от Continue. При обнаружении соответствия устанавливается Status = Continue.

При включении в <KeyProvClientHello> значений AD, DeviceID и KeyID сервер DSKPP будет проверять их. Для сервера DSKPP недопустимо принимать значение DeviceID, если этот сервер не передавал DeviceID в предшествующем триггерном сообщении. Отметим также, что клиент DSKPP вправе инициировать сессию DSKPP без получения от сервера триггерного сообщения <KeyProvTrigger>, но в этом случае восприятие любого представленного значения DeviceID недопустимо для сервера DSKPP, если у того нет доступа к уникальному ключу (который будет использоваться протоколом) для идентификации устройства.

4.2.3. KeyProvServerHello

Клиент DSKPP                         Сервер DSKPP
------------                         ------------
                      <---    SAL, R_S, [K], [MAC]

Сервер DSKPP будет передавать это сообщение в ответ на <KeyProvClientHello> после того, как будут просмотрены комбинации версии DSKPP, варианта (в данном случае 4-проходного), формата ключевого пакета, типа ключа и набора криптографических алгоритмов. Если подходящей комбинации не будет найдено, серверу следует передавать сообщение со статусом отказа.

Назначение сообщения

С помощью этого сообщения задается контекст для протокольной сессии. Кроме того, сервер DSKPP использует это сообщение для передачи случайного маркера nonce, который требуется на каждой стороне для согласования общего симметричного ключа (K_TOKEN).

Что содержится в сообщении

Атрибут статуса эквивалентен коду, возвращаемому сервером в ответ на <KeyProvClientHello>. Если сервер нашел в списке SAL подходящий набор атрибутов, он устанавливает статус Continue и возвращает список SAL (выбирается из списка SAL, полученного в сообщении <KeyProvClientHello>). Список SAL от сервера задает версию DSKPP и вариант протокола (в данном случае 4-проходный), тип ключа, криптографические алгоритмы а формат ключевого пакета, которые клиент должен использовать в оставшейся части протокольной сессии.

Случайный маркер nonce (R_S) для использования при генерации симметричного ключа путем согласования. Размер R_S может зависеть от выбранного типа ключа.

Ключ (K) будет использоваться клиентом DSKPP для шифрования клиентского значения nonce, включаемого в <KeyProvClientNonce>. K является открытым ключом сервера (K_SERVER) или известным обеим сторонам секретным ключом (K_SHARED).

Если ключ будет обновляться, должно присутствовать значение MAC, чтобы клиент DSKPP мог убедиться, что ключ на замену получен от доверенного сервера. Это значение MAC должно рассчитываться с использованием функции DSKPP-PRF (см. параграф 3.4.2) и входной параметр k должен представлять иметь значение существующего ключа MAC — K_MAC’ (т. е., значение ключа MAC, которое существовало до этого протокольного сеанса; реализация может задавать в качестве K_MAC’ значение заменяемого K_TOKEN), а в качестве входного параметра dsLen должно использоваться значение размера R_S.

Как клиент DSKPP использует это сообщение

Значение атрибута Status, отличающееся от Continue, говорит об отказе и клиент DSKPP должен прервать сеанс.

Если успешное выполнение протокола приводит к замене существующего ключа на заново сгенерированный, клиент DSKPP должен проверить значение кода MAC, представленное в сообщении <KeyProvServerHello>. Клиент DSKPP должен прервать сеанс DSKPP, если значение MAC не удалось проверить, и должен в этом случае удалить все маркеры nonce, ключи и/или секреты, связанные с этим сеансом.

Если Status = Continue, криптографический модуль генерирует случайное значение R_C, используя криптографический алгоритм, заданный в SAL. Размер nonce R_C будет зависеть от выбранного типа ключа.

Значение R_C шифруется с использованием ключа K и алгоритма, заданного в SAL.

Метод, который клиент DSKPP должен использовать для шифрования R_C

Если K эквивалентен K_SERVER (т. е. открытому ключу сервера DSKPP), может использоваться схема шифрования RSA из PKCS #1 [PKCS-1]. При K эквивалентном K_SERVER криптографическому модулю следует проверить сертификат сервера до начала его использования для шифрования R_C, как описано в параграфе 3.1 [RFC2818] и [RFC5280].

Если K эквивалентен K_SHARED, клиент DSKPP может использовать функцию DSKPP-PRF для обеспечения независимости от других алгоритмов. В этом случае клиент использует K_SHARED в качестве входного параметра k (K_SHARED следует использовать только для этого).

      dsLen = len(R_C)

где len — размер R_C.

      DS = DSKPP-PRF(K_SHARED, "Encryption" || R_S, dsLen)

Это выражение будет давать псевдослучайную строку DS размером R_C. Шифрование R_C может быть обеспечено путем использования операции XOR для DS и R_C

      E(DS, R_C) = DS ^ R_C

Сервер DSKPP в этом случае будет выполнять обратное преобразование для получения R_C из E(DS, R_C).

4.2.4. KeyProvClientNonce

Клиент DSKPP                         Сервер DSKPP
------------                         ------------
E(K,R_C), AD          --->

Клиент DSKPP будет передавать это сообщение сразу же после получения сообщения <KeyProvServerHello> со статусом Continue.

Назначение сообщения

В этом сообщении клиент DSKPP передает данные засвидетельствования пользователя (AD) и случайный маркер nonce, зашифрованный с использованием ключа сервера DSKPP (K). Клиентское случайное значение nonce требуется обеим сторонам для согласования общего симметричного ключа (K_TOKEN).

Что содержится в сообщении

Данные аутентификации (AD), которые были созданы на основе кода AC, вводятся пользователем до отправки сообщения <KeyProvClientHello> (см. параграф 3.2).

Случайное значение nonce (R_C) клиента DSKPP, зашифрованное, как описано в параграфе 4.2.3.

Как сервер DSKPP использует это сообщение

Сервер DSKPP должен использовать AD для аутентификации пользователя. Если засвидетельствование завершилось отказом, сервер DSKPP должен возвратить код состояния, обусловленный причиной отказа.

Если аутентификация прошла, сервер DSKPP дешифрует R_C, используя свой ключ (K). Метод расшифровки зависит от ключа K, переданного клиенту в сообщении <KeyProvServerHello> — открытый ключ сервера (K_SERVER) или заранее известный обеим сторона ключ (K_SHARED) (описание зашифровки клиентом DSKPP значения R_C приведено в параграфе 4.2.3).

После расшифровки R_C сервер DSKPP рассчитывает ключ K_TOKEN, используя комбинацию двух случайных значений nonce R_S и R_C, а также ключа шифрования K, как описано в параграфе 4.1.2. Конкретная реализация функции DSKPP-PRF (например, описанная в Приложении D) зависит от алгоритма MAC, заданного в сообщении <KeyProvServerHello>. После этого сервер DSKPP генерирует ключевой пакет, который содержит атрибуты применения (такие, как срок действия и размер). В ключевой пакет недопустимо включать ключ K_TOKEN, поскольку в 4-проходном варианте K_TOKEN никогда не передается между клиентом и сервером DSKPP. Сервер сохраняет K_TOKEN и ключевой пакет вместе с учетной записью пользователя на криптографическом сервере.

В заключение сервер генерирует код MAC для подтверждения ключа, который клиент будет использовать для предотвращения ложных сообщений Commit, которые могут переводить криптомодуль в состояние, когда сервер не распознает сохраненный ключ.

Код MAC, используемый для подтверждения ключа, должен рассчитываться, как показано ниже.

      msg_hash = SHA-256(msg_1, ..., msg_n)
      dsLen = len(msg_hash)
      MAC = DSKPP-PRF (K_MAC, "MAC 1 computation" || msg_hash, dsLen)

где

MAC

Для расчета MAC используется псевдослучайная функция DSKPP, определенная в параграфе 3.4.2. Конкретная реализация DSKPP-PRF (пример описан в Приложении D) зависит от алгоритма MAC, заданного в сообщении <KeyProvServerHello>. Значение MAC должно рассчитываться с использованием имеющегося ключа MAC (K_MAC) и строки, формируемой путем конкатенации ASCII-строки «MAC 1 computation» и значения msg_hash.

K_MAC

Ключ, созданный из K_PROV, как описано в параграфе 4.1.2.

msg_hash

Хэш-сумма (см. определение в параграфе 3.4.3) для сообщений msg_1, …, msg_n.

4.2.5. KeyProvServerFinished

Клиент DSKPP                         Сервер DSKPP
------------                         ------------
                       <---               KP, MAC

Сервер DSKPP будет передавать это сообщение после аутентификации пользователя и, при успешной аутентификации, генерации ключа K_TOKEN и ключевого пакета, а также связывания их с учетной записью пользователя на криптографическом сервере.

Назначение сообщения

С помощью этого сообщения сервер DSKPP подтверждает генерацию ключа K_TOKEN, а также передает клиенту связанный с ключом идентификатор и зависящие от приложения атрибуты (но не сам ключ) в ключевом пакете для завершения протокольной сессии.

Что содержится в сообщении

Атрибут статуса эквивалентен коду, возвращаемому сервером в ответ на <KeyProvClientNonce>. Если засвидетельствование пользователя прошло успешно, сервер рассчитал ключ K_TOKEN, сгенерировал ключевой пакет и связал его с учетной записью пользователя на криптографическом сервере, в поле Status сервер устанавливает значение Success. При установке для атрибута Status значения Success это сообщение действует, как сообщение Commit, говорящее криптомодулю. Что нужно сохранить сгенерированный ключ (K_TOKEN) и связать идентификатор данный идентификатор с этим ключом. По этой причине в данное сообщение должен быть помещен ключевой пакет (KP), который содержит идентификатор для сгенерированного ключа (но не сам ключ) и дополнительные конфигурационные параметры (например, отождествление сервера DSKPP, атрибуты использования ключа и т. п.). Используемый по умолчанию формат ключевого пакета должен основываться на контейнере PSKC16, определенном в [RFC6030]. В качестве дополнительных могут использоваться форматы [RFC6031], PKCS #12 [PKCS-12] или PKCS #5 XML [PKCS-5-XML].

Вместе с KP сервер включает MAC-код подтверждения ключа, который позволяет клиенту избавиться от ложного сообщения Commit. Алгоритм MAC использует ту же функцию DSKPP-PRF, которая применяется для сообщения <KeyProvServerHello>.

Как клиент DSKPP использует это сообщение

Значение атрибута Status, отличное от Success, говорит об отказе и клиент DSKPP должен прервать сессию.

После получения сообщения <KeyProvServerFinished> с кодом Status = Success клиент DSKPP должен проверить код MAC подтверждения ключа, который был передан в этом сообщении. Клиент DSKPP должен прервать сессию DSKPP, если значение MAC не прошло верификацию, а также должен в этом случае удалить все маркеры nonce, ключи и/или секреты, связанные с этим протокольным сеансом.

Если <KeyProvServerFinished> имеет Status = Success и код MAC прошел верификацию, клиент DSKPP должен рассчитать ключ K_TOKEN, используя комбинацию двух случайных значений nonce R_S и R_C, а также серверного ключа шифрования K, как описано в параграфе 4.1.2. Для расчета используется та же функция DSKPP-PRF, которая служит для расчета кода MAC. Клиент DSKPP связывает ключевой пакет, содержащийся в <KeyProvServerFinished>, с созданным ключом K_TOKEN и постоянно хранит эти данные в криптомодуле.

После этой операции не допускается возможность замены ключа, пока не будет обеспечена информация о ключе авторизации с помощью кода MAC в последующем сообщении <KeyProvServerHello> (и <KeyProvServerFinished>).

5. Использование двухпроходного варианта

В этом разделе описаны методы и поток сообщений для 2-проходного варианта протокола. Двухпроходный DSKPP важен для доставки ключевого материала от сервера DSKPP к клиенту DSKPP. Сервер DSKPP передает ключевой материал в ключевом пакете, отформатированном в соответствии с [RFC6030], [RFC6031], PKCS #12 [PKCS-12] или PKCS #5 XML [PKCS-5-XML].

Ключевой материал включает первичный ключ K_PROV, на основе которого клиент DSKPP создает два ключа: симметричный для криптомодуля (K_TOKEN) и ключ, используемый для подтверждения (K_MAC). Ключевой материал включает также атрибуты использования ключей (такие, как срок действия и размер).

Сервер DSKPP шифрует K_PROV для предотвращения доступа к этому ключу всем, кроме сервера и криптомодуля. Сервер DSKPP использует для шифрования K_PROV любой из трех методов защиты — Key Transport, Key Wrap или Passphrase-Based Key Wrap Key Protection17.

Хотя клиент и сервер DSKPP могут согласовать используемый метод защиты ключа, фактическая защита осуществляется в KeyPackage. Формат KeyPackage задает способ защиты ключа с использованием трех методов. Ниже перечислены форматы KeyPackage, определенные для DSKPP:

  • Контейнер PSKC [RFC6030]

    urn:ietf:params:xml:ns:keyprov:dskpp:pskc-key-container
  • Контейнер SKPC [RFC6031]

    urn:ietf:params:xml:ns:keyprov:dskpp:skpc-key-container
  • Контейнер PKCS12 [PKCS-12]

    urn:ietf:params:xml:ns:keyprov:dskpp:pkcs12-key-container
  • Контейнер PKCS5-XML [PKCS-5-XML]

    urn:ietf:params:xml:ns:keyprov:dskpp:pkcs5-xml-key-container

Каждый из перечисленных методов защиты описан ниже.

5.1. Методы защиты ключей

В этом разделе описаны три метода защиты ключей для 2-проходного варианта. Дополнительные методы защиты могут быть определены через процесс IETF или внешними путями.

5.1.1. Транспортировка ключа

Этот метод предназначен для поддерживающих PKI18 устройств. Сервер DSKPP шифрует ключевой материал и доставляет его клиенту DSKPP. Сервер шифрует ключевой материал, используя открытый ключ клиента DSKPP, секретный ключ которого хранится в криптомодуле. Клиент DSKPP расшифровывает ключевой материал и использует его для создания симметричного ключа K_TOKEN.

URN для идентификации метода

      urn:ietf:params:xml:schema:keyprov:dskpp:transport

Клиент и сервер DSKPP должны поддерживать механизм шифрования

      http://www.w3.org/2001/04/xmlenc#rsa-1_5,

определенный в [XMLENC].

5.1.2. Упаковка ключа

Этот метод идеален для устройств с заранее созданными ключами (например, SIM-карт). Сервер DSKPP шифрует ключевой материал, используя заранее известный ключ упаковки, и доставляет его клиенту DSKPP. Клиент DSKPP расшифровывает ключевой материал и использует его для создания симметричного ключа K_TOKEN.

URN для идентификации метода

      urn:ietf:params:xml:schema:keyprov:dskpp:wrap

Клиент и сервер DSKPP должны поддерживать перечисленные ниже механизмы упаковки ключей.

AES128 KeyWrap

Основан на id-aes128-wrap из [RFC3394] и http://www.w3.org/2001/04/xmlenc#kw-aes128 из [XMLENC]

AES128 KeyWrap with Padding

Основан на id-aes128-wrap-pad из [RFC5649] и http://www.w3.org/2001/04/xmlenc#kw-aes128 из [XMLENC]

AES-CBC-128

Основан на [FIPS197-AES] и http://www.w3.org/2001/04/xmlenc#aes128-cbc из [XMLENC]

5.1.3. Защита ключа с использованием парольной упаковки

Этот метод является вариантом упаковки ключа, применимым для устройств с ограниченными возможностями, цифровую клавиатуру (например, мобильных телефонов). Сервер DSKPP шифрует ключевой материал, используя упаковку ключа на основе представленной пользователем парольной фразы, и доставляет зашифрованный ключевой материал клиенту DSKPP. Клиент DSKPP расшифровывает ключевой материал и использует его для создания симметричного ключа K_TOKEN.

Для предотвращения раскрытия ключа K_TOKEN кому-либо, кроме сервера DSKPP и криптомодуля, этот метод следует применять только в тех случаях, когда устройство непосредственно включает средства ввода парольной фразы (например, клавиатуру).

URN для идентификации метода

      urn:ietf:params:xml:schema:keyprov:dskpp:passphrase-wrap

Клиент и сервер DSKPP должны поддерживать перечисленные ниже механизмы:

AES128 KeyWrap

Основан на id-aes128-wrap из [RFC3394] и http://www.w3.org/2001/04/xmlenc#kw-aes128 из [XMLENC]

AES128 KeyWrap with Padding

Основан на id-aes128-wrap-pad из [RFC5649] и http://www.w3.org/2001/04/xmlenc#kw-aes128 из [XMLENC]

AES-CBC-128

Основан на [FIPS197-AES] и http://www.w3.org/2001/04/xmlenc#aes128-cbc из [XMLENC]

5.2. Поток сообщений

В 2-проходном варианте протокола используется один этап обмена сообщениями:

   1:  Проход 1 = <KeyProvClientHello>, Проход 2 = <KeyProvServerFinished>

Хотя здесь нет обмена сообщениями <ServerHello> или <ClientNonce>, клиент DSKPP сохраняет возможность задания своих предпочтений в части алгоритма и поддерживаемых типов ключей с помощью сообщения <KeyProvClientHello>.

Назначение и содержимое каждого сообщения описаны ниже. Формат XML и примеры приведены в разделе 8 и Приложении B.

5.2.1. KeyProvTrigger

Триггерное сообщение используется точно так же, как в 4-проходном варианте (см. параграф 4.2.1).

5.2.2. KeyProvClientHello

Клиент DSKPP                         Сервер DSKPP
------------                         ------------
SAL, AD, R_C,
[DeviceID], [KeyID],
KPML                   --->

Когда клиент DSKPP в первый раз подключается к серверу DSKPP, он должен передать в первую очередь сообщение <KeyProvClientHello>. Клиент может также отправить <KeyProvClientHello> в ответ на <KeyProvTrigger>.

Назначение сообщения

С помощью этого сообщения клиент DSKPP показывает свои предпочтения в части алгоритма и поддерживаемых типов ключей, а также поддерживаемые версии DSKPP, варианты протокола (в данном случае 2-проходный), форматы ключевого пакета и методы защиты ключей. Кроме того, клиент DSKPP упрощает засвидетельствование пользователей за счет передачи аутентификационных данных (AD), которые пользователь предоставил до отправки первого сообщения DSKPP.

Примечания для приложений

В этом сообщении серверу DSKPP должны передаваться данные (AD). Если сообщению предшествовал триггер <KeyProvTrigger>, у приложения уже имеются доступные данные AD (см. параграф 4.2.1). Однако, если триггера <KeyProvTrigger> не было, приложение должно найти код аутентификации пользователя (AC), возможно запрашивая ввод этого кода пользователем (например, с цифровой клавиатуры устройства). Приложение должно также создать данные AD на основе кода AC, как описано в параграфе 3.4.1, и сохранить их для использования в следующем сообщении <KeyProvClientNonce>.

Что содержится в сообщении

Список атрибутов защиты (SAL), включаемый в <KeyProvClientHello>, содержит комбинацию поддерживаемых клиентом DSKPP версий и вариантов протокола DSKPP, форматов ключевых пакетов, типов ключей и криптографических алгоритмов (предпочтительные варианты указываются сначала).

Данные засвидетельствования (AD), включенные в <KeyProvTrigger> или сгенерированные, как описано в «Примечания для приложений» выше.

Случайное значение маркера nonce клиента DSKPP (R_C), которое было использовано клиентом при генерации AD. За счет включения R_C в сессию DSKPP клиент DSKPP получает возможность проверить жизнеспособность сервера DSKPP до передачи ключа.

Если сообщению <KeyProvClientHello> предшествовал триггер <KeyProvTrigger>, тогда это сообщение должно включать также значения DeviceID и/или KeyID из триггерного сообщения. Если триггера не было перед <KeyProvClientHello>, это сообщение может включать значение DeviceID, известное клиенту и серверу DSKPP, а также может содержать идентификатор ключа, связанный с ключом, который сервер обеспечения DSKPP представил ранее.

Список методов защиты ключей (KPML19), поддерживаемых клиентом DSKPP. Каждый элемент списка может включать «содержимое» ключа шифрования для сервера DSKPP, которое используется для защиты ключевого материала, возвращаемого сервером клиенту. Это содержимое должно иметь тип <ds:KeyInfoType> ([XMLDSIG]). Для каждого метода защиты ключа допустимыми вариантами для <ds:KeyInfoType> являются:

  • Транспортировка ключа

    Только те варианты <ds:KeyInfoType>, которые идентичны открытому ключу (т. е., <ds:KeyName>, <ds:KeyValue>, <ds:X509Data> или <ds:PGPData>). Рекомендуется опция <ds:X509Certificate> варианта <ds:X509Data> для случаев, когда сертифицирован открытый ключ, соответствующий секретному ключу криптомодуля.

  • Упаковка ключа

    Только те варианты <ds:KeyInfoType>, которые идентичны симметричному ключу (т. е., <ds:KeyName> и <ds:KeyValue>). Рекомендуется вариант <ds:KeyName>.

  • Упаковка ключа на базе пароля

    Должна использоваться опция <ds:KeyName> и имя ключа должно идентифицировать парольную фразу, которая будет использоваться сервером для генерации ключа упаковки. Компоненты идентификатора и парольной фразы в <ds:KeyName> должны совпадать с компонентами Client ID и Authentication Code данных AD (тех же AD, что содержатся в данном сообщении).

Как сервер DSKPP использует это сообщение

Сервер DSKPP будет искать подходящую комбинацию версии DSKPP, варианта (в данном случае, 2-проходного) протокола, формата ключевого пакета, типа ключа и криптографических алгоритмов. Если список SAL клиента DSKPP не соответствует возможностям сервера DSKPP или не согласуется с политикой предоставления ключей, сервер DSKPP будет устанавливать для атрибута Status значение, отличное от Success. При соответствии будет устанавливаться Status = Success.

Сервер DSKPP будет проверять значения DeviceID и KeyID, если они включены в <KeyProvClientHello>. Серверу DSKPP недопустимо принимать DeviceID, если сам сервер не передавал DeviceID в предшествующем триггерном сообщении. Отметим, что клиент DSKPP может начать работу без получения от сервера триггерного сообщения <KeyProvTrigger>, но в этом случае любое, представленное клиентом значение DeviceID недопустимо воспринимать со стороны сервера, если у того нет доступа к уникальному ключу для идентифицируемого устройства, который будет использоваться в работе протокола.

Сервер DSKPP должен использовать значение AD для аутентификации пользователя. При отказе аутентификации сервер DSKPP должен установить в коде возврата значение отказа и удалить все маркеры nonce, ключи и или секреты, связанные с данным сеансом протокола.

Если аутентификация пользователя прошла успешно, сервер DSKPP генерирует ключ K_PROV. В 2-проходном варианте, когда клиент не имеет доступа к R_S, значение K_PROV генерируется случайным образом исключительно сервером DSKPP, при этом ключ K_PROV должен состоять из 2 частей равного размера

         K_PROV = K_MAC || K_TOKEN

Размер ключа K_TOKEN (и, следовательно, — K_MAC) определяется типом K_TOKEN, который должен быть одним из поддерживаемых клиентом DSKPP. В случаях, когда желаемый размер ключа K_TOKEN отличается от размера K_MAC для используемого алгоритма MAC, для генерации K_PROV должен выбираться больший из двух размеров. Ключ MAC укорачивается для создания K_MAC в тех случаях, когда используется алгоритм MAC, для которого размер K_MAC больше того, который требуется для ключа желаемого K_TOKEN. Если размер K_TOKEN больше требуемого для обеспечения соответствия с размером K_MAC, сервер обеспечения и принимающий клиент должны определить актуальный размер секретного ключа из алгоритма целевого ключа и сохранять лишь усеченную до нужного размера часть K_TOKEN. При отсечке должно сохраняться требуемое число начальных байтов реального ключа K_TOKEN или K_MAC. Например, если сервер обеспечения работает на базе секретного ключа HOTP размером 20 и MAC-алгоритма DSKPP-PRF-SHA256 (Приложение D), размер K_PROV будет 64. Соответственно, ключи K_TOKEN и K_MAC будут содержать по 32 байта. Используемый ключ HOTP будет включать первые 20 байтов ключа K_TOKEN.

После расчета K_PROV сервер DSKPP выбирает один из методов защиты ключей, предложенных в списке KPML клиентом DSKPP и использует этот метод вместе с соответствующими данными для шифрования K_PROV. Сервер DSKPP генерирует ключевой пакет для транспортировки информации метода шифрования ключа и зашифрованного ключа K_PROV. Формат зашифрованных данных определяется выбранным ключевым пакетом. Ключевой пакет должен задавать и использовать выбранный метод защиты ключа и ключевую информацию из сообщения <KeyProvClientHello>. Ключевой пакет включает также атрибуты использования (такие, как срок действия и размер). Сервер сохраняет ключевой пакет и K_TOKEN, связывая их с учетной записью пользователя на криптографическом сервере.

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

В дополнение к этому при обновлении существующего ключа сервер генерирует второй код MAC, который будет возвращаться клиенту, как аутентификационные данные (AD) сервера, чтобы клиент DSKPP мог убедиться, что замена ключа осуществляется доверенным сервером.

Сервер DSKPP должен использовать при расчете MAC для подтверждения ключа описанный ниже метод.

      msg_hash = SHA-256(msg_1, ..., msg_n)
      dsLen = len(msg_hash)
      MAC = DSKPP-PRF (K_MAC, "MAC 1 computation" || msg_hash || ServerID, dsLen)

где

MAC Значение MAC должно рассчитываться с использованием уже принятого алгоритма MAC, а при расчете должна применяться строка ASCII «MAC 1 computation», msg_hash и ServerID, а также существующий ключ MAC (K_MAC).

K_MAC Ключ, полученный из K_PROV, который сервер DSKPP должен предоставить криптомодулю.

msg_hash Хэш-сумма, определенная в параграфе 3.4.3, для сообщений msg_1, …, msg_n.

ServerID Идентификатор, который сервер DSKPP должен включать в элемент <KeyPackage> сообщения <KeyProvServerFinished>.

Если в качестве алгоритма MAC используется функция DSKPP-PRF (определена в параграфе 3.4.2)входной параметр этой функции должен представлять собой конкатенацию строки ASCII «MAC 1 computation», msg_hash и ServerID, а параметр dsLen должен совпадать с размером msg_hash.

Для расчета кода MAC, применяемого при аутентификации, сервера DSKPP сервер должен использовать описанный ниже метод.

Код MAC должен рассчитываться для строки ASCII «MAC 2 computation», идентификатора сервера ServerID и R с использованием уже существующего ключа MAC — K_MAC’ (ключ MAC, который существовал до запуска протокольной сессии). Отметим, что реализация может выбрать в качестве K_MAC’ значение ключа K_TOKEN, который будет меняться.

Если в качестве алгоритма MAC используется функция DSKPP-PRF, входной параметр s должен представлять собой конкатенацию строки ASCII «MAC 2 computation» со значениями ServerID и R. Параметр dsLen должен иметь значение не менее 16 (т. е., размер кода MAC должен быть не менее 16 октетов):

      dsLen >= 16
      MAC = DSKPP-PRF (K_MAC', "MAC 2 computation" || ServerID || R, dsLen)

Алгоритм MAC должен совпадать с алгоритмом, который сервер DSKPP использует для расчета кода MAC при подтверждении ключа.

5.2.3. KeyProvServerFinished

Клиент DSKPP                         Сервер DSKPP
------------                         ------------
                       <---           KP, MAC, AD

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

Назначение сообщения

С помощью этого сообщения сервер DSKPP доставляет ключевой пакет, содержащий зашифрованный ключ K_PROV и атрибуты его использования.

Что содержится в сообщении

Атрибут Status является эквивалентом кода, возвращаемого сервером в ответ на сообщение <KeyProvClientHello>. Если сервер нашел подходящий набор атрибутов в клиентском списке SAL, он устанавливает Status = Success.

Подтверждающее сообщение должно включать ключевой пакет (KP20), содержащий идентификаторы сервера DSKPP и ключа, тип ключа, зашифрованный ключ K_PROV, метод шифрования и дополнительные конфигурационные параметры. Используемый по умолчанию ключевой пакет для симметричного шифрования должен основываться на контейнере PSKC, определенном в [RFC6030]. В число дополнительных форматов могут входить [RFC6031], PKCS #12 [PKCS-12], PKCS #5 XML [PKCS-5-XML].

Это сообщение должно включать код MAC, который клиент DSKPP будет использовать для подтверждения ключа. Это значение MAC рассчитывается с использованием строки «MAC 1 computation», как описано выше.

Если осуществляется замена существующего ключа, сообщение должно также включать код MAC для аутентификации сервера (рассчитывается с использованием строки «MAC 2 computation», как описано выше), который передается клиенту DSKPP, как AD.

Как клиент DSKPP использует это сообщение

После получения сообщения <KeyProvServerFinished> с Status = Success клиент DSKPP должен проверить оба кода MAC (поля MAC и AD). Если верификация любого из кодов MAC дала отрицательный результат, клиент DSKPP должен прервать протокольную сессию и удалить все маркеры nonce, ключи и/или секреты, связанные с этой сессией.

Если в сообщении <KeyProvServerFinished> содержится Status = Success и проверка кода MAC прошла успешно, клиент DSKPP должен выделить ключ K_PROV из полученного ключевого пакета и создать ключ K_TOKEN. В заключение клиент DSKPP инициализирует криптомодуль с ключом K_TOKEN и соответствующими атрибутами его использования. После выполнения этой операции недопустимо менять ключ, пока не будет получен ключ разрешения с использованием кода MAC в новом сообщении <KeyProvServerFinished>.

6. Расширения протокола

Протокол DSKPP рассчитан на возможность расширения. В последующих параграфах определены два расширения, включенные в схему DSKPP. Поскольку при использовании этих расширений могут возникать проблемы совместимости, разработчикам протоколов следует взвешенно подходить к решению вопроса об использовании этих разрешений. Например, если конкретная реализация основана на фирменных расширениях, она может оказаться несовместимой с независимыми реализациями, которые не знают об этих расширениях.

Расширения могут передаваться в любом сообщении DSKPP с использованием типа ExtensionsType. Этот тип представляет собой список расширений, содержащий пары «тип-значение», которые определяют дополнительные функции, поддерживаемые клиентом или сервером DSKPP. Каждое расширение может быть помечено, как критическое путем установки для атрибута Critical в Extension значение true. Если расширение не имеет маркировки Critical, принимающая сторона не обязана интерпретировать такое расширение; принимающая сторона всегда свободна в решении вопроса об отказе от некритических расширений.

6.1. ClientInfoType

Расширение ClientInfoType может содержать любые специфичные для клиента данные, требуемые приложению. Это расширение может присутствовать в сообщениях <KeyProvClientHello> и <KeyProvClientNonce>. При наличии такого расширения недопустимо устанавливать для него флаг Critical.

Серверы DSKPP должны поддерживать это расширение. Для серверов DSKPP недопустимы попытки интерпретации содержащихся в расширении данных. При получении такого расширения сервер должен включить его в неизменном виде в следующий отклик для данного сеанса. От серверов DSKPP не требуется сохранение данных ClientInfoType.

6.2. ServerInfoType

Расширение ServerInfoType может содержать любые специфичные для сервера данные, требуемые приложению (например, информацию о состоянии). Это расширение допустимо только в сообщениях <KeyProvServerHello> с атрибутом Status = Continue. При наличии такого расширения недопустимо устанавливать для него флаг Critical.

Клиенты DSKPP должны поддерживать это расширение. Для клиентов DSKPP недопустимы попытки интерпретации содержащихся в расширении данных. При получении такого расширения клиент должен включить его в неизменном виде в следующий отклик для данного сеанса. От клиентов DSKPP не требуется сохранение данных ServerInfoType.

7. Привязки протокола

7.1. Общие требования

DSKPP предполагает транспорт с гарантией доставки.

7.2. Привязка HTTP/1.1 для DSKPP

В этом параграфе рассмотрена привязка описанных выше сообщений к протоколу HTTP/1.1 [RFC2616]. Эта привязка к HTTP является обязательной для реализации, хотя в последующих версиях спецификации могут быть определены дополнительные привязки. Отметим, что в общем случае клиент HTTP будет отличаться от клиента DSKPP (n. t., клиент HTTP будет выполнять функции посредника для сообщений DSKPP от клиента DSKPP к серверу DSKPP). Кроме того, на серверной стороне HTTP сервер DSKPP может получать сообщения DSKPP от сервера HTTP-front-end. Сервер DSKPP будет идентифицироваться специфическим указателем URL, который может быть задан заранее или установлен при инициализации клиента.

7.2.1. Идентификация сообщений DSKPP

Тип MIME для всех сообщений DSKPP должен быть

   application/dskpp+xml

7.2.2. Заголовки HTTP

Для предотвращения кэширования откликов, содержащих сообщения DSKPP прокси-серверами рекомендуются перечисленные ниже меры.

  • При использовании HTTP/1.1 запрашивающей стороне следует:

    • включить в заголовок поле Cache-Control со значением «no-cache, no-store»;

    • включить в заголовок поле Pragma со значением «no-cache».

  • При использовании HTTP/1.1 отвечающей стороне следует:

    • включить в заголовок поле Cache-Control со значением «no-cache, no-must-revalidate, private»;

    • включить в заголовок поле Pragma со значением «no-cache»;

    • не включать полей Validator типа заголовков Last-Modified или Etag.

Для обработки согласования контента запросы HTTP могут включать в заголовок поле HTTP Accept. Это поле следует идентифицировать с использованием типа MIME, заданного в параграфе 7.2.1. Заголовок Accept может включать дополнительные типы содержимого, которые будут определяться в новых версиях этого протокола.

На заголовки HTTP не накладывается каких-либо ограничений, кроме требования устанавливать для заголовка Content-Type значение типа MIME, указанное в параграфе 7.2.1.

7.2.3. Операции HTTP

Установившиеся соединения, определенные в HTTP/1.1, являются опциональными. Запросы DSKPP преобразуются в запросы HTTP с использованием метода POST. Отклики DSKPP преобразуются в отклики HTTP.

Для 4-проходного DSKPP сообщения в протокольной сессии «связываются воедино». В частности, сообщение <KeyProvServerHello> привязывается к предшествующему сообщению <KeyProvClientHello> путем передачи в соответствующем отклике HTTP. Сообщение <KeyProvServerHello> должно иметь атрибут SessionID и одноименный атрибут в последующем сообщении <KeyProvClientNonce> должен быть идентичным. Сообщение <KeyProvServerFinished> снова привязывается к остальным через HTTP (и, возможно, SessionID).

7.2.4. Коды состояния HTTP

Запрашивающей стороне DSKPP HTTP, которой не удалось осуществить обмен сообщениями с отвечающей стороной DSKPP HTTP, следует возвращать отклик с кодом 403 (Forbidden — запрещено). В этом случае содержимое тела HTTP не имеет значения. При возникновении ошибки HTTP во время обработки запроса DSKPP сервер HTTP должен возвращать отклик 500 (Internal Server Error — внутренняя ошибка сервера). Этот код следует возвращать для связанных с HTTP ошибок, обнаруженных до передачи управления процессору DSKPP или в тех случаях, когда процессор DSKPP сообщает о внутренней ошибке (например, некорректное пространство имен DSKPP XML или невозможно найти схему DSKPP). Если получен запрос, не являющийся сообщением клиента DSKPP, отвечающая сторона DSKPP должна возвращать код 400 (Bad request — некорректный запрос).

В тех случаях, когда возвращается отклик HTTP с кодом 4xx или 5xx, содержимое тела HTTP не имеет значения.

Коды перенаправления (3xx) применяются, как обычно.

Всякий раз при успешном выполнении HTTP POST отвечающая сторона DSKPP HTTP должна использовать код 200 и включать подходящее сообщение DSKPP (возможно, с информацией об ошибке DSKPP) в тело HTTP.

7.2.5. HTTP-засвидетельствование

Поддержка аутентификации HTTP/1.1 не предполагается.

7.2.6. Инициализация DSKPP

Если пользователь запрашивает инициализацию ключа в сеансе Web-просмотра и этот запрос имеет подходящий запрос Accept (например, с URL конкретного сервера DSKPP), сервер DSKPP может ответить передачей инициализационного сообщения DSKPP в отклике HTTP со значением Content-Type, установленным в соответствии с параграфом 7.2.1 и кодом 200 (OK). Инициализационное сообщение может содержать в своем теле данные типа URL для клиента DSKPP, которые могут использоваться при контакте с сервером DSKPP. Если сообщение содержит данные, они должны представлять собой корректный экземпляр элемента <KeyProvTrigger>.

Если пользовательский запрос был направлен какому-либо иному ресурсу, серверу DSKPP недопустимо отвечать на него, объединяя данные DSKPP с кодом отклика 200. В таких случаях серверу DSKPP следует отвечать путем передачи инициализационного сообщения DSKPP в отклике HTTP со значением Content-Type, установленным в соответствии с параграфом 7.2.1 и кодом отклика 406 (Not Acceptable — неприемлемо).

7.2.7. Примеры сообщений

  1. Инициализация от сервера DSKPP:

       HTTP/1.1 200 OK

       Cache-Control: no-store
       Content-Type: application/dskpp+xml
       Content-Length: <некое значение>

Данные инициализации DSKPP в форме XML …

  1. Начальный запрос от клиента DSKPP:

       POST http://example.com/cgi-bin/DSKPP-server HTTP/1.1

       Cache-Control: no-cache, no-store
       Pragma: no-cache
       Host: www.example.com
       Content-Type: application/dskpp+xml
       Content-Length: <некое значение>

Данные DSKPP в форме XML (поддерживаемая версия, поддерживаемые алгоритмы, …)

  1. Начальный запрос от сервера DSKPP:

       HTTP/1.1 200 OK

       Cache-Control: no-cache, no-must-revalidate, private
       Pragma: no-cache
       Content-Type: application/dskpp+xml
       Content-Length: <некое значение>

Данные DSKPP в форме XML (случайный маркер nonce от сервера, открытый ключ сервера, …)

8. XML-схема DSKPP

8.1. Общие требования к обработке

Некоторые элементы DSKPP основываются на компонентах, которые способны сравнивать полученные значения с сохраненными. Если явно не указано иное, все элементы, имеющие схему XML типа «xs:string» или производного от него типа, должны сравниваться с использованием точного бинарного сравнения. В частности для реализаций DSKPP недопустимо сравнение текстовых строк без учета регистра символов, нормализация или игнорирование пробелов, а также преобразование определяемых локальными (языковыми) параметрами форматов (в частности, представления чисел).

Реализации, сравнивающие значения, которые представлены в разных кодировках символов, должны использовать метод сравнения, дающий такой же результат, как двоичное сравнение этих значений, преобразованных в кодировку Unicode [UNICODE].

Порядок сопоставления или сортировки для атрибутов или элементов не определяется. Следовательно, для реализаций DSKPP недопустима зависимость от какого-либо конкретного порядка сортировки значений.

8.2. Схема

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
       xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
       targetNamespace="urn:ietf:params:xml:ns:keyprov:dskpp"
       elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
       <xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
          schemaLocation=
          "http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"/>
       <xs:import namespace="urn:ietf:params:xml:ns:keyprov:pskc"
          schemaLocation="keyprov-pskc-1.0.xsd"/>
       <xs:complexType name="AbstractRequestType" abstract="true">
          <xs:annotation>
             <xs:documentation> Basic types21 </xs:documentation>
          </xs:annotation>
          <xs:attribute name="Version" type="dskpp:VersionType" use="required"/>
       </xs:complexType>
       <xs:complexType name="AbstractResponseType" abstract="true">
          <xs:annotation>
             <xs:documentation> Basic types1 </xs:documentation>
          </xs:annotation>
          <xs:attribute name="Version" type="dskpp:VersionType" use="required"/>
          <xs:attribute name="SessionID" type="dskpp:IdentifierType" />
          <xs:attribute name="Status" type="dskpp:StatusCode" use="required"/>
       </xs:complexType>

       <xs:simpleType name="VersionType">
          <xs:restriction base="xs:string">
             <xs:pattern value="\d{1,2}\.\d{1,3}" />
          </xs:restriction>
       </xs:simpleType>

       <xs:simpleType name="IdentifierType">
          <xs:restriction base="xs:string">
             <xs:maxLength value="128" />
          </xs:restriction>
       </xs:simpleType>

       <xs:simpleType name="StatusCode">
          <xs:restriction base="xs:string">
             <xs:enumeration value="Continue" />
             <xs:enumeration value="Success" />
             <xs:enumeration value="Abort" />
             <xs:enumeration value="AccessDenied" />
             <xs:enumeration value="MalformedRequest" />
             <xs:enumeration value="UnknownRequest" />
             <xs:enumeration value="UnknownCriticalExtension" />
             <xs:enumeration value="UnsupportedVersion" />
             <xs:enumeration value="NoSupportedKeyTypes" />
             <xs:enumeration value="NoSupportedEncryptionAlgorithms" />
             <xs:enumeration value="NoSupportedMacAlgorithms" />
             <xs:enumeration value="NoProtocolVariants" />
             <xs:enumeration value="NoSupportedKeyPackages" />
             <xs:enumeration value="AuthenticationDataMissing" />
             <xs:enumeration value="AuthenticationDataInvalid" />
             <xs:enumeration value="InitializationFailed" />
             <xs:enumeration value="ProvisioningPeriodExpired" />
          </xs:restriction>
       </xs:simpleType>

       <xs:complexType name="DeviceIdentifierDataType">
          <xs:choice>
             <xs:element name="DeviceId" type="pskc:DeviceInfoType" />
             <xs:any namespace="##other" processContents="strict" />
          </xs:choice>
       </xs:complexType>

       <xs:simpleType name="PlatformType">
          <xs:restriction base="xs:string">
             <xs:enumeration value="Hardware" />
             <xs:enumeration value="Software" />
             <xs:enumeration value="Unspecified" />
          </xs:restriction>
       </xs:simpleType>

       <xs:complexType name="TokenPlatformInfoType">
          <xs:attribute name="KeyLocation" type="dskpp:PlatformType"/>
          <xs:attribute name="AlgorithmLocation" type="dskpp:PlatformType"/>
       </xs:complexType>

       <xs:simpleType name="NonceType">
          <xs:restriction base="xs:base64Binary">
             <xs:minLength value="16" />
          </xs:restriction>
       </xs:simpleType>

       <xs:complexType name="AlgorithmsType">
          <xs:sequence maxOccurs="unbounded">
             <xs:element name="Algorithm" type="dskpp:AlgorithmType"/>
          </xs:sequence>
       </xs:complexType>

       <xs:simpleType name="AlgorithmType">
          <xs:restriction base="xs:anyURI" />
       </xs:simpleType>

       <xs:complexType name="ProtocolVariantsType">
          <xs:sequence>
             <xs:element name="FourPass" minOccurs="0" />
             <xs:element name="TwoPass" type="dskpp:KeyProtectionDataType" minOccurs="0"/>
          </xs:sequence>
       </xs:complexType>

       <xs:complexType name="KeyProtectionDataType">
          <xs:annotation>
             <xs:documentation xml:lang="en">
                This element is only valid for two-pass DSKPP22.
             </xs:documentation>
          </xs:annotation>
          <xs:sequence maxOccurs="unbounded">
            <xs:element name="SupportedKeyProtectionMethod" type="xs:anyURI"/>
            <xs:element name="Payload" type="dskpp:PayloadType" minOccurs="0"/>
          </xs:sequence>
       </xs:complexType>

       <xs:complexType name="PayloadType">
          <xs:choice>
             <xs:element name="Nonce" type="dskpp:NonceType" />
             <xs:any namespace="##other" processContents="strict"/>
          </xs:choice>
       </xs:complexType>

       <xs:complexType name="KeyPackagesFormatType">
          <xs:sequence maxOccurs="unbounded">
             <xs:element name="KeyPackageFormat" type="dskpp:KeyPackageFormatType"/>
          </xs:sequence>
       </xs:complexType>

       <xs:simpleType name="KeyPackageFormatType">
          <xs:restriction base="xs:anyURI" />
       </xs:simpleType>

       <xs:complexType name="AuthenticationDataType">
          <xs:annotation>
             <xs:documentation xml:lang="en">
                Authentication Data contains a MAC23.
             </xs:documentation>
          </xs:annotation>
          <xs:sequence>
             <xs:element name="ClientID"
                type="dskpp:IdentifierType" minOccurs="0"/>
             <xs:choice>
                <xs:element name="AuthenticationCodeMac" type="dskpp:AuthenticationMacType"/>
                <xs:any namespace="##other" processContents="strict" />
             </xs:choice>
          </xs:sequence>
       </xs:complexType>

       <xs:complexType name="AuthenticationMacType">
          <xs:sequence>
             <xs:element minOccurs="0" name="Nonce" type="dskpp:NonceType"/>
             <xs:element minOccurs="0" name="IterationCount" type="xs:int"/>
             <xs:element name="Mac" type="dskpp:MacType" />
          </xs:sequence>
       </xs:complexType>

       <xs:complexType name="MacType">
          <xs:simpleContent>
             <xs:extension base="xs:base64Binary">
                <xs:attribute name="MacAlgorithm" type="xs:anyURI"/>
             </xs:extension>
          </xs:simpleContent>
       </xs:complexType>

       <xs:complexType name="KeyPackageType">
          <xs:sequence>
             <xs:element minOccurs="0" name="ServerID" type="xs:anyURI"/>
             <xs:element minOccurs="0" name="KeyProtectionMethod" type="xs:anyURI" />
             <xs:choice>
                <xs:element name="KeyContainer" type="pskc:KeyContainerType"/>
                <xs:any namespace="##other" processContents="strict"/>
             </xs:choice>
          </xs:sequence>
       </xs:complexType>

       <xs:complexType name="InitializationTriggerType">
          <xs:sequence>
             <xs:element minOccurs="0" name="DeviceIdentifierData"
                type="dskpp:DeviceIdentifierDataType" />
             <xs:element minOccurs="0" name="KeyID" type="xs:base64Binary"/>
             <xs:element minOccurs="0" name="TokenPlatformInfo"
                type="dskpp:TokenPlatformInfoType" />
             <xs:element name="AuthenticationData" type="dskpp:AuthenticationDataType" />
             <xs:element minOccurs="0" name="ServerUrl" type="xs:anyURI"/>
             <xs:any minOccurs="0" namespace="##other" processContents="strict" />
          </xs:sequence>
       </xs:complexType>

       <xs:complexType name="ExtensionsType">
          <xs:annotation>
             <xs:documentation> Extension types24 </xs:documentation>
          </xs:annotation>
          <xs:sequence maxOccurs="unbounded">
             <xs:element name="Extension" type="dskpp:AbstractExtensionType"/>
          </xs:sequence>
       </xs:complexType>

       <xs:complexType name="AbstractExtensionType" abstract="true">
          <xs:attribute name="Critical" type="xs:boolean" />
       </xs:complexType>

       <xs:complexType name="ClientInfoType">
          <xs:complexContent mixed="false">
             <xs:extension base="dskpp:AbstractExtensionType">
                <xs:sequence>
                   <xs:element name="Data" type="xs:base64Binary"/>
                </xs:sequence>
             </xs:extension>
          </xs:complexContent>
       </xs:complexType>

       <xs:complexType name="ServerInfoType">
          <xs:complexContent mixed="false">
             <xs:extension base="dskpp:AbstractExtensionType">
                <xs:sequence>
                   <xs:element name="Data" type="xs:base64Binary"/>
                </xs:sequence>
             </xs:extension>
          </xs:complexContent>
       </xs:complexType>

       <xs:element name="KeyProvTrigger"
          type="dskpp:KeyProvTriggerType">
          <xs:annotation>
             <xs:documentation> DSKPP PDUs </xs:documentation>
          </xs:annotation>
       </xs:element>

       <xs:complexType name="KeyProvTriggerType">
          <xs:annotation>
          <xs:documentation xml:lang="en">
             Message used to trigger the device to initiate a DSKPP run25.
          </xs:documentation>
          </xs:annotation>
          <xs:sequence>
             <xs:choice>
                <xs:element name="InitializationTrigger"
                   type="dskpp:InitializationTriggerType" />
                <xs:any namespace="##other" processContents="strict"/>
             </xs:choice>
          </xs:sequence>
          <xs:attribute name="Version" type="dskpp:VersionType"/>
       </xs:complexType>

       <xs:element name="KeyProvClientHello"
          type="dskpp:KeyProvClientHelloPDU">
          <xs:annotation>
             <xs:documentation>KeyProvClientHello PDU</xs:documentation>
          </xs:annotation>
       </xs:element>
       <xs:complexType name="KeyProvClientHelloPDU">
          <xs:annotation>
             <xs:documentation xml:lang="en">
                Message sent from DSKPP Client to DSKPP Server to initiate a DSKPP session26.
             </xs:documentation>
          </xs:annotation>
          <xs:complexContent mixed="false">
             <xs:extension base="dskpp:AbstractRequestType">
                <xs:sequence>
                   <xs:element minOccurs="0" name="DeviceIdentifierData"
                      type="dskpp:DeviceIdentifierDataType" />
                   <xs:element minOccurs="0" name="KeyID" type="xs:base64Binary" />
                   <xs:element minOccurs="0" name="ClientNonce" type="dskpp:NonceType" />
                   <xs:element name="SupportedKeyTypes" type="dskpp:AlgorithmsType" />
                   <xs:element name="SupportedEncryptionAlgorithms"
                      type="dskpp:AlgorithmsType" />
                   <xs:element name="SupportedMacAlgorithms" type="dskpp:AlgorithmsType" />
                   <xs:element minOccurs="0" name="SupportedProtocolVariants"
                      type="dskpp:ProtocolVariantsType" />
                   <xs:element minOccurs="0" name="SupportedKeyPackages"
                      type="dskpp:KeyPackagesFormatType" />
                   <xs:element minOccurs="0" name="AuthenticationData"
                      type="dskpp:AuthenticationDataType" />
                   <xs:element minOccurs="0" name="Extensions" type="dskpp:ExtensionsType" />
                </xs:sequence>
             </xs:extension>
          </xs:complexContent>
       </xs:complexType>

       <xs:element name="KeyProvServerHello"
          type="dskpp:KeyProvServerHelloPDU">
          <xs:annotation>
             <xs:documentation>KeyProvServerHello PDU</xs:documentation>
          </xs:annotation>
       </xs:element>
       <xs:complexType name="KeyProvServerHelloPDU">
          <xs:annotation>
             <xs:documentation xml:lang="en">
                Response message sent from DSKPP Server to DSKPP Client in four-pass DSKPP27.
             </xs:documentation>
          </xs:annotation>
          <xs:complexContent mixed="false">
             <xs:extension base="dskpp:AbstractResponseType">
                <xs:sequence minOccurs="0">
                   <xs:element name="KeyType" type="dskpp:AlgorithmType"/>
                   <xs:element name="EncryptionAlgorithm" type="dskpp:AlgorithmType" />
                   <xs:element name="MacAlgorithm" type="dskpp:AlgorithmType"/>
                   <xs:element name="EncryptionKey" type="ds:KeyInfoType"/>
                   <xs:element name="KeyPackageFormat" type="dskpp:KeyPackageFormatType" />
                   <xs:element name="Payload" type="dskpp:PayloadType"/>
                   <xs:element minOccurs="0" name="Extensions" type="dskpp:ExtensionsType" />
                   <xs:element minOccurs="0" name="Mac" type="dskpp:MacType"/>
                </xs:sequence>
             </xs:extension>
          </xs:complexContent>
       </xs:complexType>

       <xs:element name="KeyProvClientNonce" type="dskpp:KeyProvClientNoncePDU">
          <xs:annotation>
             <xs:documentation>KeyProvClientNonce PDU</xs:documentation>
          </xs:annotation>
       </xs:element>

       <xs:complexType name="KeyProvClientNoncePDU">
          <xs:annotation>
             <xs:documentation xml:lang="en">
                Response message sent from DSKPP Client to DSKPP Server in a four-pass DSKPP 
	        session1.
             </xs:documentation>
          </xs:annotation>
          <xs:complexContent mixed="false">
             <xs:extension base="dskpp:AbstractRequestType">
                <xs:sequence>
                   <xs:element name="EncryptedNonce" type="xs:base64Binary"/>
                   <xs:element minOccurs="0" name="AuthenticationData"
                      type="dskpp:AuthenticationDataType" />
                   <xs:element minOccurs="0" name="Extensions" type="dskpp:ExtensionsType" />
                </xs:sequence>
                <xs:attribute name="SessionID" type="dskpp:IdentifierType" use="required"/>
             </xs:extension>
          </xs:complexContent>
       </xs:complexType>

       <xs:element name="KeyProvServerFinished" type="dskpp:KeyProvServerFinishedPDU">
          <xs:annotation>
             <xs:documentation>KeyProvServerFinished PDU</xs:documentation>
          </xs:annotation>
       </xs:element>

       <xs:complexType name="KeyProvServerFinishedPDU">
          <xs:annotation>
             <xs:documentation xml:lang="en">
                Final message sent from DSKPP Server to DSKPP Client in a DSKPP session. 
                A MAC value serves for key confirmation, and optional AuthenticationData 
                serves for server authentication28.
             </xs:documentation>
          </xs:annotation>
          <xs:complexContent mixed="false">
             <xs:extension base="dskpp:AbstractResponseType">
                <xs:sequence minOccurs="0">
                   <xs:element name="KeyPackage" type="dskpp:KeyPackageType" />
                   <xs:element minOccurs="0" name="Extensions" type="dskpp:ExtensionsType" />
                   <xs:element name="Mac" type="dskpp:MacType" />
                   <xs:element minOccurs="0" name="AuthenticationData"
                      type="dskpp:AuthenticationMacType" />
                </xs:sequence>
             </xs:extension>
          </xs:complexContent>
       </xs:complexType>
     </xs:schema>

9. Требования по соответствию

Для обеспечения совместимости всех реализаций DSKPP сервер DSKPP:

  1. должен реализовать 4-проходный вариант протокола (раздел 4);

  2. должен реализовать 2-проходный вариант протокола (раздел 5);

  3. должен поддерживать аутентификацию пользователей (параграф 3.2.1);

  4. должен поддерживать функции порождения ключей:

  • DSKPP-PRF-AES DSKPP-PRF (Приложение D);

  • DSKPP-PRF-SHA256 DSKPP-PRF (Приложение D);

  1. должен поддерживать указанный ниже механизм шифрования для защиты клиентских маркеров nonce в 4-проходном протоколе:

  • механизм, описанный в параграфе 4.2.4;

  1. должен поддерживать для операций (например, «заворачивания») с симметричными ключами один из перечисленных ниже алгоритмов шифрования:

  1. должен поддерживать указанный ниже алгоритм шифрования для операций с асимметричными ключами (например, транспортировки ключей):

  • схема RSA Encryption [PKCS-1];

  1. должен поддерживать следующие функции контроля целостности/KDF MAC:

  • DSKPP-PRF-AES (Приложение D);

  • DSKPP-PRF-SHA256 (Приложение D);

  1. должен поддерживать ключевые пакеты PSKC [RFC6030]; должны быть реализованы все 3 метода защиты ключей PSKC (Key Transport, Key Wrap, Passphrase-Based Key Wrap);

  2. могут поддерживаться ключевые пакеты ASN.1 в соответствии с определением [RFC6031].

Клиенты DSKPP должны поддерживать 2-проходный или 4-проходный вариант протокола. Клиенты DSKPP должны соответствовать всем требованиям пунктов (c) — (j).

Реализации DSKPP должны привязывать сообщения DSKPP к протоколу HTTP/1.1, как описано в параграфе 7.2.

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

10. Вопросы безопасности

10.1. Общие вопросы

Протокол DSKPP разработан для защиты генерируемого ключевого материала от раскрытия. Никакие элементы, за исключением сервера DSKPP и криптомодуля, не могут получить доступа к генерируемым значениям K_TOKEN, если используется достаточно сильный криптоалгоритм, а на клиентской стороне генерация и шифрование R_C, а также генерация K_TOKEN выполняются в соответствии с требованиями криптомодуля. Это условие выполняется даже в случаях наличия враждебного кода на стороне клиента DSKPP. Однако, как отмечено в последующих параграфах, DSKPP не обеспечивает защиты от некоторых угроз, обусловленных MITM29атаками и некоторыми другими формами атак. Следовательно для защиты от таких угроз, протокол DSKPP должен использовать транспорт, обеспечивающий защиту конфиденциальности и целостности, типа HTTP over TLS с подходящим шифрованием [RFC2818]. Отметим, что шифры TLS с анонимным обменом ключами не подходят для этого случая [RFC5246].

10.2. Активные атаки

10.2.1. Введение

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

10.2.2. Изменение сообщений

Модификация сообщений <KeyProvTrigger> может приводить к отказу службы (изменение любого из идентификаторов или Authentication Code) или вынуждать клиента DSKPP контактировать с подставным сервером DSKPP. Последний вариант относится к MITM-атакам, которые рассматриваются в параграфе 10.2.7.

Атакующий может изменить сообщение <KeyProvClientHello>. Это позволяет атакующему указать для клиента DSKPP другой ключ или устройство, а также предложить клиенту криптографические алгоритмы, отличающихся от предпочитаемых клиентом (например, более слабые). Атакующий может также предложить использование более ранних версий DSKPP, которые могут иметь уязвимости. Такие изменения могут позволить атакующему воздействовать (инициализировать или изменить) на другой криптомодуль (сервер выделит ключ для другого модуля) или получить доступ к сгенерированному ключу за счет применения более слабого криптоалгоритма или уязвимой версии протокола. Реализации DSKPP могут обеспечить защиту от угроз второго типа за счет строго контроля используемых версий и алгоритмов. Первая угроза (выделение сгенерированного ключа для другого — некорректного — модуля) не реализуема для случаев, когда используется вариант DSKPP с разделяемым ключом (предполагается, что существующие разделяемые ключи уникальны для каждого криптомодуля), но остается актуальной для вариантов с открытыми ключами. Следовательно, для серверов DSKPP недопустимо принимать в одностороннем порядке идентификаторы устройств при использовании вариантов с открытым ключом. Это указано и в описании протокола. Однако в вариантах с разделяемым ключом атакующий может получить возможность представления подложного идентификатора (что может также привести к некорректному связыванию пользователя с созданным ключом), если атакующий имеет в реальном масштабе времени доступ к криптомодулю с идентифицированным ключом. В результате такой атаки могут возникать ситуации, когда сгенерированный ключ будет связан с корректным криптомодулем, но модуль будет связываться с некорректным пользователем. Такие атаки и возможные их последствия, а также меры противодействия более подробно рассмотрены в параграфе 10.5.

Атакующий может также изменить сообщение <KeyProvServerHello>. Это означает, что атакующий может указать иные типы ключей, алгоритмы, версию протокола, нежели предлагает легитимный сервер (например, более слабые криптографически). Атакующий может также представить подменные маркеры nonce взамен передаваемых легитимным сервером. В первом случае клиент может защититься путем строгого выполнения правил в части выбора допустимых алгоритмов и версий протокола. Во втором случае (подмена nonce) проблем безопасности не возникает, поскольку сгенерированный ключ не будет соответствовать ключу, сгенерированному легитимным сервером. Кроме того, каждый раз, когда запуск DSKPP будет приводить к замене имеющегося ключа, элемент <Mac> будет обеспечивать защиту от изменения R_S.

Возможно также изменение сообщений <KeyProvClientNonce>. Если атакующий меняет атрибут SessionID, на сервере, по сути, будет происходить переход к другой сессии в предположении, что новое значение SessionID в данный момент действительно на этом сервере. Это по-прежнему не дает злоумышленнику возможности узнать сгенерированное значение K_TOKEN, поскольку значение R_C было «упаковано» (wrapped) для легитимного сервера. Изменение элемента <EncryptedNonce> (например, замена значения на известное атакующему значение для базового R’C) не будет приводить к смене клиентом своего состояния до-DSKPP, поскольку сервер не сможет предоставить действительное значение MAC в своем финальном сообщении клиенту. Однако сервер может в конечном итоге сохранить K’TOKEN вместо K_TOKEN. Если криптографический модуль был связан с конкретным пользователем, это не будет приводить к нарушению защиты. Дополнительное рассмотрение этой угрозы и мер противодействия приведено ниже в параграфе 10.5. Отметим, что использование TLS не защищает от этой атаки, если злоумышленник имеет доступ к клиенту DSKPP (например, через вредоносную программу) [RFC5246].

Кроме того, атакующие могут также менять сообщения <KeyProvServerFinished>. Замена элемента <Mac> будет приводить лишь к отказу в обслуживании (denial of service). Замена любого другого элемента может приводить клиента DSKPP к связыванию, например, ложного (wrong) сервиса с созданным ключом. DSKPP следует использовать на основе транспорта, обеспечивающего защиту конфиденциальности и целостности, если такая угроза существенна.

10.2.3. Удаление сообщений

Удаление сообщений не причинит никакого вреда, кроме отказа в обслуживании, поскольку криптографическому модулю недопустимо менять свое состояние (т. е., «вводить в дело» созданный ключ), пока он не получит финального сообщения от сервера DSKPP и не обработает успешно это сообщение, включая проверку MAC в нем. Удаленное сообщение <KeyProvServerFinished> не вызовет перехода сервера в несогласованное с криптографическим модулем состояние, если на сервере реализованы предложения из параграфа 10.5.

10.2.4. Вставка сообщений

Активный атакующий может в любой момент инициировать запуск DSKPP и предложить любой идентификатор устройства. Реализации сервера DSKPP благодаря использованию <KeyProvTrigger> могут получить некоторую защиту от нечаянной инициализации ключа, непреднамеренной замены имеющегося ключа или назначения ключа криптомодулю путем запуска DSKPP. Элемент <AuthenticationData> позволяет серверу связать запуск DSKPP, например, с аутентифицированной пользователем сессией. Защита этого метода зависит от способности защитить элемент <AuthenticationData> в инициализационном сообщении DSKPP. Если атакующий способен захватить это сообщение, он может соперничать с легитимным пользователем при инициализации ключа. DSKPP на основе транспорта с защитой конфиденциальности и целостности, вкупе с рекомендациями параграфа 10.5 рекомендуется применять в тех случаях, когда это актуально.

Вставка других сообщений в работающий протокол выглядит как изменение легитимно переданных сообщений.

10.2.5. Повторное использование сообщений

В 4-проходном DSKPP попытка повторить записанное ранее сообщение DSKPP будет обнаружена, поскольку использование nonce говорит об активности обеих сторон. Например, DSKPP Client знает, что сервер, с которым он взаимодействует «жив», поскольку сервер должен создать MAC для переданной клиенту информации.

То же самое верно и для 2-проходных DSKPP, благодаря требованию к клиенту передавать R в сообщении <KeyProvClientHello>. Сервер будет включать R в расчет MAC.

10.2.6. Смена порядка сообщений

Атакующий может попытаться изменить порядок сообщений в 4-проходном DSKPP, но это будет обнаружен, поскольку каждое сообщение имеет уникальный тип. Отметим, что в 2-проходном DSKPP атаки с изменением порядка сообщений невозможны, поскольку каждая сторона передает не больше одного сообщения разом.

10.2.7. Атаки с участием человека (MITM)

В дополнение к другим активным этапам злоумышленник в MITM-атаке может предоставить клиенту DSKPP свой открытый ключ. Эта угроза и способы защиты от нее описаны в параграфе 4.1.1. Злоумышленник в MITM-атаке может выступать в качестве прокси, не мешая работе DSKPP, но получая нужную информацию (см. параграф 10.3).

10.3. Пассивные атаки

Пассивные атакующие могут перехватывать DSKPP для получения информации, которая может служит для подмены пользователей, организации активных атак и т. д.

Если DSKPP работает без защиты конфиденциальности на транспортном уровне, злоумышленник в пассивной атаке может узнать:

  • криптографические модули, которыми обладает конкретный пользователь;

  • идентификаторы ключей этих криптографических модулей и другие атрибуты, относящиеся к ключам (например, срок действия);

  • версии DSKPP и криптографических алгоритмов, поддерживаемые конкретным клиентом и сервером DSKPP;

  • любые значения, представленные в расширении <extension>, которое является частью <KeyProvClientHello>.

Всякий раз, когда перечисленные угрозы актуальны, для DSKPP должен использоваться транспорт с защитой конфиденциальности. Если для описанных выше случаев применимы MITM-атаки, транспорт должен также поддерживать аутентификацию на стороне сервера.

10.4. Криптографические атаки

Атакующий с неограниченным доступом к инициализированному криптомодулю может использовать этот модуль в качестве предсказатель заранее рассчитанных значений, которые позднее могут использоваться для того, чтобы представить себя сервером DSKPP. В параграфе 4.1.1 подробно рассматривается эта угроза и даны рекомендации по защите.

Разработчикам известно, что криптографические алгоритмы со временем стареют. По мере разработки новых криптографических методов и роста производительности вычислений, время, требуемое для взлома конкретного криптоалгоритма, будет уменьшаться. Поэтому реализации криптографических алгоритмов следует делать модульными с возможностью простой вставки новых алгоритмов. Т. е. разработчикам следует быть готовыми к регулярной замене алгоритмов в своих реализациях.

10.5. Взаимодействие DSKPP с засвидетельствованием пользователей

Если созданные DSKPP ключи будут связаны с конкретным пользователем на сервере DSKPP (или сервере, которому доверяет и с которым взаимодействует сервер DSKPP), для защиты от угроз, где атакующий заменяет предоставленный клиентом шифрованный R_C своим R’C (независимо от применения вариации открытого ключа или вариации общего секрета DSKPP для шифрования клиентского nonce), серверу не следует представлять созданный K_TOKEN для связывания с криптографическим модулем, если пользователь одновременно не подтвердит владение устройством, на котором установлен криптографический модуль, содержащий K_TOKEN и не представит ту или иную аутентификационную информацию (например, Authentication Code) по отдельному каналу. Например, если криптомодуль представляет собой маркер одноразового пароля, для аутентификации пользователя может потребоваться как одноразовый пароль, созданный криптомодулем, так и представленный по отдельному каналу код аутентификации (Authentication Code), чтобы сервер «представил» сгенерированное для данного пользователя значение OTP. В предпочтительном варианте пользователю следует выполнять эту операцию не с того хоста, который использовался для инициализации ключей в криптографическом модуле, чтобы минимизировать риск вмешательства в процесс вредоносных программ у клиента.

Примечание. Сценарий, где атакующий заменяет представленный клиентом R_C своим R’C, не подходит для двухпроходного DSKPP, поскольку клиент не предоставляет энтропии для K_TOKEN. Атака как таковая (и меры противодействия) остается применимой для двухпроходного DSKPP, однако она становится по сути MITM-атакой.

Другая угроза связана с возможностью атакующего вынудить пользователя к аутентификации у него, а не у легитимной службы до запуска DSKPP. При успехе атакующий сможет выдать себя легитимному сервису за этого пользователя и затем получить действительный триггер DSKPP. При использовании варианта открытого ключа DSKPP это может привести к тому, что атакующий сможет (после успешного запуска DSKPP) выдать себя за пользователя. Поэтому должны применяться обычные меры предосторожности, чтобы пользователи аутентифицировались только легитимными службами.

10.6. Прочие вопросы

10.6.1. Вклад клиента в энтропию K_TOKEN

В 4-проходном DSKPP клиент и сервер предоставляют случайный материал для K_TOKEN так, что обе стороны могут проверить свой вклад в результирующий ключ. В определенном здесь 2-проходном варианте DSKPP вклад в энтропию K_TOKEN вносит лишь сервер. Это означает, что поврежденный или взломанный генератор (псевдо)случайных чисел может привести к более серьезным повреждениям, нежели в 4-проходном варианте. Поэтому реализациям серверов следует быть крайне осторожными, чтобы предотвратить такие ситуации.

10.6.2. Подтверждение ключа

4-проходные серверы DSKPP обеспечивают подтверждение ключей с помощью MAC в R_C сообщений <KeyProvServerFinished>. В 2-проходном варианте DSKPP, описанном здесь, подтверждение ключа обеспечивается MAC, включающим R, с использованием K_MAC.

10.6.3. Аутентификация сервера

Серверы DSKPP должны аутентифицировать себя всякий раз, когда успешный запуск 2-проходного протокола DSKPP приводит к замене имеющегося K_TOKEN на K_TOKEN’ или возможна DoS-атака denial-of-service30, когда несанкционированный сервер DSKPP может заменить K_TOKEN другим ключом. В 2-проходном DSKPP серверы аутентифицируются включением расширения AuthenticationDataType, содержащего MAC, как описано в разделе 5 для 2-проходного DSKPP.

Всякий раз, когда успешный запуск 2-проходного протокола DSKPP приводит к замене имеющегося K_TOKEN на K_TOKEN’, клиент и сервер DSKPP должны выполнить указанные ниже процедуры для предотвращения DoS-атак, в который несанкционированный сервер DSKPP заменяет K_TOKEN другим ключом.

  • Сервер DSKPP должен использовать расширение AuthenticationDataType для передачи второго MAC, рассчитанного в соответствии с параграфом 5.2.2.

  • Клиент DSKPP должен проверить подлинность сервера с использованием MAC из расширения AuthenticationDataType, полученного от сервера DSKPP, к которому клиент подключен.

10.6.4. Аутентификация пользователя

Сервер DSKPP должен аутентифицировать клиента, чтобы убедиться в доставке K_TOKEN на нужное устройство. Для этого следует рассмотреть приведенные ниже аспекты.

  • При использовании Authentication Code для проверки подлинности клиента возможны атаки по словарю на Authentication Data.

  • Размер Authentication Code при работе по незащищенному каналу следует делать больше, чем при защищенном канале. Когда устройство, например, мобильный телефон с небольшим экраном, не может обрабатывать длинное значение Authentication Code с удобством для пользователя, DSKPP следует применять защищенные каналы.

  • При использовании незащищенного канала Authentication Code следует передавать серверу с кодом MAC, как указано в параграфе 3.4.1. Authentication Code и nonce должны быть достаточно стойкими для предотвращения восстановления Authentication Code по хешированным данным (HMAC31). С учетом передачи nonce в открытом виде с использованием незащищенного транспорта, криптостойкость Authentication Data определяется в основном качеством Authentication Code.

  • Когда Authentication Code передается от сервера DSKPP на устройство в триггерном сообщении инициализации DSKPP, такое сообщение может быть перехвачено злоумышленником для захвата инициализации ключа. Для предотвращения этого транспортный уровень, используемый для передачи триггера DSKPP, должен обеспечивать защиту конфиденциальности и целостности (например, защищенная сессия в браузере).

10.6.5. Защита ключа в двухпроходном DSKPP

Для разных способов применения 2-проходного DSKPP определены три основных метода защиты, которые должны поддерживаться форматом ключей, таким как [RFC6030] и [RFC6031]. Поэтому защита ключа в 2-проходном DSKPP зависит от защиты формата пакетов ключей, выбранного для работы протокола. Ниже приведены некоторые соображения для метода передачи ключей с помощью пароля (Passphrase-Based Key Wrap).

Методу Passphrase-Based Key Wrap следует применять функцию PBKDF2 из [PKCS-5] для генерации ключа шифрования из парольной фразы и строки «затравки» (salt). Важно отметить, что шифрование на основе парольной фразы в общем случае обеспечивает ограниченную защиту, несмотря на применение затравки и счетчика итераций в PBKDF2 для осложнения атак. Поэтому реализациям следует принимать дополнительные меры по усилению защиты в методе Passphrase-Based Key Wrap. Для этого следует рассмотреть перечисленные ниже меры.

  • Парольная фраза совпадает с компонентой одноразового пароля в Authentication Code (см. описание формата AC в параграфе 3.4.1). Парольную фразу следует выбирать осторожно, и следует принимать во внимание рекомендации, такие как приведенные в [NIST-PWD].

  • Следует использовать разные парольные фразы для каждой инициализации ключа, если это возможно (например, следует избегать применения «глобальной» парольной фразы для пакетных криптографических модулей). Одним из вариантов является использование случайных парольных фраз.

  • Парольные фразы следует надежно защищать, если они хранятся на сервере и/или в криптографическом модуле, а доставлять на устройства следует с применением защищенных методов.

  • Следует реализовать предварительную аутентификацию пользователей, чтобы предотвратить доставку K_TOKEN подставным получателям.

  • Число итераций в PBKDF2 следует делать большим, чтобы навязать атакующему больший объем работы при использовании методов подбора — brute-force (см. рекомендации [PKCS-5]). Однако необходимо отметить, что увеличения числа итераций повышает объем работы и для легитимных криптомодулей при расшифровке недавно полученного K_TOKEN. Серверы могут применять сравнительно небольшое число итераций для способствования устройствам с ограниченными вычислительными возможностями, таким как PDA и сотовые телефоны, когда применяются другие меры защиты и безопасность Passphrase-Based Key Wrap не снижается.

  • Следует по возможности применять TLS [RFC5246] для защиты 2-проходного режима работы протокола. Защита на транспортном уровне обеспечивает дополнительную безопасность недавно созданным K_TOKEN.

10.6.6. Гибкость алгоритмов

Для многих протоколов требуется гибкость в плане алгоритмов. Одна из причин этого заключается в том, что многие протоколы в прошлом использовали фиксированный размер полей, таких как выходные данные, ключи и т. п. Это не относится к DSKPP, за исключением размера ключа при расчете DSKPP-PRF. Другой причиной является отсутствие согласования. Это тоже не относится к DSKPP, за исключением применения SHA-256 в подтверждающем MAC сообщении. Обновление размера ключей для DSKPP-PRF или алгоритма подтверждающих MAC сообщений потребует новой версии протокола, которая поддерживается атрибутом Version.

11. Поддержка других языков

DSKPP предназначен для межмашинных коммуникаций и его элементами являются маркеры (token), не предназначенные для прямого использования людьми. Обмен информацией в DSKPP использует XML. Все процессоры XML должны понимать кодировку UTF-8 [RFC3629], поэтому все клиенты и серверы DSKPP должны понимать XML в кодировке UTF-8. Кроме того, клиентам и серверам DSKPP недопустимо представлять XML в кодировке, отличной от UTF-8.

12. Взаимодействие с IANA

Этот документ требует нескольких регистраций в IANA, описанных ниже.

12.1. Регистрация субпространства имен URN

Этот параграф регистрирует пространство имен XML «urn:ietf:params:xml:ns:keyprov:dskpp» в соответствии с [RFC3688].

URI: urn:ietf:params:xml:ns:keyprov:dskpp

Регистрационные контакты:

IETF, рабочая группа KEYPROV (keyprov@ietf.org), Andrea Doherty (andrea.doherty@rsa.com)

   XML:
      BEGIN
         <?xml version="1.0"?>
         <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
         <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
         <head>
            <title>DSKPP Messages32</title>
         </head>
         <body>
            <h1>Namespace for DSKPP Messages33</h1>
            <h2>urn:ietf:params:xml:ns:keyprov:dskpp</h2>
            <p>See RFC 6063</p>
         </body>
         </html>
      END

12.2. Регистрация XML-схемы

Этот параграф регистрирует схему XML в соответствии с [RFC3688].

URI: urn:ietf:params:xml:ns:keyprov:dskpp

Регистрационные контакты:

IETF, рабочая группа KEYPROV (keyprov@ietf.org), Andrea Doherty (andrea.doherty@rsa.com)

Схема:

XML для этой схемы можно найти в разделе 8 данного документа.

12.3. Регистрация MIME Media Type

Этот параграф регистрирует тип носителя MIME «application/dskpp+xml».

   To:  ietf-types@iana.org 
   Subject:  Registration of MIME media type application/dskpp+xml
   MIME media type name:  application
   MIME subtype name:  dskpp+xml
   Required parameters:  (none)
   Optional parameters:  charset
      Indicates the character encoding of enclosed XML.34
   Encoding considerations:  Uses XML, which can employ 8-bit characters, 
   depending on the character encoding used.  See [RFC3023], Section 3.2.  
   Implementations need to support UTF-8 [RFC3629].35
   Security considerations:  This content type is designed to carry 
   protocol data related to key management.  Security mechanisms are 
   built into the protocol to ensure that various threats are dealt with.  
   Refer to Section 10 of RFC 6063 for more details36
   Interoperability considerations:  None
   Published specification:  RFC 6063.
   Applications that use this media type:  Protocol for key exchange.37
   Additional information:
      Magic Number(s): (none)
      File extension(s): .xmls
      Macintosh File Type Code(s): (none)
   Person & email address to contact for further information:
      Andrea Doherty (andrea.doherty@rsa.com)
   Intended usage:  LIMITED USE38
   Author/Change controller:  The IETF
   Other information:  This media type is a specialization of application/xml 
      [RFC3023], and many of the considerations described there also apply to 
      application/dskpp+xml.39

12.4. Регистрация кодов состояния

Этот параграф регистрирует коды состояний, включаемые в каждое сообщение с откликом DSKPP. Коды состояний заданы в определении типа <StatusCode>, содержащемся в схеме XML (раздел 8). Реестр кратко описан ниже.

Related Registry:
      KEYPROV DSKPP Registries, Status codes for DSKPP
   Defining RFC:
      RFC 6063.
   Registration/Assignment Procedures:
      Following the policies outlined in [RFC3575], the IANA policy for
      assigning new values for the status codes for DSKPP MUST be 
      "Specification Required" and their meanings MUST be documented in 
      an RFC or in some other permanent and readily available reference, 
      in sufficient detail that interoperability between independent 
      implementations is possible.  No mechanism to mark entries as 
      "deprecated" is envisioned.  It is possible to update entries from the registry.40
Registrant Contact:
      IETF, KEYPROV working group (keyprov@ietf.org), 
      Andrea Doherty (andrea.doherty@rsa.com).

12.5. Регистрация версии DSKPP

Этот параграф регистрирует номер версии DSKPP, как показано ниже.

Версия DSKPP

Спецификация

1.0

Этот документ

Для определения новой версии DSKPP требуется стандартизация. Отмена, удаление или изменение имеющихся версий DSKPP не предусмотрены.

12.6. Субреестр PRF Algorithm ID

Эта спецификация основана на криптографическом примитиве DSKPP-PRF, которые обеспечивает детерминированное преобразование секретного ключа k и строки октетов переменного размера s в битовую строку заданного размера dsLen. С точки зрения этой спецификации DSKPP-PRF является функциональным «черным ящиком», который на основе входных данных создает псевдослучайное значение, которое может быть реализовано любым подходящим и правомочным криптографическим методом. В параграфе 3.4.2 представлены две реализации DSKPP-PRF — DSKPP-PRF-AES и DSKPP-PRF-SHA256.

Этот параграф регистрирует идентификаторы, связанные с этими реализациями. Для субреестров PRF Algorithm ID применяется процедура Specification Required в соответствии с RFC 5226 [RFC5226]. Обновления должны документироваться в RFC или других постоянно и легко доступных документах с описанием, достаточно подробным для обеспечения возможности взаимодействия независимых реализаций.

Для отмены субреестра требуется одобрение эксперта. После признания PRF Algorithm ID устаревшим, алгоритм не следует применять в новых реализациях.

12.6.1. DSKPP-PRF-AES

Этот параграф регистрирует приведенный ниже реестр пространства имен IETF XML.

   Common Name:
      DSKPP-PRF-AES
   URI:
      urn:ietf:params:xml:ns:keyprov:dskpp:prf-aes-128
   Identifier Definition:
      The DSKPP-PRF-AES algorithm realization is defined in
      Appendix D.2.2 of this document.41
   Registrant Contact:
      IETF, KEYPROV working group (keyprov@ietf.org), Andrea Doherty (andrea.doherty@rsa.com)

12.6.2. DSKPP-PRF-SHA256

Этот параграф регистрирует приведенный ниже реестр пространства имен IETF XML.

   Common Name:
      DSKPP-PRF-SHA256
   URI:
      urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256
   Identifier Definition:
      The DSKPP-PRF-SHA256 algorithm realization is defined in
      Appendix D.3.2 of this document42.
   Registrant Contact:
      IETF, KEYPROV working group (keyprov@ietf.org), Andrea Doherty (andrea.doherty@rsa.com)

12.7. Регистрация ключевого контейнера

Этот параграф регистрирует тип Key Container.

   Key Container:
      The registration name for the Key Container.43
   Specification:
      Key Container defines a key package format that specifies how a
      key should be protected using the three key protection methods
      provided in Section 5.1.44
   Registration Procedure:
      Following the policies outlined in [RFC3575], the IANA policy for
      assigning new values for the status codes for DSKPP MUST be
      "Specification Required" and their meanings MUST be documented in
      an RFC or in some other permanent and readily available reference,
      in sufficient detail that interoperability between independent
      implementations is possible.45
   Deprecated:
      TRUE if based on expert approval this entry has been deprecated
      and SHOULD NOT be used in any new implementations.  Otherwise,
      FALSE.46
   Identifiers:
      The initial URIs for the Key Container defined for this version of
      the document are listed here:47
      Name:  PSKC Key Container
      URI:  urn:ietf:params:xml:ns:keyprov:dskpp:pskc-key-container
      Specification:  [RFC6030]
      Deprecated:  FALSE
      Name:  SKPC Key Container
      URI:  urn:ietf:params:xml:ns:keyprov:dskpp:skpc-key-container
      Specification:  [RFC6031]
      Deprecated:  FALSE
      Name:  PKCS12 Key Container
      URI:  urn:ietf:params:xml:ns:keyprov:dskpp:pkcs12-key-container
      Specification:  [PKCS-12]
      Deprecated:  FALSE
      Name:  PKCS5-XML Key Container
      URI:  urn:ietf:params:xml:ns:keyprov:dskpp:pkcs5-xml-key-container
      Specification:  [PKCS-5-XML]
      Deprecated:  FALSE
   Registrant Contact:
      IETF, KEYPROV working group (keyprov@ietf.org), Andrea Doherty (andrea.doherty@rsa.com)

13. Интеллектуальная собственность

RSA и RSA Security являются (зарегистрированными) торговыми знаками RSA Security, Inc. В США и/или других странах. Названия другой продукции и услуг могут быть торговыми знаками соответствующих владельцев.

14. Участники работы

Эта работа основана на информации из [RFC4758], созданного Magnus Nystrom, с усовершенствованиями, заимствованными из отдельного документа, авторами которого являются Mingliang Pei и Salah Machani (например, аутентификация пользователей и поддержка разных форматов упаковки ключей).

Авторы признательны Philip Hoyer за его работу по согласованию схем DSKPP и PSKC.

Спасибо Hannes Tschofenig и Phillip Hallam-Baker за их рецензии, отклики и вклад в текст документа.

15. Благодарности

Авторы признательны перечисленным ниже людям за рецензирование предыдущих версий документа DSKPP.

  • Dr. Ulrike Meyer (июнь 2007);

  • Niklas Neumann (июнь 2007);

  • Shuh Chang (июнь 2007);

  • Hannes Tschofenig (июнь и август 2007);

  • Sean Turner (август 2007 и июль 2008);

  • John Linn (август 2007);

  • Philip Hoyer (сентябрь 2007);

  • Thomas Roessler (ноябрь 2007);

  • Lakshminath Dondeti (комментарии в декабре 2007);

  • Pasi Eronen (комментарии в декабре 2007);

  • Phillip Hallam-Baker (обзор и редактирование в ноябре 2008 и январе 2009);

  • Alexey Melnikov (май 2010);

  • Peter Saint-Andre (май 2010).

Авторы благодарны перечисленным ниже людям за их вклад в отдельные аспекты разработки DSKPP.

  • Anders Rundgren (формат упаковки ключей и данные аутентификации клиентов);

  • Thomas Roessler (привязка HTTP);

  • Hannes Tschofenig (привязка HTTP);

  • Phillip Hallam-Baker (реестр алгоритмов);

  • N. Asokan (первым отметил слабость Authentication Data).

В заключение авторы хотели бы поблагодарить Robert Griffin за то, что он открыл для них каналы связи с IEEE P1619.3 Key Management Group и помог оставаться в курсе возможных направления сотрудничества (особенно в части представления ключей и глобальны идентификаторов ключей).

16. Литература

16.1. Нормативные документы

[FIPS180-SHA] National Institute of Standards and Technology, «Secure Hash Standard», FIPS 180-2, February 2004, <http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf>.

[FIPS197-AES] National Institute of Standards and Technology, «Specification for the Advanced Encryption Standard (AES)», FIPS 197, November 2001, <http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf>.

[ISO3309] International Organization for Standardization, «ISO Information Processing Systems — Data Communication — High-Level Data Link Control Procedure — Frame Structure», ISO 3309, 3rd Edition, October 1984.

[PKCS-1] RSA Laboratories, «RSA Cryptography Standard», PKCS #1 Version 2.1, June 2002, <http://www.rsasecurity.com/rsalabs/pkcs/>.

[PKCS-5] RSA Laboratories, «Password-Based Cryptography Standard», PKCS #5 Version 2.0, March 1999, <http://www.rsasecurity.com/rsalabs/pkcs/>.

[PKCS-5-XML] RSA Laboratories, «XML Schema for PKCS #5 Version 2.0», PKCS #5 Version 2.0 Amd.1 (FINAL DRAFT), October 2006, <http://www.rsasecurity.com/rsalabs/pkcs/>.

[RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, «HMAC: Keyed-Hashing for Message Authentication», RFC 2104, February 1997.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, «Hypertext Transfer Protocol — HTTP/1.1», RFC 2616, June 1999.

[RFC3394] Schaad, J. and R. Housley, «Advanced Encryption Standard (AES) Key Wrap Algorithm», RFC 3394, September 2002.

[RFC3629] Yergeau, F., «UTF-8, a transformation format of ISO 10646», STD 63, RFC 3629, November 2003.

[RFC4013] Zeilenga, K., «SASLprep: Stringprep Profile for User Names and Passwords», RFC 4013, February 2005.

[RFC4210] Adams, C., Farrell, S., Kause, T., and T. Mononen, «Internet X.509 Public Key Infrastructure Certificate Management Protocol (CMP)», RFC 4210, September 2005.

[RFC5272] Schaad, J. and M. Myers, «Certificate Management over CMS (CMC)», RFC 5272, June 2008.

[RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R., and W. Polk, «Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile», RFC 5280, May 2008.

[RFC5649] Housley, R. and M. Dworkin, «Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm», RFC 5649, September 2009.

[RFC6030] Hoyer, P., Pei, M., and S. Machani, «Portable Symmetric Key Container (PSKC)», RFC 6030, October 2010.

[UNICODE] Davis, M. and M. Duerst, «Unicode Normalization Forms», March 2001, <http://www.unicode.org/unicode/reports/tr15/tr15-21.html>.

[XML] W3C, «Extensible Markup Language (XML) 1.0 (Fifth Edition)», W3C Recommendation, November 2008, <http://www.w3.org/TR/2006/REC-xml-20060816/>.

[XMLDSIG] W3C, «XML Signature Syntax and Processing», W3C Recommendation, February 2002, <http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/>.

[XMLENC] W3C, «XML Encryption Syntax and Processing», W3C Recommendation, December 2002, <http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/>.

16.2. Дополнительная литература

[CT-KIP-P11] RSA Laboratories, «PKCS #11 Mechanisms for the Cryptographic Token Key Initialization Protocol», PKCS #11 Version 2.20 Amd.2, December 2005, <http://www.rsasecurity.com/rsalabs/pkcs/>.

[FAQ] RSA Laboratories, «Frequently Asked Questions About Today’s Cryptography», Version 4.1, 2000.

[NIST-PWD] National Institute of Standards and Technology, «Password Usage», FIPS 112, May 1985, <http://www.itl.nist.gov/fipspubs/fip112.htm>.

[NIST-SP800-38B] International Organization for Standardization, «Recommendations for Block Cipher Modes of Operation: The CMAC Mode for Authentication», NIST SP800-38B, May 2005, <http://csrc.nist.gov/publications/nistpubs/800-38B/SP_800-38B.pdf>.

[NIST-SP800-57] National Institute of Standards and Technology, «Recommendation for Key Management — Part I: General (Revised)», NIST 800-57, March 2007, <http://csrc.nist.gov/publications/nistpubs/800-57/sp800-57-Part1-revised2_Mar08-2007.pdf>.

[PKCS-11] RSA Laboratories, «Cryptographic Token Interface Standard», PKCS #11 Version 2.20, June 2004, <http://www.rsasecurity.com/rsalabs/pkcs/>.

[PKCS-12] «Personal Information Exchange Syntax Standard», PKCS #12 Version 1.0, 2005, <ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12v1.pdf>.

[RFC2818] Rescorla, E., «HTTP Over TLS», RFC 2818, May 2000.

[RFC3023] Murata, M., St. Laurent, S., and D. Kohn, «XML Media Types», RFC 3023, January 2001.

[RFC3575] Aboba, B., «IANA Considerations for RADIUS (Remote Authentication Dial In User Service)», RFC 3575, July 2003.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, January 2004.

[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, «Uniform Resource Identifier (URI): Generic Syntax», STD 66, RFC 3986, January 2005.

[RFC4758] Nystroem, M., «Cryptographic Token Key Initialization Protocol (CT-KIP) Version 1.0 Revision 1», RFC 4758, November 2006.

[RFC5226] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, May 2008.

[RFC5246] Dierks, T. and E. Rescorla, «The Transport Layer Security (TLS) Protocol Version 1.2», RFC 5246, August 2008.

[RFC6031] Turner, S. and R. , «Cryptographic Message Syntax (CMS) Symmetric Key Package Content Type», RFC 6031, December 2010.

[XMLNS] W3C, «Namespaces in XML», W3C Recommendation, January 1999, <http://www.w3.org/TR/2009/REC-xml-names-20091208>.

Приложение A. Варианты применения

Предполагается, что DSKPP будет применяться для предоставления симметричных ключей криптографическим модулям в различных вариантах, каждый из которых имеет свои требования, как описано ниже. Это приложение является информационной частью документа.

A.1. Запрос одного ключа

Обычный сценарий заключается в том, что криптографический модуль запрашивает симметричный ключ у сервера обеспечения, расположенного в локальной сети или в Internet. В зависимости от варианта развертывания сервер обеспечения может генерировать новый ключ «на лету» или использовать созданный заранее ключ, например, предоставленный традиционным сервером эмиссии ключей. Сервер обеспечения назначает симметричному ключу уникальный идентификатор и предоставляет его криптографическому модулю.

A.2. Запрос множества ключей

Криптографический модуль передает множество запросов для симметричных ключей одному серверу обеспечения. Симметричные ключи не обязательно должны быть однотипными, т. е. они могут применяться с разными криптографическими алгоритмами, включая алгоритмы одноразовых ключей аутентификации и алгоритм шифрования AES .

A.3. Засвидетельствование пользователя

В некоторых вариантах развертывания эмитент ключей может полагаться на стороннюю службу обеспечения. В таких случаях эмитент направляет запросы на предоставления от криптомодулей службе обеспечения. Таким образом, эмитент отвечает за аутентификацию пользователей тем или иным автономным (out-of-band) способом до предоставления пользователю права получить ключ. После предоставления эмитентом такого права он выдает пользователю код аутентификации (Authentication Code) и делает его доступным службе обеспечения, чтобы пользователь мог подтвердить свое право на получение ключей.

A.4. Политика тайм-аутов предоставления

Эмитент может предоставить пользователю в процессе регистрации временный код аутентификации, который пользователь будет вводить в криптомодуль для представления себя серверу обеспечения. Сервер будет разрешать предоставление ключа криптомодулю на пользовательском устройстве при необходимости проверить подлинность пользователя лишь в случае ввода пользователем корректного Authentication Code с фиксированным сроком действия, заданным эмитентом.

A.5. Обновление ключа

Криптомодуль запрашивает обновление симметричного ключевого материала, присоединенного к идентификатору ключа в отличие от сохранения постоянного значения ключа и обновления метаданных. Такая потребность может возникнуть в случае, когда пользователь хочет обновить свое устройство, на котором размещен криптомодуль, или при завершении срока действия ключа. Когда пользователь применяет один и тот же криптомодуль, например, для выполнения строгой аутентификации на множестве Web-сайтов со входом в систему (login), сохранение идентификатора ключа избавляет пользователя от необходимости регистрировать на каждом сайте новый ключ.

A.6. Замена предустановленного ключа

Этот вариант представляет особый случай обновления симметричного ключа, когда локальный администратор может аутентифицировать пользователя процедурно без инициирования процесса обеспечения. Это также позволяет эмитенту устройств заранее загружать ключ в криптомодуль с требованием замены этого ключа до начала использования модуля. В другом варианте это может применяться организациями, где устройства могут переходить от одного пользователя к другому. В этом случае эмитент ключей предоставляет новый симметричный ключ для криптомодуля, размещенного на устройстве, который до этого владел другой пользователь.

Отметим, что этот вариант по существу совпадает с предыдущим если при обновлении применяется тот же идентификатор ключа.

A.7. Заранее известный заводской ключ

Криптомодуль загружается в смарт-карту после ее выдачи пользователю. Симметричный ключ для криптомодуля обеспечивается с использованием защищенного канала, имеющегося в большинстве платформ для смарт-карт. Это позволяет напрямую организовать защищенный канал между микросхемой смарт-карты и сервером обеспечения. Например, команды карт (т. е. APDU48) шифруются с заранее введенным производителем карты ключом и передаются напрямую в микросхему карты, обеспечивая защищенную послепродажную подготовку в «полевых» условиях. Этот защищенный поток может проходить через TLS [RFC5246] и другие границы защищенного транспорта.

Отметим, что для этого варианта имеется два предварительных условия — протокол должен быть туннелируемым, а сервер обеспечения должен знать заданный производителем ключ.

A.8. Сквозная защита ключевого материала

В этом варианте TLS не обеспечивает сквозной защиты ключевого материала, передаваемого от сервера обеспечения в криптомодуль. Например, TLS может завершаться на приложении, размещенном в PC, а не в криптомодуле (т. е. конечной точке), расположенном в устройстве хранения данных [RFC5246]. Согласование ключа с взаимной аутентификацией обеспечивает сквозную защиту, которую не может предоставить TLS.

Приложение B. Примеры

В этом приложении даны примеры сообщений, иллюстрирующие параметры, кодирование и семантику для 2- и 4-проходного обмена DSKPP. Примеры написаны с использованием XML и синтаксически корректны. Однако значения MAC и шифров являются вымышленными. Приложение является информационной частью документа.

B.1. Триггерное сообщение

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <dskpp:KeyProvTrigger Version="1.0"
     xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
     xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc">
     <dskpp:InitializationTrigger>
       <dskpp:DeviceIdentifierData>
           <dskpp:DeviceId>
               <pskc:Manufacturer>TokenVendorAcme</pskc:Manufacturer>
               <pskc:SerialNo>987654321</pskc:SerialNo>
               <pskc:StartDate>2009-09-01T00:00:00Z</pskc:StartDate>
               <pskc:ExpiryDate>2014-09-01T00:00:00Z</pskc:ExpiryDate>
           </dskpp:DeviceId>
       </dskpp:DeviceIdentifierData>
       <dskpp:KeyID>SE9UUDAwMDAwMDAx</dskpp:KeyID>
       <dskpp:TokenPlatformInfo KeyLocation="Hardware"
         AlgorithmLocation="Software"/>
       <dskpp:AuthenticationData>
         <dskpp:ClientID>31300257</dskpp:ClientID>
         <dskpp:AuthenticationCodeMac>
           <dskpp:IterationCount>512</dskpp:IterationCount>
           <dskpp:Mac>4bRJf9xXd3KchKoTenHJiw==</dskpp:Mac>
         </dskpp:AuthenticationCodeMac>
       </dskpp:AuthenticationData>
       <dskpp:ServerUrl>keyprovservice.example.com
         </dskpp:ServerUrl>
     </dskpp:InitializationTrigger>
   </dskpp:KeyProvTrigger>

B.2. 4-проходный протокол

B.2.1. <KeyProvClientHello> без предшествующего триггера

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <dskpp:KeyProvClientHello
        xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
        xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
        xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
        xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
        Version="1.0">
        <dskpp:DeviceIdentifierData>
            <dskpp:DeviceId>
                <pskc:Manufacturer>TokenVendorAcme</pskc:Manufacturer>
                <pskc:SerialNo>987654321</pskc:SerialNo>
                <pskc:StartDate>2009-09-01T00:00:00Z</pskc:StartDate>
                <pskc:ExpiryDate>2014-09-01T00:00:00Z</pskc:ExpiryDate>
            </dskpp:DeviceId>
        </dskpp:DeviceIdentifierData>
        <dskpp:SupportedKeyTypes>
            <dskpp:Algorithm>
                urn:ietf:params:xml:ns:keyprov:pskc:hotp
            </dskpp:Algorithm>
            <dskpp:Algorithm>
    http://www.rsa.com/rsalabs/otps/schemas/2005/09/otps-wst#SecurID-AES 
            </dskpp:Algorithm>
        </dskpp:SupportedKeyTypes>
        <dskpp:SupportedEncryptionAlgorithms>
            <dskpp:Algorithm>
                http://www.w3.org/2001/04/xmlenc#aes128-cbc
            </dskpp:Algorithm>
        </dskpp:SupportedEncryptionAlgorithms>
        <dskpp:SupportedMacAlgorithms>
            <dskpp:Algorithm>
                urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256
            </dskpp:Algorithm>
        </dskpp:SupportedMacAlgorithms>
        <dskpp:SupportedProtocolVariants>
            <dskpp:FourPass/>
        </dskpp:SupportedProtocolVariants>
        <dskpp:SupportedKeyPackages>
            <dskpp:KeyPackageFormat>
                urn:ietf:params:xml:ns:keyprov:dskpp:pskc-key-container
            </dskpp:KeyPackageFormat>
        </dskpp:SupportedKeyPackages>
    </dskpp:KeyProvClientHello>

B.2.2. <KeyProvClientHello> с предшествующим триггером

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <dskpp:KeyProvClientHello
        xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
        xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
        xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
        xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
        Version="1.0">
        <dskpp:DeviceIdentifierData>
            <dskpp:DeviceId>
                <pskc:Manufacturer>TokenVendorAcme</pskc:Manufacturer>
                <pskc:SerialNo>987654321</pskc:SerialNo>
                <pskc:StartDate>2009-09-01T00:00:00Z</pskc:StartDate>
                <pskc:ExpiryDate>2014-09-01T00:00:00Z</pskc:ExpiryDate>
            </dskpp:DeviceId>
        </dskpp:DeviceIdentifierData>
        <dskpp:KeyID>SE9UUDAwMDAwMDAx</dskpp:KeyID>
        <dskpp:SupportedKeyTypes>
            <dskpp:Algorithm>
                urn:ietf:params:xml:ns:keyprov:pskc:hotp
            </dskpp:Algorithm>
            <dskpp:Algorithm>
    http://www.rsa.com/rsalabs/otps/schemas/2005/09/otps-wst#SecurID-AES 
            </dskpp:Algorithm>
        </dskpp:SupportedKeyTypes>
        <dskpp:SupportedEncryptionAlgorithms>
            <dskpp:Algorithm>http://www.w3.org/2001/04/xmlenc#aes128-cbc</dskpp:Algorithm>
        </dskpp:SupportedEncryptionAlgorithms>
        <dskpp:SupportedMacAlgorithms>
            <dskpp:Algorithm>urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256</dskpp:Algorithm>
        </dskpp:SupportedMacAlgorithms>
        <dskpp:SupportedProtocolVariants>
          <dskpp:FourPass/>
        </dskpp:SupportedProtocolVariants>
        <dskpp:SupportedKeyPackages>
            <dskpp:KeyPackageFormat>
                urn:ietf:params:xml:ns:keyprov:dskpp:pskc-key-container
            </dskpp:KeyPackageFormat>
        </dskpp:SupportedKeyPackages>
    </dskpp:KeyProvClientHello>

B.2.3. <KeyProvServerHello> без предшествующего триггера

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <dskpp:KeyProvServerHello
       xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
       xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
       xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
       Version="1.0"
       Status="Continue"
       SessionID="4114">
       <dskpp:KeyType>urn:ietf:params:xml:ns:keyprov:pskc:hotp</dskpp:KeyType>
       <dskpp:EncryptionAlgorithm>
           http://www.w3.org/2001/04/xmlenc#aes128-cbc 
       </dskpp:EncryptionAlgorithm>
       <dskpp:MacAlgorithm>
           urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256
       </dskpp:MacAlgorithm>
       <dskpp:EncryptionKey>
         <ds:KeyName>Example-Key1</ds:KeyName>
       </dskpp:EncryptionKey>
       <dskpp:KeyPackageFormat>
           urn:ietf:params:xml:ns:keyprov:dskpp:pskc-key-container
       </dskpp:KeyPackageFormat>
       <dskpp:Payload>
           <dskpp:Nonce>EjRWeJASNFZ4kBI0VniQEg==</dskpp:Nonce>
       </dskpp:Payload>
   </dskpp:KeyProvServerHello>

B.2.4. <KeyProvServerHello> в предположении обновления ключа

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <dskpp:KeyProvServerHello
      xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
      xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
      xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
      xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
      Version="1.0"
      SessionID="4114"
      Status="Continue">
      <dskpp:KeyType>
        urn:ietf:params:xml:schema:keyprov:otpalg#SecurID-AES
      </dskpp:KeyType>
      <dskpp:EncryptionAlgorithm>
         http://www.w3.org/2001/04/xmlenc#aes128-cbc 
      </dskpp:EncryptionAlgorithm>
      <dskpp:MacAlgorithm>
         urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256
      </dskpp:MacAlgorithm>
      <dskpp:EncryptionKey>
        <ds:KeyName>Example-Key1</ds:KeyName>
      </dskpp:EncryptionKey>
      <dskpp:KeyPackageFormat>
        urn:ietf:params:xml:ns:keyprov:dskpp:pskc-key-container
      </dskpp:KeyPackageFormat>
      <dskpp:Payload>
        <dskpp:Nonce>qw2ewasde312asder394jw==</dskpp:Nonce>
      </dskpp:Payload>
      <dskpp:Mac
        MacAlgorithm="urn:ietf:params:xml:ns:keyprov:dskpp:prf-aes-128">
        cXcycmFuZG9tMzEyYXNkZXIzOTRqdw==
      </dskpp:Mac>
    </dskpp:KeyProvServerHello>

B.2.5. <KeyProvClientNonce> с принятым по умолчанию шифрованием

Это сообщение содержит значение nonce, выбранное криптомодулем, R_C шифруется с заданным ключом и алгоритмом.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <dskpp:KeyProvClientNonce
        xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
        xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
        xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
        xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
        SessionID="4114"
        Version="1.0">
        <dskpp:EncryptedNonce>
            oTvo+S22nsmS2Z/RtcoF8CTwadRa1PVsRXkZnCihHkU1rPueggrd0NpEWVZR
            16Rg16+FHuTg33GK1wH3wffDZQ==
        </dskpp:EncryptedNonce>
    </dskpp:KeyProvClientNonce>

B.2.6. <KeyProvServerFinished> — принятое по умолчанию шифрование

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <dskpp:KeyProvServerFinished
          xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
          xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
          xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
          xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
          Version="1.0"
          Status="Success"
          SessionID="4114">
          <dskpp:KeyPackage>
              <dskpp:KeyContainer Version="1.0" Id="KC0001">
                  <pskc:KeyPackage>
                      <pskc:DeviceInfo>
                          <pskc:Manufacturer>TokenVendorAcme</pskc:Manufacturer>
                          <pskc:SerialNo>987654321 </pskc:SerialNo>
                          <pskc:StartDate>2009-09-01T00:00:00Z </pskc:StartDate>
                          <pskc:ExpiryDate>2014-09-01T00:00:00Z</pskc:ExpiryDate>
                      </pskc:DeviceInfo>
                      <pskc:CryptoModuleInfo>
                          <pskc:Id>CM_ID_001</pskc:Id>
                      </pskc:CryptoModuleInfo>
                      <pskc:Key
                         Id="MBK000000001"
                         Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
                         <pskc:Issuer>Example-Issuer</pskc:Issuer>
                         <pskc:AlgorithmParameters>
                             <pskc:ResponseFormat Length="6" Encoding="DECIMAL"/>
                          </pskc:AlgorithmParameters>
                          <pskc:Data>
                              <pskc:Counter>
                                  <pskc:PlainValue>0</pskc:PlainValue>
                              </pskc:Counter>
                          </pskc:Data>
                          <pskc:Policy>
                              <pskc:KeyUsage>OTP</pskc:KeyUsage>
                          </pskc:Policy>
                      </pskc:Key>
                  </pskc:KeyPackage>
              </dskpp:KeyContainer>
          </dskpp:KeyPackage>
          <dskpp:Mac
              MacAlgorithm="urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256">
              151yAR2NqU5dJzETK+SGYqN6sq6DEH5AgHohra3Jpp4=
          </dskpp:Mac>
      </dskpp:KeyProvServerFinished>

B.3. 2-проходный протокол

B.3.1. Пример использования метода транспортировки ключей

Клиент указывает поддержку всех методов защиты ключей — Key Transport, Key Wrap, Passphrase-Based Key Wrap.

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <dskpp:KeyProvClientHello
       xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
       xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
       xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
       Version="1.0">
       <dskpp:DeviceIdentifierData>
           <dskpp:DeviceId>
               <pskc:Manufacturer>TokenVendorAcme</pskc:Manufacturer>
               <pskc:SerialNo>987654321</pskc:SerialNo>
               <pskc:StartDate>2009-09-01T00:00:00Z</pskc:StartDate>
               <pskc:ExpiryDate>2014-09-01T00:00:00Z</pskc:ExpiryDate>
           </dskpp:DeviceId>
       </dskpp:DeviceIdentifierData>
       <dskpp:SupportedKeyTypes>
           <dskpp:Algorithm>urn:ietf:params:xml:ns:keyprov:pskc:hotp</dskpp:Algorithm>
           <dskpp:Algorithm>
               http://www.rsa.com/rsalabs/otps/schemas/2005/09/otps-wst#SecurID-AES 
           </dskpp:Algorithm>
       </dskpp:SupportedKeyTypes>
       <dskpp:SupportedEncryptionAlgorithms>
           <dskpp:Algorithm>http://www.w3.org/2001/04/xmlenc#rsa_1_5</dskpp:Algorithm>
       </dskpp:SupportedEncryptionAlgorithms>
       <dskpp:SupportedMacAlgorithms>
           <dskpp:Algorithm>urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256</dskpp:Algorithm>
       </dskpp:SupportedMacAlgorithms>
       <dskpp:SupportedProtocolVariants>
           <dskpp:TwoPass>
               <dskpp:SupportedKeyProtectionMethod>
                   urn:ietf:params:xml:schema:keyprov:dskpp:transport
               </dskpp:SupportedKeyProtectionMethod>
               <dskpp:Payload>
                   <ds:KeyInfo>
                       <ds:X509Data>
                           <ds:X509Certificate>
   MIIB5zCCAVCgAwIBAgIESZp/vDANBgkqhkiG9w0BAQUFADA4MQ0wCwYDVQQKEwRJRVRGM
   RMwEQYDVQQLEwpLZXlQcm92IFdHMRIwEAYDVQQDEwlQU0tDIFRlc3QwHhcNMDkwMjE3MD
   kxMzMyWhcNMTEwMjE3MDkxMzMyWjA4MQ0wCwYDVQQKEwRJRVRGMRMwEQYDVQQLEwpLZXl
   Qcm92IFdHMRIwEAYDVQQDEwlQU0tDIFRlc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
   AoGBALCWLDa2ItYJ6su80hd1gL4cggQYdyyKK17btt/aS6Q/eDsKjsPyFIODsxeKVV/uA
   3wLT4jQJM5euKJXkDajzGGOy92+ypfzTX4zDJMkh61SZwlHNJxBKilAM5aW7C+BQ0RvCx
   vdYtzx2LTdB+X/KMEBA7uIYxLfXH2Mnub3WIh1AgMBAAEwDQYJKoZIhvcNAQEFBQADgYE
   Ae875m84sYUJ8qPeZ+NG7REgTvlHTmoCdoByU0LBBLotUKuqfrnRuXJRMeZXaaEGmzY1k
   LonVjQGzjAkU4dJ+RPmiDlYuHLZS41Pg6VMwY+03lhk6I5A/w4rnqdkmwZX/NgXg06aln
   c2pBsXWhL4O7nk0S2ZrLMsQZ6HcsXgdmHo=
                           </ds:X509Certificate>
                       </ds:X509Data>
                   </ds:KeyInfo>
               </dskpp:Payload>
           </dskpp:TwoPass>
       </dskpp:SupportedProtocolVariants>
       <dskpp:SupportedKeyPackages>
           <dskpp:KeyPackageFormat>
               urn:ietf:params:xml:ns:keyprov:dskpp:pskc-key-container
           </dskpp:KeyPackageFormat>
       </dskpp:SupportedKeyPackages>
       <dskpp:AuthenticationData>
           <dskpp:ClientID>AC00000A</dskpp:ClientID>
           <dskpp:AuthenticationCodeMac>
               <dskpp:Nonce>ESIzRFVmd4iZqrvM3e7/ESIzRFVmd4iZqrvM3e7/ESI=</dskpp:Nonce>
               <dskpp:IterationCount>100000</dskpp:IterationCount>
               <dskpp:Mac
                   MacAlgorithm="urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256">
                   3eRz51ILqiG+dJW2iLcjuA==
               </dskpp:Mac>
           </dskpp:AuthenticationCodeMac>
       </dskpp:AuthenticationData>
   </dskpp:KeyProvClientHello>

В этом примере сервер отвечает на предыдущий запрос, возвращая пакет ключей, в котором ключ обеспечения зашифрован с использованием метода защиты ключа Key Transport.

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <dskpp:KeyProvServerFinished
       xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
       xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
       xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
       xmlns:dkey="http://www.w3.org/2009/xmlsec-derivedkey#" 
       xmlns:pkcs5=
          "http://www.rsasecurity.com/rsalabs/pkcs/schemas/pkcs-5v2-0#" 
       Version="1.0"
       Status="Success"
       SessionID="4114">
       <dskpp:KeyPackage>
           <dskpp:KeyContainer Version="1.0" Id="KC0001">
               <pskc:EncryptionKey>
                   <ds:X509Data>
                       <ds:X509Certificate>
   MIIB5zCCAVCgAwIBAgIESZp/vDANBgkqhkiG9w0BAQUFADA4MQ0wCwYDVQQKEwRJRVRGM
   RMwEQYDVQQLEwpLZXlQcm92IFdHMRIwEAYDVQQDEwlQU0tDIFRlc3QwHhcNMDkwMjE3MD
   kxMzMyWhcNMTEwMjE3MDkxMzMyWjA4MQ0wCwYDVQQKEwRJRVRGMRMwEQYDVQQLEwpLZXl
   Qcm92IFdHMRIwEAYDVQQDEwlQU0tDIFRlc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
   AoGBALCWLDa2ItYJ6su80hd1gL4cggQYdyyKK17btt/aS6Q/eDsKjsPyFIODsxeKVV/uA
   3wLT4jQJM5euKJXkDajzGGOy92+ypfzTX4zDJMkh61SZwlHNJxBKilAM5aW7C+BQ0RvCx
   vdYtzx2LTdB+X/KMEBA7uIYxLfXH2Mnub3WIh1AgMBAAEwDQYJKoZIhvcNAQEFBQADgYE
   Ae875m84sYUJ8qPeZ+NG7REgTvlHTmoCdoByU0LBBLotUKuqfrnRuXJRMeZXaaEGmzY1k
   LonVjQGzjAkU4dJ+RPmiDlYuHLZS41Pg6VMwY+03lhk6I5A/w4rnqdkmwZX/NgXg06aln
   c2pBsXWhL4O7nk0S2ZrLMsQZ6HcsXgdmHo=
                       </ds:X509Certificate>
                   </ds:X509Data>
               </pskc:EncryptionKey>
               <pskc:KeyPackage>
                   <pskc:DeviceInfo>
                       <pskc:Manufacturer>TokenVendorAcme</pskc:Manufacturer>
                       <pskc:SerialNo>987654321</pskc:SerialNo>
                       <pskc:StartDate>2009-09-01T00:00:00Z</pskc:StartDate>
                       <pskc:ExpiryDate>2014-09-01T00:00:00Z</pskc:ExpiryDate>
                   </pskc:DeviceInfo>
                   <pskc:Key
                       Id="MBK000000001"
                       Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
                       <pskc:Issuer>Example-Issuer</pskc:Issuer>
                       <pskc:AlgorithmParameters>
                           <pskc:ResponseFormat Length="6" Encoding="DECIMAL"/>
                       </pskc:AlgorithmParameters>
                       <pskc:Data>
                           <pskc:Secret>
                               <pskc:EncryptedValue>
                                   <xenc:EncryptionMethod
                                    Algorithm="http://www.w3.org/2001/04/xmlenc#rsa_1_5"/> 
                                   <xenc:CipherData>
                                       <xenc:CipherValue>
   eyjr23WMy9S2UdKgGnQEbs44T1jmX1TNWEBq48xfS20PK2VWF4ZK1iSctHj/u3uk+7+y8
   uKrAzHEm5mujKPAU4DCbb5mSibXMnAbbIoAi2cJW60/l8FlzwaU4EZsZ1LyQ1GcBQKACE
   eylG5vK8NTo47vZTatL5UxmbmOX2HvaVQ=
                                       </xenc:CipherValue>
                                   </xenc:CipherData>
                               </pskc:EncryptedValue>
                           </pskc:Secret>
                           <pskc:Counter>
                               <pskc:PlainValue>0</pskc:PlainValue>
                           </pskc:Counter>
                       </pskc:Data>
                       <pskc:Policy>
                           <pskc:KeyUsage>OTP</pskc:KeyUsage>
                       </pskc:Policy>
                   </pskc:Key>
               </pskc:KeyPackage>
           </dskpp:KeyContainer>
       </dskpp:KeyPackage>
       <dskpp:Mac
           MacAlgorithm="urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256">
           GHZ0H6Y+KpxdlVZ7zgcJDiDdqc8Gcmlcf+HQi4EUxYU=
       </dskpp:Mac>
   </dskpp:KeyProvServerFinished>

B.3.2. Пример использования метода упаковки ключа

Клиент передает запрос, который указывает общий ключ для защиты K_TOKEN, а сервер отвечает с использованием метода защиты ключей Key Wrap. Authentication Data в этом примере базируются на Authentication Code, а не на сертификате устройства.

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <dskpp:KeyProvClientHello
       xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
       xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
       xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
       Version="1.0">
       <dskpp:DeviceIdentifierData>
           <dskpp:DeviceId>
               <pskc:Manufacturer>TokenVendorAcme</pskc:Manufacturer>
               <pskc:SerialNo>987654321</pskc:SerialNo>
               <pskc:StartDate>2009-09-01T00:00:00Z</pskc:StartDate>
               <pskc:ExpiryDate>2014-09-01T00:00:00Z</pskc:ExpiryDate>
           </dskpp:DeviceId>
       </dskpp:DeviceIdentifierData>
       <dskpp:SupportedKeyTypes>
           <dskpp:Algorithm>urn:ietf:params:xml:ns:keyprov:pskc:hotp</dskpp:Algorithm>
           <dskpp:Algorithm>
    http://www.rsa.com/rsalabs/otps/schemas/2005/09/otps-wst#SecurID-AES 
           </dskpp:Algorithm>
       </dskpp:SupportedKeyTypes>
       <dskpp:SupportedEncryptionAlgorithms>
           <dskpp:Algorithm>http://www.w3.org/2001/04/xmlenc#aes128-cbc</dskpp:Algorithm>
       </dskpp:SupportedEncryptionAlgorithms>
       <dskpp:SupportedMacAlgorithms>
           <dskpp:Algorithm>urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256</dskpp:Algorithm>
       </dskpp:SupportedMacAlgorithms>
       <dskpp:SupportedProtocolVariants>
           <dskpp:TwoPass>
               <dskpp:SupportedKeyProtectionMethod>
                   urn:ietf:params:xml:schema:keyprov:dskpp:wrap
               </dskpp:SupportedKeyProtectionMethod>
               <dskpp:Payload>
                   <ds:KeyInfo>
                       <ds:KeyName>Pre-shared-key-1</ds:KeyName>
                   </ds:KeyInfo>
               </dskpp:Payload>
           </dskpp:TwoPass>
       </dskpp:SupportedProtocolVariants>
       <dskpp:SupportedKeyPackages>
           <dskpp:KeyPackageFormat>
               urn:ietf:params:xml:ns:keyprov:dskpp:pskc-key-container
           </dskpp:KeyPackageFormat>
       </dskpp:SupportedKeyPackages>
       <dskpp:AuthenticationData>
           <dskpp:ClientID>AC00000A</dskpp:ClientID>
           <dskpp:AuthenticationCodeMac>
               <dskpp:Nonce>
                   ESIzRFVmd4iZqrvM3e7/ESIzRFVmd4iZqrvM3e7/ESI=
               </dskpp:Nonce>
               <dskpp:IterationCount>1</dskpp:IterationCount>
               <dskpp:Mac
                   MacAlgorithm="urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256">
                   3eRz51ILqiG+dJW2iLcjuA==
               </dskpp:Mac>
           </dskpp:AuthenticationCodeMac>
       </dskpp:AuthenticationData>
   </dskpp:KeyProvClientHello>

В этом примере сервер отвечает на предыдущий запрос возвратом пакета ключа, в котором ключ обеспечения зашифрован с использованием метода защиты Key Wrap.

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <dskpp:KeyProvServerFinished
       xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
       xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
       xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
       xmlns:dkey="http://www.w3.org/2009/xmlsec-derivedkey#" 
       xmlns:pkcs5="http://www.rsasecurity.com/rsalabs/pkcs/schemas/pkcs-5v2-0#" 
       Version="1.0"
       Status="Success"
       SessionID="4114">
       <dskpp:KeyPackage>
            <dskpp:KeyContainer Version="1.0" Id="KC0001">
                <pskc:EncryptionKey>
                   <ds:KeyName>Pre-shared-key-1</ds:KeyName>
                </pskc:EncryptionKey>
                <pskc:MACMethod
                    Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"> 
                    <pskc:MACKey>
                        <xenc:EncryptionMethod
                            Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/> 
                        <xenc:CipherData>
                            <xenc:CipherValue>
        2GTTnLwM3I4e5IO5FkufoMUBJBuAf25hARFv0Z7MFk9Ecdb04PWY/qaeCbrgz7Es
                             </xenc:CipherValue>
                        </xenc:CipherData>
                    </pskc:MACKey>
                </pskc:MACMethod>
                <pskc:KeyPackage>
                    <pskc:DeviceInfo>
                        <pskc:Manufacturer>TokenVendorAcme</pskc:Manufacturer>
                        <pskc:SerialNo>987654321</pskc:SerialNo>
                        <pskc:StartDate>2009-09-01T00:00:00Z</pskc:StartDate>
                        <pskc:ExpiryDate>2014-09-01T00:00:00Z</pskc:ExpiryDate>
                    </pskc:DeviceInfo>
                    <pskc:CryptoModuleInfo>
                        <pskc:Id>CM_ID_001</pskc:Id>
                    </pskc:CryptoModuleInfo>
                    <pskc:Key
                        Id="MBK000000001"
                        Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
                        <pskc:Issuer>Example-Issuer</pskc:Issuer>
                        <pskc:AlgorithmParameters>
                          <pskc:ResponseFormat Length="6" Encoding="DECIMAL"/>
                        </pskc:AlgorithmParameters>
                        <pskc:Data>
                            <pskc:Secret>
                                <pskc:EncryptedValue>
                                  <xenc:EncryptionMethod
                                  Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/> 
                                    <xenc:CipherData>
                                        <xenc:CipherValue>
                                            oTvo+S22nsmS2Z/RtcoF8AabC6vr
                                            09sh0QIU+E224S96sZjpV+6nFYgn
                                            6525OoepbPnL/fGuuey64WCYXoqh
                                            Tg==
                                        </xenc:CipherValue>
                                    </xenc:CipherData>
                               </pskc:EncryptedValue>
                               <pskc:ValueMAC>o+e9xgMVUbYuZH9UHe0W9dIo88A=</pskc:ValueMAC>
                           </pskc:Secret>
                           <pskc:Counter><pskc:PlainValue>0</pskc:PlainValue></pskc:Counter>
                       </pskc:Data>
                       <pskc:Policy><pskc:KeyUsage>OTP</pskc:KeyUsage></pskc:Policy>
                   </pskc:Key>
               </pskc:KeyPackage>
           </dskpp:KeyContainer>
       </dskpp:KeyPackage>
       <dskpp:Mac
           MacAlgorithm="urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256">
           l53BmSO6qUzoIgbQegimsKk2es+WRpEl0YFqaOp5PGE=
       </dskpp:Mac>
   </dskpp:KeyProvServerFinished>

B.3.3. Пример использования упаковки ключа на базе пароля

Клиент передает запрос, аналогичный описанному в приложении B.3.1 с Authentication Data на основе Authentication Code, а сервер отвечает с использованием метода Passphrase-Based Key Wrap для шифрования ключа обеспечения (отметим, что шифрование выводится из парольной компоненты Authentication Code). Authentication Data передаются в открытом виде при использовании защищенного канала, такого как TLS [RFC5246].

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <dskpp:KeyProvClientHello
       xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
       xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
       xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
       Version="1.0">
       <dskpp:DeviceIdentifierData>
           <dskpp:DeviceId>
               <pskc:Manufacturer>TokenVendorAcme</pskc:Manufacturer>
               <pskc:SerialNo>987654321</pskc:SerialNo>
               <pskc:StartDate>2009-09-01T00:00:00Z</pskc:StartDate>
               <pskc:ExpiryDate>2014-09-01T00:00:00Z</pskc:ExpiryDate>
           </dskpp:DeviceId>
       </dskpp:DeviceIdentifierData>
       <dskpp:SupportedKeyTypes>
           <dskpp:Algorithm>
               urn:ietf:params:xml:ns:keyprov:pskc:hotp
           </dskpp:Algorithm>
           <dskpp:Algorithm>
    http://www.rsa.com/rsalabs/otps/schemas/2005/09/otps-wst#SecurID-AES 
           </dskpp:Algorithm>
       </dskpp:SupportedKeyTypes>
       <dskpp:SupportedEncryptionAlgorithms>
           <dskpp:Algorithm>
               http://www.w3.org/2001/04/xmlenc#rsa_1_5
           </dskpp:Algorithm>
       </dskpp:SupportedEncryptionAlgorithms>
       <dskpp:SupportedMacAlgorithms>
           <dskpp:Algorithm>
               urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256
           </dskpp:Algorithm>
       </dskpp:SupportedMacAlgorithms>
       <dskpp:SupportedProtocolVariants>
           <dskpp:TwoPass>
               <dskpp:SupportedKeyProtectionMethod>
                urn:ietf:params:xml:schema:keyprov:dskpp:passphrase-wrap
               </dskpp:SupportedKeyProtectionMethod>
               <dskpp:Payload>
                   <ds:KeyInfo>
                       <ds:KeyName>Passphrase-1</ds:KeyName>
                   </ds:KeyInfo>
               </dskpp:Payload>
           </dskpp:TwoPass>
       </dskpp:SupportedProtocolVariants>
       <dskpp:SupportedKeyPackages>
           <dskpp:KeyPackageFormat>
               urn:ietf:params:xml:ns:keyprov:dskpp:pskc-key-container
           </dskpp:KeyPackageFormat>
       </dskpp:SupportedKeyPackages>
       <dskpp:AuthenticationData>
           <dskpp:ClientID>AC00000A</dskpp:ClientID>
           <dskpp:AuthenticationCodeMac>
               <dskpp:Nonce>
                   ESIzRFVmd4iZqrvM3e7/ESIzRFVmd4iZqrvM3e7/ESI=
               </dskpp:Nonce>
               <dskpp:IterationCount>1</dskpp:IterationCount>
               <dskpp:Mac
                   MacAlgorithm=
                  "urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256">
                  K4YvLMN6Q1DZvtShoCxQag==
               </dskpp:Mac>
           </dskpp:AuthenticationCodeMac>
       </dskpp:AuthenticationData>
   </dskpp:KeyProvClientHello>

В этом примере сервер отвечает на предыдущий запрос, возвращая пакет ключа в котором ключ обеспечения зашифрован с использованием метода защиты Passphrase-Based Key Wrap.

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <dskpp:KeyProvServerFinished
       xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
       xmlns:dskpp="urn:ietf:params:xml:ns:keyprov:dskpp"
       xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
       xmlns:dkey="http://www.w3.org/2009/xmlsec-derivedkey#" 
       xmlns:pkcs5=
          "http://www.rsasecurity.com/rsalabs/pkcs/schemas/pkcs-5v2-0#" 
       Version="1.0"
       Status="Success"
       SessionID="4114">
       <dskpp:KeyPackage>
           <dskpp:KeyContainer Version="1.0" Id="KC0002">
               <pskc:EncryptionKey>
                   <dkey:DerivedKey>
                       <dkey:KeyDerivationMethod
                       Algorithm=
                       "http://www.rsasecurity.com/rsalabs/pkcs/schemas/
                           pkcs-5v2-0#pbkdf2"> 
                           <pkcs5:PBKDF2-params>
                               <Salt>
                                   <Specified>Ej7/PEpyEpw=</Specified>
                               </Salt>
                               <IterationCount>1000</IterationCount>
                               <KeyLength>16</KeyLength>
                           </pkcs5:PBKDF2-params>
                       </dkey:KeyDerivationMethod>
                       <xenc:ReferenceList>
                           <xenc:DataReference URI="#ED"/>
                       </xenc:ReferenceList>
                       <dkey:MasterKeyName>
                          Passphrase1
                       </dkey:MasterKeyName>
                   </dkey:DerivedKey>
               </pskc:EncryptionKey>
               <pskc:MACMethod
                   Algorithm=
                      "http://www.w3.org/2000/09/xmldsig#hmac-sha1"> 
                   <pskc:MACKey>
                       <xenc:EncryptionMethod
                           Algorithm=
                         "http://www.w3.org/2001/04/xmlenc#aes128-cbc"/> 
                       <xenc:CipherData>
                           <xenc:CipherValue>
        2GTTnLwM3I4e5IO5FkufoOEiOhNj91fhKRQBtBJYluUDsPOLTfUvoU2dStyOwYZx
                           </xenc:CipherValue>
                       </xenc:CipherData>
                   </pskc:MACKey>
               </pskc:MACMethod>
               <pskc:KeyPackage>
                   <pskc:DeviceInfo>
                       <pskc:Manufacturer>
                          TokenVendorAcme
                       </pskc:Manufacturer>
                       <pskc:SerialNo>
                          987654321
                       </pskc:SerialNo>
                       <pskc:StartDate>
                          2009-09-01T00:00:00Z
                       </pskc:StartDate>
                       <pskc:ExpiryDate>
                          2014-09-01T00:00:00Z
                       </pskc:ExpiryDate>
                   </pskc:DeviceInfo>
                   <pskc:CryptoModuleInfo>
                       <pskc:Id>CM_ID_001</pskc:Id>
                   </pskc:CryptoModuleInfo>
                   <pskc:Key
                       Id="MBK000000001"
                       Algorithm=
                          "urn:ietf:params:xml:ns:keyprov:pskc:hotp">
                       <pskc:Issuer>Example-Issuer</pskc:Issuer>
                       <pskc:AlgorithmParameters>
                          <pskc:ResponseFormat Length="6"
                             Encoding="DECIMAL"/>
                       </pskc:AlgorithmParameters>
                       <pskc:Data>
                           <pskc:Secret>
                               <pskc:EncryptedValue>
                                   <xenc:EncryptionMethod
                                       Algorithm=
                                       "http://www.w3.org/2001/04/
                                       xmlenc#aes128-cbc"/> 
                                   <xenc:CipherData>
                                       <xenc:CipherValue>
                                         oTvo+S22nsmS2Z/RtcoF8HX385uMWgJ
                                         myIFMESBmcvtHQXp/6T1TgCS9CsgKtm
                                         cOrF8VoK254tZKnrAjiD5cdw==
                                       </xenc:CipherValue>
                                   </xenc:CipherData>
                               </pskc:EncryptedValue>
                               <pskc:ValueMAC>
                                   pbgEbVYxoYs0x41wdeC7eDRbUEk=
                               </pskc:ValueMAC>
                           </pskc:Secret>
                           <pskc:Counter>
                               <pskc:PlainValue>0</pskc:PlainValue>
                           </pskc:Counter>
                       </pskc:Data>
                       <pskc:Policy>
                           <pskc:KeyUsage>OTP</pskc:KeyUsage>
                       </pskc:Policy>
                   </pskc:Key>
               </pskc:KeyPackage>
           </dskpp:KeyContainer>
       </dskpp:KeyPackage>
       <dskpp:Mac MacAlgorithm=
           "urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256">
           Jc4VsNODYXgfbDmTn9qQZgcL3cKoa//j/NRT7sTpKOM=
       </dskpp:Mac>
   </dskpp:KeyProvServerFinished>

Приложение C. Интеграция с PKCS #11

Клиент DSKPP, которому нужно взаимодействовать с подключенным криптомодулем для обмена DSKPP, может использовать PKCS #11 [PKCS-11] в качестве программного интерфейса, как описано здесь. Это приложение является информационной частью документа.

C.1. 4-проходный вариант

При 4-проходном обмене DSKPP с криптомодулем при использовании программного интерфейса PKCS #11 рекомендуется процедура, описанная в приложении B к [CT-KIP-P11].

C.2. 2-проходный вариант

Предлагаемая процедура для 2-проходного обмена DSKPP с криптомодулем при использовании программного интерфейса PKCS #11, определенного в [CT-KIP-P11], описана ниже.

a. На стороне клиента.

  1. Клиент выбирает подходящий слот и маркер (например, используя элемент <DeviceIdentifier> или <PlatformInfo> в триггерном сообщении DSKPP).

  2. Генерируется nonce R, например, путем вызова C_SeedRandom и C_GenerateRandom.

  3. Клиент передает серверу первое сообщение, включающее nonce R.

b. На стороне сервера.

  1. Генерируется базовый ключ K_PROV = K_TOKEN | K_MAC (| указывает конкатенацию), например, путем вызова C_GenerateKey (с использованием типа ключа CKK_GENERIC_SECRET). Шаблон для K_PROV должен разрешать экспорт (но только в упакованном виде, т. е. для CKA_SENSITIVE должно быть установлено значение CK_TRUE, а для CKA_EXTRACTABLE должно устанавливаться значение CK_TRUE), а также использование для последующего вывода ключей. Из K выводится ключ маркера K_TOKEN подходящего типа путем вызова C_DeriveKey с использованием механизма PKCS #11 CKM_EXTRACT_KEY_FROM_KEY и установкой CK_EXTRACT_PARAMS в качестве первого бита базового секретного ключа (т. е. 0). Аналогично, ключ MAC K_MAC выводится из K_PROV путем вызова C_DeriveKey с использованием механизма CKM_EXTRACT_KEY_FROM_KEY, а в качестве CK_EXTRACT_PARAMS устанавливается размер K_PROV (в битах), поделенный на 2.

  2. Сервер пакует (wrap) K_PROV с использованием открытого ключа клиента DSKPP или устройства, заранее известный секретный ключ или общий секрет, выведенный с использованием C_WrapKey. Если использование алгоритма упаковки ключей DSKPP согласовано, должен применяться механизм CKM_KIP_WRAP для упаковки K. При вызове C_WrapKey для дескриптора hKey в структуре CK_KIP_PARAMS должно устанавливаться значение NULL_PTR. Параметр pSeed в структуре CK_KIP_PARAMS должен указывать nonce R, предоставленное клиентом DSKPP, а параметр ulSeedLen должен указывать размер R. Параметр hWrappingKey при вызове C_WrapKey должен указывать ключ упаковки ключа.

  3. Затем сервер должен рассчитать MAC, используя K_MAC. Если применяемый алгоритм DSKPP MAC был согласован, MAC вычисляется путем вызова C_SignInit с механизмом CKM_KIP_MAC и последующим вызовом C_Sign. При вызове C_SignInit значением K_MAC должен быть ключ подписи, для параметра hKey в структуре CK_KIP_PARAMS должно быть установлено значение NULL_PTR, для pSeed в структуре CT_KIP_PARAMS -NULL_PTR, а параметр ulSeedLen должен иметь значение 0. При вызове C_Sign параметр pData должен быть конкатенацией строк ServerID и nonce R, а в качестве ulDataLen должен быть указан размер строки конкатенации. Желаемый размер MAC должен быть указан параметром pulSignatureLen и должен совпадать с размером R.

  4. Если серверу нужно также аутентифицировать свое сообщение (по причине замены K_TOKEN), он должен рассчитать второе значение MAC. Если согласовано использование алгоритма DSKPP MAC, значение MAC рассчитывается путем вызова C_SignInit с механизмом CKM_KIP_MAC и последующего вызова C_Sign. В этом вызове C_SignInit значение K_MAC’, имевшееся до этого запуска DSKPP, должно быть ключом подписи (реализация может задать в качестве K_MAC’ значение K_TOKEN, которое будет заменено, или K_MAC из предыдущего запуска протокола), для параметра hKey в структуре CK_KIP_PARAMS должно быть установлено значение NULL, для pSeed в структуре CT_KIP_PARAMS должно быть установлено значение NULL_PTR, а для параметра ulSeedLen должно быть установлено значение 0. При вызове C_Sign в качестве значения параметра pData должна применяться конкатенация строк ServerID и nonce R, а значением параметра ulDataLen должен быть размер объединенной строки. Желательный размер MAC должен быть задан параметром pulSignatureLen и должен совпадать с размером R.

  5. Сервер передает сообщение клиенту, включая упакованный ключ K_TOKEN, MAC и возможно MAC для аутентификации.

c. На стороне клиента.

  1. Клиент вызывает C_UnwrapKey для получения дескриптора K. Затем клиент дважды вызывает C_DeriveKey — один раз для вывода K_TOKEN, другой для вывода K_MAC. Клиент должен применять тот же механизм (CKM_EXTRACT_KEY_FROM_KEY) и такие же параметры механизма, которые использовались сервером (см. выше). При вызове C_UnwrapKey и C_DeriveKey должен использоваться параметр pTemplate для установки дополнительных атрибутов ключа в соответствии с локальной политикой, как они были согласованы и выражены в протоколе. В частности, значение элемента <KeyID> из отклика сервера может применяться в качестве CKA_ID для K_TOKEN. Ключ K_PROV должен быть уничтожен после вывода K_TOKEN и K_MAC.

  2. Значение MAC проверяется обращением процедуры его генерации на сервере. Если было согласовано применение механизма CKM_KIP_MAC, при вызове C_VerifyInit для параметра hKey в структуре CK_KIP_PARAMS должно быть установлено значение NULL_PTR, для pSeed — NULL_PTR, а для ulSeedLen — 0. Параметр hKey в C_VerifyInit должен указывать K_MAC. При вызове C_Verify в качестве значения pData должна использоваться конкатенация строк ServerID и nonce R, параметр ulDataLen должен указывать размер объединенной строки, pSignature — значение MAC, полученное от сервера, а ulSignatureLen — размер MAC. Если проверка MAC не проходит, протокольная сессия завершается отказом. Маркер должен создаваться так, чтобы новые значения K_TOKEN и K_MAC не представлялись до проверки MAC.

  3. При получении MAC для аутентификации (требуется, если новый K_TOKEN будет заменять имеющийся ключ в маркере) код проверяется аналогичным способом, но с использованием K_MAC’, связанного с этим сервером и имевшегося до запуска протокола (реализация может указать для K_MAC’ значение заменяемого K_TOKEN или K_MAC из предшествующего запуска протокола). Если проверка MAC не проходит, протокольная сессия завершается отказом. Маркер должен создаваться так, чтобы новые значения K_TOKEN и K_MAC не представлялись до проверки MAC.

Приложение D. Примеры реализации DSKPP-PRF

D.1. Введение

В этом приложении определяется DSKPP-PRF в терминах AES [FIPS197-AES] и HMAC [RFC2104]. Приложение является информационной частью документа.

D.2. DSKPP-PRF-AES

D.2.1. Идентификация

Для криптомодулей, поддерживающих эту реализацию DSKPP-PRF, должен применяться приведенный ниже идентификатор URN, указывающий этот алгоритм в DSKPP.

   urn:ietf:params:xml:ns:keyprov:dskpp:prf-aes-128

При использовании этого URN для указания алгоритма шифрования, должен применяться метод шифрования значений R_C, описанный в параграфе 4.2.4.

D.2.2. Определение

   DSKPP-PRF-AES (k, s, dsLen)

Вход:

k используемый ключ шифрования;

s строка октетов, содержащая случайные данные размером sLen;

dsLen желаемый размер результата.

Выход:

DS псевдослучайная строка размером dsLen октетов.

Этапы:

  1. Пусть bLen указывает размер выходного блока AES в октетах

    bLen = (размер выходного блока AES в октетах)

    (обычно bLen = 16)

  2. Если dsLen > (232 — 1) * bLen, выводится сообщение «derived data too long49» и работа прекращается.

  3. Пусть n — число блоков размером bLen в выходных данных, округленное в большую сторону, а j — число октетов в последнем блоке

    n = CEILING( dsLen / bLen)
    j = dsLen - (n - 1) * bLen
  4. Для каждого блока псевдослучайной строки DS применяется определенная ниже функция F с ключом k, строкой s и индексом рассчитываемого блока

    B1 = F (k, s, 1) ,
    B2 = F (k, s, 2) ,
    ...
    Bn = F (k, s, n)

Функция F определяется в терминах конструкции CMAC из [NIST-SP800-38B] с использованием блочного шифра AES

   F (k, s, i) = CMAC-AES (k, INT (i) || s)

где INT (i) — 4-октетное представление целого числа i (сначала старший октет), а выходной размер CMAC равен bLen.

Блоки сливаются и выбираются первые dsLen октетов для создания желаемой строки данных DS

   DS = B1 || B2 || ... || Bn<0..j-1>

Выводится строка данных DS.

D.2.3. Пример

Для dsLen = 16 будем иметь

   n = 16 / 16 = 1
   j = 16 - (1 - 1) * 16 = 16
   DS = B1 = F (k, s, 1) = CMAC-AES (k, INT (1) || s)

D.3. DSKPP-PRF-SHA256

D.3.1. Идентификация

Для криптомодулей, поддерживающих эту реализацию DSKPP-PRF, должен применяться приведенный ниже идентификатор URN, указывающий этот алгоритм в DSKPP.

   urn:ietf:params:xml:ns:keyprov:dskpp:prf-sha256

При использовании этого URN для указания алгоритма шифрования, должен применяться метод шифрования значений R_C, описанный в параграфе 4.2.4.

D.3.2. Определение

   DSKPP-PRF-SHA256 (k, s, dsLen)

Вход:

k используемый ключ шифрования;

s строка октетов, содержащая случайные данные размером sLen;

dsLen желаемый размер результата.

Выход:

DS псевдослучайная строка размером dsLen октетов.

Этапы:

  1. Пусть bLen указывает выходной размер SHA-256 в октетах [FIPS180-SHA] (без отсечки вывода HMAC)

           bLen = 32
           (normally, bLen = 16)
  2. Если dsLen > (232 — 1) * bLen, выводится сообщение «derived data too long1» и работа прекращается.

  3. Пусть n — число блоков размером bLen в выходных данных, округленное в большую сторону, а j — число октетов в последнем блоке

           n = CEILING( dsLen / bLen)
           j = dsLen - (n - 1) * bLen
  4. Для каждого блока псевдослучайной строки DS применяется определенная ниже функция F с ключом k, строкой s и индексом рассчитываемого блока

       B1 = F (k, s, 1),
       B2 = F (k, s, 2),
       ...
       Bn = F (k, s, n)

Функция F определяется в терминах конструкции HMAC из [RFC2104] с использованием алгоритма подписи SHA-256

   F (k, s, i) = HMAC-SHA256 (k, INT (i) || s)

где INT (i) — 4-октетное представление целого числа i (сначала старший октет), а выходной размер HMAC равен bLen.

Блоки сливаются и выбираются первые dsLen октетов для создания желаемой строки данных DS

   DS = B1 || B2 || ... || Bn<0..j-1>

Выводится строка данных DS.

D.3.3. Пример

Для sLen = 256 (два 128-октетных значения) и dsLen = 16 бедуем иметь

   n = CEILING( 16 / 32 ) = 1
   j = 16 - (1 - 1) * 32 = 16
   B1 = F (k, s, 1) = HMAC-SHA256 (k, INT (1) || s)
   DS = B1<0 ... 15>

Т. е. результатом будут первые 16 октетов вывода HMAC.

Адреса авторов

Andrea Doherty

RSA, The Security Division of EMC

174 Middlesex Turnpike

Bedford, MA 01730

USA

EMail: andrea.doherty@rsa.com

Mingliang Pei

VeriSign, Inc.

487 E. Middlefield Road

Mountain View, CA 94043

USA

EMail: mpei@verisign.com

Salah Machani

Diversinet Corp.

2225 Sheppard Avenue East, Suite 1801

Toronto, Ontario M2J 5C2

Canada

EMail: smachani@diversinet.com

Magnus Nystrom

Microsoft Corp.

One Microsoft Way

Redmond, WA 98052

USA

EMail: mnystrom@microsoft.com

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Certificate Management Protocol.

2Certificate Management over CMS — управление сертификатами через CMS.

3Public Key Infrastructure.

4Cryptographic Token Key Initialization Protocol — протокол ключей криптомаркеров.

5Uniform Resource Identifier.

6Portable Symmetric Key Container — контейнер переносимого симметричного ключа.

7Open AUTHentication HMAC-Based One-Time Password — аутентификация с одноразовым ключом на базе HMAC.

8One-time password — одноразовый пароль.

9Для несимметричного алгоритма. Прим. перев.

10Subscriber Identity Module — модуль идентификации абонента.

11Type-Length-Value — тип-размер-значение.

12В оригинале ошибочно сказано myclient!ID. Прим. перев.

13Полученная в результате последовательность должна чередовать сообщения DSKPP Request и DSKPP Response.

14Man in the middle — букв., «человек посередине». Перехват и изменение данных с участием человека. Прим. перев.

15Security Attribute List.

16Portable Symmetric Key Container — переносимый контейнер с симметричным ключом.

17Транспортировка ключа, упаковка ключа, защита ключа с использованием парольной упаковки.

18Public Key Infrastructure — инфраструктура открытых ключей. Прим. перев.

19The list of key protection methods.

20Key Package.

21Базовые типы.

22Этот элемент подходит только для двухпроходного DSKPP.

23Данные засвидетельствования содержат MAC.

24Типы расширений.

25Сообщение используется в качестве триггера для инициирования запуска DSKPP.

26Сообщение передается от клиента DSKPP серверу DSKPP для инициирования сеанса DSKPP.

27Отклик, передаваемый от сервера DSKPP клиенту DSKPP в 4-проходном варианте DSKPP.

28Финальное сообщение, переданное от сервера к клиенту DSKPP в сеансе DSKPP. Значение MAC служит для подтверждения ключа, а необязательные данные AuthenticationData — для засвидетельствования сервера.

29Man-in-the-middle атака с перехватом данных на пути при участии человека.

30Denial-of-service — отказ в обслуживании.

31Hashed MAC.

32Сообщения DSKPP.

33Пространство имен сообщений DSKPP.

34Указывает кодировку символов вложенного XML.

35Используется XML c возможностью поддержки 8-битовых символов в зависимости от применяемой кодировки (см. параграф 3.2 в [RFC3023]). Реализации должны поддерживать UTF-8 [RFC3629].

36Этот тип носителя предназначен для переноса протокольных данных, связанных с управлением ключами. Механизмы защиты встроены в протокол для предотвращения различных угроз. Дополнительную информацию можно найти в разделе 10 RFC 6063.

37Протокол для обмена ключами.

38Ограниченное применение.

39Этот тип носителя является специализацией application/xml [RFC3023] и многие вопросы, рассмотренные в упомянутом документе, применимы и к application/dskpp+xml.

40В соответствии с политикой, указанной в [RFC3575], процедура IANA для выделения новых значений кодов состояния DSKPP должна быть Specification Required и смысл новых значений должен быть документирован в RFC или ином постоянно и легко доступном документе с подробностями, достаточными для обеспечения взаимодействия независимых реализаций. Механизма маркировки записей как устаревших (deprecated) не предусмотрено. Записи в реестре можно обновлять.

41Реализация алгоритма DSKPP-PRF-AES определена в приложении D.2.2 к этому документу.

42Реализация алгоритма DSKPP-PRF-SHA256 определена в приложении D.3.2 к этому документу.

43Регистрационное имя для контейнера ключей.

44Key Container определяет формат упаковки ключей, который задает способ защиты ключей с применением трех методов, представленных в параграфе 5.1.

45В соответствии с политикой, указанной в [RFC3575], процедура IANA для выделения новых значений кодов состояния DSKPP должна быть Specification Required и смысл новых значений должен быть документирован в RFC или ином постоянно и легко доступном документе с подробностями, достаточными для обеспечения взаимодействия независимых реализаций.

46TRUE, если с одобрения эксперта эта запись признана устаревшей и ее не следует применять в новых реализациях. В остальных случаях FALSE.

47Начальные URI для Key Container, определенные в этой версии документа, перечислены ниже.

48Application Protocol Data Unit — блок данных прикладного протокола.

49Слишком много данных на выходе.

Рубрика: RFC | Комментарии к записи RFC 6063 Dynamic Symmetric Key Provisioning Protocol (DSKPP) отключены

RFC 5944 IP Mobility Support for IPv4, Revised

Internet Engineering Task Force (IETF)                   C. Perkins, Ed.
Request for Comments: 5944                                 WiChorus Inc.
Obsoletes: 3344                                            November 2010
Category: Standards Track
ISSN: 2070-1721

Пересмотренная поддержка IP Mobility для IPv4

IP Mobility Support for IPv4, Revised

PDF

Аннотация

В этом документе содержится спецификация расширения протокола, обеспечивающего прозрачную маршрутизацию дейтаграмм IP для мобильных узлов в сети Internet. Каждый мобильный узел всегда идентифицируется своим домашним адресом, независимо от текущей точки подключения к сети Internet. С мобильным узлом, находящимся за пределами домашней сети, связывается адрес обслуживания, обеспечивающий информацию о текущей точке подключения к сети Internet. Протокол обеспечивает регистрацию адреса обслуживания на домашнем агенте. Домашний агент передает дейтаграммы для мобильного узла через туннель на адрес обслуживания. После прибытия дейтаграммы на этот конец туннеля дейтаграмма доставляется мобильному узлу.

Статус документа

Этот документ содержит проект стандарта Internet (Internet Standards Track).

Документ является результатом работы IETF1 и представляет собой согласованное мнение членов (сообщества) IETF. Документ был представлен для публичного обсуждения и одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 документа RFC 5741.

Информацию о текущем состоянии этого документа, обнаруженных ошибках и способах обратной связи можно найти по ссылке http://www.rfc-editor.org/info/rfc5944.

Авторские права

Авторские права ((c) 2010) принадлежат IETF Trust и лицам, указанным в числе авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включенные в этот документ, распространяются в соответствии с упрощенной лицензией BSD, как указано в параграфе 4.e документа Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

Документ может содержать материалы из IETF Document или IETF Contribution, опубликованных или публично доступных до 10 ноября 2008 года. Лица, контролирующие авторские права на некоторые из таких документов, могли не предоставить IETF Trust права разрешать внесение изменений в такие документы за рамками процессов IETF Standards. Без получения соответствующего разрешения от лиц, контролирующих авторские права этот документ не может быть изменен вне рамок процесса IETF Standards, не могут также создаваться производные документы за рамками процесса IETF Standards за исключением форматирования документа для публикации или перевода с английского языка на другие языки.

1. Введение

В IP версии 4 предполагается, что IP-адрес узла уникально идентифицирует точку подключения данного узла к сети Internet. Следовательно, узел должен размещаться в сети, указанной его адресом IP, чтобы получать адресованные ему пакеты. В противном случае дейтаграммы просто не дойдут до узла. Чтобы узлы могли менять точки подключения без потери возможности связи в настоящее время используется обычно один из перечисленных механизмов:

  1. узел меняет адрес в соответствии с точкой подключения;

  2. специфические маршруты к хостам распространяются через систему маршрутизации Internet.

Зачастую не приемлем ни один из этих вариантов. В первом случае при изменении местоположения узла для него становится невозможной поддержка соединений на транспортном и вышележащих уровнях. Второе решение вызывает проблемы с масштабированием, существенно усложняющиеся с ростом числа мобильных компьютеров.

Требуется новый, обеспечивающий масштабирование механизм для подключения мобильных узлов к сети Internet. В этом документе определен такой механизм, который позволяет мобильным узлам менять точку подключения к Internet без смены своего адреса IP.

Различия между этой обновленной спецификацией Mobile IP и предшествующими спецификациями (см. [44], [14], [15], [20], [4], [50]) подробно рассмотрены в Приложении F.

1.1. Протокольные требования

Мобильный узел должен сохранять возможность взаимодействия с другими узлами после изменения его точки подключения к Internet на канальном уровне без изменения адреса IP.

Мобильный узел должен иметь возможность коммуникаций с узлами, не поддерживающими описанные здесь функции мобильности. Не требуется расширения протоколов на хостах и маршрутизаторах, не являющихся непосредственными участниками архитектурных элементов, указанных в параграфе 1.5.

Все сообщения для обновления на других узлах в связи со сменой местоположения мобильного узла должны аутентифицироваться с целью предотвращения атак с перенаправлением трафика.

1.2. Цели

Для подключения мобильных узлов к Internet зачастую могут применяться беспроводные сети. Канал подключения может отличаться меньшей полосой пропускания и большей частотой ошибок по сравнению с традиционными проводными сетями. Более того, питание мобильных узлов зачастую осуществляется от внутренней батареи и вопрос снижения энергопотребления весьма важен. Следовательно, число административных сообщений через канал подключения мобильного узла к сети Internet следует минимизировать, а размер таких сообщений сделать как можно меньше.

1.3. Допущения

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

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

Этот протокол исходит из допущения о том, что индивидуальные дейтаграммы IP маршрутизируются на основе адресов получателей в заголовках дейтаграмм (и не маршрутизация не зависит, например, от адресов отправителей).

1.4. Применимость

Расширение Mobile IP предназначено для обеспечения мобильным узлам возможности перехода из одной сети IP в другую. Оно одинаково подходит как для однородных, так и для разнородных сетевых сред. Т. е., Mobile IP упрощает как переход узла из одного сегмента Ethernet в другой, так и переключение из сети Ethernet в беспроводную сеть, если IP-адрес мобильного узла при таких перемещениях не меняется.

Можно рассматривать Mobile IP как решение задачи управления мобильностью на макроуровне. Для управления мобильностью на «микроуровне» (например, переключение между беспроводными точками доступа в движении) это решение подходит не столь хорошо. Если мобильный узел не просто переключается из одной сети IP в другую, а движется в процессе такого «переключения», механизмы поддержки мобильности на канальном уровне (переход из одной сети в другую — link-layer handoff) могут обеспечивать более быстрое переключение и меньшие издержки, нежели Mobile IP.

1.5. Новые архитектурные элементы

Mobile IP добавляет ряд новых функциональных элементов, перечисленных ниже.

Mobile Node — мобильный узел

Хост или маршрутизатор, который меняет точку своего подключения, переходя из одной (под)сети в другую. Мобильный узел может менять свое местоположение без смены адреса IP, он может продолжать взаимодействие с другими узлами Internet из любой точки, используя свой (постоянный) адрес IP, если обеспечивается связность с сетью на канальном уровне.

Home Agent — домашний агент

Маршрутизатор в домашней сети мобильного узла, который туннелирует дейтаграммы для доставки мобильному узлу, находящемуся за пределами домашней сети, и поддерживает информацию о текущем местоположении мобильного узла.

Foreign Agent — внешний агент

Маршрутизатор в сети, к которой подключается мобильный узел, обеспечивающий по запросу мобильного узла услуги маршрутизации. Внешний агент служит второй точкой туннеля, организуемого домашним агентом мобильного узла. Для передаваемых зарегистрированными мобильными узлами дейтаграмм внешний агент может служить используемым по умолчанию маршрутизатором.

Мобильный узел имеет с домашней сети адрес IP с продолжительным сроком действия. Этот домашний адрес администрируется так же, как «постоянные» адреса IP на стационарных хостах. Когда мобильное устройство отключается от домашней сети и подключается к другой, оно получает «адрес обслуживания» (care-of address), который связывается с мобильным узлом и указывает его текущую точку подключения. Мобильный узел использует свой домашний адрес в качестве адреса отправителя всех передаваемых им дейтаграмм IP, за исключением описанных в этом документе дейтаграмм, служащих для некоторых функций управления (см. параграф 3.6.1.1).

1.6. Терминология

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с RFC 2119 [1].

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

Authorization-enabling extension — расширение для поддержки проверки полномочий

Аутентификация, которая делает (регистрационное) сообщение приемлемым для конечного получателя. Поддерживающее проверку полномочий расширение должно включать SPI.

В этом документе все случаи использования поддерживающего проверку полномочий расширения относятся к аутентификационным расширениям, которые разрешают восприятие сообщения Registration Request домашним агентом. Использование дополнительных протокольных структур, не описанных в данном документе, может оказаться возможным для мобильного узла с целью обеспечить его регистрацию на домашнем агенте с помощью элемента аутентификации в сети, который приемлем для домашнего агента (см., например, RFC 2794 [2]).

Agent Advertisement — анонсирование агента

Сообщение-анонс, созданное путем присоединения к маршрутным анонсам специального расширения [5].

Authentication — аутентификация

Процесс проверки (с использованием криптографических методов для всех приложений в данной спецификации) идентификации источника сообщения.

Care-of Address — адрес обслуживания

Точка завершения туннеля в направлении мобильного узла для пересылаемых такому узлу дейтаграмм в случае его подключения за пределами домашней сети. Протокол может использовать два разных типа адресов обслуживания: foreign agent care-of address представляет собой адрес внешнего агента, на котором регистрируется мобильный узел, а co-located care-of address (совмещенный адрес) — полученный извне локальный адрес, который мобильный узел связывает с одним из своих интерфейсов.

Correspondent Node — узел-корреспондент

Партнер, с которым взаимодействует мобильный узел. Это может быть стационарный или мобильный узел.

Foreign Network — чужая сеть

Любая сеть, не являющаяся домашней для мобильного узла.

Gratuitous ARP — беспричинный пакет

Пакет ARP, передаваемый узлом для того, чтобы побудить другие узлу к обновлению их кэша ARP [45] (см. параграф 4.6).

Home Address — домашний адрес ARP

Адрес IP, предоставленный мобильному узлу для использования в течение достаточно долгого срока. Этот адрес не зависит от точки подключения мобильного узла к сети Internet.

Home Network — домашняя сеть

Сеть (возможно, виртуальная), адресный префикс которой соответствует домашнему адресу мобильного узла. Отметим, что стандартные механизмы маршрутизации IP будут доставлять дейтаграммы для мобильного узла в его домашнюю сеть.

Link — канал, соединение

Элемент или среда, через которые узлы взаимодействуют на канальном уровне. Располагается под сетевым уровнем.

Link-Layer Address — адрес канального уровня

Адрес, служащий для идентификации конечных точек в некоторых коммуникациях через физические каналы. Обычно адресом канального уровня является MAC-адрес интерфейса.

Mobility Agent — агент мобильности

Домашний или внешний агент.

Mobility Binding — мобильная привязка

Связывание домашнего адреса с адресом обслуживания вкупе со временем существования такой привязки.

Mobility Security Association — защищенная мобильная связь (MSA)

Набор защитных средств (контекстов) между парой узлов, который может быть применен к сообщениям протокола Mobile IP между этими узлами. Каждый контекст указывает алгоритм и режим аутентификации (параграф 5.1), секрет (разделяемый ключ или подходящая пара из закрытого и открытого ключей), а также стиль защиты от использования повторов (параграф 5.7).

Node — узел

Хост или маршрутизатор.

Nonce

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

Security Parameter Index (SPI) — индекс параметров защиты

Индекс, идентифицирующий контекст защиты между парой узлов из числа контекстов, доступных в MSA. Значения SPI от 0 до 255 являются резервными, недопустимо использовать их для Mobility SA.

Tunnel — туннель

Путь, по которому проходят инкапсулированные дейтаграммы. Инкапсулируемая дейтаграмма маршрутизируется известному агенту декапсуляции, который корректно извлекает дейтаграмму и направляет ее получателю.

Virtual Network — виртуальная сеть

Сеть без физического интерфейса за пределы маршрутизатора (с физическим интерфейсом маршрутизатора в другую сеть). Маршрутизатор (например, домашний агент) обычно анонсирует доступность виртуальной сети с использованием обычных протоколов маршрутизации.

Visited Network — посещенная сеть

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

Visitor List — список посетителей

Список мобильных узлов, посетивших внешний агент.

1.7. Обзор протокола

Ниже перечислены службы, определенные для Mobile IP.

Agent Discovery — обнаружение агента

Домашние и внешние агенты могут анонсировать свою доступность на каждом канале, через который они обеспечивают сервис. Вновь подключившийся мобильный узел может отправить в канал запрос для определения наличия там нужного агента.

Registration — регистрация

Когда мобильный узел покидает домашнюю сеть, он регистрирует свой адрес обслуживания на домашнем агенте. В зависимости от метода подключения мобильный узел может регистрироваться на домашнем агенте напрямую или через внешний агент, пересылающий регистрационные данные домашнему агенту.

silently discard — отбрасывание без уведомления

Реализация отбрасывает дейтаграммы без дальнейшей обработки и без уведомления об этом отправителя. В реализациях следует поддерживать возможность записи таких фактов в системный журнал (с возможностью сохранения содержимого отброшенной дейтаграммы) и учет таких событий в статистике.

Ниже кратко описаны операции протокола Mobile IP.

  • Агенты мобильности (т. е., домашние и внешние агенты) анонсируют свое присутствие с помощью сообщений Agent Advertisement (раздел 2). Мобильный узел может запросить сообщение Agent Advertisement от любого локально подключенного агента мобильности с помощью отправки сообщения Agent Solicitation.

  • Мобильный узел получает эти сообщения Agent Advertisement и определяет подключен он к домашней или чужой сети.

  • Когда мобильный узел определяет свое подключение к домашней сети, он не использует службы мобильности. При возвращении в домашнюю сеть после регистрации в какой-либо чужой сети мобильный узел заново регистрируется на домашнем агенте, обмениваясь с ним сообщениями Registration Request и Registration Reply.

  • Когда мобильный узел определяет, что он подключен к чужой сети, он получает от этой сети адрес обслуживания. Этот адрес может быть определен из анонсов внешнего агента (адрес внешнего агента) или с помощью того или иного внешнего механизма типа DHCP [13] (совмещенный адрес обслуживания).

  • Работающий за пределами домашней сети мобильный узел регистрирует адрес обслуживания на своем домашнем агенте, обмениваясь с ним сообщениями Registration Request и Registration Reply (возможно через внешнего агента — см. раздел 3).

  • Дейтаграммы, передаваемые на домашний адрес мобильного узла, перехватываются домашним агентом, туннелируются на адрес обслуживания мобильного узла, принимаются в конечной точке этого туннеля (внешний агент или сам мобильный узел) и доставляются мобильному узлу (параграф 4.2.3).

  • В обратном направлении дейтаграммы от мобильного узла обычно доставляются получателям с использованием стандартных механизмов маршрутизации IP (не обязательно через домашнего агента).

При работе мобильного узла вне домашней сети Mobile IP использует туннелирование для сокрытия домашнего адреса мобильного узла от промежуточных маршрутизаторов на пути между домашней сетью и текущей точкой подключения мобильного узла. Туннель завершается на адресе обслуживания мобильного узла. Адресом обслуживания должен быть тот адрес IP, на который дейтаграммы будут доставляться обычной маршрутизацией. По адресу обслуживания исходные дейтаграммы извлекаются из туннеля и доставляются мобильному узлу.

Mobile IP предлагает два варианта получения адреса обслуживания:

  1. Адрес внешнего агента (foreign agent care-of address) — это адрес обслуживания, предоставляемый внешним агентом в его сообщениях Agent Advertisement. В этом случае адресом обслуживания является IP-адрес внешнего агента. В этом режиме внешний агент является конечной точкой туннеля и при получении туннелированных дейтаграмм он декапсулирует их и доставляет вложенные дейтаграммы мобильному узлу. Этот режим получения адреса является предпочтительным, поскольку он позволяет множеству мобильных узлов пользоваться одним адресом обслуживания, что весьма важно в условиях дефицита адресов IPv4.

  2. Совмещенный адрес (co-located care-of address) — это адрес обслуживания, получаемый мобильным узлом, как локальный адрес IP с помощью тех или иных внешних механизмов. Полученный адрес мобильный узел связывает с одним из своих интерфейсов. Адрес может выделяться динамически (например, через DHCP [13]) или статически на все время присутствия мобильного узла в чужой сети. Конкретные способы предоставления локальных адресов мобильным узлам для использования в качестве адресов обслуживания выходят за рамки этого документа. При использовании совмещенного адреса обслуживания мобильный узел является конечной точкой туннеля и сам выполняет декапсуляцию туннелируемых дейтаграмм.

Преимуществом использования совмещенного адреса обслуживания является возможность работы мобильного узла без внешнего агента (например, в сетях, где таких агентов нет). Однако для поддержки этого режима требуется выделять дополнительный пул дефицитных адресов IPv4, которые могут использоваться мобильными узлами. Эффективная поддержка таких пулов для каждой подсети, к которой могут подключаться мобильные пользователи, является достаточно трудной задачей.

Важно различать адрес обслуживания и функции внешнего агента. Адрес обслуживания просто задает конечную точку туннеля. Это может быть и адрес внешнего агента (foreign agent care-of address), но может быть и адресом, временно полученным мобильным узлом (co-located care-of address). Внешний агент, с другой стороны, является агентом мобильности, обслуживающим мобильны узлы. Дополнительная информация приведена в параграфах 3.7 и 4.2.2.

Домашний агент должен быть способен перехватывать дейтаграммы, направленные любому из зарегистрированных им мобильных узлов. Использование посредника и механизмов ARP, описанных в параграфе 4.6, позволяет выполнить это требование, если домашний агент имеет интерфейс в сеть (канал), указанную домашним адресом мобильного узла. При ином расположении домашнего агента относительно домашнего местоположения мобильных узлов могут применяться иные механизмы для перехвата пакетов, адресованных на домашние адреса мобильных узлов. Рассмотрение этих вариантов выходит за рамки данного документа.

Аналогично, мобильный узел и текущий или будущий внешний агент должны быть способны обмениваться дейтаграммами без привлечения стандартных механизмов маршрутизации IP (т. е., механизмы, принимающие решение о пересылке на основе адреса получателя в заголовках IP). Это требование может быть выполнено, если внешний агент и подключившийся мобильный узел имеют интерфейсы в одну сеть (канал). В этом случае мобильный узел и внешний агент при обмене дейтаграммами могут обойтись без вовлечения обычных механизмов маршрутизации IP, адресуя пакеты канального уровня соответствующему получателю канального уровня. При других вариантах взаимного расположения мобильного узла и внешнего агента могут применяться иные механизмы обеспечения обмена дейтаграммами между ними, но этот вопрос выходит за рамки данного документа.

Если мобильный узел использует совмещенный адрес обслуживания (см. п. b выше), он должен размещаться в сети, указанной префиксом этого адреса. Иначе дейтаграммы, переданные по адресу обслуживания, не будут доставлены.

На рисунке 1 показана маршрутизация дейтаграмм мобильного узла, находящегося вне домашней сети, после его регистрации на домашнем агенте. В этом примере мобильный узел использует адрес внешнего агента, а не совмещенный адрес.

           2) Дейтаграмма перехватывается  3) Дейтаграмма 
              домашним агентом и              детуннелируется 
              туннелируется на адрес          и доставляется
              обслуживания.                   Мобильному узлу.

                +-----+          +-------+         +------+
                |домаш| =======> |внешний| ------> |мобил.|
                |агент|          | агент | <------ | узел |
                +-----+          +-------+         +------+
1) Дейтаграмма    /|\         /
   для мобильного  |        /   4) Для переданных мобильным 
   узла приходит   |      /        узлом используется обычная
   в домашнюю сеть |    /          маршрутизация IP. На рисунке
   обычным путем.  |  |_           внешний агент является для   
                 +----+            мобильного узла маршрутизатором
                 |хост|            по умолчанию.                
                 +----+

Рисунок 1. Работа Mobile IPv4.


1.8. Расширяемость протокола и формата сообщений

Mobile IP определяет набор управляющих сообщений, передаваемых по протоколу UDP [37] через порт 434. В данном документе определены два типа сообщений:

1 Registration Request (запрос регистрации)

3 Registration Reply (регистрационный отклик)

Актуальные значения для типов сообщений Mobile IP указаны в базе данных IANA [48].

Кроме того для обнаружения агентов (Agent Discovery) Mobile IP использует сообщения Router Advertisement и Router Solicitation, определенные для ICMP Router Discovery [5].

Mobile IP определяет общий механизм расширения (Extension), позволяющий передавать дополнительную информацию в управляющих сообщениях Mobile IP и сообщениях ICMP Router Discovery. Некоторые расширения представляются в формате TLV3, описанном в параграфе 1.9.

Расширения позволяют передавать в каждой дейтаграмме переменный объем информации. Завершение списка расширений указывается полем общего размера дейтаграммы IP.

В Mobile IP используется два набора номерных пространств для значения Extension Type:

  • Первый набор включает расширения, которые могут включаться только в управляющие сообщения Mobile IP (передаются по протоколу UDP через порт 434). В этом документе определены четыре типа расширений для управляющих сообщений Mobile IP:

    0 One-byte Padding (однобайтовое заполнение, без полей Length и Data);

    32 Mobile-Home Authentication;

    33 Mobile-Foreign Authentication;

    34 Foreign-Home Authentication.

  • Второй набор включает расширения, которые могут включаться только в сообщения ICMP Router Discovery [5]. Данный документ определяет три типа таки расширений:

    0 One-byte Padding (однобайтовое заполнение, без полей Length и Data);

    16 Mobility Agent Advertisement (анонс мобильного агента);

    19 Prefix-Lengths (размеры префиксов).

Расширения будут подробно описаны ниже. Актуальные значения Extension Type можно найти в базе данных IANA [48].

По причине разделения (ортогональности) этих множеств в будущем номера типов для расширений из разных множеств могут совпадать. Это не создаст проблем, поскольку одни расширения могут применяться только в управляющих сообщениях Mobile IP, а другие — только в сообщениях ICMP Router Discovery.

Поле типа в структуре расширения Mobile IP может поддерживать до 255 (пропускаемых и непропускаемых) однозначно идентифицируемых расширений. Когда расширение из любого набора со значением типа от 0 до 127 не распознается, сообщение с таким расширением должно отбрасываться без уведомления. Если не распознается расширение с типом от 128 до 255, это расширение игнорируется, но остальные расширения и данные сообщения должны обрабатываться. Поле Length в Extension служит для пропуска поля Data при поиске следующего расширения.

Пока для типов расширений не используется дополнительная структура, новые разработки или дополнения к Mobile IP могут потребовать столько расширений, что доступного для типов расширения пространства окажется не достаточно. Для решения этой проблемы предложены две новых структуры расширения. Некоторые типы расширений можно агрегировать, используя подтипы для точной идентификации (например, это возможно для расширений Generic Authentication Keys [46]). Во многих случаях это позволяет снизить скорость добавления новых значений для поля типа.

Поскольку новые структуры повышают эффективность использования пространства типов расширений, рекомендуется для новых расширений Mobile IP следовать одному из двух предложенных форматов, если возможна группировка связанных расширений.

В последующих параграфах более подробно рассмотрены три разных структуры для расширений Mobile IP:

  • простой формат;

  • длинный формат;

  • короткий формат.

1.9. Формат TLV для расширений Mobile IP

Для расширений, определенных в этом документе применяется формат TLV, показанный на рисунке 2. Поскольку эта простая структура не обеспечивает повышения эффективности использования пространства типов расширений, для новых расширений Mobile IP рекомендуется использовать один из новых форматов, описанных в параграфах 1.10 и 1.11, если расширения поддерживают группировку.


 0                   1                   2
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
|     Type      |    Length     |    Data ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

Рисунок 2: Формат TLV для расширений Mobile IPv4

Type

Указывает конкретный тип расширения.

Length

Указывает размер поля данных расширения в байтах. Размер не учитывает два байта полей Type и Length.

Data

Связанные с расширением данные, формат и размер которых определяется значениями полей Type и Length.

1.10. Длинный формат расширения

Этот формат применим для непропускаемых расширений, которые могут содержать более 256 данных. Пропускаемые расширения не могут использовать длинный формат, поскольку получатель не обязан поддерживать код для разбора и будет, очевидно, трактовать 8 битов, следующих непосредственно за полем Type, как поле Length.

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |     Type      |  Sub-Type     |           Length              |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                           Data      .....
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Длинный формат расширения требует наличия в начале заголовка следующих полей.

Type

Поле типа, описывающее набор однотипных расширений.

Sub-Type

Уникальный номер каждого элемента в группе расширений.

Length

Размер поля данных расширения в байтах. 4 октета полей Type, Length и Sub-Type в размере не учитываются.

Data

Данные, связанные с конкретным подтипом расширения. Структура данных в этой спецификации не задается.

16-битовое поле размера позволяет данным расширения превышать размер 256 байтов.

1.11. Короткий формат расширения

Этот формат совместим с пропускаемыми расширениями, которые определены в параграфе 1.9, но не применим с расширениями, включающими более 256 байтов данных (для них используется формат, описанный в параграфе 1.10).

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |     Type      |   Length      |    Sub-Type   |    Data ....
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Короткий формат требует присутствия в начале расширения перечисленных ниже полей.

Type

Поле типа, описывающее набор однотипных расширений.

Sub-Type

Уникальный номер каждого элемента в группе расширений.

Length

8-битовое целое число без знака, которое показывает размер расширения без учета полей Type и Length (1 + размер поля Data).

Data

Данные, связанные с конкретным подтипом расширения. Структура данных в этой спецификации не задается.

2. Обнаружение агента

Agent Discovery является методом, с помощью которого мобильный узел определяет подключен он в данный момент к чужой или домашней сети, а также фиксирует перемещение из одной сети в другую. При подключении к чужой сети сети описанные в этом разделе методы также позволяют мобильному узлу определить адрес внешнего агента, предлагаемый им в качестве адреса обслуживания мобильных узлов.

Mobile IP расширяет механизм Router Discovery [5] для использования в целях обнаружения агента. Сообщения Agent Advertisement формируются путем включения расширений Mobility Agent Advertisement в сообщения ICMP Router Advertisement (параграф 2.1). Сообщение Agent Solicitation идентично ICMP Router Solicitation, за исключением того, что должно устанавливаться IP TTL = 1 (параграф 2.2). В этом разделе рассматриваются форматы сообщений и процедуры, с помощью которых мобильные узлы в кооперации с домашними и внешними агентами реализуют механизм Agent Discovery.

Сообщения Agent Advertisement и Agent Solicitation могут не требоваться для канальных уровней, где такая функциональность уже присутствует. Метод организации мобильным узлом соединений с потенциальными агентами на канальном уровне выходит за рамки данного документа (см. Приложение A). Описанные ниже процедуры предполагают наличие такого соединения на канальном уровне.

Для сообщений Agent Advertisement и Agent Solicitation не требуется аутентификации. Они могут быть аутентифицированы с помощью IP Authentication Header [9], но это не связано с описываемыми здесь сообщениями. Дополнительная спецификация процедур аутентификации сообщений Advertisement и Solicitation выходит за рамки данного документа.

2.1. Анонсы агента

Сообщения Agent Advertisement передаются в канал агентом мобильности для анонсирования своих услуг. Мобильные узлы используют эти анонсы для определения своей текущей точки подключения к Internet. Agent Advertisement представляет собой сообщение ICMP Router Advertisement, в которое добавлено расширение Mobility Agent Advertisement (параграф 2.1.1) и могут быть также добавлены расширения Prefix-Lengths (параграф 2.1.2), One-byte Padding (параграф 2.1.3) и другие расширения, которые будут добавлены в будущем.

В сообщении Agent Advertisement поля ICMP Router Advertisement должны соответствовать перечисленным ниже дополнительным требованиям.

  • Поля канального уровня

    Destination Address

    Адрес получатель на канальном уровне в индивидуальном сообщении Agent Advertisement должен совпадать с канальным адресом отправителя в сообщении Agent Solicitation, вызвавшем Advertisement.

  • Поля IP

    TTL

    Во всех сообщениях Agent Advertisement должно устанавливаться TTL = 1.

    Destination Address

    Как указано в [10] для сообщений ICMP Router Discovery, IP-адрес получателя группового сообщения Agent Advertisement должен быть 224.0.0.1 (все системы на канале) [6] или 255.255.255.255 (ограниченное широковещание). Широковещательный адрес подсети (subnet-directed broadcast) вида <prefix>.<-1> использовать не допустимо, поскольку мобильным узлам обычно не известен префикс чужой сети. Если сообщение Agent Advertisement передается индивидуально мобильному узлу, в качестве Destination Address следует использовать домашний IP-адрес мобильного узла.

  • Поля ICMP

    Code

    Поле Code в анонсах агентов интерпретируется следующим образом:

    0 — агент мобильности обслуживает трафик общего назначения (т. е., действует в качестве маршрутизатора дейтаграмм IP не только мобильных узлов);

    16 — агент мобильности не маршрутизирует трафик общего назначения. Однако все внешние агенты должны (как минимум) пересылать используемому по умолчанию все дейтаграммы, полученные от зарегистрированного мобильного узла (параграф 4.2.2).

    Lifetime

    Максимальное время, в течение которого сообщение Advertisement считается корректным при отсутствии других анонсов.

    Router Address(es)

    Адреса, которые могут присутствовать в этой части Agent Advertisement, рассмотрены в параграфе 2.3.1.

    Num Addrs

    Число адресов маршрутизаторов, анонсируемых в этом сообщении. Отметим, что в сообщении Agent Advertisement число адресов маршрутизаторов, заданных в ICMP Router Advertisement, может быть нулевым. Дополнительная информация приведена в параграфе 2.3.1.

При периодической передаче интервал между сообщениями Agent Advertisement следует делать не более 1/3 от анонсируемого значения Lifetime в заголовке ICMP. Этот интервал может быть короче 1/3 анонсируемого значения Lifetime. Это позволяет мобильному узлу не удалять агента из своего списка подходящих агентов даже при пропуске трех анонсов подряд. Реальное время передачи каждого анонса следует менять на случайную величину [5] для предотвращения синхронизации и последующих конфликтов с анонсами от других агентов (или с анонсами Router Advertisement от других маршрутизаторов). Отметим, что это поле не связано с полем Registration Lifetime в определенном ниже расширении Mobility Agent Advertisement.

2.1.1. Расширение для анонсов мобильного агента

Расширение Mobility Agent Advertisement использует поля анонса ICMP Router Advertisement. Это расширение служит для индикации того, что сообщение ICMP Router Advertisement является также анонсом агента (Agent Advertisement), переданным мобильным агентом. Формат Mobility Agent Advertisement Extension показан ниже.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |    Length     |        Sequence Number        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    Registration Lifetime      |R|B|H|F|M|G|r|T|   reserved    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Care-of Addresses                        |
   |                              ...                              |

Type

16

Length

(6 + 4*N), где 6 учитывает число байтов в полях Sequence Number, Registration Lifetime, флагах и резервных битах, а N задает число анонсируемых адресов обслуживания.

Sequence Number

Число сообщений Agent Advertisement, переданных с момента инициализации агента (см. параграф 2.3.2).

Registration Lifetime

Максимальное время жизни (в секундах), которое этот агент будет принимать в запросах Registration. 0xffff задает бесконечное время. Это поле не связано с полем Lifetime в части ICMP Router Advertisement анонсов агента.

R

Требуется регистрация. Регистрация на данном (или другом на том же канале) внешнем агенте требуется даже при использовании совмещенного адреса обслуживания.

B

Занят. Внешний агент не принимает регистрацию для дополнительных мобильных узлов.

H

Домашний агент. Предлагает услуги домашнего агента на канале, в который передан анонс Agent Advertisement.

F

Внешний агент. Предлагает услуги внешнего агента на канале, в который передан анонс Agent Advertisement.

M

Минимальная инкапсуляция. Агент принимает туннелированные дейтаграммы с минимальной инкапсуляцией [15].

G

Инкапсуляция GRE. Агент принимает туннелированные дейтаграммы с инкапсуляцией GRE [13].

r

0 при передаче, игнорируется на приемной стороне. Не следует использовать для каких-либо иных целей.

T

Внешний агент поддерживает обратное туннелирование [12].

U

Агент мобильности поддерживает туннелирование UDP в соответствии с [27].

X

Агент мобильности поддерживает отзыв регистрации в соответствии с [28].

I

Внешний агент поддерживает региональную регистрацию в соответствии с [29].

reserved

0 при передаче, игнорируется на приемной стороне.

Care-of Address(es)

Анонсированный адрес (адреса) внешнего агента, обеспечиваемый этим агентом. Сообщение Agent Advertisement должно включать хотя бы один адрес обслуживания, если установлен бит F. Число представленных адресов обслуживания определяется значением поля Length в расширении.

Агент должен быть постоянно готов к обслуживанию мобильных узлов, для которых он служит домашним агентом. Внешний агент может оказаться перегруженным и не будет способен обслуживать дополнительные узлы. В таких случаях он должен продолжать передачу сообщений Agent Advertisement, чтобы зарегистрированные мобильные узлы знали, что агент работает и продолжает их обслуживание. Внешний агент может указать свою чрезмерную загрузку (too busy), чтобы позволить регистрацию новых мобильных узлов, устанавливая бит B в своих сообщениях Agent Advertisement. В анонсах агента недопустимо устанавливать одновременно биты B и F. Кроме того, один из битов F или H должен быть установлен во всех передаваемых сообщениях Agent Advertisement.

Если внешний агент требует регистрации даже для мобильных узлов с совмещенным адресом обслуживания, он устанавливает бит R. Поскольку этот флаг применим только для внешних агентов, не допускается установка R при сброшенном флаге F.

2.1.2. Расширение Prefix-Lengths

Расширение Prefix-Lengths может следовать за расширением Mobility Agent Advertisement. Оно служит для индикации числа битов в сетевом префиксе для каждого адреса Router Address в списке ICMP Router Advertisement сообщения Agent Advertisement. Отметим, что размер префикса не относится к адресам обслуживания в расширении Mobility Agent Advertisement. Формат расширения Prefix-Lengths показан ниже.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |    Length     | Prefix Length |      ....
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type

19 (Prefix-Lengths Extension)

Length

N, где N — значение (возможно 0) поля Num Addrs в части ICMP Router Advertisement анонса Agent Advertisement.

Prefix Length

Число старших битов, определяющих номер сети для соответствующего Router Address в ICMP Router Advertisement данного сообщения. Размер префикса для каждого Router Address представляется отдельным байтом в порядке следования полей Router Addresses в ICMP Router Advertisement.

В параграфе 2.4.2 рассмотрено, как с помощью расширения Prefix-Lengths мобильный узел может определить факт своего перемещения в другую сеть. Детали использования расширения приведены в Приложении D.

2.1.3. Расширение для однобайтового заполнения

Некоторым реализациям протокола IP нужно заполнение сообщений ICMP для выравнивания по четному размеру. Если размер ICMP в анонсе Agent Advertisement нечетный, может использоваться данное расширение для увеличения размера до четного. Отметим, что это расширение не относится к числу расширений общего назначения для выравнивания различных полей Agent Advertisement. В анонсы Agent Advertisement не следует включать более одного расширения One-byte Padding Extension и при наличии этого расширения его следует размещать последним в Agent Advertisement.

Отметим, что в отличии от других расширений, используемых Mobile IP, расширение One-byte Padding Extension представляется одним байтом без полей Length и Data. Формат расширения One-byte Padding показан ниже.

    0 1 2 3 4 5 6 7
   +-+-+-+-+-+-+-+-+
   |     Type      |
   +-+-+-+-+-+-+-+-+

Type

0 (One-byte Padding Extension)

2.2. Сообщение Agent Solicitation

Сообщение Agent Solicitation идентично ICMP Router Solicitation, но поле IP TTL должно иметь значение 1.

2.3. Внешний агент и домашний агент

Любой агент мобильности, который не может быть обнаружен протоколом канального уровня,, должен передавать анонсы Agent Advertisement. Анонсам, которые могут быть обнаружены протоколом канального уровня, следует также реализовать Agent Advertisement. Однако анонсы не требуется передавать за исключениям ситуаций, когда политика сайта требует регистрации (установлен бит R), или в качестве отклика на конкретное сообщение Agent Solicitation. Все агенты мобильности должны обрабатывать полученные пакеты, направленные в группу Mobile-Agents по адресу 224.0.0.11. Мобильный узел может отправлять сообщения Agent Solicitation по адресу 224.0.0.11. Все агентам мобильности следует отвечать на сообщения Agent Solicitation.

Одни и те же процедуры, параметры по умолчанию и константы используются в сообщениях Agent Advertisement и сообщениях Agent Solicitation, как указано для ICMP Router Discovery в [5], за исключением перечисленного ниже.

  • Агент мобильности должен ограничивать скорость передачи широковещательных и групповых сообщений Agent Advertisement, максимальную скорость следует выбирать так, чтобы анонсы не отнимали значительную часть пропускной способности сети;

  • мобильному агенту, получившему Router Solicitation, недопустимо требовать, чтобы в поле IP Source Address был указан адрес соседа (т. е., соответствовал подсети, связанной с одним из адресов интерфейса, через который пришло сообщение).

  • Агент мобильности может быть настроен на передачу сообщений Agent Advertisements только в ответ на сообщения Agent Solicitation.

Если домашняя сеть не является виртуальной, домашний агент для любого мобильного узла следует размещать на канале, идентифицируемом домашним адресом мобильного узла, а передаваемые домашним агентом в этот канал сообщения Agent Advertisement должны иметь флаг H. Благодаря этому, мобильный узел в своей домашней сети может определить, что он находится дома. В любых сообщениях Agent Advertisement, передаваемых домашним агентом в другие каналы, к которым он подключен (если агент мобильности обслуживает более одного канала), недопустимо устанавливать бит H, если этот агент не является домашним и для данного канала (для других мобильных узлов). Агент мобильности может использовать разные установки для битов R, H и F на каждом сетевом интерфейсе.

Если домашняя сеть является виртуальной, она не имеет физической реализации, внешней по отношению к домашнему агенту. В этом случае нет физического сетевого соединения, в которое передаются сообщения Agent Advertisement, анонсирующие домашний агент. Мобильные пользователи, для которых такая сеть является домашней, всегда трактуются, как находящиеся дома.

В конкретной подсети все агенты мобильности должны включать расширение Prefix-Lengths Extension или все они должны отказаться от его использования. Иными словами, недопустимо использование данного расширения одними агентами в подсети, тогда как другие агенты в той же подсети не будут его включать. В противном случае один из алгоритмов детектирования перемещений для мобильных узлов не будет работать корректно (параграф 2.4.2).

2.3.1. Анонсируемые адреса маршрутизатора

Часть ICMP Router Advertisement анонса Agent Advertisement может включать один или множество адресов маршрутизаторов. Агенту следует помещать в анонс только свои собственные адреса (если они есть). Независимо от наличия его адреса в поле Router Addresses, внешний агент должен маршрутизировать дейтаграммы, полученные от зарегистрированных мобильных узлов (параграф 3.7).

2.3.2. Порядковые номера

Порядковые номера в Agent Advertisement лежат в диапазоне от 0 до 0xffff. После загрузки агент должен использовать в первом анонсе номер 0. В каждом последующем анонсе номер должен увеличиваться на 1, за исключением того, что после номера 0xffff должен следовать номер 256. Это позволяет мобильному узлу различать ситуации, когда порядковый номер меняется в результате перезагрузки агента или по причине достижения верхнего передела.

2.4. Мобильный узел

Каждый мобильный узел должен поддерживать сообщения Agent Solicitation. Ходатайства следует передавать лишь при отсутствии анонсов Agent Advertisement, если адрес обслуживания еще не был определен через протокол канального уровня или иным способом. Мобильный узел использует те же процедуры, значения по умолчанию и константы для Agent Solicitation, что указаны для сообщений ICMP Router Solicitation в [5], за исключением того, что мобильный узел может ходатайствовать более часто, чем 1 раз в 3 секунды, а не подключенный к внешнему агенту мобильный узел может передавать больше запросов, чем задает MAX_SOLICITATIONS.

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

Пока продолжается поиск агента мобильному узлу недопустимо повышать скорость передачи ходатайств, если он не имеет подтверждения своего перехода на другой канал. После регистрации мобильному узлу также следует повысить скорость передачи ходатайств при начале поиска нового агента для регистрации. При увеличении скорость может достигнуть максимального значения, но она должна ограничиваться, как указано выше. Для всех случаев рекомендуемые интервалы отправки ходатайств являются номинальными значениями. Мобильные узлы должны вносить случайные изменений в эти номинальные интервалы, как указано для ICMP Router Discovery [5].

Мобильные узлы должны обрабатывать полученные анонсы агентов. Мобильный узел может отличить сообщение Agent Advertisement от других применений сообщения ICMP Router Advertisement, проверяя число анонсируемых адресов и поле IP Total Length. Если общий размер IP показывает, что сообщение ICMP длиннее, чем нужно для указанного числа анонсируемых адресов, остальные данные интерпретируются как одно или несколько расширений. Наличие расширения Mobility Agent Advertisement идентифицирует сообщение, как анонс Agent Advertisement.

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

При использовании множества методов обнаружения агента мобильному узлу следует сначала предпринять попытку регистрации у агентов, включивших расширения Mobility Agent Advertisement в свои анонсы и лишь после этого использовать агентов, открытых иными способами. Такая регистрация будет признана с максимальной вероятностью и это позволяет снизить число попыток.

Мобильный узел должен игнорировать резервные биты в Agent Advertisement, не отбрасывая самих анонсов. В этом случае даже после добавки новых битов мобильные узлы смогут пользоваться не до конца понятными им анонсами.

2.4.1. Требование регистрации

Когда мобильный узел получает анонс Agent Advertisement с установленным битом R, ему следует выполнять регистрацию через внешний агент даже при наличии возможности получения своего совмещенного адреса обслуживания. Это предназначено для обеспечения сайтам возможности реализации правил посещения (например, учета), требующих проверки полномочий.

Если некоторые зарезервированные ранее биты требуют того или иного мониторинга/исполнения на внешнем канале, поддерживающие новую спецификацию внешние агенты могут устанавливать бит R. Это вынудит мобильные узлы регистрироваться через данного агента, что позволит ему контролировать/требовать выполнение правил.

2.4.2. Детектирование перемещений

Для мобильных узлов обеспечиваются два основных механизма детектирования перехода из одной подсети в другую. Могут использоваться также иные механизмы. Мобильному узлу, обнаружившему свое перемещение, следует зарегистрироваться (раздел 3) с подходящим адресом обслуживания в новой внешней сети. Однако мобильным узлам недопустимо регистрироваться чаще одного раза в секунду (в среднем), как указано в параграфе 3.6.3.

2.4.2.1. Алгоритм 1

Первый метод детектирования перемещений основан на использовании поля Lifetime в основном теле части ICMP Router Advertisement сообщения Agent Advertisement. Мобильному узлу следует сохранять значение, полученное в анонсах Agent Advertisement до истечения времени Lifetime. Если мобильный узел не получает другого анонса от того же агента в течение времени, заданного Lifetime, ему следует считать, что контакт с агентом потерян. Если мобильный узел при этом получил сообщение Agent Advertisement от другого агента, для которого время Lifetime еще не истекло, он может незамедлительно попытаться зарегистрироваться у этого агента. В противном случае мобильному узлу следует предпринять попытку обнаружения нового агента для регистрации.

2.4.2.2. Алгоритм 2

Во втором методе используются сетевые префиксы. В некоторых случаях мобильные узлы могут использовать расширение Prefix-Lengths для определения принадлежности недавно полученного анонса Agent Advertisement к той же подсети, из которой взят адрес обслуживания мобильного узла. Если префиксы различаются, мобильный узел может предполагать свое перемещение. Если мобильный узел в данный момент пользуется адресом внешнего агента, ему не следует применять этот метод детектирования перемещений, если в анонсах нового и текущего агентов не присутствует расширение Prefix-Lengths. Аналогично при использовании мобильным узлом совмещенного адреса обслуживания узлу не следует применять этот метод, если новый агент не включает расширение Prefix-Lengths в свои анонсы или мобильному узлу не известен сетевой префикс для своего текущего совмещенного адреса обслуживания. При завершении срока текущей регистрации, если данный метод говорит о перемещении мобильного узла, данный узел может зарегистрироваться на внешнем агенте, передавшем новое сообщение Agent Advertisement с другим сетевым префиксом. Недопустимо в таких случаях регистрироваться с использованием сообщения Agent Advertisement, для которого истек срок, заданный полем Lifetime.

2.4.3. Возвращение в домашнюю сеть

Мобильный узел может обнаружить свой возврат в домашнюю сеть при получении анонса Agent Advertisement от своего домашнего агента. В этом случае мобильному узлу следует отменить регистрацию на своем домашнем агенте (раздел 3). Перед попыткой дерегистрации мобильному узлу следует настроить свою таблицу маршрутизации на домашнюю сеть (параграф 4.2.1). Кроме того, если домашняя сеть использует ARP [16], мобильный узел должен выполнить процедуры, описанные в параграфе 4.6 применительно к ARP, proxy ARP и gratuitous ARP.

2.4.4. Порядковые номера

Если мобильный узел обнаруживает два последовательных значения порядковых номеров в сообщениях Agent Advertisement от внешнего агента, где он зарегистрирован, и второй номер меньше первого и лежит в диапазоне от 0 до 255, данному узлу следует зарегистрироваться заново. Если второе значение меньше первого, но не меньше 256, мобильному узлу следует считать, что нумерация достигла максимума (0xffff) и пошла на следующий круг. Повторная регистрация в этом случае не требуется (параграф 2.3).

3. Регистрация

Регистрация Mobile IP обеспечивает мобильным узлам гибких механизм обмена текущей информацией о доступности со своим домашним агентом. Это представляет собой метод, с помощью которого мобильные узлы

  • запрашивают обслуживание при подключении к чужой сети;

  • информируют домашний агент о своем текущем адресе обслуживания;

  • обновляют регистрацию по ее завершении;

  • отменяют внешнюю регистрацию при возврате домой.

Регистрационные сообщения обеспечивают обмен информацией между мобильным узлом, (опционально) внешним агентом и домашним агентом. Регистрация организует или меняет привязку мобильности на домашнем агенте, связывающую домашний адрес мобильного узла с текущим адресом его обслуживания на время, заданное Lifetime.

В регистрационной процедуре поддерживается ряд опциональных возможностей, доступных мобильному узлу:

  • определение мобильным узлом своего домашнего адреса (если он не указан в конфигурации);

  • поддержка множества одновременных регистраций для туннелирования копий каждой дейтаграммы по всем активным адресам обслуживания;

  • дерегистрация конкретного адреса обслуживания с сохранением других привязок мобильности;

  • определение адреса домашнего агента, если он не задан в настройках мобильного узла.

3.1. Обзор регистрации

Mobile IP определяет две разных процедуры регистрации. Одна из процедур использует внешний агент, который транслирует регистрацию домашнему агенту мобильного узла, а во второй регистрация происходит напрямую на домашнем агенте. Приведенные ниже правила определяют выбор конкретной процедуры для тех или иных условий:

  • если мобильный узел регистрирует адрес внешнего агента, он должен делать это через данного агента;

  • если мобильный узел использует совмещенный адрес обслуживания и получил анонс Agent Advertisement от внешнего агента на канале, где он использует данный адрес обслуживания, мобильному узлу следует регистрироваться через данный внешний агент (или другой внешний агент на данном канале), если в полученном анонсе был установлен бит R;

  • в остальных случаях при использовании совмещенного адреса обслуживания мобильный узел должен регистрироваться непосредственно на своем домашнем агенте;

  • если мобильный узел вернулся в свою домашнюю сеть, он должен регистрироваться непосредственно на своем домашнем агенте.

Обе процедуры регистрации включают обмен сообщениями Registration Request и Registration Reply (параграфы 3.3 и 3.4). При регистрации через внешний агент процедура требует использования четырех сообщений:

  1. мобильный узел передает Registration Request подходящему внешнему агенту для начала процесса;

  2. внешний агент обрабатывает запрос и транслирует его домашнему агенту;

  3. домашний агент передает Registration Reply внешнему агенту, принимая или отвергая полученный запрос;

  4. внешний агент обрабатывает Registration Reply и транслирует его мобильному узлу для информирования того о результате рассмотрения запроса.

При регистрации непосредственно на домашнем агенте процедура требует двух сообщений:

  1. мобильный узел передает Registration Request домашнему агенту;

  2. домашний агент передает мобильному узлу Registration Reply, принимая или отвергая запрос.

Регистрационные сообщения, определенные в параграфах 3.3 и 3.4, используют протокол UDP4 [17]. В заголовок следует включать отличную от нуля контрольную сумму UDP, а получатель должен проверять эту сумму. Получателям следует воспринимать пакеты с нулевой контрольной суммой UDP. Поведение мобильного узла и домашнего агента в части восприятия пакетов с нулевым значением контрольной суммы UDP следует согласовывать в рамках связи MSA между сторонами.

3.2. Аутентификация

Каждый мобильный узел, домашний и внешний агент должны обеспечивать поддержку связей MSA для мобильных узлов, индексируемых по их SPI и адресам IP. Для мобильного узла должна использоваться индексация по его домашнему адресу. Требования по поддержке алгоритмов аутентификации приведены в параграфе 5.1. Регистрационные сообщения между мобильным узлом и его домашним агентом должны аутентифицироваться с поддерживающим проверку полномочий расширением (см., например, Mobile-Home Authentication Extension в параграфе 3.5.2). Это расширение должно быть первым аутентификационным расширением. В сообщение могут добавляться другие расширения, специфичные для внешнего агента, после того, как аутентификация завершится.

3.3. Запрос регистрации

Мобильный узел регистрируется на своем домашнем агенте, используя сообщения Registration Request, чтобы домашний агент мог создать или изменить привязку мобильности для этого узла (например, скорректировать Lifetime). Запрос может быть оттранслирован домашнему агенту внешним агентом, через который регистрируется мобильный узел, или передан напрямую при регистрации мобильным узлом совмещенного адреса обслуживания.

Поля IP

Source Address — обычно адрес интерфейса, с которого передается сообщение.

Destination Address — обычно адрес домашнего или внешнего агента.

Дополнительная информация приведена в параграфах 3.6.1.1 и 3.7.2.2.

Поля UDP

Source Port — переменное.

Destination Port — 434.

Заголовок UDP, следующий за полями Mobile IP, показан ниже.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |S|B|D|M|G|r|T|x|          Lifetime             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Home Address                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           Home Agent                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Care-of Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                         Identification                        +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Расширения ...
+-+-+-+-+-+-+-+-

Type

1 (Registration Request)

S

Одновременные (Simultaneous) привязки. Если бит S установлен, мобильный узел запрашивает у домашнего агента сохранение имеющихся привязок мобильности, как описано в параграфе 3.6.1.2.

B

Широковещательные (Broadcast) дейтаграммы. Установленный бит B показывает запрос мобильного узла к домашнему агенту на пересылку в туннель всех широковещательных дейтаграмм из домашней сети, как описано в параграфе 4.3.

D

Декапсуляция (Decapsulation) мобильным узлом. Установленный флаг D показывает, что мобильный узел желает самостоятельно декапсулировать дейтаграммы, направленные по адресу обслуживания. Это говорит об использовании мобильным узлом совмещенного адреса обслуживания.

M

Минимальная (Minimal) инкапсуляция. Установленный бит M означает, что домашний агент использует минимальную инкапсуляцию [16] для туннелируемых мобильному узлу дейтаграмм.

G

Инкапсуляция GRE. Установленный бит G говорит о том, что мобильный узел запрашивает у своего домашнего агента использование инкапсуляции GRE [13] для туннелируемых мобильному узлу дейтаграмм.

r

На передающей стороне устанавливается 0, при получении игнорируется. Не следует использовать этот бит для каких-либо целей.

T

Запрошено обратное туннелирование (см. [12]).

x

На передающей стороне устанавливается 0, при получении игнорируется.

Lifetime

Число секунд, остающихся до завершения срока действия регистрации. Нулевое значение указывает запрос отмены регистрации, значение 0xffff показывает неограниченный срок регистрации.

Home Address

IP-адрес мобильного узла.

Home Agent

IP-адрес домашнего агента мобильного узла.

Care-of Address

IP-адрес точки завершения туннеля (к мобильному узлу).

Identification

64-битовое число, создаваемое мобильным узлом и служащее для сопоставления запросов и откликов на них, а также защиту от атак с повторным использованием регистрационных сообщений (см. параграфы 5.4 и 5.7).

Extensions

За фиксированной частью запроса Registration Request может следовать одно или несколько расширений, описанных в параграфе 3.5. В запросы должно включаться расширение для проверки полномочий. Порядок, в котором должны следовать расширения при их включении в запросы регистрации описан в параграфах 3.6.1.3 и 3.7.2.2.

3.4. Регистрационный отклик

Агент мобильности обычно возвращает сообщение Registration Reply мобильному узлу, передавшему Registration Request. Если мобильный узел запрашивает обслуживание у внешнего агента, этот агент обычно получает отклик от домашнего агента этого мобильного узла и пересылает его мобильному узлу. Отклики содержат коды, требуемые для информирования мобильного узла о состоянии его запроса и выделенном домашним агенте сроке регистрации, который может оказаться меньше запрошенного.

Внешнему агенту недопустимо увеличивать значение Lifetime, указанное мобильным узлом в сообщении Registration Request, поскольку поле Lifetime учитывается аутентификационным расширением, которое включает проверку полномочий на домашнем агенте. Такие расширения содержат аутентификационные данные, которые внешний агент не может корректно рассчитать. Домашнему агенту также недопустимо увеличивать значение Lifetime, указанное мобильным узлом в Registration Request, поскольку это может привести к выходу срока регистрации за пределы максимального значения Registration Lifetime, разрешаемого вешним агентом. Если значение Lifetime в полученном сообщении Registration Reply превышает значение в отправленном сообщении Registration Request, должно использоваться значение Lifetime из запроса. Если значение Lifetime в отклике меньше значения этого поля в запросе, должно использоваться значение Lifetime из сообщения Registration Reply.

Поля IP

Source Address — обычно копируется из поля Destination Address сообщения Registration Request, на которое агент отвечает. Дополнительная информация приведена в параграфах 3.7.2.3 и 3.8.3.2.

Destination Address — копируется из поля Source Address сообщения Registration Request, на которое агент отвечает.

Поля UDP

Source Port — копируется из поля UDP Destination Port соответствующего запроса.

Destination Port — копируется из поля UDP Source Port соответствующего запроса (параграф 3.7.1).

Заголовок UDP, следующий за полями Mobile IP, показан ниже.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |           Lifetime            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Home Address                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           Home Agent                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                         Identification                        +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Расширения ...
+-+-+-+-+-+-+-+-

Type

3 (Registration Reply)

Code

Значение, показывающее результат обработки Registration Request. Значения кодов приведены ниже.

Lifetime

Если поле Code говорит, что регистрация была воспринята, в поле Lifetime указывается число секунд, оставшихся до завершения срока регистрации. Нулевое значение указывает отмену регистрации мобильного узла, значение 0xffff показывает неограниченный срок регистрации. Если значение Code говорит об отказе в регистрации, содержимое поля Lifetime не задается и должно игнорироваться при получении.

Home Address

IP-адрес мобильного узла.

Home Agent

IP-адрес домашнего агента мобильного узла.

Identification

64-битовое число, создаваемое мобильным узлом и служащее для сопоставления запросов и откликов на них, а также защиту от атак с повторным использованием регистрационных сообщений. Значение определяется значением поля Identification из сообщения Registration Requests от мобильного узла и стилем защиты от повторного использования пакетов в контексте защиты между мобильным узлом и домашним агентом (определяется MSA и значением SPI в разрешающем проверку полномочий расширении). См. параграфы 5.4 и 5.7.

Extensions

За фиксированной частью запроса Registration Request может следовать одно или несколько расширений, описанных в параграфе 3.5. Разрешающее проверку полномочий расширение должно включаться во все регистрационные отклики, возвращаемые домашним агентом. Правила размещения расширений в откликах приведены в параграфах 3.7.2.2 и 3.8.3.3.

Ниже приведены значения, определенные для поля Code.

Успешная регистрация

0 регистрация принята;

1 регистрация принята, но одновременные привязки мобильности не поддерживаются.

Регистрация отвергнута внешним агентом

64 причина отказа не указана;

65 административный запрет;

66 недостаточно ресурсов;

67 отказ при аутентификации мобильного узла;

68 отказ при аутентификации домашнего агента;

69 запрошенное значение Lifetime слишком велико;

70 некорректный формат сообщения Request;

71 некорректный формат сообщения Reply;

72 запрошенная инкапсуляция не поддерживается;

73 резерв (не используется);

77 недопустимый адрес обслуживания;

78 тайм-аут при регистрации;

80 домашняя сеть недоступна (получена ошибка ICMP);

81 хост домашнего агента недоступен (получена ошибка ICMP);

82 порт домашнего агента недоступен (получена ошибка ICMP);

88 домашний агент недоступен (получена другая ошибка ICMP);

194 недопустимый адрес домашнего агента.

Регистрация отвергнута домашним агентом

128 причина не указана;

129 административный запрет;

130 недостаточно ресурсов;

131 отказ при аутентификации мобильного узла;

132 отказ при аутентификации внешнего агента;

133 несоответствие Identification;

134 некорректный формат сообщения Request;

135 слишком много одновременных привязок мобильности;

136 не известен адрес домашнего агента.

Актуальные значения кодов указываются в базе данных IANA [48].

3.5. Регистрационные расширения

3.5.1. Расчет значений аутентификационного расширения

Значение Authenticator, рассчитываемое для каждого аутентификационного расширения, должно защищать следующие поля регистрационного сообщения:

  • данные UDP (т. е., данные Registration Request или Registration Reply);

  • все предшествующие расширения целиком;

  • поля Type, Length и SPI данного расширения.

По умолчанию используется алгоритм HMAC-MD5 [10] для расчета 128-битовой цифровой подписи регистрационного сообщения. При расчете HMAC учитываются следующие данные:

  • данные UDP (т. е., данные Registration Request или Registration Reply);

  • все предшествующие расширения целиком;

  • поля Type, Length и SPI данного расширения.

Отметим, что само поле Authenticator и заголовок UDP не включаются по умолчанию в расчет значения Authenticator. В параграфе 5.1 приведена информация о требованиях к поддержке для кодов аутентификации, которые применяются в различных аутентификационных расширениях.

Индекс параметров защиты (SPI5) в любом аутентификационном расширении определяет контекст защиты, который применяется для расчета значения Authenticator и должен использоваться получателем для проверки принятого значения. В частности, SPI выбирает алгоритм и режим аутентификации (параграф 5.1), а также секрет (разделяемый ключ или подходящую пару из открытого и закрытого ключей), применяемый при расчете значения Authenticator. Для обеспечения взаимодействия реализаций Mobile IP каждая реализация должна быть способна связать любое значение SPI с любым поддерживаемым алгоритмом и режимом аутентификации. Кроме того, все реализации Mobile IP должны поддерживать используемый по умолчанию алгоритм аутентификации HMAC-MD5, указанный выше.

3.5.2. Расширение Mobile-Home Authentication

Во всех сообщениях Registration Request, а также генерируемых домашним агентом сообщениях Registration Reply должно присутствовать хотя бы одно разрешающее аутентификацию расширение. Mobile-Home Authentication Extension всегда является разрешающим аутентификацию расширением для описанных в этом документе регистрационных сообщений. Это требование обусловлено необходимостью предотвращения проблем [30], возникающих в результате неконтролируемого распространения удаленных перенаправлений в Internet. Местоположение разрешающего аутентификацию расширения указывает окончание данных, которые будут аутентифицироваться агентом проверки полномочий, интерпретирующим данное расширение.


 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Length    |         SPI  ....
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       ... SPI (cont.)          |       Authenticator ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type

32

Length

4 + число байтов в поле Authenticator.

SPI

Индекс параметров защиты (4 байта). Неразбираемый идентификатор (см. параграф 1.6).

Authenticator

(переменный размер) (см. параграф 3.5.1.)

3.5.3. Расширение Mobile-Foreign Authentication

Это расширение может включаться в регистрационные запросы и отклики при существовании между мобильным узлом и внешним агентом защищенной связи MSA. Требования поддержки для кодов аутентификации сообщений описаны в параграфе 5.1.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Length    |         SPI  ....
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       ... SPI (продолж.)       |       Authenticator ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type

33

Length

4 + число байтов в поле Authenticator.

SPI

Индекс параметров защиты (4 байта). Неразбираемый идентификатор (см. параграф 1.6).

Authenticator

(переменный размер) (см. параграф 3.5.1.)

3.5.4. Расширение Foreign-Home Authentication

Это расширение может включаться в регистрационные запросы и отклики при существовании между мобильным узлом и внешним агентом защищенной связи MSA. Требования поддержки для кодов аутентификации сообщений описаны в параграфе 5.1.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Length    |         SPI  ....
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       ... SPI (продолж.)       |       Authenticator ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type

34

Length

4 + число байтов в поле Authenticator.

SPI

Индекс параметров защиты (4 байта). Неразбираемый идентификатор (см. параграф 1.6).

Authenticator

(переменный размер) (см. параграф 3.5.1.)

Для выполнения аутентификации домашний агент и внешний агент используют организуют защищенную связь MSA, указываемую SPI (в расширении Foreign-Home Authentication) и полем IP Source Address в Registration Request. Если расширение используется в сообщении Registration Reply, в качестве адреса получателя в заголовке IP должен использоваться адрес внешнего агента.

При использовании данного расширения в сообщениях Registration Request защищенная связь MSA для проверки корректности аутентификационных данных выбирается домашним агентом на основе значения поля Source IP Address в сообщении Registration Request и SPI в аутентификационном расширении. Значение Source IP Address будет совпадать с Care-of Address в сообщении Registration Request (см. параграф 3.7.2.2).

При использовании этого расширения в сообщениях Registration Reply защищенная связь MSA для проверки корректности аутентификационных данных выбирается внешним агентом по адресу домашнего агента в сообщении Registration Reply.

Если адреса Care-of Address из сообщения Registration Request не было в сообщении Agent Advertisement, внешнему агенту недопустимо добавлять расширение Foreign-Home Authentication при трансляции сообщения домашнему агенту. Более того, для сообщение об отмене регистрации (Lifetime = 0) внешнему агенту недопустимо добавлять расширение Foreign-Home Authentication при трансляции сообщения этому домашнему агенту. Следовательно, при получении домашним агентом (HA) запроса на отмену регистрации без расширения Foreign-Home Authentication недопустимо отбрасывать запрос на основании лишь отсутствия такого расширения.

3.6. Мобильные узлы

На мобильном узле должна быть (статически или динамически) задана маска сети и MSA для каждого из его домашних агентов. В дополнение к этому на мобильном узле может быть установлен домашний адрес и IP-адреса одного или нескольких домашних агентов. Если этого не сделано, мобильный узел может определить адрес домашнего агента, используя процедуры, описанные в параграфе 3.6.1.2.

Если на мобильном узле не настроен домашний адрес, он может использовать расширение Mobile Node Network Access (NAI) [2] для самоидентификации и установить в поле Home Address сообщения Registration Request значение 0.0.0.0. В таких случаях мобильный узел должен быть способен присвоить себе домашний адрес после извлечения нужной информации из сообщения Registration Reply от домашнего агента.

Для каждой ожидающей регистрации мобильный узел поддерживает следующую информацию:

  • адрес канального уровня внешнего агента, которому было отправлено сообщение Registration Request (если такой адрес имеется),

  • IP Destination Address из сообщения Registration Request,

  • адрес обслуживания, используемый при регистрации,

  • значение Identification, переданное при регистрации,

  • запрошенное изначально значение Lifetime,

  • оставшееся время Lifetime для ожидающей регистрации.

Мобильному узлу следует инициировать регистрацию при обнаружении смены своего подключения к сети. Методы, с помощью которых мобильный узел может это обнаружить, описаны в параграфе 2.4.2. При выходе мобильного узла из домашней сети сообщение Registration Request от такого узла позволяет домашнему агенту создать или изменить для этого узла привязку мобильности. Для находящегося в домашней сети мобильного узла такое сообщение позволяет домашнему агенту удалить существующие мобильные привязки для этого узла. В домашней сети мобильный узел работает без использования функций мобильности.

Есть еще два случая, когда мобильному узлу следует (де)регистрироваться на домашнем агенте, — обнаружение мобильным узлом перезагрузки внешнего агента (как описано в параграфе 2.4.4) и истекающее время Lifetime для текущей регистрации.

При отсутствии на канальном уровне индикации смены точки подключения анонсам Agent Advertisement от новых агентов не следует инициировать на мобильном узле попытки новой регистрации, если срок действия текущей еще не истек и от внешнего агента текущей регистрации продолжают приходить анонсы Agent Advertisement. При отсутствии индикации канального уровня мобильному узлу недопустимо пытаться зарегистрироваться более 1 раза в секунду.

Мобильный узел может зарегистрироваться у другого агента, если протоколы транспортного уровня показывают слишком много повторов передачи. Мобильному узлу недопустимо трактовать получение ICMP Redirect от обеспечивающего текущее обслуживание внешнего агента, как основание для регистрации у другого агента. При выполнении указанных ограничений мобильный узел может снова зарегистрироваться в любой момент.

В Приложении C даны примеры заполнения полей регистрационных сообщений и типовые варианты регистрации.

3.6.1. Отправка регистрационных запросов

В последующих параграфах приведено подробное описание значений, которые мобильный узел должен представлять в полях сообщений Registration Request.

3.6.1.1. Поля IP

В этом параграфе описаны правила, в соответствии с которыми мобильные узлы заполняют поля заголовков IP для сообщений Registration Request.

IP Source

  • При регистрации в чужой сети с совмещенным адресом обслуживания в поле IP source должен указываться этот адрес.

  • В остальных случаях, если у мобильного узла нет домашнего адреса, поле IP source должно быть 0.0.0.0.

  • При прочих обстоятельствах в поле IP source должен указываться домашний адрес мобильного узла.

IP Destination

  • Когда мобильный узел нашел агента, на котором зарегистрирован тем или иным способом, не сообщающим IP-адрес агента (например, на канальном уровне), должен указываться адрес получателя All Mobility Agents (224.0.0.11). В этом случае мобильный узел должен использовать индивидуальный адрес канального уровня для доставки дейтаграммы нужному агенту.

  • Когда при регистрации у внешнего агента, должен указываться его адрес, взятый из поля IP source соответствующего анонса Agent Advertisement. Это может оказаться адресом, который не анонсируется в качестве адреса обслуживания в Agent Advertisement. Кроме того, при передаче этого сообщения Registration Request мобильный узел должен использовать адрес получателя на канальном уровне, взятый из соответствующего поля анонса Agent Advertisement, где был найден IP-адрес внешнего агента.

  • Когда мобильный узел регистрируется напрямую у своего домашнего агента и знает его (индивидуальный) адрес IP, это адрес должен указываться в поле IP Destination.

  • Если мобильный узел напрямую регистрируется у домашнего агента, но не знает его адреса IP, он может использовать динамическое преобразование для автоматического определения нужного адреса IP (параграф 3.6.1.2). В этом случае в поле IP Destination помещается широковещательный адрес (subnet-directed) домашней сети мобильного узла. Такой адрес недопустимо использовать в качестве адреса получателя, если мобильный узел регистрируется через внешний агент, хотя этот адрес можно указывать в теле сообщения Registration Request при такое регистрации.

IP TTL

  • В поле IP TTL должно указываться значение 1, если в качестве адреса получателя используется All Mobility Agents, как указано выше. В остальных случаях задается подходящее значение в соответствии с обычной практикой IP [18].

3.6.1.2. Поля регистрационного запроса

В этом параграфе представлены специфические правила, в соответствии с которыми мобильные узлы устанавливают значения полей в фиксированной части сообщений Registration Request.

Мобильный узел может установить бит S для того, чтобы запросить у домашнего агента поддержку предыдущих привязок мобильности. Без этого домашний агент будет удалять все прежние привязки, заменяя их новой привязкой, которая задана в Registration Request. Множество одновременных привязок полезно в тех случаях, когда мобильный узел, использующий хотя бы одну беспроводную сеть, перемещается в области покрытия обслуживаемой несколькими внешними агентами. IP явно разрешает дублирование дейтаграмм. Если домашний агент разрешает множественные привязки, он будет туннелировать копии каждой прибывающей дейтаграммы на все адреса обслуживания и мобильный узел будет получать множество таких копий.

Мобильному узлу следует устанавливать бит D при регистрации с совмещенным адресом обслуживания. В остальных случаях установка этого флага недопустима.

Мобильный узел может устанавливать бит B для запроса у своего домашнего агента пересылки копий всех широковещательных дейтаграмм, получаемых агентом из домашней сети. Метод, используемый домашним агентом для пересылки широковещательных дейтаграмм, зависит от типа адреса обслуживания, зарегистрированного мобильным узлом (как указано битом D в регистрационном запросе мобильного узла).

  • Установленный бит D показывает, что мобильный узел будет самостоятельно декапсулировать все дейтаграммы, туннелированные на этот адрес обслуживания (совмещенный). В этом случае для пересылки мобильному узлу полученных широковещательных дейтаграмм домашний агент должен туннелировать их на адрес обслуживания. Мобильный узел детуннелирует такие дейтаграммы так же, как он делает это с дейтаграммами, адресованными непосредственно ему.

  • Сброшенный бит D показывает, что мобильный узел использует для обслуживания адрес внешнего агента, который будет декапсулировать дейтаграммы до их пересылки мобильному узлу. В этом случае для пересылки полученных широковещательных дейтаграмм мобильному узлу домашний агент должен инкапсулировать их в unicast-дейтаграммы, направленные по домашнему адресу мобильного узла, а потом должен туннелировать их на адрес обслуживания мобильного узла.

    После декапсуляции внешним агентом внутренняя дейтаграмма будет обычной (unicast) дейтаграммой IP, адресованной мобильному узлу, что показывает внешнему агенту направление ее пересылки. Доставка ее мобильному узлу осуществляется так же, как доставляются тому обычные дейтаграммы. Мобильному узлу недопустимо декапсулировать вложенные широковещательные дейтаграммы и недопустимо для их пересылки мобильному узлу использовать локальное широковещание. Мобильный узел должен декапсулировать широковещательную дейтаграмму самостоятельно. Следовательно, для мобильного узла в таких случаях недопустима установка бита B в Registration Request, если он не способен декапсулировать дейтаграммы.

Мобильный узел может запрашивать дополнительные формы инкапсуляции, устанавливая бит M и/или G, но только в тех случаях, когда он самостоятельно декапсулирует дейтаграммы (использует совмещенный адрес обслуживания) или внешний агент указал поддержку этих форм инкапсуляции, установив соответствующие биты в расширении Mobility Agent Advertisement анонса Agent Advertisement, полученного мобильным узлом. В остальных случаях для мобильного узла установка этих битов недопустима.

Выбор значения поля Lifetime рассмотрен ниже.

  • Если мобильный узел регистрируется на внешнем агенте, значение поля Lifetime не следует устанавливать больше значения Registration Lifetime в полученном от данного агента сообщении Agent Advertisement. Когда метод определения адреса обслуживания не включает Lifetime, может использоваться принятое по умолчанию значение ICMP Router Advertisement Lifetime (1800 сек.).

  • Мобильный узел может запросить у домашнего агента удаление конкретной мобильной привязки, передав сообщение Registration Request с адресом обслуживания этой привязки и Lifetime = 0 (параграф 3.8.2).

  • Отмена регистрации всех адресов обслуживания с Lifetime = 0 указывает на возврат мобильного узла домой.

В поле Home Address должен быть указан домашний адрес мобильного узла, если он известен. В противном случае должен указываться адрес 0.0.0.0.

В поле Home Agent должен указываться адрес домашнего агента мобильного узла, если он известен мобильному узлу. В противном случае мобильный узел может использовать динамическое преобразование адресов для определения адреса своего домашнего агента. Для этого мобильный узел должен указать в поле Home Agent широковещательный адрес своей домашней подсети. Каждый домашний агент, получивший сообщение Registration Request с таким широковещательным адресом в поле Destination Address должен отвергнуть регистрацию мобильного узла и ему следует также передать сообщение Registration Reply, указывающее его индивидуальный адрес IP для использования мобильным узлом при следующей попытке регистрации.

Поле Care-of Address должно содержать конкретный адрес обслуживания, который мобильный узел хочет зарегистрировать (или отменить его регистрацию). Если мобильный узел хочет отменить регистрацию всех своих адресов обслуживания, он должен указать в этом поле свой домашний адрес.

Мобильный узел выбирает значение поля Identification в соответствии с используемой защитой от повторов. Это является частью защищенной связи MSA между мобильным узлом и домашним агентом. Описание методов расчета значений поля Identification приведено в параграфе 5.7.

3.6.1.3. Расширения

В этом параграфе описан порядок следования обязательных и необязательных расширений, которые мобильный узел добавляет в конце сообщений Registration Request. Требуется соблюдать указанный здесь порядок.

  1. После заголовка IP следует заголовок UDP, а за ним фиксированная часть Registration Request, после которой

  2. могут присутствовать какие-либо, не связанные с аутентификацией расширения, которые могут использоваться домашним агентом (и могут оказаться полезны внешнему агенту), а за ними

  3. все разрешающие аутентификацию расширения (см. параграф 1.6), после которых

  4. могут присутствовать любые, не относящиеся к аутентификации расширения, используемые только внешним агентом, а затем

  5. может следовать расширение Mobile-Foreign Authentication.

Отметим, что элементы a) и c) должны присутствовать в каждом сообщении Registration Request от мобильного узла. Элементы b), d) и e) не обязательны. Однако элемент e) должен включаться в сообщения при использовании мобильным узлом и внешним агентом общей защищенной связи MSA.

3.6.2. Получение регистрационных откликов

Сообщения Registration Reply мобильный узел получает в ответ на свои сообщения Registration Request. Отклики при регистрации обычно делятся на три категории:

  • запрос был принят;

  • запрос был отклонен внешним агентом;

  • регистрация была отвергнута домашним агентом.

В оставшейся части этого раздела рассматривается обработка мобильным узлом сообщений Registration Reply каждой из трех категорий.

3.6.2.1. Проверка применимости

Отклики Registration Reply с ненулевой некорректной контрольной суммой UDP должны отбрасываться без уведомления.

Кроме того, 32 младших бита поля Identification в Registration Reply должны сравниваться с 32 младшими битами поля Identification в последнем сообщении Registration Request, отправленном отвечающему агенту. При несоответствии отклик должен отбрасываться без уведомления.

В дополнение к этому сообщения Registration Reply должны проверяться на предмет наличия разрешающего аутентификацию расширения. Для всех сообщений Registration Reply, содержащих Status Code с кодом статуса от домашнего агента, мобильный узел должен проверять наличие разрешающего аутентификацию расширения и действовать с соответствии со значением поля Code в отклике. Правила приведены ниже.

  1. Если мобильный узел и внешний агент используют защищенную связь MSA, в отклике Registration Reply должно присутствовать в точности одно расширение Mobile-Foreign Authentication и мобильный узел должен проверить значение Authenticator в этом расширении. Если расширения Mobile-Foreign Authentication не найдено, присутствует несколько таких расширений или значение Authenticator неприемлемо, мобильный узел должен отбросить отклик без уведомления (следует также сделать запись в системном журнале о нарушении безопасности).

  2. Если поле Code указывает, что обслуживание было отвергнуто домашним агентом или регистрация была воспринята им, в сообщении Registration Reply должно присутствовать в точности одно расширение Mobile-Home Authentication и мобильный узел должен проверить значение Authenticator в этом расширении. Если отклик был создан домашним агентом, но расширения Mobile-Home Authentication в нем не найдено, присутствует несколько таких расширений или значение Authenticator неприемлемо, мобильный узел должен отбросить отклик без уведомления (следует также сделать запись в системном журнале о нарушении безопасности).

Если значение Code говорит об отказе при аутентификации со стороны домашнего или внешнего агента, вполне возможно наличие ошибок в полях Authenticator сообщения Registration Reply. Это может произойти, например, при некорректной настройке совместно используемого мобильным узлом и домашним агентом секрета. Мобильному узлу следует занести в системный журнал запись о нарушении безопасности.

3.6.2.2. Регистрационный запрос принят

Если поле Code указывает, что запрос был воспринят, мобильному узлу следует настроить свою таблицу маршрутизации в соответствии с текущей точкой подключения (параграф 4.2.1).

Если мобильный узел возвращается в домашнюю сеть и в этой сети поддерживается ARP, мобильный узел должен следовать описанным в параграфе 4.6 процедурам в части ARP, proxy ARP, gratuitous ARP.

Если мобильный узел зарегистрирован в чужой сети, ему следует возобновлять регистрацию до того, как завершится срок действия (Lifetime) текущей регистрации. Как указано в параграфе 3.6, для каждого ожидающего сообщения Registration Request, мобильный узел должен поддерживать информацию об оставшемся сроке регистрации, а также исходное значение Lifetime из сообщения Registration Request. При получении мобильным узлом приемлемого сообщения Registration Reply, он должен уменьшить значение оставшегося срока регистрации в соответствии с указанным домашним агентом в отклике значением Lifetime. Это равносильно началу отсчета таймера в момент отправки регистрационного запроса со значения Lifetime в отклике, хотя значение Lifetime из отклика домашнего агента заранее не известно. Поскольку регистрационный запрос передается несколько раньше того, как домашний агент начнет отсчет срока регистрации (указываемое в отклике значение Lifetime), эта процедура обеспечивает мобильному узлу возможность своевременно возобновить регистрацию с учетом возможных задержек при передаче регистрационного запроса и отклика на него.

3.6.2.3. Регистрационный запрос отвергнут

Если поле Code показывает, что запрос на обслуживание был отвергнут, мобильному узлу следует занести в системный журнал запись об ошибке. В некоторых случаях мобильный узел может решить проблему сам. К таким случаям относятся:

Code 69: (отвергнуто внешним агентом, запрошенное значение Lifetime слишком велико)

В этом случае поле Lifetime в сообщении Registration Reply будет показывать максимальное значение Lifetime, которое внешний агент согласен принимать в сообщениях Registration Request. Мобильный узел может повторить попытку регистрации у того же внешнего агента, установив для поля Lifetime в сообщении Registration Request значение, которое должно быть не больше указанного в отклике времени.

Code 133: (отвергнуто домашним агентом, несоответствие Identification)

В этом случае поле Identification в сообщении Registration Reply будет содержать значение, которое позволит мобильному узлу синхронизироваться с домашним агентом с учетом используемой модели защиты от повторного использования пакетов (параграф 5.7). Мобильный узел должен скорректировать параметры, используемые при расчете поля Identification в соответствии с информацией из сообщения Registration Reply, прежде, чем вводить новые запросы на регистрацию.

Code 136: (отвергнуто домашним агентом, неизвестный адрес домашнего агента)

Этот код может возвращаться домашним агентом в тех случаях, когда мобильный узел определяет адрес домашнего агента динамически, как описано в параграфах 3.6.1.1 и 3.6.1.2. В таких случаях поле Home Agent в отклике будет содержать индивидуальный IP-адрес передающего отклик домашнего агента. Мобильный узел может повторить попытку регистрации, указав полученный адрес в последующем сообщении Registration Request. Кроме того, мобильному узлу следует до новой попытки регистрации настроить параметры, используемые для расчета поля Identification с учетом значений соответствующих полей из полученного сообщения Registration Reply.

3.6.3. Повтор передачи при регистрации

При отсутствии отклика Registration Reply в течение достаточно продолжительного времени, возможна повторная передача сообщения Registration Request. При использовании временных меток для каждого повтора используется новое значение Identification и каждое сообщение, по сути, является новой регистрацией. При использовании маркеров nonce запросы передаются повторно без изменений и повтор не учитывается, как новая регистрация (параграф 5.7). За счет этого повторная передача не будет требовать от домашнего агента повторной синхронизации с мобильным узлом за счет использования другого маркера nonce, как происходит в случае потери исходного сообщения Registration Request (с меньшей вероятностью, Registration Reply) в сети.

Максимальное время до повтора передачи Registration Request следует делать не больше значения Lifetime, указанного в Registration Request. Минимальный интервал до повтора следует делать достаточно большим, принимая во внимание размер сообщений — подойдет двойное время кругового обхода между мобильным узлом и домашним агентом, к которому добавлено по крайней мере 100 мсек на обработку сообщения перед откликом. Время кругового обхода для передачи домашнему агенту будет не меньше времени, требуемого для передачи сообщения через канал в текущей точке подключения мобильного узла. Некоторые устройства добавляют еще 200 мсек задержки при передаче домашнему агенту с учетом возможности наличия на пути спутникового канала. Минимальное время между повторами сообщений Registration Request недопустимо делать меньше 1 секунды. Каждый последующий интервал до повтора следует увеличивать по крайней мере вдвое по сравнению с предыдущим, пока не будет достигнуто максимальное значение, рассмотренное выше.

3.7. Внешний агент

Роль внешнего агента в процессе регистрации Mobile IP в основном пассивна. Он транслирует регистрационные запросы между мобильными узлами и их домашними агентами и, в случае предоставления своего адреса для обслуживания мобильных клиентов, декапсулирует дейтаграммы для доставки мобильному узлу. Внешним агентам следует периодически отправлять сообщения Agent Advertisement для анонсирования своего присутствия, как описано в параграфе 2.3, если агент не может быть обнаружен средствами канального уровня.

Внешним агентам недопустимо передавать сообщения Registration Request, за исключением пересылки регистрационных запросов мобильных узлов к своим домашним агентам. Внешним агентам недопустимо передавать сообщения Registration Reply, за исключением пересылки регистрационных откликов домашних агентов или ответов на регистрационные запросы в случае отказа от обслуживания мобильного узла. В частности, внешним агентам недопустимо генерировать регистрационные запросы и/или отклик по истечении срока регистрации (Lifetime) мобильного узла. Внешним агентам недопустимо генерировать сообщения Registration Request для запроса отмены регистрации мобильных узлов, однако они должны транслировать корректные запросы мобильных узлов на регистрацию или ее отмену.

3.7.1. Таблицы конфигурации и регистрации

В конфигурации каждого внешнего агента должен быть задан адрес обслуживания. Кроме того, для каждой ожидающей и действующей регистрации внешний агент должен поддерживать запись в списке посетителей, включающую сведения из сообщений Registration Request от мобильных узлов:

  • адрес мобильного узла на канальном уровне;

  • домашний IP-адрес мобильного узла или его совмещенный адрес обслуживания (см. описание бита R в параграфе 2.1.1);

  • IP-адрес получателя (см. параграф 3.6.1.1);

  • UDP-порт источника;

  • адрес домашнего агента;

  • значение поля Identification;

  • запрошенное значение Lifetime;

  • остающееся время ожидающей или действующей регистрации.

Если в регистрационном запросе используется расширение NAI (например, при нулевом значении Home Address), внешний агент должен следовать процедурам, описанным в RFC 2794 [2]. В частности, если внешний агент не может управлять записями для ожидающих сообщений Registration Request с нулевым значением Home Address, этот агент должен возвращать мобильному узлу сообщение Registration Reply с кодом NONZERO_HOMEADDR_REQD (см. [2]).

Конфигурация внешнего агента может ограничивать число ожидающих регистраций, которые она готова поддерживать (обычно 5). В этом случае внешнему агенту следует отвергать дополнительные попытки регистрации с кодом 66. Внешний агент может удалить любой регистрационный запрос, ожидающий более 7 секунд; в этом случае внешнему агенту следует отвергнуть запрос с кодом 78 (тайм-аут при регистрации).

Как любой узел в сети Internet, внешний агент может организовывать защищенные связи MSA с другими узлами. При трансляции сообщений Registration Request от мобильного узла его домашнему агенту, если у внешнего агента имеется MSA с этим домашним агентом, он должен добавлять в запрос расширение Foreign-Home Authentication. В таких случаях, когда сообщение Registration Reply включает отличное от 0 значение Lifetime, внешний агент должен проверить наличие требуемого расширения Foreign-Home Authentication в сообщении Registration Reply от домашнего агента (параграфы 3.3 и 3.4). Аналогично, при получении Registration Request от мобильного узла и наличии MSA с этим узлом внешний агент должен проверить наличие требуемого расширения Mobile-Foreign Authentication в запросе и должен добавлять в отклики для этого узла расширение Mobile-Foreign Authentication.

3.7.2. Получение регистрационных запросов

Если внешний агент воспринимает сообщение Registration Request от мобильного узла, он убеждается в том, что указанный там домашний агент не подключен к какому-либо из сетевых интерфейсов внешнего агента. Если такого подключения не обнаружено, внешний агент должен транслировать запрос указанному домашнему агенту. В противном случае, если внешний агент отвергает запрос, он должен передать мобильному узлу сообщение Registration Reply с подходящим кодом отказа, но частота передачи таких сообщений не должна превышать 1 сообщения в секунду для данного мобильного узла. Этот вопрос более подробно рассматривается в последующих параграфах.

Если на одном из интерфейсов внешнего агента установлен адрес IP, который указан мобильным узлом в качестве адреса домашнего агента, внешнему агенту недопустимо пересылать такой запрос. Если внешний агент обслуживает мобильный узел в качестве домашнего агента, он должен следовать процедурам, описанным в параграфе 3.8.2. В противном случае (если внешний агент не обслуживает мобильный узел в качестве домашнего агента) внешний агент отвергает запрос с возвратом кода ошибки 194 (недопустимый адрес домашнего агента).

Если внешний агент получает сообщение Registration Request от мобильного узла из своего списка посетителей, существующую в этом списке запись не следует удалять или изменять, пока внешний агент не получит от домашнего агента сообщение Registration Reply с кодом успешной регистрации. Внешний агент должен записать новый ожидающий запрос в отдельную запись списка посетителей. Если сообщение запрашивает отмену регистрации, имеющуюся в списке посетителей запись для мобильного узла не следует удалять до получения Registration Reply с кодом успешного выполнения. Если сообщение Registration Reply говорит об отвергнутом запросе (регистрации или дерегистрации), имеющуюся в списке запись недопустимо изменять в результате получения такого Registration Reply.

3.7.2.1. Проверка применимости

Сообщения Registration Request с некорректной, отличной от нуля контрольной суммой UDP должны отбрасываться без уведомления. Запросы с отличными от 0 резервными полями должны отвергаться с кодом 70 (некорректный формат запроса). Запросы со сброшенным флагом D и отличным от нуля полем Lifetime, указывающие адрес обслуживания, не являющийся адресом внешнего агента, должны отвергаться с кодом 77 (недопустимый адрес обслуживания).

В сообщениях Registration Request должна проверяться аутентификация. Если между мобильным узлом и внешним агентом имеется защищенная связь MSA, в запросе должно присутствовать в точности одно расширение Mobile-Foreign Authentication и внешний агент должен проверять значение Authenticator в таком расширении. Если расширение не найдено, обнаружено несколько расширений или значение Authenticator не приемлемо, внешний агент должен отбросить запрос без уведомления. Следует также записать информацию о таком запросе в системный журнал. Внешнему агенту следует также передать мобильному узлу сообщение Registration Reply с кодом 67.

3.7.2.2. Пересылка применимых запросов домашнему агенту

Если внешний агент принимает регистрационный запрос мобильного узла, он должен транслировать этот запрос домашнему агенту данного узла, указанному в поле Home Agent сообщения Registration Request. Внешнему агенту недопустимо менять какие-либо поля, начиная с фиксированной части сообщения Registration Request и заканчивая Mobile-Home Authentication Extension (включая его) или другим аутентификационным расширением, представленным мобильным узлом в качестве разрешающего аутентификацию расширения для домашнего агента. В противном случае с высокой вероятностью аутентификация на домашнем агенте завершится отказом. Кроме того, внешний агент:

  • должен обработать и удалить любые расширения, кроме предшествующих расширению, разрешающему проверку полномочий;

  • может добавить любое из своих не относящихся к аутентификации расширений для домашнего агента;

  • если внешний агент имеет защищенную связь MSA с домашним агентом и значение Lifetime в запросе отлично от 0, внешний агент должен добавить в конце расширение Foreign-Home Authentication.

Приведенные ниже поля заголовков IP и UDP транслируемого сообщения Registration Request должны быть изменены.

IP Source Address

Адрес обслуживания, предложенный внешним агентом для мобильного узла, передавшего Registration Request.

IP Destination Address

Копируется из поля Home Agent в сообщении Registration Request.

UDP Source Port

переменный

UDP Destination Port

434

После пересылки корректного сообщения Registration Request домашнему агенту внешний агент должен начать отсчет оставшегося времени для ожидающей регистрации со значения поля Lifetime в Registration Request. Если отсчет таймера завершится до получения приемлемого сообщения Registration Reply, внешний агент должен удалить запись для ожидающей регистрации из своего списка посетителей.

3.7.2.3. Отказы для недопустимых запросов

Если внешний агент по какой-либо причине отвергает регистрационный запрос мобильного узла, ему следует возвратить сообщение Registration Reply с подходящим кодом отказа. В таких случаях поля Home Address, Home Agent, и Identification копируются в сообщение Registration Reply из соответствующих полей Registration Request.

Если значение поля Reserved отлично от 0, внешний агент должен отвергнуть запрос и мобильному узлу следует отправить сообщение Registration Reply с кодом 70. Если запрос отвергается по причине слишком большого значения Lifetime в запросе, внешний агент устанавливает в поле Lifetime возвращаемого отклика максимальное значение срока регистрации, которое может быть принято для регистрационного запроса и помещает в поле Code значение 69. В остальных случаях значение Lifetime следует копировать из одноименного поля в запросе.

Ниже показаны значения, которые должны помещаться в поля заголовков IP и UDP для сообщений Registration Reply.

IP Source Address

Копируется из поля IP Destination Address сообщения Registration Request, если там не был указан адрес All Agents Multicast. В последнем случае должен использоваться адрес интерфейса внешнего агента, через который сообщение передается.

IP Destination Address

Если сообщение Registration Reply генерируется внешним агентом для отказа от регистрации мобильного узла и в поле Home Address регистрационного запроса указано значение, отличное от 0.0.0.0, значение поля IP Destination Address копируется из поля Home Address в сообщении Registration Request. В противном случае, если сообщение Registration Reply получено от домашнего агента и содержит отличное от 0.0.0.0 поле Home Address, значение IP Destination Address копируется из поля Home Address сообщения Registration Reply. В остальных случаях для поля IP Destination Address в Registration Reply устанавливается значение 255.255.255.255.

UDP Source Port

434

UDP Destination Port

Копируется из поля UDP Source Port регистрационного запроса.

3.7.3. Получение регистрационных откликов

Внешний агент обновляет свой список посетителей при получении приемлемого сообщения Registration Reply от домашнего агента. Полученное сообщение транслируется мобильному узлу. Более подробное описание этого приведено в последующих параграфах.

Если при трансляции сообщения Registration Request домашнему агенту внешний агент получает сообщение ICMP об ошибке вместо Registration Reply, тогда этому агенту следует отправить мобильному узлу сообщение Registration Reply с подходящим кодом отказа (домашний агент недоступен) из диапазона кодов 80-95. Создание сообщений Registration Reply описано в параграфе 3.7.2.3.

3.7.3.1. Проверка применимости

Сообщения Registration Reply с некорректно, отличной от 0 контрольной суммой UDP должны отбрасываться без уведомления.

При получении внешним агентом сообщения Registration Reply он должен просмотреть свой список посетителей на предмет ожидающих сообщений Registration Request с тем же домашним адресом мобильного узла, какой указан в полученном отклике. Если для этого адреса найдено множество записей и в сообщении Registration Reply имеется расширение Mobile Node NAI [2], внешний агент должен использовать NAI для устранения неоднозначности с ожидающими регистрационными запросами. Если соответствующего запроса в списке не найдено и сообщение Registration Reply не соответствует ни одному из ожидающих регистрационных запросов с нулевым домашним адресом мобильного узла (см. параграф 3.7.1), внешний агент должен отбросить отклик без уведомления. Отклики также должны отбрасываться без уведомления, если младшие 32 бита поля Identification не соответствуют таким же битам в запросе.

Должна также проверяться аутентификация в Registration Reply. Если между внешним и домашним агентом имеется защищенная связь MSA, в сообщении должно присутствовать в точности одно расширение Foreign-Home Authentication и внешний агент должен проверять значение Authenticator в нем. Если расширения Foreign-Home Authentication не найдено, обнаружено несколько таких расширений или значение Authenticator неприемлемо, внешний агент должен отбросить отклик без уведомления и ему также следует сделать запись о нарушении безопасности в системный журнал. Внешний агент в этом случае должен также отвергать регистрацию мобильного узла, которому следует отправить сообщение Registration Reply с кодом 68.

3.7.3.2. Пересылка откликов мобильному узлу

Сообщения Registration Reply, прошедшие проверки из параграфа 3.8.2.1, транслируются мобильному узлу. Внешний агент в этом случае должен обновить свой список посетителей с учетом результата регистрационного запроса, указанного полем Code в отклике. Если код показывает восприятие запроса домашним агентом и значение поля Lifetime отлично от 0, внешнему агенту следует установить в поле Lifetime своего списка посетителей меньшее из:

  • значение поля Lifetime в сообщении Registration Reply;

  • максимально допускаемое внешним агентом значение Lifetime.

Если отклик содержит Lifetime = 0, внешний агент должен удалить запись для мобильного узла из своего списка посетителей. Если же код в отклике указывает на отказ домашнего агента от регистрации мобильного узла, внешний агент должен удалить из своего списка ожидающую регистрацию, сохранив запись для мобильного узла в списке посетителей.

Внешнему агенту недопустимо менять какие-либо поля, начиная с фиксированной части Registration Reply и заканчивая расширением Mobile-Home Authentication (включительно). В противном случае на стороне мобильного узла с высокой вероятностью возникнет отказ аутентификации. В дополнение к этому внешнему агенту следует выполнять перечисленные ниже процедуры:

  • он должен обработать и удалить все расширения, не относящиеся к аутентификационным;

  • он может добавить в конец свои, не относящиеся к аутентификации расширения, передающие информацию мобильному узлу;

  • он должен добавить в конец расширение Mobile-Foreign Authentication, если имеется защищенная связь MSA с мобильным узлом.

Поля заголовков IP и UDP в транслируемых сообщениях Registration Reply устанавливаются в соответствии с правилами, приведенными в параграфе 3.7.2.3.

После пересылки приемлемого сообщения Registration Reply мобильному узлу внешний агент должен обновить для этой регистрации запись в списке посетителей. Если сообщение Registration Reply указывает восприятие регистрации домашним агентом, внешний агент устанавливает для таймера срока регистрации значение поля Lifetime из сообщения Registration Reply. В отличии от мобильного узла, отсчитывающего срок регистрации в соответствии с параграфом 3.6.2.2, внешний агент начинает свой отсчет с момента пересылки сообщения Registration Reply — это гарантирует, что отсчет срока регистрации на внешнем агенте не завершится раньше, нежели на мобильном узле. Если же сообщение Registration Reply показывает, что регистрация была отвергнута домашним агентом, внешний агент удаляет из списка посетителей запись для этой попытки регистрации.

3.8. Домашний агент

Домашний агент в процессе регистрации играет реактивную роль. Он получает сообщения Registration Request от мобильного узла (возможно, транслируемые внешним агентом), обновляет свою запись привязки мобильности и возвращает подходящее сообщение Registration Reply в ответ на каждый запрос.

Домашнему агенту недопустимо передавать сообщения Registration Reply за исключением случаев ответа на сообщения Registration Request от мобильного узла. В частности, домашнему агенту недопустимо генерировать сообщения Registration Reply для индикации завершения срока регистрации (Lifetime).

3.8.1. Таблицы конфигурации и регистрации

На каждом домашнем агенте должен быть задан адрес IP и размер префикса для домашней сети. На домашнем агенте должна быть настроена защищенная связь MSA с каждым уполномоченным мобильным узлом, который он обслуживает.

Когда домашний агент воспринимает корректное сообщение Registration Request от мобильного узла, который он обслуживает, этот агент должен создать или изменить для этого узла привязку мобильности, содержащую:

  • домашний адрес мобильного узла;

  • адрес обслуживания мобильного узла;

  • поле Identification из сообщения Registration Reply;

  • остающийся срок регистрации (Lifetime).

Домашний агент может предлагать динамическое выделение домашнего адреса мобильному узлу при получении от того сообщения Registration Request. Методы выделения динамических адресов выходят за рамки данного документа и рассмотрены в работе [2]. После того, как домашний агент свяжет с мобильным узлом домашний адрес, агент должен поместить этот адрес в поле Home Address сообщения Registration Reply.

Домашний агент может также поддерживать защищенные связи MSA с разными внешними агентами. При получении сообщения Registration Request от внешнего агента, с которым имеется защищенная связь MSA, домашний агент должен проверить значение Authenticator в обязательном расширении Foreign-Home Authentication данного сообщения, основываясь на своей MSA, если значение поля Lifetime отлично от 0. При обработке регистрационного запроса с Lifetime = 0, домашний может пропустить проверку наличия и корректности расширения Foreign-Home Authentication. Аналогично, при передаче сообщения Registration Reply внешнему агенту, с которым домашний агент имеет защищенную связь MSA, домашний агент должен включить в сообщение расширение Foreign-Home Authentication на основе MSA.

3.8.2. Получение регистрационных запросов

Если домашний агент воспринимает входящее сообщение Registration Request, он должен обновить свою запись для привязки мобильности данного узла. В ответ следует отправить сообщение Registration Reply с подходящим кодом. В противном случае (домашний агент отвергает запрос) следует в большинстве случаев отправить сообщение Registration Reply с кодом, указывающим причину отказа в регистрации. Эта ситуация рассматривается более подробно в последующих параграфах. Если домашний агент не поддерживает широковещания (см. параграф 4.3), он должен игнорировать флаг B (не отвергая Registration Request).

3.8.2.1. Проверка применимости

Сообщения Registration Request с отличной от 0 и некорректной контрольной суммой UDP должны отбрасываться домашним агентом без уведомления отправителя.

Должна выполняться аутентификация сообщений Registration Request, включающая перечисленные ниже операции.

  1. Домашний агент должен проверить наличие хотя бы одного разрешающего аутентификацию расширения и убедиться, что все указанные аутентификационные действия выполнены. В сообщении Registration Request должно присутствовать по крайней мере одно разрешающее аутентификацию расширение и домашний агент должен проверить значение Authenticator в этом расширении или убедиться в том, что это значение проверено другим агентом, с которым имеется защищенная связь.

    Если домашний агент получает сообщение Registration Request от мобильного узла, с которым у него нет защищенной связи, домашний агент должен отбросить регистрационный запрос без уведомления.

    Если домашний агент получает сообщение Registration Request без разрешающего аутентификацию расширения, он должен отбросить такой запрос без уведомления.

    Если значение Authenticator не приемлемо, домашний агент должен отвергнуть регистрацию мобильного узла. Дальнейшие действия зависят от наличия в запросе приемлемого расширения Foreign-Home (см. ниже):

    • При наличии подходящего расширения Foreign-Home домашний агент должен отправить сообщение Registration Reply с кодом 131.

    • В остальных случаях, если нет защищенной связи между домашним и внешним агентом (Foreign-Home Security Association), домашний агент может передать сообщение Registration Reply с кодом 131. Если домашний агент передает Registration Reply, это сообщение должно включать расширение Mobile-Home Authentication. При создании отклика домашнему агенту следует выбрать защищенную связь, которая может быть организована с мобильным узлом. Например, это может быть старая защищенная связь или связь, время жизни которой превышает время жизни той связи, которой пытался воспользоваться при запросе мобильный узел. Следует соблюдать осторожность при обновлении защищенных связей, чтобы обеспечить постоянное наличие по крайней мере одной действующей связи между мобильным узлом и домашним агентом. В случае отказа при проверке значения Authenticator, домашний агент должен отбросить запрос без дополнительной обработки, следует также сделать в системном журнале запись о нарушении безопасности.

  2. Домашний агент должен проверять корректность поля Identification с использованием контекста, выбранного SPI в разрешающем аутентификацию расширении, которое домашний агент применяет для аутентификации сообщения Registration Request от мобильного узла. Описание такой проверки приведено в параграфе 5.7. При некорректном значении поля домашний агент должен отвергнуть регистрационный запрос, а мобильному узлу следует отправить сообщение Registration Reply с кодом 133, включающее поле Identification, рассчитанное в соответствии с правилами параграфа 5.7. Домашний агент должен прекратить обработку регистрационного запроса, хотя следует сделать запись об ошибке в системный журнал.

  3. Если у домашнего агента организована защищенная связь MSA с внешним агентом и в сообщении Registration Request поле Lifetime отлично от 0, домашний агент должен проверить наличие подходящего расширения Foreign-Home Authentication. В этом случае в сообщении Registration Request должно присутствовать в точности одно расширение Foreign-Home Authentication и домашний агент должен проверить значение Authenticator в этом расширении. Если расширение Foreign-Home Authentication не найдено, указано несколько таких расширений или значение Authenticator не приемлемо, домашний агент должен отвергнуть регистрацию мобильного узла, которому следует вернуть сообщение Registration Reply с кодом 132. Домашний агент должен отбросить запрос, а в системный журнал следует внести запись о нарушении безопасности.

  4. Если между домашним и внешним агентом нет защищенной связи MSA, а регистрационное сообщение включает расширение Foreign-Home Authentication, домашний агент должен отбросить запрет, а в системный журнал следует внести запись о нарушении безопасности.

В дополнение к выполнению аутентификации для сообщений Registration Request домашний агент должен отвергать регистрационные запросы, которые отправлены по широковещательному адресу subnet-directed домашней сети (вместо индивидуального адреса домашнего агента). Домашний агент должен отбросить запрос, а мобильному узлу следует отправить сообщение Registration Reply с кодом 136. В этом случае Registration Reply будет содержать индивидуальный адрес домашнего агента, по которому мобильный узел может передать новое сообщение Registration Request.

Отметим, что некоторые маршрутизаторы меняют поле IP Destination Address в дейтаграммах с широковещательным адресом subnet-directed на 255.255.255.255 до их передачи в сеть адресата. В таких случаях домашний агент, который пытается «подобрать» запросы динамического обнаружения домашнего агента путем явной привязки к широковещательному адресу subnet-directed, не увидит таких пакетов. Разработчикам домашних агентов следует быть готовыми к приему пакетов, направленных по широковещательным адресам subnet-directed и 255.255.255.255, если они хотят поддерживать динамическое обнаружение домашнего агента.

3.8.2.2. Восприятие применимого запроса

Если сообщение Registration Request успешно прошло проверки, описанные в параграфе 3.8.2.1, и домашний агент может воспринять запрос на регистрацию, этот агент должен обновить свой список мобильных привязок для данного мобильного узла и должен вернуть этому узлу сообщение Registration Reply. В этом случае сообщение Registration Reply будет включать код 0, если домашний агент поддерживает одновременные мобильные привязки, или 1, если такие привязки не поддерживаются. Описание построения регистрационных откликов дано в параграфе 3.8.3.

Домашний агент обновляет свою запись мобильной привязки для данного узла на основе полей сообщения Registration Request:

  • Если Lifetime = 0 и Care-of Address совпадает с домашним адресом мобильного узла, домашний агент удаляет для этого узла все записи из своего списка мобильных привязок, как будто мобильный узел попросил у домашнего агента прекратить обслуживание мобильности для него.

  • Если Lifetime = 0, а Care-of Address отличается от домашнего адреса мобильного узла, домашний агент удаляет из списка привязок мобильности только запись, содержащую указанный Care-of Address для данного мобильного узла. Все прочие записи с таким же адресом сохраняются неизменными.

  • Если значение Lifetime отлично от 0, домашний агент добавляет в свой список мобильных привязок для данного мобильного узла значение Care-of Address из запроса. Если установлен бит S и домашний агент поддерживает одновременные мобильные привязки, имеющиеся в списке записи для этого узла сохраняются. В остальных случаях домашний агент удаляет из списка все имеющиеся для данного мобильного узла записи.

Во всех случаях домашний агент должен отправить сообщение Registration Reply источнику сообщения Registration Request, который на деле может быть не тем внешним агентом для чьего адреса обслуживания запрошена (де)регистрация. Если у домашнего агента есть защищенная связь MSA с внешним агентом, для адреса которого запрошена отмена регистрации и этот агент отличается от того, который транслировал сообщение Registration Request, домашний агент может дополнительно передать сообщение Registration Reply внешнему агенту, чей адрес обслуживания дерегистрируется. Домашнему агенту недопустимо передавать такой отклик, если у него нет защищенной связи MSA с внешним агентом. Если отклик не передается, срок действия записи в списке посетителей внешнего агента завершается естественным путем по истечении времени Lifetime.

Когда внешний агент транслирует запрос дерегистрации, содержащий адрес обслуживания, не принадлежащий данному агенту, недопустимо добавлять расширение Foreign-Home Authentication в этот запрос (см. параграф 3.5.4).

Домашнему агенту недопустимо увеличивать значение Lifetime сверх указанного мобильным узлом в сообщении Registration Request. Однако запрос мобильным узлом значения Lifetime, превышающего то, которое позволяет домашний агент, не является ошибкой. В таком случае домашний агент просто уменьшает Lifetime до приемлемого значения и возвращает его в отклике Registration Reply. Значение Lifetime в сообщении Registration Reply информирует мобильный узел об установленном сроке регистрации, показывая тому, когда следует повторно зарегистрироваться для продолжения обслуживания. По истечении срока регистрации домашний агент должен удалить свою запись для данной регистрации из списка привязок мобильности.

Если сообщение Registration Request дублирует воспринятый текущий регистрационный запрос, недопустимо выделять срок регистрации, превышающий выданное ранее значение Lifetime. Сообщение Registration Request считается дубликатом при совпадении домашнего адреса, адреса обслуживания и поля Identification с такими же полями имеющейся регистрации.

Кроме того, если в домашней сети поддерживается ARP [16] и сообщение Registration Request просит у домашнего агента создать мобильную привязку для узла, который ранее такой привязки не имел (узел предполагался домашним), домашний агент должен следовать процедурам, описанным в параграфе 4.6, в части ARP, proxy ARP и gratuitous ARP. Если для мобильного узла есть предшествующая привязка, домашний агент должен по прежнему следовать правилам для proxy ARP из параграфа 4.6.

3.8.2.3. Отказ при недопустимом запросе

Если регистрационный запрос не проходит всех проверок, указанных в параграфе 3.8.2.1, или домашний агент не способен его воспринять, домашнему агенту следует направить мобильному узлу сообщение Registration Reply с кодом причины отказа. Если запрос транслировался внешним агентом, такое сообщение позволяет этому агенту удалить запись из списка ожидающих посетителей. Кроме того, информация о причине отказа может помочь мобильному узлу в его попытках исправить ошибку перед отправкой следующего запроса на регистрацию.

В этом разделе описано множество причин, по которым домашний агент может отвергнуть регистрационный запрос, и приведены коды, которые следует использовать в каждом случае. Построение откликов Registration Reply подробно описано в разделе 3.8.3.

Многие из причин отказа при регистрации являются по своей природе административными. Например, домашний агент может ограничивать для мобильного узла число одновременных регистраций, отвергая выходящие за этот предел попытки с возвратом кода 135. Домашний агент может также отвергать запросы на регистрацию для мобильных узлов, подключенным к недоверенным областям обслуживания (сетям), возвращая отклик с кодом 129.

Запросы с отличными от 0 битами резервных полей должны отвергаться с возвратом кода 134 (неверный формат).

3.8.3. Передача регистрационных откликов

Если домашний агент воспринимает сообщение Registration Request, он должен обновить свою запись привязок для мобильного узла и ему также следует отправить отклик Registration Reply с соответствующим значением Code. В противном случае (домашний агент отвергает запрос) следует отправить сообщение Registration Reply с полем Code, указывающим причину отказа. В последующих параграфах приведены описания значений, которые домашний агент должен устанавливать в полях сообщений Registration Reply.

3.8.3.1. Поля IP/UDP

В этом параграфе приведены специфические правила, по которым домашний агент устанавливает значения полей в заголовках IP и UDP сообщений Registration Reply.

IP Source Address

Копируется из поля IP Destination Address сообщения Registration Request, если там не указан групповой или широковещательный адрес. При групповом или широковещательном адресе в заголовке Registration Request в поле IP Source Address должен указываться (индивидуальный) IP-адрес домашнего агента.

IP Destination Address

Копируется из поля IP Source Address в сообщении Registration Request.

UDP Source Port

Копируется из поля UDP Destination Port в сообщении Registration Request.

UDP Destination Port

Копируется из поля UDP Source Port в сообщении Registration Request.

При передаче Registration Reply в ответ на Registration Request с запросом дерегистрации мобильного узла (Lifetime = 0 и Care-of Address совпадает с домашним адресом мобильного узла), в котором поле IP Source Address содержит домашний адрес мобильного узла (это обычный метод дерегистрации при возвращении в домашнюю сеть), в поле IP Destination Address передаваемого отклика указывается домашний адрес мобильного узла путем копирования поля IP Source Address из запроса.

В этом случае при передаче Registration Reply домашний агент должен передать отклик непосредственно в домашнюю сеть, обходя список мобильных привязок. В частности для возвращающегося в домашнюю сеть мобильного узла если его новое сообщение Registration Request не воспринято домашним агентом, имеющаяся в списке мобильных привязок запись для этого узла будет указывать на зарегистрированный ранее адрес обслуживания. При передаче сообщения Registration Reply, указывающего на отказ при обработке данного запроса, эта привязка должна игнорироваться и домашний агент должен передать этот отклик как для мобильного узла, находящегося в домашней сети.

3.8.3.2. Поля регистрационного отклика

В этом параграфе описаны конкретные правила, в соответствии с которыми домашний агент устанавливает значения полей в фиксированной части сообщений Registration Reply.

Значение поля Code в Registration Reply выбирается в соответствии с правилами предыдущих параграфов. При ответе на воспринятую регистрацию домашнему агенту следует отвечать с Code = 1, если он не поддерживает одновременных регистраций.

Поле Lifetime должно копироваться из соответствующего поля в Registration Request, если запрошенное значение не превышает максимальное время, в течение которого домашний агент согласен предоставлять обслуживание. В последнем случае для поля Lifetime должно устанавливаться значение времени, в течение которого домашний агент действительно будет осуществлять обслуживание. В качестве такого уменьшенного значения Lifetime следует использовать максимальное значение Lifetime, дозволенное домашним агентом (для данного мобильного узла и адреса обслуживания).

Если поле Home Address в регистрационном запросе (Registration Request) отлично от 0, это поле должно копироваться в поле Home Address сообщения Registration Reply. Если домашний агент не может поддерживать указанный ненулевой индивидуальный (unicast) адрес, указанный в поле Home Address сообщения Registration Request, он должен отвергнуть запрос регистрации с возвратом Code = 129.

Если же поле Home Address в сообщении Registration Request имеет значение 0, как указано в параграфе 3.6, домашнему агенту следует выбрать домашний адрес для мобильного узла и поместить этот адрес в поле Home Address сообщения Registration Reply. В документе [2] приведены дополнительные подробности для случая, когда мобильный узел представляет себя с помощью NAI вместо своего домашнего адреса IP.

Если поле Home Agent в сообщении Registration Request содержит индивидуальный адрес этого домашнего агента, значение поля должно копироваться в поле Home Agent сообщения Registration Reply. В остальных случаях домашний агент должен указать в поле Home Agent сообщения Registration Reply свой индивидуальный адрес. При этом домашний агент должен отвергнуть регистрацию с использованием подходящего кода (например, Code = 136) для предотвращения одновременной регистрации мобильного узла на нескольких домашних агентах.

3.8.3.3. Расширения

В этом параграфе описан порядок всех обязательных и опциональных расширений Mobile IP, которые домашний агент добавляет в конце сообщений Registration Reply. Должен соблюдаться приведенный далее порядок.

  1. Заголовок IP, за ним заголовок UDP, а затем фиксированная по размеру часть Registration Reply.

  2. Все имеющиеся (если они есть) расширения, не относящиеся к проверке подлинности, которые использует мобильный узел (они могут использоваться и внешним агентом).

  3. Расширение Mobile-Home Authentication.

  4. Все имеющиеся (если они есть) расширения, не относящиеся к проверке подлинности, которые использует только внешний агент.

  5. Расширение Foreign-Home Authentication при его наличии.

Отметим, что элементы (a) и (c) должны присутствовать в каждом сообщении Registration Reply, передаваемом домашним агентом. Элементы (b), (d) и (e) являются не обязательными. Однако элемент (e) должен включаться в тех случаях, когда внешний и домашний агенты связаны через общую MSA.

4. Вопросы маршрутизации

В этом разделе описано взаимодействие мобильных узлов, домашних агентов и (возможно) внешних агентов при маршрутизации дейтаграмм мобильного узла, подключенного к чужой сети. Мобильный узел информирует домашнего агента о своем текущем местоположении, используя процедуру регистрации, описанную в разделе 3. В обзоре протокола (параграф 1.7) описаны местоположения домашних адресов мобильных узлов относительно домашних агентов и самих мобильных узлов относительно внешних агентов, но которых мобильные узлы пытаются зарегистрироваться.

4.1. Типы инкапсуляции

Домашние и внешние агенты должны поддерживать туннелирование дейтаграмм с использованием инкапсуляции IP в IP [14]. Любой мобильный узел, использующий совмещенный адрес обслуживания (co-located care-of address), должен поддерживать прием дейтаграмм, туннелированных с использованием инкапсуляции IP в IP. Минимальная инкапсуляция [15] и инкапсуляция GRE [13] являются дополнительными методами и могут опционально поддерживаться мобильными узлами. Использование дополнительных форм инкапсуляции происходит по запросам мобильных узлов на усмотрение домашнего агента.

4.2. Маршрутизация индивидуальных дейтаграмм

4.2.1. Мобильный узел

При подключении к своей домашней сети мобильный узел работает без поддержки услуг мобильности. Т. е. он работает так же, как любой другой (стационарный) хост или маршрутизатор. Метод выбора мобильным узлом используемого по умолчанию маршрутизатора при подключении к своей домашней сети или выходе из нее с использованием совмещенного адреса обслуживания выходит за рамки данного документа. Одним из таких методов является ICMP Router Advertisement [5].

При регистрации в чужой сети мобильный узел выбирает используемый по умолчанию маршрутизатор в соответствии с приведенными ниже правилами.

  • Если мобильный узел зарегистрирован с использованием адреса внешнего агента (foreign agent care-of address), он может указать этот агент в качестве первого интервала маршрутизации (first-hop router). MAC-адрес внешнего агента может быть определен из сообщения Agent Advertisement от этого агента. В остальных случаях мобильный узел должен выбрать маршрут по умолчанию из числа адресов, анонсируемых в части ICMP Router Advertisement portion сообщения Agent Advertisement message.

  • Если мобильный узел регистрируется напрямую со своим домашним агентом, используя совмещенный адрес обслуживания (co-located care-of address), ему следует выбрать маршрут по умолчанию из числа анонсируемых в любых принятых сообщениях ICMP Router Advertisement, для которых полученный извне адрес обслуживания и адрес маршрутизатора совпадают по префиксу. Если полученный мобильным узлом извне адрес обслуживания соответствует по префиксу IP-адресу отправителя Agent Advertisement, мобильный узел может рассмотреть этот адрес в качестве возможного маршрута по умолчанию. Сетевой префикс может быть получен из Prefix-Lengths Extension в Router Advertisement (при наличии). Префикс можно также определить с помощью других механизмов, не рассмотренных в этом документе.

Когда мобильный узел находится за пределами своей домашней сети, ему недопустимо передавать в широковещательному режиме пакеты ARP для определения MAC-адреса другого узла Internet. Таким образом, список (возможно, пустой) адресов маршрутизаторов из компоненты ICMP Router Advertisement сообщения не поможет при выборе используемого по умолчанию маршрутизатора, пока у мобильного узла нет какого-либо способа определения MAC-адресов маршрутизаторов из этого списка без использования широковещательных пакетов ARP, не заданного в этом документе. Аналогично, при отсутствии не заданных в спецификации механизмов получения MAC-адресов в чужой сети мобильный узел должен игнорировать перенаправление на другие маршрутизаторы чужой сети.

4.2.2. Внешний агент

При получении инкапсулированной дейтаграммы, переданной по анонсированному адресу обслуживания, внешний агент должен сравнить внутренний адрес получателя со своими записями списка посетителей. Если этот адрес не соответствует ни одному из присутствующих в списке мобильных узлов, внешнему агенту недопустимо пересылать дейтаграмму без изменения исходного заголовка IP, поскольку в противном случае с высокой вероятностью возникнет петля в маршрутизации. Дейтаграмму следует отбросить без уведомления. Сообщения ICMP Destination Unreachable недопустимо передавать, если внешний агент не способен переслать входящую туннелированную дейтаграмму. В остальных случаях внешний агент пересылает инкапсулированную дейтаграмму мобильному узлу.

Внешнему агенту недопустимо анонсировать другим маршрутизаторам в своем маршрутном домене или любым другим мобильным узлам наличие в своем списке посетителей мобильного маршрутизатора (параграф 4.5) или мобильного узла.

Внешний агент должен маршрутизировать дейтаграммы, принятые от зарегистрированных мобильных узлов. Это означает, по меньшей мере, что внешний агент должен проверять контрольную сумму заголовка IP, декрементировать IP TTL, пересчитывать контрольную сумму заголовка IP и пересылать дейтаграмму заданному по умолчанию маршрутизатору.

Внешнему агенту недопустимо использовать широковещание ARP для MAC-адреса мобильного узла в чужой сети. Он может определить MAC-адрес путем копирования данных из сообщения Agent Solicitation или Registration Request, переданного мобильным узлом. Записи в кэше ARP внешнего агента для IP-адреса мобильного узла недопустимо устаревать да окончания срока действия записи мобильного узла в списке посетителей, если у внешнего агента нет отличного от широковещания ARP способа обновления MAC-адреса, связанного с адресом IP мобильного узла.

Каждому внешнему агенту следует поддерживать обязательные функции обратного туннелирования [12].

4.2.3. Домашний агент

Домашний агент должен быть способен перехватывать любые дейтаграммы в домашней сети, адресованные мобильному узлу, когда этот узел зарегистрирован в чужой сети. Можно применять Proxy ARP и Gratuitous ARP для обеспечения такого перехвата, как описано в параграфе 4.6.

Домашний агент должен проверять IP-адрес получателя во всех принимаемых дейтаграммах на предмет совпадения с домашним адресом какого-либо из мобильных узлов, подключенных к чужим сетям. При обнаружении такой дейтаграммы домашний агент туннелирует ее мобильному узлу, зарегистрированному по адресу (адресам) обслуживания. Если домашний агент поддерживает необязательную функцию множества одновременных мобильных привязок, он туннелирует копию дейтаграммы по каждому адресу обслуживания в списке привязок мобильного узла. Если мобильный узел не имеет действующих привязок, домашнему агенту недопустимо пытаться перехватывать адресованные этому узлу дейтаграммы, поэтому в общем случае агент просто не будет их получать. Однако, если домашний агент является также маршрутизатором, обслуживающим общий трафик IP, он может получать такие дейтаграммы для пересылки в домашнюю сеть. В этом случае домашний агент должен предполагать, что мобильный узел находится в домашней сети и просто пересылать дейтаграммы напрямую в эту сеть.

Для многодомных домашних агентов адресом отправителя во внешнем заголовке IP должен быть адрес, переданный мобильному узлу в поле Home Agent сообщения Registration Reply. Т. е. домашний агент не может использовать в качестве адреса отправителя адрес того или иного сетевого интерфейса.

Методы инкапсуляции, которые могут применяться для туннелирования, описаны в параграфе 4.1. Узлам, реализующим туннелирование, следует также поддерживать механизм tunnel soft state [14], который позволяет возвращать сообщения ICMP об ошибках из туннеля для корректного указания исходных отправителей туннелированных дейтаграмм.

Домашние агенты должны декапсулировать адресованные им пакеты, отправленные мобильным узлом для поддержки приватности местоположения, как описано в параграфе 5.5. Это требуется также для поддержки реверсного туннелирования [12].

Если Lifetime для данной мобильной привязки завершается до того, как домашний агент получит другой действительный запрос Registration Request от мобильного узла, эта привязка удаляется из списка мобильных привязок. Домашнему агенту недопустимо отправлять какие-либо сообщения Registration Reply, поскольку срок действия мобильной привязки истек. Запись в списке посетителей текущего внешнего агента этого мобильного узла будет устаревать естественным образом, вероятно в то же время, что и привязка у домашнего агента. Когда срок действия мобильной привязки завершается, домашний агент должен удалить эту привязку, но он должен сохранить все другие (не устаревшие) мобильные привязки, которые он имеет для данного мобильного узла.

Когда домашний агент получает дейтаграмму, перехваченную для одного из своих мобильных узлов, находящихся вне домашней сети, он должен проверить не является ли дейтаграмма уже инкапсулированной. При положительном ответе для пересылки такой дейтаграммы мобильному узлу используются перечисленные ниже правила.

  • Если внутренний (инкапсулированный) адрес получателя совпадает в внешним Destination Address (мобильный узел), домашний агент должен также проверить внешний адрес отправителя инкапсулированной дейтаграммы (адрес источника для туннеля). Если этот адрес совпадает с текущим адресом обслуживания (care-of) мобильного узла, домашний агент должен отбросить дейтаграмму без уведомление для того, чтобы предотвратить возникновение маршрутной петли. Если же внешний адрес отправителя не совпадает с адресом care-of мобильного узла, домашнему агенту следует переслать дейтаграмму мобильному узлу. Для пересылки дейтаграммы с этом случае домашний агент может просто изменить адрес получателя на адрес обслуживания мобильного узла, не инкапсулируя дейтаграмму снова.

  • В остальных случаях (внутренний адрес получателя не совпадает с внешним) домашнему агенту следует инкапсулировать дейтаграмму еще раз (вложенная инкапсуляция) с установкой в поле Destination Address адреса обслуживания (care-of) мобильного узла. Затем домашний агент пересылает всю дейтаграмму мобильному узлу как это делается для всех прочих дейтаграмм (уже инкапсулированных или нет).

4.3. Широковещательные дейтаграммы

При получении домашним агентом широковещательной дейтаграммы недопустимо пересылать ее каким-либо мобильным узлам из списка мобильных привязок, кроме тех узлов, которые запросили пересылку широковещательных дейтаграмм. Мобильный узел может запросить такую пересылку, установив флаг B в своем сообщении Registration Request (параграф 3.3). Для каждого такого узла домашнему агенту следует пересылать принятые широковещательные дейтаграммы, хотя это может решаться настройкой домашнего агента, в результате которой мобильным узлам будут пересылаться лишь заданные категории широковещательных дейтаграмм.

Если установлен бит D в сообщении Registration Request, указывающий использованием мобильным узлом совмещенного адреса обслуживания (co-located care-of), домашний агент просто туннелирует широковещательные дейтаграммы IP по адресу обслуживания мобильного узла. В остальных случаях (флаг D не установлен), домашний агент сначала инкапсулирует широковещательную дейтаграмму в индивидуальную на домашний адрес мобильного узла, а затем туннелирует инкапсулированную дейтаграмму внешнему агенту. Дополнительная инкапсуляция нужна для того, чтобы внешний агент мог определить, какому из мобильных узлов следует переслать дейтаграмму после ее декапсуляции. При получении внешним агентом индивидуальной инкапсулированной дейтаграммы он извлекает ее из туннеля и доставляет мобильному узлу так же, как остальные дейтаграммы. В любом случае мобильный узел должен декапсулировать полученную дейтаграмму для восстановления исходной широковещательной дейтаграммы.

4.4. Маршрутизация групповых дейтаграмм

Как было отмечено выше, мобильный узел в своей домашней сети работает так же, как любые другие (стационарные) хосты или маршрутизаторы. Т. е. дома мобильный узел функционирует аналогично другим отправителям и получателя группового (multicast) трафика. Поэтому в данном параграфе описывается поведение мобильного узла в чужой сети.

Для получения группового трафика мобильный узел должен присоединиться к multicast-группе одним из двух способов. Мобильный узел может подключиться к группе через (локальный) групповой маршрутизатор подсети, в которой он находится. Этот вариант предполагает наличие такого маршрутизатора в чужой сети. Если мобильный узел использует совмещенный адрес обслуживания, ему следует указывать этот адрес в качестве IP-адреса отправителя в своих сообщениях IGMP [6]. В остальных случаях мобильный узел может использовать свой домашний адрес.

Кроме того, желающий получать групповой трафик мобильный узел может присоединиться к группе через двухсторонний туннель к домашнему агенту, если этот агент является также групповым маршрутизатором. Мобильный узел туннелирует сообщения IGMP своему домашнему агенту, а тот пересылает групповые дейтаграммы по туннелю мобильному узлу. Для пакетов, туннелируемых домашнему агенту в качестве адреса отправителя в заголовке IP следует указывать домашний адрес мобильного узла.

Правила доставки групповых дейтаграмм мобильному узлу в этом случае идентичны правилам доставки широковещательных дейтаграмм (параграф 4.3). Если мобильный узел использует совмещенный адрес обслуживания (co-located care-of), т. е. был установлен бит D в регистрационном запросе мобильного узла, домашнему агенту следует туннелировать дейтаграммы на этот адрес обслуживания. В противном случае домашний агент должен сначала инкапсулировать дейтаграмму в индивидуальную дейтаграмму для домашнего адреса мобильного узла, а затем должен туннелировать полученную в результате дейтаграмму (вложенное туннелирование) по адресу обслуживания мобильного узла. Поэтому мобильный узел должен быть способен декапсулировать пакеты, переданные по его домашнему адресу, чтобы получать групповые дейтаграммы с использованием этого метода.

Мобильный узел, желающий отправлять дейтаграммы в multicast-группу, также имеет два варианта — (1) передавать напрямую в сеть, куда он в данный момент подключен, или (2) передавать домашнему агенту через туннель. Поскольку групповая маршрутизация в общем случае зависит от IP-адреса отправителя, в первом варианте мобильный узел должен использовать совмещенный адрес обслуживания (co-located care-of) в качестве IP-адреса отправителя. При туннелировании групповых дейтаграмм домашнему агенту мобильный узел должен использовать свой домашний адрес в качестве IP-адреса отправителя как для внутренней групповой дейтаграммы, так и для инкапсулирующей (внешней) дейтаграммы. Во втором варианте предполагается, что домашний агент является multicast-маршрутизатором.

4.5. Мобильные маршрутизаторы

Мобильный узел может быть маршрутизатором, отвечающим за мобильность одной или множества сетей, перемещающихся вместе (например, на самолете, корабле, поезде, автомобиле). Соединенные в сеть узлы, обслуживаемые маршрутизатором, могут быть стационарными или мобильными узлами и маршрутизаторами. В данном документе такие сети называются мобильными.

Мобильный маршрутизатор может служить внешним агентом и предоставлять адреса обслуживания для мобильных узлов, подключенных к мобильной сети. Ниже приведен пример типовой маршрутизации через мобильный маршрутизатор.

  1. Переносной компьютер отключается от домашней сети, а затем подключается к сетевому порту в кресле самолета. Компьютер использует Mobile IP для регистрации в чужой сети с использованием адреса обслуживания от внешнего агента, найденного через сообщения Agent Advertisement от внешнего агента на борту самолета.

  2. Бортовая сеть самолета сама является мобильной. Предположим, что узел, являющийся внешним агентом, к которому подключена бортовая сеть, служит также принятым по умолчанию маршрутизатором, соединяющим сеть самолета с Internet. Когда самолет находится «дома», этом маршрутизатор подключается к некой стационарной сети авиакомпании, которая является домашней сетью этого маршрутизатора. Во время полета бортовой маршрутизатор время от времени регистрируется по радиоканалу на внешних агентах, расположенных на земле вдоль трассы полета. Домашним агентом этого маршрутизатора является узел стационарной сети в офисе авиакомпании.

  3. Некий узел передает дейтаграмму переносному компьютеру, направляя ее по домашнему адресу этого компьютера. Дейтаграмма сначала маршрутизируется в домашнюю сеть переносного компьютера.

  4. Домашний агент переносного компьютера перехватывает дейтаграмму в домашней сети и туннелирует ее по адресу обслуживания переносного компьютера, который а данном случае является адресом узла, служащего маршрутизатором и внешним агентом на борту самолета. Обычная маршрутизация IP будет доставлять эту дейтаграмму в стационарную сеть авиакомпании.

  5. Домашний агент маршрутизатора и бортового внешнего агента перехватывает дейтаграмму и туннелирует ее по текущему адресу обслуживания, которым в нашем примере является некий (наземный) внешний агент на трассе полета. Исходная дейтаграмма в результате будет инкапсулирована дважды — домашним агентом переносного компьютера и домашним агентом самолета.

  6. Внешний агент на земле декапсулирует дейтаграмму, извлекая из нее дейтаграмму, инкапсулированную домашним агентом переносного компьютера с полем Destination Address, указывающим адрес обслуживания переносного компьютера. Полученную в результате дейтаграмму этот внешний агент передаст по радиоканалу на борт самолета.

  7. Бортовой внешний агент декапсулирует дейтаграмму, извлекая исходную дейтаграмму с Destination Address, указывающим домашний адрес переносного компьютера. Затем этот агент доставит эту дейтаграмму через бортовую сеть, используя канальный адрес переносного компьютера.

Этот пример иллюстрирует случай подключения мобильного узла к мобильной сети. Т. е. мобильный узел является мобильным в сети, которая сама по себе также мобильна (в примере, относительно земли). Если же узел является стационарным в мобильной сети (т. е. мобильная сеть является домашней для мобильного узла), может применяться любой из двух методов доставки дейтаграмм такому узлу.

Для стационарного узла домашний агент можно настроить для постоянной регистрации, которая указывает адрес мобильного маршрутизатора в качестве адреса обслуживания хоста. Для этого обычно используется домашний агент мобильного маршрутизатора. В этом случае домашний агент отвечает за анонсирование связности со стационарным узлом с помощью обычных протоколов маршрутизации. Все дейтаграммы для стационарного узла будут использовать вложенное туннелирование, как описано выше.

Кроме того, мобильный маршрутизатор может анонсировать связность для всей мобильной сети, используя обычные протоколы маршрутизации IP через двухсторонний туннель со своим домашним агентом. Этот метод позволяет отказаться от вложенного туннелирования дейтаграмм.

4.6. ARP, Proxy ARP, Gratuitous ARP

Использование ARP [16] требует специальных правил для случаев, когда вовлечен беспроводный или мобильный узел. Заданные в этом параграфе требования применимы ко всем домашним сетям, где применяется протокол ARP для преобразования адресов.

В дополнение к обычному использованию ARP для сопоставления адреса канального уровня с IP-адресом узла этот документ выделяет два специальных случая применения протокола ARP, описанных ниже.

  • Proxy ARP [49] представляет собой отклик ARP Reply, передаваемый одним узлом от имени другого узла, который не может или не хочет сам отвечать на запросы ARP Request. Отправитель Proxy ARP резервирует поля протокольных адресов Sender и Target, как описано в [16], по подставляет некий заданный в конфигурации (обычно свой) адрес канального уровня в поле Sender Hardware Address. Узел, получивший сообщение Reply, будет связывать адрес канального уровня с IP-адресом исходного целевого узла, что приведет к передаче дейтаграмм для этого узла по указанному адресу канального уровня.

  • Механизм Gratuitous ARP [45] использует пакеты ARP, отправляемые узлом, для того, чтобы другие узлы обновили записи в своем кэше ARP. Беспричинный ARP может использовать пакеты ARP Request или ARP Reply. В любом случае поля ARP Sender Protocol Address и ARP Target Protocol Address содержат адрес IP, для которого нужно обновить кэш-запись, в для ARP Sender Hardware Address указывается адрес канального уровня, который должен появиться в обновленной записи. При использовании пакетов ARP Reply в поле Target Hardware Address также указывается адрес канального уровня, который должен появиться в обновленной записи (в ARP Request это поле не используется).

    В любом случае для беспричинного ARP пакеты ARP должны передаваться как локальные широковещательные пакеты на локальном канале. Как указано в [16], любой узел, получивший пакет ARP (Request или Reply), должен обновить свой локальный кэш ARP с использованием адресов Sender Protocol и Hardware из пакета ARP, если принявший пакет узел уже имеет запись для этого адреса IP в своем кэше ARP. Это требование протокола ARP применимо даже к пакетам ARP Request и пакетам ARP Reply, которые не соответствуют запросам ARP, переданным узлом, который получил пакет [16].

Когда мобильный узел зарегистрирован в чужой сети, его домашний агент использует proxy ARP [49] для отклика на пакеты ARP Request, запрашивающие адрес канального уровня мобильного узла. При получении пакета ARP Request домашний агент должен проверить целевой адрес в запросе и при соответствии этого адреса домашнему адресу мобильного узла, для которого зарегистрирована мобильная привязка, домашний агент должен передать пакет ARP Reply от имени мобильного узла. После перестановки адресов получателя и отправителя в пакете [49] домашний агент должен установить в качестве адреса канального уровня в пакете адрес своего интерфейса, с которого будет передан пакет Reply.

Когда мобильный узел покидает домашнюю сеть и регистрирует привязку к чужой сети, его домашний агент использует Gratuitous ARP для обновления кэша ARP на узлах домашней сети. В результате узлы домашней сети связывают канальный адрес домашнего агента с домашним IP-адресом мобильного узла. При регистрации привязки мобильного узла, для которого у домашнего агента раньше не было привязок (мобильный узел не покидал домашней сети) домашний агент должен передать Gratuitous ARP от имени мобильного узла. Этот пакет ARP должен передаваться как широковещательный для канала, с которым связан домашний адрес мобильного узла. Поскольку широковещание на локальном соединении (например, Ethernet) обычно не обеспечивает гарантии доставки, пакет Gratuitous ARP следует повторить несколько раз для повышения надежности.

При возвращении мобильного узла в домашнюю сеть этот узел и его домашний агент используют Gratuitous ARP, чтобы побудить все узлы домашней сети к обновлению своего кэше ARP в соответствии с адресом канального уровня и домашним IP-адресом мобильного узла. Перед отправкой сообщения (de)Registration Request своему домашнему агенту мобильный узел должен передать Gratuitous ARP в свою домашнюю сеть в широковещательном пакете для локального соединения. Пакет Gratuitous ARP следует повторить несколько раз для надежности, однако повторы следует передавать параллельно передаче и обработке (de)Registration Request.

Когда домашний агент мобильного узла получает и воспринимает это сообщение (de)Registration Request, он должен также предает пакет Gratuitous ARP в домашнюю сеть мобильного узла. Этот пакет служит для связывания домашнего адреса мобильного узла с его адресом канального уровня. Пакеты Gratuitous ARP передаются мобильным узлом и домашним агентом, поскольку в случае беспроводных интерфейсов область передачи мобильного узла может отличаться от области передачи домашнего агента. Пакеты ARP от домашнего агента должны передаваться как широковещательные для домашнего канала мобильного узла и следует повторять передачу пакета несколько раз для повышения надежности. Повторы следует выполнять параллельно с передачей и обработкой сообщения (de)Registration Reply для мобильного узла.

Пока мобильный узел находится в домашней сети, ему недопустимо передавать какие-либо широковещательные сообщения ARP Request или ARP Reply. Наконец, хотя мобильный узел находится дома, ему недопустимо отвечать на сообщения ARP Request, в которых целевым указан его домашний адрес IP, если только ARP Request не является индивидуальным от внешнего агента, на котором мобильный узел пытался зарегистрироваться или от внешнего агента, на котором на закончилась регистрация мобильного узла. В последнем случае мобильный узел должен использовать индивидуальную адресацию ARP Reply для ответа внешнему агенту. Отметим, что если мобильный узел использует совмещенный адрес обслуживания и получает ARP Request, в котором в качестве целевого адреса IP указан его адрес обслуживания, мобильному узлу следует отвечать на это сообщение ARP Request. Отметим также, что при передаче Registration Request в чужой сети мобильный узел может определить канальный адрес внешнего агента сохраняя адрес, который был получен из сообщения Agent Advertisement от этого агента, но не из широковещательного сообщения ARP Request.

Конкретный порядок, в котором применяется каждое из приведенных выше требований для ARP, proxy ARP и gratuitous ARP, относительно передачи и обработки сообщений мобильного узла Registration Request и Registration Reply при выходе из домашней сети или возвращении в нее важен для корректной работы протокола.

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

  • Мобильный узел решает зарегистрироваться вне дома, возможно в результате получения анонса Agent Advertisement от внешнего агента и продолжительного отсутствия таких анонсов от домашнего агента.

  • Перед отправкой сообщения Registration Request мобильный узел отключает на будущее обработку любых сообщений ARP Request с запросом адреса канального уровня для его домашнего адреса, которые он может получить, за исключением нужных для взаимодействия с внешними агентами в чужих сетях.

  • Мобильный узел передает Registration Request.

  • Когда домашний агент мобильного узла получает и воспринимает сообщение Registration Request, он отправляет Gratuitous ARP от имени мобильного узла и начинает использовать proxy ARP для откликов на получаемые сообщения ARP Request с запросом канального адреса мобильного узла. В Gratuitous ARP поле ARP Sender Hardware Address содержит адрес канального уровня домашнего агента. Если вместо этого домашний агент станет отвергать сообщения Registration Request, обработка ARP (gratuitous и proxy) не будет выполняться домашним агентом.

При возвращении мобильного узла в домашнюю сеть должны быть выполнены приведенные ниже операции с сохранением их порядка.

  • Мобильный узел принимает решение о регистрации в домашней сети (возможно в результате получения Agent Advertisement от своего домашнего агента).

  • Перед отправкой сообщения Registration Request мобильный узел восстанавливает будущую обработку любых сообщений ARP Requests с запросом его адреса канального уровня.

  • Мобильный узел выполняет для себя Gratuitous ARP, указывая в поле ARP Sender Hardware Address свой адрес канального уровня.

  • Мобильный узел повторяет передачу сообщения Registration Request.

  • Когда домашний агент мобильного узла получает и воспринимает сообщение Registration Request, он прекращает использование proxy ARP для откликов на сообщения ARP Request, запрашивающие канальный адрес мобильного узла, и выполняет процедуру Gratuitous ARP от имени мобильного узла, указывая в поле ARP Sender Hardware Address канальный адрес мобильного узла. Если вместо этого домашний агент отвергает сообщения Registration Request, ему недопустимо менять способ обработки ARP (ни gratuitous, ни proxy) для мобильного узла. В этом случае домашнему агенту следует вести себя так, будто мобильный узел не вернулся домой и продолжать выполнение proxy ARP от имени мобильного узла.

5. Вопросы безопасности

Мобильные компьютерные среды существенно отличаются от традиционных вычислительных сред. Во многих случаях мобильные компьютеры подключаются к сети по беспроводным каналам. Такие каналы могут быть уязвимыми для пассивного перехвата данных, активных атак с повторным использованием пакетов (replay) и других активных атак.

5.1. Коды проверки подлинности сообщений

Домашние агенты и мобильные узлы должны быть способны выполнять проверку подлинности. По умолчанию используется алгоритм HMAC-MD5 [10] с размером ключей 128 битов. Внешние агенты также должны поддерживать аутентификацию с использованием алгоритма HMAC-MD5 и ключей размером не менее 128 битов с ручным распространением ключей. Должны поддерживаться ключи с произвольными двоичными значениями.

Механизм prefix+suffix использует MD5 для защиты данных и общий секрет считается криптографическим сообществом уязвимым для атак. Если нужна совместимость со старыми реализациями Mobile IP, использующими этот режим, новым реализациям следует включать MD5 с ключами [19] в качестве одного из дополнительных алгоритмов аутентификации для использования при создании и проверке аутентификационных данных, которые представляются в регистрационных сообщениях Mobile IP, например, в расширениях, заданных в параграфах 3.5.2, 3.5.3 и 3.5.4.

Могут также поддерживаться дополнительные алгоритмы проверки подлинности, режимы алгоритмов, методы распространения и размеры ключей для всех аутентификационных расширений.

5.2. Проблемы безопасности, связанные с протоколом

Протокол регистрации, описанный в этом документе, будет приводить к туннелированию трафика мобильного узла на его адрес обслуживания. Это туннелирование может иметь серьезные уязвимости, если регистрация проводится без проверки подлинности. Дистанционное перенаправление, выполняемое протоколом мобильной регистрации, считается одной из проблем безопасности Internet, если оно не использует аутентификации [30]. Кроме того, протокол ARP не использует проверки подлинности и может использоваться для кражи чужого трафика. Применение Gratuitous ARP (параграф 4.6) влечет за собой все риски, связанные с ARP.

5.3. Управление ключами

Данная спецификация требует использования механизма строгой аутентификации (MD5 с ключами), что позволяет предотвратить множество потенциальных атак, основанных на протоколе регистрации Mobile IP. Однако в силу затруднительности распространения ключей без сетевого протокола управления ключами для взаимодействия с внешним агентом проверка подлинности сообщений не требуется. В коммерческих средах аутентификация сообщений между внешним и домашним агентом может быть важна для выставления счетов за обслуживание, поскольку сервис-провайдеры не обслуживают пользователей, которые не являются их легитимными заказчиками.

5.4. Выбор хороших случайных чисел

Надежность любого механизма аутентификации зависит от нескольких факторов, включая стойкость алгоритма, секретность и стойкость используемого ключа, а также качества конкретной реализации. Данная спецификация требует реализации MD5 с ключом для проверки подлинности, но не исключает использования других алгоритмов и режимов аутентификации. Для эффективной аутентификации keyed MD5 128-битовый ключ должен быть секретным (известным лишь уполномоченным лицам) и псевдослучайным.

Если используются nonce для защиты от повторов, одноразовые значения тоже нужно выбирать осторожно. В RFC 4086 [8], написанном Eastlake с соавторами, приведены рекомендации по созданию псевдослучайных значений.

5.5. Приватность

Пользователям, имеющим конфиденциальные данные, которые они не хотят раскрывать, следует использовать выходящие за рамки этого документа механизмы (например, шифрование) для обеспечения подходящей защиты. Пользователям, озабоченным анализом трафика, следует применять подходящее шифрование каналов. Если требуется скрыть местоположение, мобильный узел может организовать туннель со своим домашним агентом. Тогда дейтаграммы будут представляться узлам-корреспондентам приходящими из домашней сети и это осложнит определение места размещения мобильного узла. Такие механизмы выходят за рамки этого документа.

5.6. Фильтрация на входе

На многих маршрутизаторах используются правила безопасности типа входной фильтрации [35], которые не позволяют пересылать пакеты, в которых Source Address представляется топологически некорректным. В средах, где это вызывает проблемы, мобильные узлы могут применять реверсное туннелирование [12] с представленным внешним агентом адресом обслуживания в поле Source Address. Пакеты в реверсных туннелях смогут нормально проходить через такие маршрутизаторы, а входная фильтрация сможет определять корректно топологический источник как и для пакетов от стационарных узлов.

5.7. Защита от повторного использования для запросов регистрации

Поле Identification позволяет домашнему агенту проверить свежесть регистрационного сообщения, созданного мобильным узлом, и избавиться от используемых атакующими пакетов от предшествующих регистраций. В этом разделе описаны два метода защиты — временные метки (обязательный) и nonce (опция). Все мобильные узлы и домашние агенты должны поддерживать защиту от повторов на основе временных меток. Они могут также поддерживать защиту на базе одноразовых значений nonce.

Способ защиты от повторов между мобильным агентом и домашним узлом является частью MSA. Мобильный узел и его домашний агент должны согласовать используемый метод защиты. Интерпретация поля Identification зависит от выбранного метода, как описано в последующих параграфах.

Независимо от выбранного метода 32 младших бита поля Identification должны без изменений копироваться из регистрационного запроса в отклик. Внешний агент использует эти биты (и домашний адрес мобильного узла) для сопоставления регистрационных запросов и откликов. Мобильный узел должен проверить идентичность 32 младших битов в Registration Reply и соответствующих битов Registration Request.

В поле Identification нового сообщение Registration Request недопустимо указывать значение, которое использовалось в непосредственно предшествующем запросе и не следует повторять значение в течение всего срока действия контекста защиты между мобильным узлом и домашним агентом. Разрешена повторная передача в соответствии с параграфом 3.6.3.

5.7.1. Защита с использованием временных меток

Основа защиты от повторного использования с помощью временных меток заключается в том, что узел, генерирующий сообщение, вставляет в него временную метку, достаточно близкую к текущему времени на узле, а приемный узел проверяет близость этой метки к своему текущему времени. Если в защитной связи между узлами не задано иное, может допускаться отклонение значений до 7 секунд. Допустимое отклонение следует делать больше 3 секунд. Обычно взаимодействующие узлы должны синхронизировать свои часы. Как и все другие, синхронизационные сообщения могут использовать механизм аутентификации, определенный в контексте защиты между парой узлов.

При использовании временных меток мобильный узел должен помещать в поле Identification 64-битовое значение в формате протокола NTP6 [11]. 32 младших бита в формате NTP представляют доли секунды и при недоступности этих битов от источника временных меток взамен следует применять случайное значение из хорошего источника. Однако следует отметить, что при использовании временных меток 64-битовое поле Identification в сообщениях Registration Request от мобильного узла должно быть больше любого использованного в предыдущих сообщениях Registration Request значения, поскольку для домашнего агента это значение служит порядковым номером. Без такого номера становится возможным восприятие домашним агентом просроченных дубликатов предшествующих сообщений Registration Request (в соответствии с требуемой домашним агентом синхронизацией часов) и соответствующее нарушения порядка, ошибочно меняющее текущий зарегистрированный адрес обслуживания мобильного узла.

При получении сообщения Registration Request с разрешающим проверку полномочий расширением домашний агент должен проверить пригодность поля Identification. В действительном поле временная метка должна быть достаточно близка к текущему времени домашнего агента и должна быть больше значений предшествующих временных меток от этого мобильного узла. Допустимые отклонения и детали синхронизации определяются конкретной защищенной связью (Mobility Security Association).

Если временная метка действительна, домашний агент копирует поле Identification целиком в свое сообщение Registration Reply для мобильного узла. Если метка не действительна, домашний агент копирует в Registration Reply лишь 32 младших бита, а в старших указывает 32 бита своего текущего времени. В этом случае домашний агент должен отвергнуть регистрацию и возвратить код 133 (несоответствие Identification) в отклике Registration Reply.

Как описано в параграфе 3.6.2.1, мобильный узел должен проверить идентичность 32 младших битов поля Identification в сообщении Registration Reply битам в отвергнутой попытке регистрации до применения старших 32 битов для синхронизации часов.

5.7.2. Защита с использованием Nonce

Базовым принципом защиты от повторного использования с помощью одноразовых значений (nonce) является то, что узел A включает новое случайное значение в каждое сообщение для узла B и проверяет возврат узлом B того же значения в следующем сообщении для узла A. Оба сообщения используют код аутентификации для защиты от подмены атакующим. В то же время узел B может передавать свои значения nonce узлу A (которые A будет возвращать),так что «свежесть» принимаемых сообщений легко проверить.

Предполагается, что у домашнего агента есть ресурсы для расчета псевдослучайных чисел, полезных для nonce [8]. Новое значение nonce помещается в старшие 32 бита поля Identification каждого сообщения Registration Reply. Домашний агент копирует 32 младших бита поля Identification из сообщения Registration Request в 32 младших бита поля Identification в сообщении Registration Reply. Когда мобильный узел получает аутентифицированный отклик Registration Reply от домашнего агента, он сохраняет 32 старших бита поля Identification для использования в качестве 32 старших битов следующего сообщения Registration Request.

Мобильный узел отвечает за генерацию младших 32 битов поля Identification в каждом сообщении Registration Request. В идеальном случае узлу следует самостоятельно генерировать случайные значения nonce. Однако узел может использовать любой подходящий метод, включая дублирование случайного значения, переданного домашним агентом. Выбранный метод интересует лишь сам мобильный узел, поскольку он сам проверяет пригодность значений в Registration Reply. Значения старших и младших 32 поля Identification следует выбирать так, чтобы они отличались от предшествующих. Домашний агент использует в каждом сообщении новое значение для старших битов, а мобильный узел — для младших. Внешние агенты используют значение младших битов (и домашний адрес мобильного узла) для сопоставления регистрационных откликов с ожидающими запросами (параграф 3.7.1).

Если регистрационное сообщение отвергается по причине непригодности nonce, сообщение Reply всегда указывает мобильному узлу новое значение nonce для следующей регистрации. Это обеспечивает самосинхронизацию протокола nonce.

6. Взаимодействие с IANA

Mobile IP задает несколько пространств номеров для значений, используемых в различных полях сообщений. Эти пространства включают перечисленные ниже.

  • Типы сообщений Mobile IP, отправляемых в порт UDP 434, как описано в параграфе 1.8.

  • Типы расширений Registration Request и Registration Reply (см. параграфы 3.3 и 3.4, а также [12], [43], [2], [3] и [7]).

  • Значения кодов в сообщениях Registration Reply (см. параграф 3.4, а также [12], [43], [2], [3], [7]).

  • Mobile IP определяет сообщения Agent Solicitation и Agent Advertisement, которые фактически являются сообщениями Router Discovery [5], дополненными связанными с Mobile-IP расширениями. Таким образом, для этих сообщений не определяется новое пространство имен, но определяются дополнительные расширения Router Discovery, как описано ниже в параграфе 6.2. См. также параграф 2.1 и работы [3] и [7].

В документе [3] заданы дополнительные пространства номеров Mobile IP.

Информацию о выделении номеров Mobile IP в других спецификациях можно найти на сайте IANA по ссылке http://www.iana.org/protocols (см. раздел Mobile Internet Protocol (IP) Numbers).

В этой пересмотренной спецификации потребовалось новое значение кода для поля сообщений Registration Reply в рамках диапазона, обычно используемого для сообщений внешних агентов. Этот код ошибки требуется для отклика о некорректном адресе домашнего агента (Invalid Home Agent Address), как описано в параграфе 3.7.2.

6.1. Типы сообщений Mobile IP

Для сообщений Mobile IP определена передача в порт получателя с номером 434 (UDP или TCP). Пространство номеров для сообщений Mobile IP задано в параграфе 1.8. Выделение номеров для расширений происходит по процедуре Expert Review, как указано в [22]. Стандартизованные к настоящему моменту номера сообщений перечислены в таблице и описаны в указанных в таблице параграфах.

Тип

Имя

Параграф

1

Registration Request

3.3

3

Registration Reply

3.4

6.2. Расширения для анонсов маршрутизаторов RFC 1256

RFC 1256 определяет два типа сообщений ICMP — Router Advertisement и Router Solicitation. Mobile IP определяет пространство номеров для Router Advertisement, которые могут применяться не только протоколом Mobile IP. Номера, стандартизованные для использования с Mobile IP, перечислены в таблице.

Тип

Имя

Параграф

0

One-byte Padding

2.1.3

16

Mobility Agent Advertisement

2.1.1

19

Prefix-Lengths

2.1.2

Выделение номеров для расширений происходит по процедуре Expert Review, как указано в [22].

6.3. Расширения для регистрационных сообщений Mobile IP

Сообщения Mobile IP, заданные в этом документе и перечисленные в параграфах 1.8 и 6.1, могут использовать расширения. Расширения сообщений Mobile IP используют общее пространство номеров, даже если они относятся к разным сообщениям Mobile IP. Пространство номеров расширений Mobile IP задано в этом документе. Выделение номеров для расширений происходит по процедуре Expert Review, как указано в [22].

Тип

Имя

Параграф

0

One-byte Padding

32

Mobile-Home Authentication

3.5.2

33

Mobile-Foreign Authentication

3.5.3

34

Foreign-Home Authentication

3.5.4

6.4. Коды сообщений Mobile IP Registration Reply

Сообщение Mobile IP Registration Reply, описанное в параграфе 3.4, имеет поле Code. Пространство значений кодов также указано в параграфе 3.4. Это пространство структурировано в соответствии с результатами регистрации, как показано в таблице ниже.

Таблица 1. Рекомендации по выделению значений кодов.

Коды

Рекомендации

0-8

Коды успешного выполнения

9-63

Данный документ не дает рекомендаций для этого диапазона кодов

64-127

Коды ошибок от внешнего агента

128-192

Коды ошибок от домашнего агента

193-200

Коды ошибок от внешнего агента-шлюза [29]

201-255

Данный документ не дает рекомендаций для этого диапазона кодов

Выделение новых кодов происходит в соответствии с процедурой Expert Review [22].

7. Благодарности

Особая благодарность Steve Deering (Xerox PARC), а также Dan Duchamp и John Ioannidis (JI) (Columbia University) за формирование рабочей группы, руководство ею и значительный вклад в ранний этап разработки. Раннюю работу по Columbia Mobile IP можно найти в [37], [38], [39].

Спасибо также Kannan Alaggapan, Greg Minshall, Tony Li, Jim Solomon, Erik Nordmark, Basavaraj Patil и Phil Roberts за их вклад в работу группы при выполнении обязанностей руководителя, а также множество полезных замечаний.

Спасибо активным участникам рабочей группы IP Working, особенно тем, кто принял участие в написании текста (в алфавитном порядке)

Ran Atkinson (Naval Research Lab);

Samita Chakrabarti (Sun Microsystems);

Ken Imboden (Candlestick Networks, Inc.);

Dave Johnson (Carnegie Mellon University);

Frank Kastenholz (FTP Software);

Anders Klemets (KTH);

Chip Maguire (KTH);

Alison Mankin (ISI);

Andrew Myles (Macquarie University);

Thomas Narten (IBM);

Al Quirt (Bell Northern Research);

Yakov Rekhter (IBM);

Fumio Teraoka (Sony);

Alper Yegin (NTT DoCoMo).

Спасибо редакторам Charlie Kunzinger и Bill Simpson, которые создали первый черновой вариант документа, отражающий обсуждения в рабочей группе. Значительная часть текста в последних версиях перед выпуском RFC 2002 подготовлена Jim Solomon и Dave Johnson.

Спасибо Greg Minshall (Novell), Phil Karn (Qualcomm), Frank Kastenholz (FTP Software) и Pat Calhoun (Sun Microsystems) за их поддержку при проведении совещаний рабочей группы.

Параграфы 1.10 и 1.11, которые описывают новые форматы расширений для использования с агрегируемыми типами расширений, были заимствованы из спецификации Mobile IP Extensions Rationalization (MIER), которую написали:

Mohamed Khalil (Nortel Networks);

Raja Narayanan (nVisible Networks);

Haseeb Akhtar (Nortel Networks);

Emad Qaddoura (Nortel Networks).

Спасибо этим авторам также за дополнительную работу в MIER, выполненную Basavaraj Patil, Pat Calhoun, Neil Justusson, N. Asokan и Jouni Malinen.

Спасибо Vijay Devarapalli, потратившему много часов на преобразование текста исходного документа в формат XML.

8. Литература

8.1. Нормативные документы

[1] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[2] Calhoun, P. and C. Perkins, «Mobile IP Network Access Identifier Extension for IPv4», RFC 2794, March 2000.

[3] Perkins, C., Calhoun, P., and J. Bharatia, «Mobile IPv4 Challenge/Response Extensions (Revised)», RFC 4721, January 2007.

[4] Cong, D., Hamlen, M., and C. Perkins, «The Definitions of Managed Objects for IP Mobility Support using SMIv2», RFC 2006, October 1996.

[5] Deering, S., Ed., «ICMP Router Discovery Messages», RFC 1256, September 1991.

[6] Deering, S., «Host extensions for IP multicasting», STD 5, RFC 1112, August 1989.

[7] Dommety, G. and K. Leung, «Mobile IP Vendor/Organization-Specific Extensions», RFC 3115, April 2001.

[8] Eastlake 3rd, D., Schiller, J., and S. Crocker, «Randomness Requirements for Security», BCP 106, RFC 4086, June 2005.

[9] Kent, S., «IP Authentication Header», RFC 4302, December 2005.

[10] Krawczyk, H., Bellare, M., and R. Canetti, «HMAC: Keyed-Hashing for Message Authentication», RFC 2104, February 1997.

[11] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, «Network Time Protocol Version 4: Protocol and Algorithms Specification», RFC 5905, June 2010.

[12] Montenegro, G., Ed., «Reverse Tunneling for Mobile IP, revised», RFC 3024, January 2001.

[13] Farinacci, D., Li, T., Hanks, S., Meyer, D., and P. Traina, «Generic Routing Encapsulation (GRE)», RFC 2784, March 2000.

[14] Perkins, C., «IP Encapsulation within IP», RFC 2003, October 1996.

[15] Perkins, C., «Minimal Encapsulation within IP», RFC 2004, October 1996.

[16] Plummer, D., «Ethernet Address Resolution Protocol: Or Converting Network Protocol Addresses to 48.bit Ethernet Address for Transmission on Ethernet Hardware», STD 37, RFC 826, November 1982.

[17] Postel, J., «User Datagram Protocol», STD 6, RFC 768, August 1980.

[18] Postel, J., «Internet Protocol», STD 5, RFC 791, September 1981.

[19] Rivest, R., «The MD5 Message-Digest Algorithm», RFC 1321, April 1992.

[20] Solomon, J., «Applicability Statement for IP Mobility Support», RFC 2005, October 1996.

[21] Perkins, C., Ed., «IP Mobility Support for IPv4», RFC 3344, August 2002.

[22] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, May 2008.

8.2. Дополнительная литература

[23] Solomon, J. and S. Glass, «Mobile-IPv4 Configuration Option for PPP IPCP», RFC 2290, February 1998.

[24] Montenegro, G., Dawkins, S., Kojo, M., Magret, V., and N. Vaidya, «Long Thin Networks», RFC 2757, January 2000.

[25] Allman, M., Glover, D., and L. Sanchez, «Enhancing TCP Over Satellite Channels using Standard Mechanisms», BCP 28, RFC 2488, January 1999.

[26] Paxson, V. and M. Allman, «Computing TCP’s Retransmission Timer», RFC 2988, November 2000.

[27] Levkowetz, H. and S. Vaarala, «Mobile IP Traversal of Network Address Translation (NAT) Devices», RFC 3519, April 2003.

[28] Glass, S. and M. Chandra, «Registration Revocation in Mobile IPv4», RFC 3543, August 2003.

[29] Fogelstroem, E., Jonsson, A., and C. Perkins, «Mobile IPv4 Regional Registration», RFC 4857, June 2007.

[30] Bellovin, S., «Security Problems in the TCP/IP Protocol Suite», ACM Computer Communications Review, 19(2), March 1989.

[31] Border, J., Kojo, M., Griner, J., Montenegro, G., and Z. Shelby, «Performance Enhancing Proxies Intended to Mitigate Link-Related Degradations», RFC 3135, June 2001.

[32] Caceres, R. and L. Iftode, «Improving the Performance of Reliable Transport Protocols in Mobile Computing Environments», IEEE Journal on Selected Areas in Communication, 13(5):850-857, June 1995.

[33] Dawkins, S., Montenegro, G., Kojo, M., Magret, V., and N. Vaidya, «End-to-end Performance Implications of Links with Errors», BCP 50, RFC 3155, August 2001.

[34] Droms, R., «Dynamic Host Configuration Protocol», RFC 2131, March 1997.

[35] Ferguson, P. and D. Senie, «Network Ingress Filtering: Defeating Denial of Service Attacks which employ IP Source Address Spoofing», BCP 38, RFC 2827, May 2000.

[36] Jacobson, V., «Compressing TCP/IP Headers for Low-Speed Serial Links», RFC 1144, February 1990.

[37] Ioannidis, J., Duchamp, D., and G. Maguire, «IP-Based Protocols for Mobile Internetworking», In Proceedings of the SIGCOMM ’01 Conference: Communications Architectures and Protocols, pages 235-245, September 1991.

[38] Ioannidis, J. and G. Maguire, «The Design and Implementation of a Mobile Internetworking Architecture», In Proceedings of the Winter USENIX Technical Conference, pages 489-500, January 1993.

[39] Ioannidis, J., «Protocols for Mobile Internetworking», PhD Dissertation — Columbia University in the City of New York, July 1993.

[40] Jacobson, V., «Congestion Avoidance and Control», In Proceedings of the SIGCOMM ’88 Workshop, ACM SIGCOMM, ACM Press, pages 314-329, August 1998.

[41] McCloghrie, K. and F. Kastenholz, «The Interfaces Group MIB», RFC 2863, June 2000.

[42] McGregor, G., «The PPP Internet Protocol Control Protocol (IPCP)», RFC 1332, May 1992.

[43] Montenegro, G. and V. Gupta, «Sun’s SKIP Firewall Traversal for Mobile IP», RFC 2356, June 1998.

[44] Perkins, C., Ed., «IP Mobility Support», RFC 2002, October 1996.

[45] Stevens, R., «TCP/IP Illustrated, Volume 1: The Protocols», Addison-Wesley, Reading, Massachusetts, 1994.

[46] Perkins, C. and P. Calhoun, «Authentication, Authorization, and Accounting (AAA) Registration Keys for Mobile IPv4», RFC 3957, March 2005.

[47] Simpson, W., Ed., «The Point-to-Point Protocol (PPP)», STD 51, RFC 1661, July 1994.

[48] IANA, «Mobile IPv4 Numbers», http://www.iana.org.

[49] Postel, J., «Multi-LAN address resolution», RFC 925, October 1984.

[50] Perkins, C., Ed., «IP Mobility Support for IPv4», RFC 3220, January 2002.

Приложение A. Канальный уровень

Мобильный узел может использовать механизмы канального уровня для обнаружения смены точки подключения. Такая индикация включает состояния интерфейса Down/Testing/Up [41] и изменения в ячейке или администрировании. Механизмы будут зависеть от применяемой технологии канального уровня и выходят за рамки этого документа.

Протоколы PPP7 [47] и IPCP8 [42] согласуют использование адресов IP.

Мобильному узлу следует сначала попытаться задать свой домашний адрес, поскольку при подключении к домашней сети немаршрутизируемый канал будет работать корректно. Если партнер не воспринимает домашний адрес, но мобильному узлу динамически выделяется временный адрес IP и узел способен поддерживать совмещенный адрес обслуживания (co-located care-of), этот узел может зарегистрировать полученный адрес в качестве адреса обслуживания. Когда партнер задает свой адрес, недопустимо предполагать, что это адрес внешнего агента (care-of) или IP-адрес домашнего агента. Расширения PPP для Mobile IP заданы в RFC 2290 [23]. В этом документе приведена дополнительная информация по получению адресов обслуживания от PPP наиболее эффективным путем.

Приложение B. Проблемы TCP

B.1. Таймеры TCP

При работе по каналам с высокой задержкой (например, спутниковым) или малой пропускной способностью (например, по радиоканалу) некоторые стеки TCP могут иметь недостаточно адаптивные (нестандартные) тайм-ауты повтора передачи. Это может приводить к ложным тайм-аутам даже при корректной работе сети просто по причине значительной задержки в используемой среде. В результате организация или поддержка соединений TCP может стать невозможной или будут возникать необоснованные повторы передачи, которые будут приводить к дополнительному расходу дефицитной пропускной способности. Производителям рекомендуется следовать алгоритмам RFC 2988 [26] при реализации таймеров повтора TCP. Производителям систем для работы на низкоскоростных каналах со значительной задержкой следует обратиться к RFC 2757 и RFC 2488 [24], [25]. Разработчикам приложений для мобильных узлов следует принимать во внимание сложности, связанные с таймерами.

B.2. Контроль насыщения TCP

Мобильные узлы часто используют среды, в которых вероятность ошибок достаточно высока и пакеты могут отбрасываться. Это порождает конфликты с механизмами контроля перегрузок, используемыми в современных версиях TCP [40]. При отбрасывании пакет реализация TCP на стороне партнера вероятно отреагирует на это как на перегрузку сети и инициирует механизм замедленного старта (slow-start) [40], разработанный для контроля перегрузок. Однако этот механизм не подходит для сетей с избыточными ошибками на каналах и в реальности лишь усиливает негативное влияние потери пакетов. Эта проблема была проанализирована в работе Caceres с соавторами [32]. Подходы TCP к обработке ошибок, которые могут конфликтовать с контролем перегрузок, рассмотрены в документах рабочей группы PILC [31] [33]. Хотя эти подходы выходят за рамки данного документа, они показывают, что обеспечение производительности для мобильных узлов включает механизмы, выходящие за пределы сетевого уровня. Проблемы, вызываемые большим числом ошибок в среде, также показывают необходимость избегать использования решений, которые систематически отбрасывают пакеты. В других ситуациях такие решения могут быть эффективными с учетом инженерных компромиссов.

Приложение C. Примеры

В этом приложении приведены примера сообщений Registration Request для типичных сценариев.

C.1. Регистрация с Foreign Agent Care-of Address

Мобильный узел получает сообщение Agent Advertisement от внешнего агента и хочет зарегистрироваться у него с использованием адреса обслуживания от этого агента. Мобильный узел желает применять лишь инкапсуляцию IP-in-IP, не хочет получать широковещательных пакетов и не желает одновременных мобильных привязок.

Поля IP

Source Address = домашний адрес мобильного узла;

Destination Address = копируется из IP-адреса отправителя в Agent Advertisement;

Time to Live = 1.

Поля UDP

Source Port = <любой>;

Destination Port = 434.

Поля сообщения Registration Request

Type = 1;

S=0,B=0,D=0,M=0,G=0;

Lifetime = Registration Lifetime копируется из Mobility Agent Advertisement Extension сообщения Router Advertisement;

Home Address = домашний адрес мобильного узла;

Home Agent = IP-адрес домашнего агента;

Care-of Address = Care-of Address копируется из Mobility Agent Advertisement Extension сообщения Router Advertisement;

Identification = временная метка NTP или Nonce.

Расширения

Включающее проверку полномочий расширение (например, Mobile-Home Authentication).

C.2. Регистрация с Co-Located Care-of Address

Мобильный узел подключается к чужой сети, в которой нет внешнего агента. Узел получает адрес от сервера DHCP [34] для использования в качестве совмещенного адреса обслуживания (co-located care-of). Мобильный узел поддерживает все формы инкапсуляции (IP-in-IP, минимальная инкапсуляция, GRE), желает получать широковещательные дейтаграммы из домашней сети и не желает одновременных мобильных привязок.

Поля IP

Source Address = адрес обслуживания (care-of), полученный от сервера DHCP;

Destination Address = IP-адрес домашнего агента;

Time to Live = 64.

Поля UDP

Source Port = <любой>

Destination Port = 434.

Поля сообщения Registration Request

Type = 1;

S=0,B=1,D=1,M=1,G=1;

Lifetime = 1800 (секунд);

Home Address = домашний адрес мобильного узла;

Home Agent = IP-адрес домашнего агента;

Care-of Address = адрес обслуживания (care-of), полученный от сервера DHCP;

Identification = временная метка NTP или Nonce.

Расширения

Mobile-Home Authentication.

C.3. Дерегистрация

Мобильный узел возвращается домой и отменяет регистрацию всех адресов обслуживания на своем домашнем агенте.

Поля IP

Source Address = домашний адрес мобильного узла;

Destination Address = IP-адрес домашнего агента;

Time to Live = 1.

Поля UDP

Source Port = <любой>;

Destination Port = 434.

Поля сообщения Registration Request

Type = 1;

S=0,B=0,D=0,M=0,G=0;

Lifetime = 0;

Home Address = домашний адрес мобильного узла;

Home Agent = IP-адрес домашнего агента;

Care-of Address = домашний адрес мобильного узла;

Identification = временная метка NTP или Nonce.

Расширения

Включающее проверку полномочий расширение (например, Mobile-Home Authentication).

Приложение D. Применимость расширения Prefix-Lengths

Следует обратить внимание на использование расширения Prefix-Lengths на беспроводных каналах, поскольку беспроводные приемопередатчики не обеспечивают равномерного покрытия. В результате могут возникать ситуации, когда два внешних агента, анонсирующих одинаковый префикс, могут различную связность с потенциальными мобильными узлами. Расширение Prefix-Lengths не следует включать в анонсы, передаваемые агентами в такой конфигурации.

Внешние агенты, использующие разные беспроводные интерфейсы, должны будут взаимодействовать по специальному протоколу для обеспечения идентичного пространственного покрытия и таким образом заявлять о наличии беспроводных интерфейсов из одной подсети. В случае проводных интерфейсов мобильный узел отключающийся от сети и затем подключающийся к другой точке привязки, может отправить новое сообщение Registration Request независимо от того, относится ли новый анонс к той же среде, из которой был получен предыдущий анонс. И, наконец, в областях с высокой плотностью внешних агентов было бы неразумно требовать распространения через протоколы маршрутизации префиксов подсетей, связанных с каждым отдельным беспроводным внешним агентом. Такая стратегия может привести к быстрому истощению доступного для таблиц маршрутизации пространства, необоснованному росту времени, требуемого для обработки таблиц маршрутизации и замедлению принятия решений по выбору маршрутов, если маршруты (которые почти никогда не нужны) будут сохраняться для беспроводных «подсетей».

Приложение E. Вопросы взаимодействия

Этот документ задает пересмотр RFC 2002 в целях повышения уровня взаимодействия за счет устранения содержавшихся в документе неоднозначностей. Реализации, выполняющие проверку подлинности св соответствии с новым, заданным более точно алгоритмом, смогут взаимодействовать с прежними реализациями, которые выполняют то, что первоначально ожидалось для обеспечения аутентификационных данных. Это было основным источником проблем совместимости.

Однако данная спецификация не включает новых функций, использование которых могло бы вызвать проблемы при взаимодействии с ранними реализациями. Все функции, заданные в RFC 2002, будут работать с новыми реализациями, за исключением компрессии V-J [36]. В приведенном ниже списке перечислены возможные проблемы совместимости, с которыми могут столкнуться узлы, соответствующие данной спецификации, при взаимодействии с узлами RFC 2002.

  • Клиент, ожидающий новых обязательных функций (типа реверсных туннелей) от внешнего агента (FA), сохранит возможность взаимодействия, если он принимает во внимание бит T.

  • Мобильные узлы (MN), использующие расширение NAI для идентификации себя, не смогут работать со старыми агентами мобильности.

  • Мобильные узлы, использующие нулевой домашний адрес и предполагающие получить домашний адрес в сообщении Registration Reply, не смогут работать со старыми агентами мобильности.

  • Мобильные узлы, пытающиеся подтвердить свою подлинность без использования расширения Mobile-Home authentication, не смогут зарегистрироваться у своего домашнего агента.

Во всех таких случаях отказоустойчивый и корректно настроенный мобильный узел скорей всего сможет нормально работать, если предпримет разумные действия при получении регистрационного отклика с кодом ошибки, указывающим причину отказа. Например, если мобильный узел передает сообщение Registration Request, которое отвергается по причине указания неприемлемого аутентификационного расширения, этот узел может повторить попытку регистрации с расширением Mobile-home authentication, поскольку внешний и/или домашний агент в этом случае не будет запрашивать дополнительных данных для проверки подлинности.

Приложение F. Отличия от RFC 3344

Ниже перечислены изменения, внесенные в спецификацию с момента публикации RFC 3344. Список отличий от RFC 2002, внесенных при создании RFC 3344 [21], можно найти в RFC 3344.Для изменений, указанных с номерами выпусков, можно найти дополнительную информацию в архивах списка рассылок MIP4.

  • Показано больше определений битов в структуре сообщения Agent Advertisement (параграф 2.1.1). В других спецификациях были определены новые биты анонсов, которые не были представлены в этой спецификации, что приводило к путанице. Включены также выдержки из соответствующих спецификаций.

  • (Выпуск 6) Было изменено поведение домашнего агента чтобы избежать обязательной отправки откликов об ошибках на регистрационные запросы, в которых отказ был вызван тем, что внешний агент не прошел проверку подлинности. Цель заключается в том, чтобы сделать домашний агент более устойчивым к атакам, нацеленным на отказ в обслуживании (DoS9), когда враждебное устройство не предоставляет действительных сообщений Registration Request, а лишь загружает трафиком домашнюю сеть (см. параграф 3.8.2.1).

  • По причине использования неуникальных адресов IPv4 во многих домена у разных мобильных узлов могут оказаться одинаковые домашние адреса. Если эти узлы используют NAI, внешний агент сможет различить их. В параграфы 3.7.1 и 3.7.3.1 был добавлен текст о том, что внешний агент должен использовать NAI, чтобы различать мобильные узлы с совпадающими домашними адресами.

  • (Выпуск 45) Отмечено, что внешнему агенту недопустимо применять расширение Foreign-Home Authentication для запросов дерегистрации мобильных узлов. Также для внешнего агента недопустимо использовать расширение Foreign-Home Authentication, если Care-of Address в Registration Request не соответствует адресу, анонсируемому этим агентом.

  • Указано, что MSA будет применяться внешним и домашним агентом в зависимости от значений, содержащихся в данных сообщения, а не от заголовка IP.

  • (Выпуски 9, 18) Определен новый код ошибки для использования внешним агентом для случая, когда внешний агент не обслуживает мобильный узел как домашний агент. Раньше в таких случаях внешний агент мог использовать код 136.

  • (Выпуск 17) Указано, что в случаях, когда домашний агент не может поддерживать запрошенный ненулевой индивидуальный адрес в поле Home Address сообщения Registration Request, он должен отвергнуть регистрацию с кодом 129 (см. параграф 3.8.3.2).

  • (Выпуск 19) Указана возможность присутствия множества разрешающих проверку полномочий расширений в сообщении Registration Request, но домашний агент должен (каким-либо образом) обеспечить выполнение всех таких проверок (см. параграф 3.8.3.1).

  • (Выпуск 20) Указано, что внешнему агенту не следует менять какие-либо поля сообщения Registration Reply, охватываемые расширением Mobile-Home Authentication, когда он транслирует пакет мобильному узлу.

  • (Выпуск 21) Уточнено, что внешний агент удаляет расширения, которые не предшествуют каким-либо аутентификационным расширениям, а не только Mobile-Home Authentication (параграф 3.7.3.2).

  • (Выпуск 44) Указано, что адрес, анонсируемый внешним агентом в сообщениях Agent Advertisement, является адресом care-of, предлагаемом на сетевом интерфейсе, а не обязательно адресом сетевого интерфейса (параграф 3.7.2.2).

  • (Выпуск 45) В параграфе 3.7.2.1 уточнено, что код 77 применяется только для сообщений Registration Request с отличным от 0 значением Lifetime.

  • Добавлен код ошибки для использования внешним агентом в тех случаях, когда он может обнаружить некорректность поля с адресом домашнего агента.

  • Запрещено использование расширения Foreign-Home Authorization в сообщениях дерегистрации.

  • Исключены некоторые формулировки, связанные с расширениями, разрешающими проверку полномочий.

  • Для согласованности изменен текст о копировании портов UDP.

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

  • Переписан данный раздел.

  • Обновлены цитаты из других документов.

Приложение G. Примеры сообщений

G.1. Пример формата сообщения ICMP Agent Advertisement

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |     Type      |     Code      |           Checksum            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Num Addrs   |Addr Entry Size|           Lifetime            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                       Router Address[1]                       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                      Preference Level[1]                      |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                       Router Address[2]                       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                      Preference Level[2]                      |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                        ....                                   |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Type = 16   |     Length    |      Sequence Number          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |    Registration Lifetime      |R|B|H|F|M|G|r|T|U|X|I|reserved |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                     Care-of Address[1]                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                     Care-of Address[2]                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                         ....                                  |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    :                     Optional  Extensions                      :
    :   ....                ......                      ......      :
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

G.2. Пример формата сообщения Registration Request

Ниже показан пример заголовка UDP, за которым следуют поля Mobile IP.

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |     Type = 1  |S|B|D|M|G|r|T|x|          Lifetime             |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                          Home Address                         |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                           Home Agent                          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                        Care-of Address                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    +                         Identification                        +
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                Optional Non-Auth Extensions for HA ...        |
    |                     (переменный размер)                       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Type = 32   |      Length   |           SPI                 |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          SPI (cont.)          |                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
    :         MN-HA Authenticator (переменный размер)               :
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    :           Optional  Non-Auth Extensions for FA .........
    :           Optional  MN-FA  Authentication Extension...
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

G.3. Пример формата сообщения Registration Reply

Ниже показан заголовок UDP и следующие за ним поля Mobile IP.

     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Type = 3    |     Code      |           Lifetime            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                          Home Address                         |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                           Home Agent                          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    +                         Identification                        +
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                 Optional  HA  Non-Auth Extensions ...         |
    |                     (переменный размер)                       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Type = 32   |      Length   |           SPI                 |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          SPI (продолж.)       |                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
    :         MN-HA Authenticator (переменный размер)               :
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    :           Опциональные расширения, используемые FA .......
    :           Опциональное расширение MN-FA Authentication ...
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Адрес автора

Charles E. Perkins (редактор)

WiChorus Inc.

3590 N. 1st Street, Suite 300

San Jose, CA 95134

USA

EMail: charliep@computer.org

Перевод на русский язык

Николай Малых

nmalykh@gmail.com

1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

3Type-Length-Value — тип-размер-значение.

4User Datagram Protocol — протокол пользовательских дейтаграмм.

5Security Parameter Index.

6Network Time Protocol — протокол сетевого времени.

7Point-to-Point-Protocol — протокол для соединений «точка-точка».

8Internet Protocol Control Protocol — протокол управления IP.

9Denial of Service.

Рубрика: RFC | Комментарии к записи RFC 5944 IP Mobility Support for IPv4, Revised отключены

RFC 6030 Portable Symmetric Key Container (PSKC)

Internet Engineering Task Force (IETF)                          P. Hoyer
Request for Comments: 6030                                 ActivIdentity
Category: Standards Track                                         M. Pei
ISSN: 2070-1721                                                 VeriSign
                                                              S. Machani
                                                              Diversinet
                                                            October 2010

Переносимый контейнер с симметричным ключом (PSKC)

Portable Symmetric Key Container (PSKC)

PDF

Аннотация

Этот документ задает формат симметричного ключа для транспортировки и обеспечения симметричными ключами криптомодулей различных типов. Примерами могут служить разделяемые секреты с одноразовым паролем (OTP1) или симметричные ключи для устройств со строгой аутентификацией. Стандартный формат транспортировки ключей обеспечивает предприятиям возможность внедрения лучших в своем классе решений от разных производителей в рамках одной инфраструктуры.

Статус документа

Этот документ содержит проект стандарта Internet (Internet Standards Track).

Документ является результатом работы IETF и выражает согласованное мнение сообщества IETF. Документ был представлен на публичное рассмотрение и одобрен для публикации IESG. Дополнительная информация о стандартах Internet доступна в разделе 2 RFC 5741.

Информацию о текущем статусе документа, обнаруженных ошибках и способах обратной связи можно получить, воспользовавшись ссылкой http://www.rfc-editor.org/info/rfc6030.

Авторские права

Авторские права ((c) 2010) принадлежат IETF Trust и лицам, указанным в числе авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

По мере расширения использования систем на основе симметричных ключей типа шифрования данных или строгой проверки подлинности и, в частности, систем на основе одноразовых паролей (OTP2) и механизмов «запрос-отклик» (CR)3 все более важным становится взаимодействие систем разных производителей и стандартизация форматов для импорта и экспорта (представления) симметричный ключей. Например, производители серверов аутентификации и поставщики услуг традиционно используют фирменные форматы для импорта и экспорта таких ключей в своих системах, что существенно осложняет использование идентификаторов (token) двух разных производителей.

В этом документе определяется стандартный контейнер для ключа на основе XML, называемый переносимым контейнером симметричных ключей (PSKC4), для переноса симметричных ключей и относящихся к ним метаданных. Документ также задает информационные элементы, которые требуются для конкретного применения симметричных ключей типа начального счетчика в алгоритме HOTP5 [HOTP]. В документе также создан реестр IANA для профилей алгоритмов, в котором могут быть записаны алгоритмы, их метаданные и профили передачи PSKC для централизованных и стандартизованных ссылок на них.

1.1. Ключевые слова

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе должны интерпретироваться в соответствии с документом [RFC2119].

1.2. Поддержка версий

Обеспечение выполняется с использованием синтаксиса явного указания номера версии. В настоящее время поддерживается только версия «1.0».

Схема нумерации версий PSKC имеет вид «<major>.<minor>». Значения старшего и младшего номеров должны трактоваться, как раздельные целые числа, и каждое из этих чисел может инкрементироваться6 более, чем на 1. Таким образом PSKC 2.4 будет иметь более низкую (младшую) версию по сравнению с PSKC 2.13, а та, в свою очередь, будет ниже PSKC 12.3. Ведущие нули (например, PSKC 6.01) должны игнорироваться получателями, а установка их недопустима.

Значение старшего номера версии следует увеличивать только для случаев, когда формат сообщений (например, структура элемента) изменен столь существенно, что старые версии не могут взаимодействовать с новой версией. Значение младшего номера версии показывает наличие новых возможностей и должно игнорироваться объектами с меньшим значением младшего номера версии, но использоваться для информационных целей объектами с большим значением младшего номера версии протокола.

1.3. Идентификаторы пространства имен

В этом документе используются идентификаторы ресурсов URI7 [RFC3986] для обозначения ресурсов, алгоритмов и семантики.

1.3.1. Определенные здесь идентификаторы

Пространство имен XML [XMLNS] URI для версии 1.0 протокола PSKC представляет собой:

   urn:ietf:params:xml:ns:keyprov:pskc

Определенные здесь ссылки на элементы схемы PSKC используют префикс pskc (определен, как pskc=«urn:ietf:params:xml:ns:keyprov:pskc»). В реализациях рекомендуется использовать данное пространство имен.

1.3.3. Ссылочные идентификаторы

Кроме того, представленный в документе синтаксис PSKC использует идентификаторы алгоритмов, определенные в пространстве имен XML Signature [XMLDSIG]:

   xmlns:ds="http://www.w3.org/2000/09/xmldsig#"

Ссылки на идентификаторы алгоритмов в пространстве имен XML Signature используют префикс ds.

PSKC также опирается на идентификаторы алгоритмов и элементы, определенные в пространстве имен XML Encryption [XMLENC]:

   xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"

Ссылки на пространство имен XML Encryption используют префикс xenc.

При защите транспортировки ключей с использованием основанного на парольной фразе ключа PSKC опирается также на производные элементы ключей, определенные в пространстве имен XML Encryption версии 1.1 [XMLENC11]:

   xmlns:xenc11="http://www.w3.org/2009/xmlenc11#"

Ссылки на пространство имен XML Encryption Version 1.1 используют префикс xenc11.

При защите транспортировки ключей с использованием основанного на парольной фразе ключа PSKC опирается также на идентификаторы алгоритмов и элементы, определенные в пространстве имен PKCS #5 [PKCS5]:

   xmlns:pkcs5="http://www.rsasecurity.com/rsalabs/pkcs/schemas/pkcs-5v2-0#"

Ссылки на пространство имен PKCS #5 используют префикс pkcs5.

1.3.3. Ссылочные идентификаторы

Кроме того, представленный в документе синтаксис DSKPP использует идентификаторы алгоритмов, определенные в пространстве имен XML Signature [XMLDSIG]:

   xmlns:ds="http://www.w3.org/2000/09/xmldsig#"

Ссылки на идентификаторы алгоритмов в пространстве имен XML Signature используют префикс ds.

2. Терминология

Примечание. В последующих параграфах этого документа обязательные элементы и атрибуты XML выделены шрифтом. Необязательные элементы и атрибуты явно не выделяются, т. е. атрибуты или элементы, не помеченные как обязательные, являются опциональными.

3. Обзор переносимых контейнеров и связей между ними

Переносимый контейнер базируется на определении схемы XML и содержит перечисленные ниже основные элементы.

  1. KeyContainer — представление контейнера, содержащее множество элементов KeyPackage. Пригодный контейнер должен включать хотя бы один элемент KeyPackage.

  2. KeyPackage — представление «упаковки», содержащей не более одного ключа и связанной с его представлением конечной точки (endpoint) или конечной точки текущего использования типа физического или виртуального устройства и конкретного CryptoModule.

  3. DeviceInfo — представление информации об устройстве и критерии уникальной идентификации устройства.

  4. CryptoModuleInfo — представление информации о CryptoModule, где ключи содержатся или куда они представляются.

  5. Key — представление переносимого или представляемого ключа.

  6. Data — представление списка метаданных, связанных с ключом, где имя элемента является названием метаданных, а связанное с именем значение является зашифрованным (например, для элемента данных <Secret>) или открытым (например, для элемента данных <Counter>).

На рисунке 1 представлен верхний уровень структуры элементов данных PSKC.

-----------------
| KeyContainer  |
|---------------|
| EncryptionKey |
| Signature     |
| ...           |
-----------------
        |
        |
       /|\ 1..n
----------------        ----------------
| KeyPackage   |    0..1| DeviceInfo   |
|--------------|--------|--------------|
|              |--      | SerialNo     |
----------------  |     | Manufacturer |
        |         |     | ....         |
        |         |     ----------------
       /|\ 0..1   |
----------------  |     --------------------
| Key          |  | 0..1| CryptoModuleInfo |
|--------------|   -----|------------------|
| Id           |        | Id               |
| Algorithm    |        |....              |
| UserId       |        --------------------
| Policy       |
| ....         |
----------------
        |
        |
       /|\ 0..n
    --------------------------------------- -  -
    |                     |              |
    ------------------  ----------------  -------- - -
| Data:Secret    |  | Data:Counter |  | Data:other
|----------------|  |--------------|  |-- - -
| EncryptedValue |  | PlainValue   |
| ValueMAC       |  ----------------
------------------

Рисунок 1. Связи между элементами данных PSKC.


В последующих параграфах подробно описаны все объекты, а также элементы и атрибуты связанных с ними схем XML.

4. Элемент <KeyContainer> — основы

В своей базовой форме документ PSKC использует элемент верхнего уровня <KeyContainer> и один элемент <KeyPackage> для передачи информации о ключе.

Ниже приведен пример документа PSKC для описания структуры элемента <KeyContainer> и его дочерних элементов.

<?xml version="1.0" encoding="UTF-8"?>
<KeyContainer Version="1.0"
    Id="exampleID1"
    xmlns="urn:ietf:params:xml:ns:keyprov:pskc">
    <KeyPackage>
        <Key Id="12345678"
            Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
            <Issuer>Issuer-A</Issuer>
            <Data>
                <Secret>
                    <PlainValue>MTIzNA==
                    </PlainValue>
                </Secret>
            </Data>
        </Key>
    </KeyPackage>
</KeyContainer>

Рисунок 2. Пример базового контейнера с ключом PSKC.


Значения атрибутов элемента <KeyContainer> описаны ниже.

Version

Служит для идентификации номера версии схемы PSKC. Данная спецификация определяет начальную версию (1.0) схемы PSKC. Этот атрибут должен присутствовать.

Id

Уникальный идентификатор контейнера, помогающий определить конкретный контейнер в случае наличия множества контейнеров в большом документе XML.

4.1. <Key> — вложенный ключевой материал и связанные с ключом данные

Как минимум должны включаться описанные ниже атрибуты элемента <Key>.

Id

Этот атрибут передает уникальный идентификатор симметричного ключа в контексте обмена ключами между двумя сторонами. Это означает, что при использовании PSKC во множестве взаимодействий между передающей и приемной стороной, использующих разные контейнеры, ссылающиеся на одни ключи, атрибут Id в <Key> должен содержать одно значение (например, после начального предоставления если система хочет обновить значения метаданных ключа в другой системе, значение атрибута Id в <Key>, где метаданные будут обновляться, должно совпадать с представленным изначально атрибутом Id). Идентификатор определен как строка алфавитно-цифровых символов.

Algorithm

Этот атрибут содержит уникальный идентификатор профиля алгоритма PSKC. Профиль связывает конкретную семантику с элементами и атрибутами, содержащимися в элементе <Key>. Данный документ описывает профили для алгоритмов открытых стандартов в разделе 10. Дополнительные профили определены в информационном документе [PSKC-ALGORITHM-PROFILES].

Элемент <Key> имеет множество необязательных дочерних элементов. Первоначальный набор описан ниже.

<Issuer>

Этот элемент представляет имя выпустившей сертификат стороны. Например, банк Foobar Bank, Inc., выпускающий маркеры для своих пользователей, может установить для элемента значение.

<FriendlyName>

Читаемое человеком имя для секретного ключа. Этот элемент служит лишь для информирования и может задаваться строками на разных языках, поэтому ему следует иметь атрибут xml:lang=»xx», где xx — идентификатор языка, заданный в [RFC5646]. Если атрибут xml:lang не задан, реализации должны предполагать английский язык, как при указании xml:lang=»en».

<AlgorithmParameters>

Этот элемент содержит параметры, которые влияют на результат криптографических расчетов, например, отсечка и формат отклика в алгоритмах OTP и CR. Более подробное описание дано в параграфе 4.3.4.

<Data>

Этот элемент содержит данные о ключе и связанные с ним данные. Ниже перечислены дочерние элементы.

<Secret>

Этот элемент содержит двоичное представление ключа. Форматы кодирования описаны в параграфе 4.2.

<Counter>

Этот элемент содержит счетчик событий для основанных на событиях алгоритмов OTP.

<Time>

Этот элемент указывает время для основанных на времени алгоритмов OTP (при использовании временных интервалов элемент содержит число интервалов от заданной точки старта, обычно зависящее от алгоритма).

<TimeInterval>

Этот элемент указывает интервал времени (в секундах) для основанных на времени алгоритмов OTP (типовое значение 30).

<TimeDrift>

Этот элемент указывает сдвиг (drift) часов устройства для основанных на времени алгоритмов OTP. Целочисленное значение (положительный или отрицательный сдвиг) указывает число временных интервалов, которое сервер проверки установил для сдвига часов устройства после последней успешной аутентификации. Например, если при последней успешной аутентификации было установлено время устройства в 8 интервалов от конкретной стартовой даты, а сервер проверки определил значение в 9, серверу следует записать сдвиг -1.

Все элементы, приведенные выше (и те, которые будут определены впредь), следуют простой структуре в том смысле, что они должны поддерживать дочерние элементы для передачи значений данных в открытом и шифрованном виде.

Plaintext

Элемент <PlainValue> содержит открытое значение, которое типизовано, например, xs:integer.

Encrypted

Элемент <EncryptedValue> содержит зашифрованное значение.

ValueMAC

Элемент <ValueMAC> заполняется кодом аутентификации сообщения (MAC8), создаваемым из шифрованного значения в том случае, если алгоритм шифрования не поддерживает проверки целостности. Пример на рисунке 2 показывает использование элемента <Data> с двумя дочерними элементами <Secret> и <Counter>, которые содержат открытые значения в дочерних элементах <PlainValue>.

4.2. Представление ключа

Две стороны, получившие одно значение ключа (OCTET STRING), что приводит к декодированию xs:base64Binary внутри элементов <PlainValue> или <EncryptedValue>, должны использовать ключ одним способом для обеспечения возможности взаимодействия. Для проверки этого требуется определить соответствие между OCTET STRING и нотацией в описании стандартного алгоритма, определяющего применяемый ключ. В последующих параграфах описано соответствие между алгоритмом AES [FIPS197] и TDEA9 (или Triple DES) [SP800-67]. Если для алгоритма не указано иное, кодирование OCTET STRING должно следовать AES Key Value Encoding.

4.2.1. Представление ключа AES

В параграфе 5.2 [FIPS197] (Key Expansion) в качестве входного ключа применяется массив байтов, индексируемых с 0. Первому октету OCTET STRING нужно стать байтом ключа с AES, помеченным индексом 0 в [FIPS197], последующим октетам OCTET STRING нужно стать байтами в AES в порядке роста индекса.

Корректный разбор и загрузку ключа из содержимого OCTET STRING для AES нужно определять с использованием показанного ниже значения элемента <PlainValue> (binaryBase64-encoded) для создания и сопоставления тестовых векторов [FIPS197] (приложение A) для AES.

   Cipher Key: 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c

   ...
    <PlainValue>K34VFiiu0qar9xWICc9PPA==</PlainValue>
   ...

4.2.2. Представление ключа Triple-DES

Ключ Triple-DES состоит из трех ключей для криптографической машины (Key1, Key2, Key3), имеющих размер по 64 бита (56 битов ключа и 8 битов четности). Эти три ключа вместе называют пакетом ключей (key bundle) [SP800-67]. Пакет может реализовать два или три независимых ключа. При использовании лишь двух ключей (Triple DES с двумя ключами) Key1 и Key3 имеют одинаковое значение.

Каждый ключ пакета Triple-DES извлекается в расписание ключей по процедуре, определенной в приложении A к [SP800-67]. Эта процедура нумерует биты ключей от 1 до 64,присваивая номер 1 левому (старшему) биту (MSB). В первый октет OCTET STRING нужно помещать биты 1 — 8 ключа Key1 (бит 1 является старшим — MSB). Во второй октет OCTET STRING нужно помещать биты 9 — 16 из Key1 и т. д. До финального октета OCTET STRING, в который нужно помещать биты 57 — 64 из Key3 (или Key2 для Triple DES с двумя ключами).

Подходящий анализ (разбор) и загрузку содержимого OCTET STRING для Triple DES нужно определять с использованием элемента <PlainValue> (кодирование binaryBase64) для генерации и сопоставления тестовых векторов извлечения ключа из приложения B к [SP800-67].

   Key1 = 0123456789ABCDEF
   Key2 = 23456789ABCDEF01
   Key3 = 456789ABCDEF0123

   ...
    <PlainValue>ASNFZ4mrze8jRWeJq83vAUVniavN7wEj</PlainValue>
   ...

4.3. Передача дополнительной информации

Документ PSKC может содержать дополнительную информацию, относящуюся к идентификации устройства, криптографического модуля и пользователя, а также параметры для использования с алгоритмами OTP и CR. Пример на рисунке 3 служит иллюстрацией для последующих параграфов.

<?xml version="1.0" encoding="UTF-8"?>
<KeyContainer Version="1.0"
    Id="exampleID1"
    xmlns="urn:ietf:params:xml:ns:keyprov:pskc">
    <KeyPackage>
        <DeviceInfo>
            <Manufacturer>Manufacturer</Manufacturer>
            <SerialNo>987654321</SerialNo>
            <UserId>DC=example-bank,DC=net</UserId>
        </DeviceInfo>
        <CryptoModuleInfo>
            <Id>CM_ID_001</Id>
        </CryptoModuleInfo>
        <Key Id="12345678"
            Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
            <Issuer>Issuer</Issuer>
            <AlgorithmParameters>
                <ResponseFormat Length="8" Encoding="DECIMAL"/>
            </AlgorithmParameters>
            <Data>
                <Secret>
                    <PlainValue>MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=
                    </PlainValue>
                </Secret>
                <Counter>
                    <PlainValue>0</PlainValue>
                </Counter>
            </Data>
            <UserId>UID=jsmith,DC=example-bank,DC=net</UserId>
        </Key>
    </KeyPackage>
</KeyContainer>

Рисунок 3. Пример контейнера PSKC Key с дополнительными данными.


4.3.1. Элемент <DeviceInfo> — уникальная идентификация устройства

Элемент <DeviceInfo> однозначно указывает устройство, для которого предоставляется <KeyPackage>. Поскольку устройства могут иметь разный форм-фактор (например, аппаратный маркер, смарт-карта, программный маркер в мобильном телефоне или ПК), этот элемент позволяет применять различные комбинации дочерних элементов. При использовании комбинации она должна обеспечивать однозначное указание устройства. Например, для аппаратных маркеров комбинация элементов <SerialNo> и <Manufacturer> указывает устройство однозначно, а отдельный элемент <SerialNo> не обеспечивает, поскольку серийные номера могут совпадать у разных производителей (аналогично для Issuer Distinguished Name и серийного номера сертификата).

Дочерние элементы <DeviceInfo> описаны ниже.

<Manufacturer>

Этот элемент указывает производителя устройства. Значения для <Manufacturer> должны браться из префиксов [OATHMAN] (левая колонка) или реестра IANA Private Enterprise Number Registry [IANAPENREG] (Organization). При использовании [OATHMAN] должен указываться префикс «oath.» (например, «oath.<значение из [OATHMAN]>»), а при использовании [IANAPENREG] должен указываться префикс «iana.» (например «iana.<Organization из [IANAPENREG]>»).

<SerialNo>

Этот элемент указывает серийный номер устройства.

<Model>

Этот элемент описывает модель устройства (например, one-button-HOTP-token-V1).

<IssueNo>

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

<DeviceBinding>

Этот элемент позволяет предоставляющему серверу гарантировать, что ключ будет загружен в устройство, для которого был одобрен запрос на предоставления. Устройство связывается с запросом по идентификатору (например, IMEI10 для мобильного телефона) или классу идентификаторов (например, устройства, для которых ключи защищены TPM11).

<StartDate> и <ExpiryDate>

Эти два элемента указывают срок действия устройства (например, для платежной карты, когда номер выпуска на карте не напечатан). Даты должны указываться в формате dateTime с «каноническим представлением» [W3C.REC-xmlschema-2-20041028]. Реализациям не следует полагаться на точность указания времени лучше миллисекунды и недопустимо создавать значения с «високосными» секундами. Ключи, находящиеся на устройстве, следует применять только в интервале времени между <StartDate> и <ExpiryDate>. Отметим, что учет дат для ключей возможен лишь на сервере проверки, поскольку некоторые устройства (например, смарт-карты) не имеют встроенных часов. Поэтому системам не следует полагаться на устройство для контроля срока действия.

В зависимости от типа устройства некоторые дочерние элементы <DeviceInfo> должны включаться для отождествления устройства. Этот документ не рассматривает различные типы устройств и поэтому не задает обязательные элементы.

4.3.2. Элемент <CryptoModuleInfo> — идентификация криптомодуля

Элемент <CryptoModuleInfo> указывает криптографический модуль, для которого предоставлены или будут предоставлены симметричные ключи. Это позволяет указать конкретные варианты в тех случаях, когда устройство может содержать более одного криптомодуля (например, ПК с TPM и подключенным маркером).

Элемент <CryptoModuleInfo> имеет один дочерний элемент, который должен включаться всегда.

<Id>

Этот элемент содержит уникальный идентификатор для CryptoModule и зависит от реализации, поэтому помогает лишь для идентификации конкретного CryptoModule которому ключ предоставлен или будет предоставлен.

4.3.3. Элемент <UserId> — идентификация пользователя

Элемент <UserId> указывает пользователя отличительного имени, как определено в [RFC4514] (например, UID=jsmith,DC=example,DC=net).

Хотя синтаксис идентификатора определен, с этим элементом не связано конкретной семантики, т. е. нет проверки применения этого ключа лишь определенным пользователем. Поэтому элемент служит лишь для информации.

Этот элемент может указываться в двух местах, а именно в качестве дочернего элемента <Key>, где он указывает связанного с ключом пользователя, или как дочерний элемент <DeviceInfo> для указания пользователя, с которым связано устройство.

4.3.4. Элемент <AlgorithmParameters> — дополнительные данные для OTP и CR

Элемент <AlgorithmParameters> является дочерним элементом <Key> и этот документ определяет 3 дочерних элемента: <Suite>, <ChallengeFormat>, <ResponseFormat>.

<Suite>

Необязательный элемент <Suite> определяет дополнительные характеристики используемого алгоритма, зависимые от него. Например, для алгоритма на основе OTP HMAC (Hashed MAC) этот элемент может указывать «силу» применяемого алгоритма хэширования (SHA1, SHA256 и т. п.). Точная семантика значения для каждого профиля алгоритма рассматривается в разделе 10.

<ChallengeFormat>

Элемент <ChallengeFormat> определяет характеристики запроса (challenge) в сценарии использования CR, с помощью которых определяются перечисленные ниже атрибуты.

‘Encoding’

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

DECIMAL — только цифры.

HEXADECIMAL — шестнадцатеричный отклик.

ALPHANUMERIC — все буквы и цифры с учетом регистра.

BASE64 — кодирование Base-64 в соответствии с разделом 4 [RFC4648].

BINARY — двоичные данные.

‘CheckDigits’

Этот атрибут показывает, нужно ли устройству проверять добавленную в конце запроса контрольную цифру Luhn, как указано в [ISOIEC7812]. Атрибут применим только при кодировании DECIMAL. Значение TRUE указывает, что устройство должно проверить контрольную цифру Luhn в конце запроса, FALSE говорит, что устройство не будет проверять контрольную цифру Luhn.

‘Min’

Этот атрибут определяет минимальный размер запроса (challenge), воспринимаемого устройством и режиме CR, и должен быть включен. При кодировании DECIMAL, HEXADECIMAL или ALPHANUMERIC это значение указывает минимальное число символов, при кодировании BASE64 или ‘BINARY — минимальное число октетов кодированного значения.

‘Max’

Этот атрибут определяет максимальный размер запроса (challenge), воспринимаемого устройством и режиме CR, и должен быть включен. При кодировании DECIMAL, HEXADECIMAL или ALPHANUMERIC это значение указывает минимальное число символов, при кодировании BASE64 или ‘BINARY — максимальное число октетов кодированного значения.

<ResponseFormat>

Элемент <ResponseFormat> определяет характеристики результата расчетов и формат OTP или отклика на запрос. Если ключ является значением PIN, этот элемент содержит формат самого PIN (например, DECIMAL размером 4 для PIN из 4 цифр). Определенные для элемента атрибуты перечислены ниже.

‘Encoding’

Этот атрибут должен быть включен и указывает кодирование отклика, создаваемого устройством. Атрибут должен присутствовать и иметь значение DECIMAL, HEXADECIMAL, ALPHANUMERIC, BASE64 или BINARY.

‘CheckDigits’

Этот атрибут показывает, нужно ли устройству добавлять в конце отклика контрольную цифру Luhn, как указано в [ISOIEC7812]. Атрибут примени только при кодировании DECIMAL. Значение TRUE указывает, что устройство должно добавить контрольную цифру Luhn в конце отклика, FALSE говорит, что устройство не будет добавлять контрольную цифру Luhn.

‘Length’

Этот атрибут определяет размер отклика, создаваемого устройством, и должен присутствовать. При кодировании DECIMAL, HEXADECIMAL или ALPHANUMERIC это значение указывает число символов, при кодировании BASE64 или ‘BINARY — число октетов кодированного значения.

4.4. Передача значений для вывода ключей

Элемент <KeyProfileId>, являющийся дочерним для элемента <Key>, передает уникальный идентификатор, применяемый между передающей и приемной стороной для организации набора значений атрибутов ключа, которые не передаются внутри контейнера, но могут согласовываться между сторонами по отдельному каналу (out of band). Этот элемент будет представлять уникальную ссылку на набор значений атрибутов ключей (например, идентификатор профиля персонализации смарт-карты, связанный с конкретными значениями атрибутов, присутствующими в приложении смарт-карты и влияющими на расчет отклика).

<?xml version="1.0" encoding="UTF-8"?>
<KeyContainer Version="1.0" Id="exampleID1"
     xmlns="urn:ietf:params:xml:ns:keyprov:pskc">
    <KeyPackage>
        <DeviceInfo>
            <Manufacturer>Manufacturer</Manufacturer>
            <SerialNo>987654321</SerialNo>
        </DeviceInfo>
        <CryptoModuleInfo>
            <Id>CM_ID_001</Id>
        </CryptoModuleInfo>
        <Key Id="12345678"
         Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
            <Issuer>Issuer</Issuer>
            <AlgorithmParameters>
                <ResponseFormat Length="8" Encoding="DECIMAL"/>
            </AlgorithmParameters>
            <KeyProfileId>keyProfile1</KeyProfileId>
            <KeyReference>MasterKeyLabel
            </KeyReference>
            <Data>
                <Counter>
                    <PlainValue>0</PlainValue>
                </Counter>
            </Data>
            <Policy>
                <KeyUsage>OTP</KeyUsage>
            </Policy>
        </Key>
    </KeyPackage>
</KeyContainer>

Рисунок 4. Пример документа PSKC, передающего ключ HOTP в Key Derivation.


Например, в случае MasterCard CAP12 [CAP] передающая и приемная стороны согласуют, что KeyProfileId=’1′ представляет некий набор значений (например, флаг Internet Authentication Flag — IAF имеет определенное значение). В процессе передачи <KeyContainer> эти значения не будут передаваться как атрибуты ключа и будет включена лишь ссылка через элемент <KeyProfileId> на конкретный профиль, согласованный ранее (в данном случае ‘1’). Принимающая сторона затем свяжет все относящиеся к делу атрибуты из профиля, которые были согласованы по отдельному каналу, с импортированными ключами. Такой подход часто применяется между производством, управляемым компанией A, и службой проверки, управляемой компанией B, для предотвращения повторяющейся передачи одного и того же набора значений атрибутов ключа.

Элемент <KeyReference> содержит ссылку на внешний ключ для использования схемой вывода ключа. В этом случае родительский элемент <Key> не будет включать субэлемент <Secret> в <Data>, где передается значение (секретного) ключа, а указывается лишь ссылка на внешний первичный ключ (например, метка ключа PKCS #11).

Значение ключа будет выводиться с использованием элемента <SerialNo>, значений, согласованных между передающей и приемной стороной, указанных <KeyProfile> keyProfile1, и согласованного извне ключа, указанного меткой MasterKeyLabel.

5. Политика ключа

Этот раздел иллюстрирует функциональность элемента <Policy> в PSKC, позволяющего присоединить правила использования ключа и защиты PIN к определенному ключу и связанным с ним метаданным. Этот элемент является дочерним для элемента <Key> .

Если <Policy> содержит дочерние элементы или значение в элементах/атрибутах, которые непонятны получателю документа PSKC, получатель должен считать, что использование этого ключа не разрешено. Это гарантирует , что непонимание тех или иных расширений не приведет к непредусмотренному использованию ключа.

Начнем рассмотрение с примера, расширяющего пример на рисунке 3.

<?xml version="1.0" encoding="UTF-8"?>
<KeyContainer
    Version="1.0" Id="exampleID1"
    xmlns="urn:ietf:params:xml:ns:keyprov:pskc">
    <KeyPackage>
        <DeviceInfo>
            <Manufacturer>Manufacturer</Manufacturer>
            <SerialNo>987654321</SerialNo>
        </DeviceInfo>
        <CryptoModuleInfo>
            <Id>CM_ID_001</Id>
        </CryptoModuleInfo>
        <Key Id="12345678"
            Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
            <Issuer>Issuer</Issuer>
            <AlgorithmParameters>
                <ResponseFormat Length="8" Encoding="DECIMAL"/>
            </AlgorithmParameters>
            <Data>
                <Secret>
                    <PlainValue>MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=</PlainValue>
                </Secret>
                <Counter>
                    <PlainValue>0</PlainValue>
                </Counter>
            </Data>
            <Policy>
                <PINPolicy MinLength="4" MaxLength="4"
                    PINKeyId="123456781" PINEncoding="DECIMAL" PINUsageMode="Local"/>
                <KeyUsage>OTP</KeyUsage>
            </Policy>
        </Key>
    </KeyPackage>
    <KeyPackage>
        <DeviceInfo>
            <Manufacturer>Manufacturer</Manufacturer>
            <SerialNo>987654321</SerialNo>
        </DeviceInfo>
        <CryptoModuleInfo>
            <Id>CM_ID_001</Id>
        </CryptoModuleInfo>
        <Key Id="123456781"
            Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:pin">
            <Issuer>Issuer</Issuer>
            <AlgorithmParameters>
                <ResponseFormat Length="4" Encoding="DECIMAL"/>
            </AlgorithmParameters>
            <Data>
                <Secret>
                    <PlainValue>MTIzNA==</PlainValue>
                </Secret>
            </Data>
        </Key>
    </KeyPackage>
</KeyContainer>

Рисунок 5. Нешифрованный HOTP Secret Key, защищенный PIN.


Этот документ определяет два дочерних элемента для <Policy>, описанных ниже.

<StartDate> и <ExpiryDate>

Эти два элемента указывают срок действия ключа. Это должно гарантировать, что ключ будет применяться лишь в интервале между этими датами (включительно). Даты должны указываться в формате dateTime с «каноническим представлением» [W3C.REC-xmlschema-2-20041028]. Реализациям не следует полагаться на точность указания времени лучше миллисекунды и недопустимо создавать значения с «високосными» секундами. При отсутствии этого элемента начальным моментом считается текущее время.

<NumberOfTransactions>

Значение этого элемента задает максимальное число случаев использования ключа приложением после получения документа PSKC. При отсутствии элемента ограничений на число применений ключа на задается.

<KeyUsage>

Элемент <KeyUsage> задает ограничения на использование ключа, которым должен следовать получатель документа PSKC. Этот документ регистрирует приведенные ниже маркеры.

OTP

Ключ должен применяться только для создания OTP.

CR

Ключ должен применяться только для Challenge/Response.

Encrypt

Ключ должен применяться только для шифрования.

Integrity

Ключ должен применяться только для генерации дайджестов сообщений с целью защиты целостности или аутентификации.

Verify

Ключ должен применяться только для проверки дайджестов, служащих целям защиты целостности или аутентификации (т. е. обратно по отношению к Integrity).

Unlock

Ключ должен применяться только для инверсных Challenge/Response в случаях, когда пользователь заблокировал устройство в результате многократного ввода некорректных значений PIN (для устройств с поддержкой ввода PIN).

Decrypt

Ключ должен применяться только для расшифровки.

KeyWrap

Ключ должен применяться только для «заворачивания» ключей.

Unwrap

Ключ должен применяться только для «разворачивания» ключей.

Derive

Ключ должен применяться только с функцией вывода ключей для создания нового ключа (см. также параграф 8.2.4 в [NIST800-57]).

Generate

Ключ должен применяться только для создания нового ключа на основе случайного значения и прежнего ключа (см. также параграф 8.1.5.2.1 в [NIST800-57]).

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

<PINPolicy>

Элемент <PINPolicy> позволяет связать с ключом политику использования PIN. Атрибуты элемента указаны ниже.

‘PINKeyId’

Этот атрибут передает уникальный идентификатор элемента <Key>, содержащегося в этом <KeyContainer>, который указывает значение PIN для защиты ключа.

‘PINUsageMode’

Этот обязательный атрибут указывает способ применения PIN при использовании ключа.

Local

PIN проверяется локально на устройстве до разрешения использовать ключ в работе алгоритма.

Prepend

PIN помещается перед откликом алгоритма (prepend), поэтому значение PIN должно проверяться любой стороной, проверяющей отклик.

Append

PIN помещается после отклика алгоритма (append), поэтому значение PIN должно проверяться любой стороной, проверяющей отклик.

Algorithmic

PIN используется как часть расчетов алгоритма.

‘MaxFailedAttempts’

Этот атрибут задает максимальное число неудачных попыток ввести PIN, прежде чем использование ключа станет недопустимо (разумными значениями являются положительные целые числа от 2 до 10).

‘MinLength’

Этот атрибут задает минимальный размер PIN, который может быть установлен для защиты связанного ключа. Недопустимо задавать PIN, размер которого меньше этого значения. Если атрибут PINFormat имеет значение DECIMAL, HEXADECIMAL или ALPHANUMERIC, этот атрибут задает число символов, а для форматов BASE64 и BINARY — число байтов кодированного значения.

‘MaxLength’

Этот атрибут задает максимальный размер PIN, который может быть установлен для защиты связанного ключа. Недопустимо задавать PIN, размер которого больше этого значения. Если атрибут PINFormat имеет значение DECIMAL, HEXADECIMAL или ALPHANUMERIC, этот атрибут задает число символов, а для форматов BASE64 и BINARY — число байтов кодированного значения.

‘PINEncoding’

Этот атрибут задает кодирование PIN и должен принимать одно из значений DECIMAL, HEXADECIMAL, ALPHANUMERIC, BASE64 или BINARY.

При PinUsageMode = Local ограничения, заданные в MaxFailedAttempts, MinLength, MaxLength и PINEncoding, должно применять устройство, в остальных случаях они должны применяться на стороне сервера.

5.1. Определение алгоритма PIN

Алгоритм PIN определяется как

   boolean = comparePIN(K,P)

где

K — сохраненное симметричное свидетельство (PIN) в двоичном формате;

P — предложенное для сравнения значение PIN в двоичном формате.

Функция comparePIN выполняет непосредственное сравнение октетов K и P. Такое сравнение должно давать TRUE (совпадение), когда размеры K и P одинаковы, а каждый октет K совпадает с соответствующим октетом P.

6. Методы защиты ключей

С описанной выше функциональностью информация, связанная с ключами, передается в открытом виде. С помощью элемента <EncryptionKey>, который является дочерним для <KeyContainer>, можно зашифровать ключи и связанную с ними информацию. Уровень шифрования применяется к значениям отдельных элементов, а используемый алгоритм должен совпадать для всех шифруемых элементов. Ключи защищаются с использованием заранее известных общих ключей (pre-shared), ключей на основе парольной фразы (passphrase-based) и асимметричных ключей. При использовании алгоритмов шифрования с вектором инициализации (IV13), например, AES-128-CBC, должно создаваться случайное значение IV для каждого шифруемого элемента и этот вектор должен помещаться перед зашифрованным значением (prepend), как указано в [XMLENC].

6.1. Шифрование на основе заранее распределенных ключей

Рисунок 6 иллюстрирует шифрование элемента <Secret> с применением AES-128-CBC и заполнения PKCS #5. Открытое значение <Secret> равно 3132333435363738393031323334353637383930. Заранее известных общий секрет имеет значение Pre-shared-key, как указано в элементе <KeyName> (дочерний для <EncryptionKey>). Используемый ключ шифрования имеет значение 12345678901234567890123456789012.

IV для MAC имеет значение 11223344556677889900112233445566, для HOTP — 000102030405060708090a0b0c0d0e0f.

 <?xml version="1.0" encoding="UTF-8"?>
 <KeyContainer Version="1.0"
     xmlns="urn:ietf:params:xml:ns:keyprov:pskc"
     xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
     xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionKey>
         <ds:KeyName>Pre-shared-key</ds:KeyName>
     </EncryptionKey>
     <MACMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"> 
         <MACKey>
             <xenc:EncryptionMethod
             Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/> 
             <xenc:CipherData>
                 <xenc:CipherValue>
     ESIzRFVmd4iZABEiM0RVZgKn6WjLaTC1sbeBMSvIhRejN9vJa2BOlSaMrR7I5wSX
                 </xenc:CipherValue>
             </xenc:CipherData>
         </MACKey>
     </MACMethod>
     <KeyPackage>
         <DeviceInfo>
             <Manufacturer>Manufacturer</Manufacturer>
             <SerialNo>987654321</SerialNo>
         </DeviceInfo>
         <CryptoModuleInfo>
             <Id>CM_ID_001</Id>
         </CryptoModuleInfo>
         <Key Id="12345678"
             Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
             <Issuer>Issuer</Issuer>
             <AlgorithmParameters>
                 <ResponseFormat Length="8" Encoding="DECIMAL"/>
             </AlgorithmParameters>
             <Data>
                 <Secret>
                     <EncryptedValue>
                         <xenc:EncryptionMethod
             Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/> 
                         <xenc:CipherData>
                             <xenc:CipherValue>
     AAECAwQFBgcICQoLDA0OD+cIHItlB3Wra1DUpxVvOx2lef1VmNPCMl8jwZqIUqGv
                             </xenc:CipherValue>
                         </xenc:CipherData>
                     </EncryptedValue>
                     <ValueMAC>Su+NvtQfmvfJzF6bmQiJqoLRExc=
                     </ValueMAC>
                 </Secret>
                 <Counter>
                     <PlainValue>0</PlainValue>
                 </Counter>
             </Data>
         </Key>
     </KeyPackage>
 </KeyContainer>

Рисунок 6. Шифрование с заранее известным ключом и AES-128-CBC с HMAC-SHA1.


Поскольку AES-128-CBC не обеспечивает защиты целостности, для зашифрованного значения применяется MAC с ключом и алгоритмом, указанными в элементе <MACMethod> (http://www.w3.org/2000/09/xmldsig#hmac-sha1 в приведенном примере служит алгоритмом, ключ MAC (1122334455667788990011223344556677889900) создается случайным образом и шифруется с указанным ключом). Результат расчета MAC помещается в <ValueMAC> — дочерний элемент <Secret>.

При защите данных с заранее известным ключом реализация должна указать имя конкретного ключа, распределенного заранее, в элементе <KeyName> внутри <EncryptionKey>. При шифровании в режиме CBC, который требует явного вектора инициализации, значение IV должно указываться перед шифрованным значением (prepend).

Для систем, реализующих PSKC, рекомендуется поддержка AES-128-CBC (http://www.w3.org/2001/04/xmlenc#aes128-cbc) и KW-AES128 (http://www.w3.org/2001/04/xmlenc#kw-aes128). Следует отметить, что KW-AES128 требует размера защищаемого ключа, кратного 8 байтам. Поэтому при необходимости защиты ключей иного размера рекомендуется алгоритм «заворачивания» ключа (key-wrap) с заполнением, как описано в [RFC5649]. Некоторые из алгоритмов шифрования, которые могут быть реализованы, перечислены в таблице.

 

Алгоритм

Идентификатор URL

AES192-CBC

http://www.w3.org/2001/04/xmlenc#aes192-cbc

AES256-CBC

http://www.w3.org/2001/04/xmlenc#aes256-cbc

TripleDES-CBC

http://www.w3.org/2001/04/xmlenc#tripledes-cbc

Camellia128

http://www.w3.org/2001/04/xmldsig-more#camellia128-cbc

Camellia192

http://www.w3.org/2001/04/xmldsig-more#camellia192-cbc

Camellia256

http://www.w3.org/2001/04/xmldsig-more#camellia256-cbc

KW-AES128

http://www.w3.org/2001/04/xmlenc#kw-aes128

KW-AES192

http://www.w3.org/2001/04/xmlenc#kw-aes192

KW-AES256

http://www.w3.org/2001/04/xmlenc#kw-aes256

KW-TripleDES

http://www.w3.org/2001/04/xmlenc#kw-tripledes

KW-Camellia128

http://www.w3.org/2001/04/xmldsig-more#kw-camellia128

KW-Camellia192

http://www.w3.org/2001/04/xmldsig-more#kw-camellia192

KW-Camellia256

http://www.w3.org/2001/04/xmldsig-more#kw-camellia256

 

6.1.1. Метод MAC

При использовании алгоритмов без контроля целостности, таких как AES-128-CBC, значение MAC с ключом должно помещаться в элемент <ValueMAC> внутри <Data>. В этом случае алгоритм MAC должен быть указан элементом <MACMethod> в <KeyContainer>. Ключ MAC должен создаваться отправителем случайным образом, быть заранее согласованным с получателем и устанавливаться прикладным протоколом, который передает документ PSKC. Отправителю рекомендуется генерировать случайный ключ MAC. При случайном создании ключевой материал MAC должен шифроваться с ключом, указанным в элементе <EncryptionKey> ключевого контейнера. Метод шифрования и шифрованное значение должны помещаться в элемент <EncryptionMethod> и <CipherData> (соответственно) элемента <MACKey> в <MACMethod>. Можно применять элемент <MACKeyReference> в <MACMethod> для указания заранее распространенного ключа MAC или протокола вывода ключа MAC. Системам, поддерживающим PSKC, рекомендуется реализовать HMAC-SHA1 (http://www.w3.org/2000/09/xmldsig#hmac-sha1). Некоторые из алгоритмов MAC, которые могут быть реализованы, перечислены в таблице.

 

Алгоритм

Идентификатор URL

HMAC-SHA224

http://www.w3.org/2001/04/xmldsig-more#hmac-sha224

HMAC-SHA256

http://www.w3.org/2001/04/xmldsig-more#hmac-sha256

HMAC-SHA384

http://www.w3.org/2001/04/xmldsig-more#hmac-sha384

HMAC-SHA512

http://www.w3.org/2001/04/xmldsig-more#hmac-sha512

 

6.2. Шифрование с ключами на основе парольной фразы

На рисунке 7 дан пример шифрования содержимого элемента <Secret> с использованием выведенного из парольной фразы ключа (PBKDF214) в соответствии с [PKCS5]. При выводе ключа из парольной фразы должен применяться элемент <DerivedKey>, определенный в XML Encryption Version 1.1 [XMLENC11], для указания ключа на основе парольной фразы. <DerivedKey> указывается как дочерний элемент <EncryptionKey> в ключевом контейнере.

Элемент <DerivedKey> служит для задания функции вывода ключа и связанных параметров. Алгоритм шифрования (в примере AES-128-CBC, http://www.w3.org/2001/04/xmlenc#aes128-cbc) должен быть указан в атрибуте Algorithm элемента <EncryptionMethod>, используемого в зашифрованных элементах данных.

При использовании PBKDF2 атрибут Algorithm элемента <xenc11: KeyDerivationMethod> должен содержать URI http://www.rsasecurity.com/rsalabs/pkcs/schemas/pkcs-5#pbkdf2‘. Элемент <xenc11:KeyDerivationMethod> должен включать дочерний элемент <PBKDF2-params> с параметрами PBKDF2, такими как «затравка» и число итераций.

При шифровании с режиме CBC с явным вектором инициализации (IV), отличным от выведенного, значение IV должно передаваться путем указания перед зашифрованным значением (prepend).

Ниже перечислены значения, используемые в примере.

Password — qwerty;

Salt — 0x123eff3c4a72129c;

Iteration Count — 1000;

MAC Key — 0xbdaab8d648e850d25a3289364f7d7eaaf53ce581;

OTP Secret — 12345678901234567890.

Выведенный ключ шифрования имеет значение 0x651e63cd57008476af1ff6422cd02e41, вектор инициализации (IV) — 0xa13be8f92db69ec992d99fd1b5ca05f0. Этот ключ также применяется для шифрования случайно выбранного ключа MAC. Можно применять другой IV (в примере 0xd864d39cbc0cdc8e1ee483b9164b9fa0). Шифрование по алгоритму AES-128-CBC соответствует [XMLENC].

  <?xml version="1.0" encoding="UTF-8"?>
  <pskc:KeyContainer
    xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
    xmlns:xenc11="http://www.w3.org/2009/xmlenc11#"
    xmlns:pkcs5=
    "http://www.rsasecurity.com/rsalabs/pkcs/schemas/pkcs-5v2-0#"
    xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Version="1.0">
      <pskc:EncryptionKey>
          <xenc11:DerivedKey>
              <xenc11:KeyDerivationMethod
                Algorithm=
   "http://www.rsasecurity.com/rsalabs/pkcs/schemas/pkcs-5v2-0#pbkdf2"> 
                  <pkcs5:PBKDF2-params>
                      <Salt>
                          <Specified>Ej7/PEpyEpw=</Specified>
                      </Salt>
                      <IterationCount>1000</IterationCount>
                      <KeyLength>16</KeyLength>
                      <PRF/>
                  </pkcs5:PBKDF2-params>
              </xenc11:KeyDerivationMethod>
              <xenc:ReferenceList>
                  <xenc:DataReference URI="#ED"/>
              </xenc:ReferenceList>
              <xenc11:MasterKeyName>My Password 1</xenc11:MasterKeyName>
          </xenc11:DerivedKey>
      </pskc:EncryptionKey>
      <pskc:MACMethod
          Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"> 
          <pskc:MACKey>
              <xenc:EncryptionMethod
              Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/> 
              <xenc:CipherData>
                  <xenc:CipherValue>
  2GTTnLwM3I4e5IO5FkufoOEiOhNj91fhKRQBtBJYluUDsPOLTfUvoU2dStyOwYZx
                  </xenc:CipherValue>
              </xenc:CipherData>
          </pskc:MACKey>
      </pskc:MACMethod>
      <pskc:KeyPackage>
          <pskc:DeviceInfo>
              <pskc:Manufacturer>TokenVendorAcme</pskc:Manufacturer>
              <pskc:SerialNo>987654321</pskc:SerialNo>
          </pskc:DeviceInfo>
          <pskc:CryptoModuleInfo>
              <pskc:Id>CM_ID_001</pskc:Id>
          </pskc:CryptoModuleInfo>
          <pskc:Key Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp" Id="123456">
              <pskc:Issuer>Example-Issuer</pskc:Issuer>
              <pskc:AlgorithmParameters>
                  <pskc:ResponseFormat Length="8" Encoding="DECIMAL"/>
              </pskc:AlgorithmParameters>
              <pskc:Data>
                  <pskc:Secret>
                  <pskc:EncryptedValue Id="ED">
                      <xenc:EncryptionMethod
                          Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/> 
                          <xenc:CipherData>
                              <xenc:CipherValue>
        oTvo+S22nsmS2Z/RtcoF8Hfh+jzMe0RkiafpoDpnoZTjPYZu6V+A4aEn032yCr4f
                          </xenc:CipherValue>
                      </xenc:CipherData>
                      </pskc:EncryptedValue>
                      <pskc:ValueMAC>LP6xMvjtypbfT9PdkJhBZ+D6O4w=
                      </pskc:ValueMAC>
                  </pskc:Secret>
              </pskc:Data>
          </pskc:Key>
      </pskc:KeyPackage>
  </pskc:KeyContainer>

Рисунок 7. Пример документа PSKC с шифрованием ключом на основе парольной фразы.


6.3. Шифрование на базе асимметричных ключей

При использовании асимметричных ключей для шифрования дочерних элементов элемента <Data> информация о сертификате должна представляться элементом <X509Data>, который является дочерним для <EncryptionKey>. Алгоритм шифрования должен указываться атрибутом Algorithm элемента <EncryptionMethod>. В примере на рисунке 8 используется алгоритм http://www.w3.org/2001/04/xmlenc#rsa_1_5.

   <?xml version="1.0" encoding="UTF-8" ?>
   <KeyContainer
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
       xmlns="urn:ietf:params:xml:ns:keyprov:pskc"
       xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
       Id="KC0001"
       Version="1.0">
       <EncryptionKey>
           <ds:X509Data>
   <ds:X509Certificate>MIIB5zCCAVCgAwIBAgIESZp/vDANBgkqhkiG9w0BAQUFADA4M
   Q0wCwYDVQQKEwRJRVRGMRMwEQYDVQQLEwpLZXlQcm92IFdHMRIwEAYDVQQDEwlQU0tDIF
   Rlc3QwHhcNMDkwMjE3MDkxMzMyWhcNMTEwMjE3MDkxMzMyWjA4MQ0wCwYDVQQKEwRJRVR
   GMRMwEQYDVQQLEwpLZXlQcm92IFdHMRIwEAYDVQQDEwlQU0tDIFRlc3QwgZ8wDQYJKoZI
   hvcNAQEBBQADgY0AMIGJAoGBALCWLDa2ItYJ6su80hd1gL4cggQYdyyKK17btt/aS6Q/e
   DsKjsPyFIODsxeKVV/uA3wLT4jQJM5euKJXkDajzGGOy92+ypfzTX4zDJMkh61SZwlHNJ
   xBKilAM5aW7C+BQ0RvCxvdYtzx2LTdB+X/KMEBA7uIYxLfXH2Mnub3WIh1AgMBAAEwDQY
   JKoZIhvcNAQEFBQADgYEAe875m84sYUJ8qPeZ+NG7REgTvlHTmoCdoByU0LBBLotUKuqf
   rnRuXJRMeZXaaEGmzY1kLonVjQGzjAkU4dJ+RPmiDlYuHLZS41Pg6VMwY+03lhk6I5A/w
   4rnqdkmwZX/NgXg06alnc2pBsXWhL4O7nk0S2ZrLMsQZ6HcsXgdmHo=
   </ds:X509Certificate>
           </ds:X509Data>
       </EncryptionKey>
       <KeyPackage>
           <DeviceInfo>
               <Manufacturer>TokenVendorAcme</Manufacturer>
               <SerialNo>987654321</SerialNo>
           </DeviceInfo>
           <Key
               Id="MBK000000001"
               Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
               <Issuer>Example-Issuer</Issuer>
               <AlgorithmParameters>
                   <ResponseFormat Length="6" Encoding="DECIMAL"/>
               </AlgorithmParameters>
               <Data>
                   <Secret>
                       <EncryptedValue>
                           <xenc:EncryptionMethod
                Algorithm="http://www.w3.org/2001/04/xmlenc#rsa_1_5"/> 
                           <xenc:CipherData>
   <xenc:CipherValue>hJ+fvpoMPMO9BYpK2rdyQYGIxiATYHTHC7e/sPLKYo5/r1v+4
   xTYG3gJolCWuVMydJ7Ta0GaiBPHcWa8ctCVYmHKfSz5fdeV5nqbZApe6dofTqhRwZK6
   Yx4ufevi91cjN2vBpSxYafvN3c3+xIgk0EnTV4iVPRCR0rBwyfFrPc4=
   </xenc:CipherValue>
                           </xenc:CipherData>
                       </EncryptedValue>
                   </Secret>
                   <Counter>
                       <PlainValue>0</PlainValue>
                   </Counter>
               </Data>
           </Key>
       </KeyPackage>
   </KeyContainer>

Рисунок 8. Пример документа PSKC с шифрованием на основе открытого ключа.


Системам PSKC рекомендуется реализовать алгоритм RSA-1.5 (http://www.w3.org/2001/04/xmlenc#rsa-1_5).

В таблице указан дополнительный алгоритм асимметричного шифрования, который может быть реализован.

 

Алгоритм

Идентификатор URL

RSA-OAEP-MGF1P

http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p

 

6.4. Дополнение шифрованных значений для алгоритмов без дополнения

Дополнение зашифрованных значений (например, секретного ключа) требуется в тех случаях, когда используются механизмы защиты ключей, не поддерживающие встроенного дополнения, а размер шифруемого ключа не кратен размеру блока шифрования в применяемом алгоритме.

Например, при передаче ключа HOTP (20 байтов), защищенного алгоритмом AES в режиме CBC (8-байтовый блочный шифр), заполнение требуется, поскольку размер ключа не кратен размеру 8-байтового блока.

В таких случаях реализующим PSKC системам рекомендуется дополнять значение перед шифрованием с использованием механизма PKCS #5, как описано в [PKCS5].

7. Цифровая подпись

PSKC позволяет добавлять цифровую подпись в документ XML как дочерний элемент в <KeyContainer>. Описание цифровой подписи XML можно найти в [XMLDSIG].

   <?xml version="1.0" encoding="UTF-8"?>
   <KeyContainer
       xmlns="urn:ietf:params:xml:ns:keyprov:pskc"
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
       xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
       Version="1.0">
       <KeyPackage>
           <DeviceInfo>
               <Manufacturer>TokenVendorAcme</Manufacturer>
               <SerialNo>0755225266</SerialNo>
           </DeviceInfo>
           <Key Id="123"
           Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
               <Issuer>Example-Issuer</Issuer>
               <AlgorithmParameters>
                   <ResponseFormat Length="6" Encoding="DECIMAL"/>
               </AlgorithmParameters>
               <Data>
                   <Secret>
                       <PlainValue>
                           MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=
                       </PlainValue>
                   </Secret>
                   <Counter>
                       <PlainValue>0</PlainValue>
                   </Counter>
               </Data>
           </Key>
       </KeyPackage>
       <ds:Signature>
           <ds:SignedInfo>
               <ds:CanonicalizationMethod
                Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
               <ds:SignatureMethod
                Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
               <ds:Reference URI="#Device">
                   <ds:DigestMethod
                Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
                   <ds:DigestValue>
                       j6lwx3rvEPO0vKtMup4NbeVu8nk=
                   </ds:DigestValue>
               </ds:Reference>
           </ds:SignedInfo>
           <ds:SignatureValue>
               j6lwx3rvEPO0vKtMup4NbeVu8nk=
           </ds:SignatureValue>
           <ds:KeyInfo>
               <ds:X509Data>
                   <ds:X509IssuerSerial>
                       <ds:X509IssuerName>
                           CN=Example.com,C=US
                       </ds:X509IssuerName>
                       <ds:X509SerialNumber>
                           12345678
                       </ds:X509SerialNumber>
                   </ds:X509IssuerSerial>
               </ds:X509Data>
           </ds:KeyInfo>
       </Signature>

Рисунок 9. Пример цифровой подписи.


</KeyContainer>

8. Массовое представление

Функциональность массового представления может быть реализована путем повтора элемента <KeyPackage> внутри <KeyContainer>, указывающего представление множества ключей для разных устройств или криптографических модулей. Элемент <EncryptionKey> в таком случае применяет все элементы <KeyPackage>. При представлении множества ключей одному устройству элемент <KeyPackage> повторяется, а вложенный в него элемент <DeviceInfo> всегда содержит одни субэлементы, однозначно указывающие устройство (например, ниже представлены ключи для устройства с SerialNo=9999999).

На рисунке 10 приведен пример использования описанной возможности.

   <?xml version="1.0" encoding="UTF-8"?>
   <KeyContainer Version="1.0"
       xmlns="urn:ietf:params:xml:ns:keyprov:pskc">
       <KeyPackage>
           <DeviceInfo>
               <Manufacturer>TokenVendorAcme</Manufacturer>
               <SerialNo>654321</SerialNo>
           </DeviceInfo>
           <Key Id="1"
           Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
               <Issuer>Issuer</Issuer>
               <AlgorithmParameters>
                   <ResponseFormat Length="8" Encoding="DECIMAL"/>
               </AlgorithmParameters>
               <Data>
                   <Secret>
                       <PlainValue>MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=</PlainValue>
                   </Secret>
                   <Counter>
                       <PlainValue>0</PlainValue>
                   </Counter>
               </Data>
               <Policy>
                   <StartDate>2006-05-01T00:00:00Z</StartDate>
                   <ExpiryDate>2006-05-31T00:00:00Z</ExpiryDate>
               </Policy>
           </Key>
       </KeyPackage>
       <KeyPackage>
           <DeviceInfo>
               <Manufacturer>TokenVendorAcme</Manufacturer>
               <SerialNo>123456</SerialNo>
           </DeviceInfo>
           <Key Id="2"
           Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
               <Issuer>Issuer</Issuer>
               <AlgorithmParameters>
                   <ResponseFormat Length="8" Encoding="DECIMAL"/>
               </AlgorithmParameters>
               <Data>
                   <Secret>
                       <PlainValue>MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=</PlainValue>
                   </Secret>
                   <Counter>
                       <PlainValue>0</PlainValue>
                   </Counter>
               </Data>
               <Policy>
                   <StartDate>2006-05-01T00:00:00Z</StartDate>
                   <ExpiryDate>2006-05-31T00:00:00Z</ExpiryDate>
               </Policy>
           </Key>
       </KeyPackage>
       <KeyPackage>
           <DeviceInfo>
               <Manufacturer>TokenVendorAcme</Manufacturer>
               <SerialNo>9999999</SerialNo>
           </DeviceInfo>
           <Key Id="3"
           Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
               <Issuer>Issuer</Issuer>
               <AlgorithmParameters>
                   <ResponseFormat Length="8" Encoding="DECIMAL"/>
               </AlgorithmParameters>
               <Data>
                   <Secret>
                       <PlainValue>MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=</PlainValue>
                   </Secret>
                   <Counter>
                       <PlainValue>0</PlainValue>
                   </Counter>
               </Data>
               <Policy>
                   <StartDate>2006-03-01T00:00:00Z</StartDate>
                   <ExpiryDate>2006-03-31T00:00:00Z</ExpiryDate>
               </Policy>
           </Key>
       </KeyPackage>
       <KeyPackage>
           <DeviceInfo>
               <Manufacturer>TokenVendorAcme</Manufacturer>
               <SerialNo>9999999</SerialNo>
           </DeviceInfo>
           <Key Id="4"
           Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
               <Issuer>Issuer</Issuer>
               <AlgorithmParameters>
                   <ResponseFormat Length="8" Encoding="DECIMAL"/>
               </AlgorithmParameters>
               <Data>
                   <Secret>
                       <PlainValue>MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=</PlainValue>
                   </Secret>
                   <Counter>
                       <PlainValue>0</PlainValue>
                   </Counter>
               </Data>
               <Policy>
                   <StartDate>2006-04-01T00:00:00Z</StartDate>
                   <ExpiryDate>2006-04-30T00:00:00Z</ExpiryDate>
               </Policy>
           </Key>
       </KeyPackage>
   </KeyContainer>

Рисунок 10. Пример массового представления.


9. Расширяемость

В этом разделе перечислены некоторые базовые точки расширения, обеспечиваемые PSKC.

Новая версия PSKC

При необходимости определить новую версию этого документа выделяется новый номер версии, указывающий обновленную спецификацию. Номер версии создается в атрибуте Version, как описано в разделе 4, а схема нумерации должна соответствовать параграфу 1.2 и правилам расширения из раздела 12.

Новые элементы XML

Использование схемы XML и доступные точки расширения позволяют добавлять новые элементы XML. В зависимости от элемента XML могут применяться разные способы расширения. В одних местах можно использовать элемент <Extensions>, в других — точку расширения XML <xs:any namespace=»##other» processContents=»lax» minOccurs=»0″ maxOccurs=»unbounded»/>.

Новые атрибуты XML

Схема XML позволяет добавлять новые атрибуты XML там, где определены точки расширения XML (см. «<xs: anyAttribute namespace=»##other»/>» в разделе 11).

Новые профили алгоритмов PSKC

Этот документ определяет в разделе 10 два профиля алгоритмов PSKC. В информационном документе [PSKC-ALGORITHM-PROFILES] описаны дополнительные профили. Могут быть зарегистрированы дополнительные профили алгоритмов PSKC в соответствии с параграфом 12.4.

URI алгоритмов

В разделе 6 описана защита ключей и связанных с ними данных, для чего применяется множество алгоритмов. Новые алгоритмы можно применять путем указания соответствующих идентификаторов URI.

Правила

В разделе 5 определены правила, которые могут быть привязаны к ключу и относящимся к нему данным. Элемент <Policy> является одним из элементов, позволяющих разработчикам ограничивать применение ключа неким набором функций (например, только для OTP). Дополнительные значения могут регистрироваться в соответствии с разделом 12.

10. Профили алгоритмов PSKC

10.1. HOTP

Базовое имя — HOTP

Класс — OTP

URI — urn:ietf:params:xml:ns:keyprov:pskc:hotp

Определение алгоритма — [HOTP]

Определение идентификатора — (этот RFC)

Регистрационный контакт — IESG

Устарел — FALSE

Профиль

Элемент <KeyPackage> должен присутствовать, а элемент <ResponseFormat>, являющийся дочерним для <AlgorithmParameters>, должен использоваться для указания размера и формата значения OTP.

Элемент <Counter> (параграф 4.1) должен представляться как метаданные для ключа.

Применяются также перечисленные ниже добавочные ограничения.

  • Значение элемента <Secret> при его наличии должно содержать не менее 16 октетов (128 битов) ключевого материала.

  • Элемент <ResponseFormat> должен иметь атрибут Format = DECIMAL, а атрибут Length должен указывать размер от 6 до 9 (включительно).

  • Элемент <PINPolicy> может присутствовать, но PINUsageMode не может иметь значения Algorithmic.

Пример можно видеть на рисунке 3.

10.2. PIN

Базовое имя — PIN

Класс — сравнение симметричных статических свидетельств (удостоверений)

URI — urn:ietf:params:xml:ns:keyprov:pskc:pin

Определение алгоритма — параграф 5.1 (этот RFC)

Определение идентификатора — (этот RFC)

Регистрационный контакт — IESG

Устарел — FALSE

Профиль

Элемент <AlgorithmParameters> может присутствовать, но атрибут <AlgorithmParameters> не требуется. Элемент <ResponseFormat> можно использовать для указания формата значения PIN.

Элемент <Secret> (параграф 4.1) должен представляться.

Пример можно видеть на рисунке 5.

11. Схема XML

В этом разделе определена схема XML для PSKC.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
     xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
     xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
     targetNamespace="urn:ietf:params:xml:ns:keyprov:pskc"
     elementFormDefault="qualified"
     attributeFormDefault="unqualified">
     <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" 
          schemaLocation=
             "http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"/>
     <xs:import namespace="http://www.w3.org/2001/04/xmlenc#"
          schemaLocation=
             "http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/xenc-schema.xsd"/>
     <xs:import namespace="http://www.w3.org/XML/1998/namespace"/>
     <xs:complexType name="KeyContainerType">
          <xs:sequence>
               <xs:element name="EncryptionKey"
                    type="ds:KeyInfoType" minOccurs="0"/>
               <xs:element name="MACMethod"
                    type="pskc:MACMethodType" minOccurs="0"/>
               <xs:element name="KeyPackage"
                    type="pskc:KeyPackageType" maxOccurs="unbounded"/>
               <xs:element ref="ds:Signature" minOccurs="0"/>
               <xs:element name="Extensions"
                    type="pskc:ExtensionsType"
                    minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
          <xs:attribute name="Version"
               type="pskc:VersionType" use="required"/>
          <xs:attribute name="Id"
               type="xs:ID" use="optional"/>
     </xs:complexType>
     <xs:simpleType name="VersionType" final="restriction">
          <xs:restriction base="xs:string">
               <xs:pattern value="\d{1,2}\.\d{1,3}"/>
          </xs:restriction>
     </xs:simpleType>
     <xs:complexType name="KeyType">
          <xs:sequence>
               <xs:element name="Issuer"
                    type="xs:string" minOccurs="0"/>
               <xs:element name="AlgorithmParameters"
                    type="pskc:AlgorithmParametersType"
                    minOccurs="0"/>
               <xs:element name="KeyProfileId"
                    type="xs:string" minOccurs="0"/>
               <xs:element name="KeyReference"
                    type="xs:string" minOccurs="0"/>
               <xs:element name="FriendlyName"
                    type="xs:string" minOccurs="0"/>
               <xs:element name="Data"
                    type="pskc:KeyDataType" minOccurs="0"/>
               <xs:element name="UserId"
                    type="xs:string" minOccurs="0"/>
               <xs:element name="Policy"
                    type="pskc:PolicyType" minOccurs="0"/>
               <xs:element name="Extensions"
                    type="pskc:ExtensionsType" minOccurs="0"
                    maxOccurs="unbounded"/>
          </xs:sequence>
          <xs:attribute name="Id"
               type="xs:string" use="required"/>
          <xs:attribute name="Algorithm"
               type="pskc:KeyAlgorithmType" use="optional"/>
     </xs:complexType>
     <xs:complexType name="PolicyType">
          <xs:sequence>
               <xs:element name="StartDate"
                    type="xs:dateTime" minOccurs="0"/>
               <xs:element name="ExpiryDate"
                    type="xs:dateTime" minOccurs="0"/>
               <xs:element name="PINPolicy"
                    type="pskc:PINPolicyType" minOccurs="0"/>
               <xs:element name="KeyUsage"
                    type="pskc:KeyUsageType"
                    minOccurs="0" maxOccurs="unbounded"/>
               <xs:element name="NumberOfTransactions"
                    type="xs:nonNegativeInteger" minOccurs="0"/>
               <xs:any namespace="##other"
                    minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
     </xs:complexType>
     <xs:complexType name="KeyDataType">
          <xs:sequence>
               <xs:element name="Secret" type="pskc:binaryDataType" minOccurs="0"/>
               <xs:element name="Counter" type="pskc:longDataType" minOccurs="0"/>
               <xs:element name="Time" type="pskc:intDataType" minOccurs="0"/>
               <xs:element name="TimeInterval" type="pskc:intDataType" minOccurs="0"/>
               <xs:element name="TimeDrift" type="pskc:intDataType" minOccurs="0"/>
               <xs:any namespace="##other" processContents="lax"
                    minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
     </xs:complexType>
     <xs:complexType name="binaryDataType">
          <xs:sequence>
               <xs:choice>
                    <xs:element name="PlainValue" type="xs:base64Binary"/>
                    <xs:element name="EncryptedValue" type="xenc:EncryptedDataType"/>
               </xs:choice>
               <xs:element name="ValueMAC" type="xs:base64Binary" minOccurs="0"/>
          </xs:sequence>
     </xs:complexType>
     <xs:complexType name="intDataType">
          <xs:sequence>
               <xs:choice>
                    <xs:element name="PlainValue" type="xs:int"/>
                    <xs:element name="EncryptedValue" type="xenc:EncryptedDataType"/>
               </xs:choice>
               <xs:element name="ValueMAC" type="xs:base64Binary" minOccurs="0"/>
          </xs:sequence>
     </xs:complexType>
     <xs:complexType name="stringDataType">
          <xs:sequence>
               <xs:choice>
                    <xs:element name="PlainValue" type="xs:string"/>
                    <xs:element name="EncryptedValue" type="xenc:EncryptedDataType"/>
               </xs:choice>
               <xs:element name="ValueMAC" type="xs:base64Binary" minOccurs="0"/>
          </xs:sequence>
     </xs:complexType>
     <xs:complexType name="longDataType">
          <xs:sequence>
               <xs:choice>
                    <xs:element name="PlainValue" type="xs:long"/>
                    <xs:element name="EncryptedValue" type="xenc:EncryptedDataType"/>
               </xs:choice>
               <xs:element name="ValueMAC" type="xs:base64Binary" minOccurs="0"/>
          </xs:sequence>
     </xs:complexType>
     <xs:complexType name="PINPolicyType">
          <xs:attribute name="PINKeyId" type="xs:string" use="optional"/>
          <xs:attribute name="PINUsageMode" type="pskc:PINUsageModeType"/>
          <xs:attribute name="MaxFailedAttempts" type="xs:unsignedInt" use="optional"/>
          <xs:attribute name="MinLength" type="xs:unsignedInt" use="optional"/>
          <xs:attribute name="MaxLength" type="xs:unsignedInt" use="optional"/>
          <xs:attribute name="PINEncoding" type="pskc:ValueFormatType" use="optional"/>
          <xs:anyAttribute namespace="##other"/>
     </xs:complexType>
     <xs:simpleType name="PINUsageModeType">
          <xs:restriction base="xs:string">
               <xs:enumeration value="Local"/>
               <xs:enumeration value="Prepend"/>
               <xs:enumeration value="Append"/>
               <xs:enumeration value="Algorithmic"/>
          </xs:restriction>
     </xs:simpleType>
     <xs:simpleType name="KeyUsageType">
          <xs:restriction base="xs:string">
               <xs:enumeration value="OTP"/>
               <xs:enumeration value="CR"/>
               <xs:enumeration value="Encrypt"/>
               <xs:enumeration value="Integrity"/>
               <xs:enumeration value="Verify"/>
               <xs:enumeration value="Unlock"/>
               <xs:enumeration value="Decrypt"/>
               <xs:enumeration value="KeyWrap"/>
               <xs:enumeration value="Unwrap"/>
               <xs:enumeration value="Derive"/>
               <xs:enumeration value="Generate"/>
          </xs:restriction>
     </xs:simpleType>
     <xs:complexType name="DeviceInfoType">
          <xs:sequence>
               <xs:element name="Manufacturer" type="xs:string" minOccurs="0"/>
               <xs:element name="SerialNo" type="xs:string" minOccurs="0"/>
               <xs:element name="Model" type="xs:string" minOccurs="0"/>
               <xs:element name="IssueNo" type="xs:string" minOccurs="0"/>
               <xs:element name="DeviceBinding" type="xs:string" minOccurs="0"/>
               <xs:element name="StartDate" type="xs:dateTime" minOccurs="0"/>
               <xs:element name="ExpiryDate" type="xs:dateTime" minOccurs="0"/>
               <xs:element name="UserId" type="xs:string" minOccurs="0"/>
               <xs:element name="Extensions" type="pskc:ExtensionsType" minOccurs="0"
                    maxOccurs="unbounded"/>
          </xs:sequence>
     </xs:complexType>
     <xs:complexType name="CryptoModuleInfoType">
          <xs:sequence>
               <xs:element name="Id" type="xs:string"/>
               <xs:element name="Extensions" type="pskc:ExtensionsType" minOccurs="0"
                    maxOccurs="unbounded"/>
          </xs:sequence>
     </xs:complexType>
     <xs:complexType name="KeyPackageType">
          <xs:sequence>
               <xs:element name="DeviceInfo" type="pskc:DeviceInfoType" minOccurs="0"/>
               <xs:element name="CryptoModuleInfo"
                    type="pskc:CryptoModuleInfoType" minOccurs="0"/>
               <xs:element name="Key" type="pskc:KeyType" minOccurs="0"/>
               <xs:element name="Extensions" type="pskc:ExtensionsType" minOccurs="0"
                    maxOccurs="unbounded"/>
          </xs:sequence>
     </xs:complexType>
     <xs:complexType name="AlgorithmParametersType">
          <xs:choice>
               <xs:element name="Suite" type="xs:string" minOccurs="0"/>
               <xs:element name="ChallengeFormat" minOccurs="0">
                    <xs:complexType>
                         <xs:attribute name="Encoding"
                              type="pskc:ValueFormatType" use="required"/>
                         <xs:attribute name="Min" type="xs:unsignedInt" use="required"/>
                         <xs:attribute name="Max" type="xs:unsignedInt" use="required"/>
                         <xs:attribute name="CheckDigits" type="xs:boolean" default="false"/>
                    </xs:complexType>
               </xs:element>
               <xs:element name="ResponseFormat" minOccurs="0">
                    <xs:complexType>
                         <xs:attribute name="Encoding"
                              type="pskc:ValueFormatType" use="required"/>
                         <xs:attribute name="Length" type="xs:unsignedInt" use="required"/>
                         <xs:attribute name="CheckDigits" type="xs:boolean" default="false"/>
                    </xs:complexType>
               </xs:element>
               <xs:element name="Extensions" type="pskc:ExtensionsType" minOccurs="0"
                    maxOccurs="unbounded"/>
          </xs:choice>
     </xs:complexType>
     <xs:complexType name="ExtensionsType">
          <xs:sequence>
               <xs:any namespace="##other" processContents="lax" maxOccurs="unbounded"/>
          </xs:sequence>
          <xs:attribute name="definition" type="xs:anyURI" use="optional"/>
     </xs:complexType>
     <xs:simpleType name="KeyAlgorithmType">
          <xs:restriction base="xs:anyURI"/>
     </xs:simpleType>
     <xs:simpleType name="ValueFormatType">
          <xs:restriction base="xs:string">
               <xs:enumeration value="DECIMAL"/>
               <xs:enumeration value="HEXADECIMAL"/>
               <xs:enumeration value="ALPHANUMERIC"/>
               <xs:enumeration value="BASE64"/>
               <xs:enumeration value="BINARY"/>
          </xs:restriction>
     </xs:simpleType>
     <xs:complexType name="MACMethodType">
           <xs:sequence>
                  <xs:choice>
                        <xs:element name="MACKey"
                           type="xenc:EncryptedDataType" minOccurs="0"/>
                        <xs:element name="MACKeyReference" type="xs:string" minOccurs="0"/>
                        </xs:choice>
                        <xs:any namespace="##other"
           processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:attribute name="Algorithm" type="xs:anyURI" use="required"/>
        </xs:complexType>
     <xs:element name="KeyContainer" type="pskc:KeyContainerType"/>
</xs:schema>

12. Взаимодействие с IANA

12.1. Регистрация Content-Type для application/pskc+xml

Данная спецификация регистрирует новый тип носителя в соответствии с процедурами RFC 4288 [RFC4288] и рекомендациями RFC 3023 [RFC3023].

Имя типа носителя MIME — application

Имя субтипа MIME — pskc+xml

Требуемые параметры — нет.

Необязательные параметры — набор символов

Указывает кодировку символов во вложенном XML.

Вопросы кодирования — используется XML, где могут применяться 8-битовые символы в зависимости от применяемой кодировки (см. парараграф 3.2 в RFC 3023 [RFC3023]).

Вопросы безопасности — см. раздел 13 в RFC 6030.

Проблемы взаимодействия — нет.

Опубликованная спецификация — RFC 6030.

Приложения, использующие этот тип носителя — этот тип может служить контейнером для симметричных ключей при их передаче и представлении (общие секреты OTP или симметричные ключи шифрования) разным типам устройств строгой аутентификации. В таком качестве он применяется в системах представления ключей.

Дополнительная информация

Magic Number — нет.

Расширение имен файлов — .pskcxml

Код типа файлов Macintosh — TEXT

Лицо и почтовый адрес для дополнительной информации — Philip Hoyer, Philip.Hoyer@actividentity.com

Предусмотренное применение — ограниченное использование

Ограничения на использование — нет

Автор — данная спецификация создана рабочей группой IETF KEYPROV, имеющей список рассылки <keyprov@ietf.org>.

Контроль изменений — IESG <iesg@ietf.org>

12.2. Регистрация схемы XML

Этот параграф регистрирует схему XML в соответствии с рекомендациями [RFC3688].

URI: urn:ietf:params:xml:schema:keyprov:pskc

Регистрационный контакт — IETF KEYPROV Working Group, Philip Hoyer (Philip.Hoyer@actividentity.com).

XML Schema: регистрируемая схема XML приведена в разделе 11. Она начинается строкой

   <?xml version="1.0" encoding="UTF-8"?>

и заканчивается строкой

   </xs:schema>

12.3. Регистрация субпространства имен URN

Этот параграф регистрирует новое пространство имён XML urn:ietf:params:xml:ns:keyprov:pskc в соответствии с рекомендациями [RFC3688].

URI: urn:ietf:params:xml:ns:keyprov:pskc

Регистрационный контакт — IETF KEYPROV Working Group, Philip Hoyer (Philip.Hoyer@actividentity.com).

XML

   BEGIN
   <?xml version="1.0"?>
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
     "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"> 
   <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="content-type"
           content="text/html;charset=iso-8859-1"/>
     <title>PSKC Namespace</title>
   </head>
   <body>
     <h1>Namespace for PSKC</h1>
     <h2>urn:ietf:params:xml:ns:keyprov:pskc</h2>
   <p>See <a href="http://www.rfc-editor.org/rfc/rfc6030.txt"> 
    RFC 6030</a>.</p>
   </body>
   </html>
   END

12.4. Реестр профилей для алгоритма PSKC

Агентство IANA создало реестр для профилей алгоритмов PSKC в соответствии с RFC 5226 [RFC5226].

Как часть этого реестра IANA поддерживает приведенную ниже информацию.

Базовое имя — имя, которым обычно обозначают профиль алгоритма PSKC.

Класс — тип записи в реестре профилей алгоритмов PSKC (например, шифрование — encryption, MAC, одноразовый пароль — OTP, подпись — digest).

URI — идентификатор профиля.

Определение идентификатора — IANA будет добавлять указатель на спецификацию, содержащую сведения о регистрации профиля алгоритма PSKC.

Определение алгоритма — ссылка на стабильный документ, в котором определен алгоритм, используемый с PSKC.

Регистрационный контакт — контактные данные стороны, подавшей запрос на регистрацию.

Устарел — TRUE, если запись была отменена на основе одобрения экспертов и профиль не следует применять в новых реализациях; в остальных случаях FALSE.

Профиль PSKC — информация об элементах PSKC XML и атрибутах, которые будут (или не будут) применяться с этим профилем PSKC.

Регистрация профиля алгоритма PSKC выполняется по процедуре Specification Required в соответствии с RFC 5226 [RFC5226], для обновления достаточно одобрения экспертов. На основе такого одобрения можно указать запись как устаревшую (deprecated). Экспертов назначает IESG.

Агентство IANA добавило в реестр две записи для профилей алгоритмов, описанных в разделе10.

12.5. Реестр версий PSKC

Агентство IANA создало реестр номеров версий PSKC с показанной в таблице структурой.

 

Версия PSKC

Спецификация

1.0

RFC 6030

Для добавления новой версии PSKC требуется стандартизация. Старение, удаление или изменение имеющихся версий PSKC не предполагаются.

12.6. Реестр использования ключей

Агентство IANA создало реестр использования ключей. Описание элемента <KeyUsage> приведено в разделе 5.

Как часть этого реестра IANA будет поддерживать указанную ниже информацию.

Использование ключа — идентификатор использования ключа.

Спецификация — IANA будет добавлять указатель на документ, содержащий информацию о семантике новой регистрации использования ключей.

Устарел — TRUE, если запись была отменена на основе одобрения экспертов и профиль не следует применять в новых реализациях; в остальных случаях FALSE.

Агентство IANA включило в реестр начальные значения, представленные ниже.

Применение ключа

Спецификация

Устарел

OTP

[раздел 5]

FALSE

CR

[раздел 5]

FALSE

Encrypt

[раздел 5]

FALSE

Integrity

[раздел 5]

FALSE

Verify

[раздел 5]

FALSE

Unlock

[раздел 5]

FALSE

Decrypt

[раздел 5]

FALSE

KeyWrap

[раздел 5]

FALSE

Unwrap

[раздел 5]

FALSE

Derive

[раздел 5]

FALSE

Generate

[раздел 5]

FALSE

 

Регистрация в реестре Key Usage выполняется по процедуре Specification Required в соответствии с RFC 5226 [RFC5226]. Для определения новых значений Key Usage применяется процедура Expert Review. На основе такого одобрения можно указать запись как устаревшую (deprecated). Экспертов назначает IESG.

13. Вопросы безопасности

Переносимый контейнер с симметричным ключом (PSKC) содержит конфиденциальную информацию (например, криптографические ключи) и может передаваться из одной защищенной области в другую. Например, контейнер, находящийся в защищенной области внутреннего сервера обеспечения, может доставляться через Internet на устройство конечного пользователя, подключенное к персональному компьютеру. Это означает, что должны приниматься особые меры по защите конфиденциальности, целостности и подлинности информации в контейнере.

13.1. Конфиденциальность PSKC

Конструкция контейнера позволяет применять два основных подхода для сохранения конфиденциальности содержащейся в контейнере информации при ее транспортировке.

Во-первых, содержимое контейнера (payload) может быть зашифровано.

В этом случае не требуется защиты на транспортном уровне. При выборе криптографического алгоритма для шифрования данных контейнера ключей применяются стандартные рекомендации по защите. Следует использовать симметричный криптографический шифр и увеличение размера ключа повышает уровень защищенности. В параграфе 6.1 даны рекомендации по защите ключевых данных с использованием симметричных криптографических шифров. В тех случаях, когда обмен ключами шифрования между отправителем и получателем невозможен, может применяться асимметричное шифрование ключевых данных, описанное в параграфе 6.3. Как и при симметричном шифровании увеличение размера ключа повышает уровень защиты.

Если ключевые данные зашифрованы с помощью метода, использующего пароль (PBE15), как описано в параграфе 6.2, эти данные могут быть подвержены атакам по словарю для расшифровки данных. Здесь применяются стандартные методы выбора стойких паролей.

В дополнение к этому настоятельно рекомендуется в практических реализациях в шифрованием PBE применять PBESalt и PBEIterationCount. Для лучшей защиты следует использовать свое значение PBESalt для каждого PSKC.

Другой подход к защите конфиденциальности ключевых данных основан на использовании механизмов защиты нижележащий уровней (например, [TLS], [IPsec]). Организуется защищенное соединение между защищенной областью источника (сервер обеспечения в приведенном выше примере) и целевой областью (подключенное к компьютеру конечного пользователя устройство) с шифрованием проходящих через соединение сообщений. В этом режиме сами ключевые данные не шифруются, а защищенное соединение шифрует и подписывает каждое сообщение.

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

13.2. Целостность PSKC

PSKC обеспечивает средства защиты целостности информации с помощью цифровых подписей. Для эффективной защиты рекомендуется включать в цифровую подпись все содержимое контейнера PSKC. Это гарантирует целостность всех атрибутов, а также позволит проверить PSKC после доставки контейнера по каналу связи.

13.3. Подлинность PSKC

Цифровая подпись PSKC является основным способом проверки подлинности. Получателю контейнера следует использовать связанный с подписью открытый ключ для проверки подлинности отправителя путем отслеживания пути к предварительно загруженному открытому ключу или сертификату. Отметим, что цифровую подпись PSKC можно проверять даже после доставки по защищенному каналу связи.

Гарантию подлинности можно обеспечить с помощью [TLS] или [IPsec]. Однако в этом случае невозможна будет проверка подлинности после доставки контейнера и разрыва соединения. Поскольку конечные точки TLS могут не совпадать с конечными точками представления ключей, это решение слабее цифровой подписи PSKC.

14. Участники работы

Спасибо Hannes Tschofenig за его вклад в текст этого документа.

15. Благодарности

Авторы благодарны Apostol Vassilev, Shuh Chang, Jon Martinson, Siddhart Bajaj, Stu Vaeth, Kevin Lewis, Philip Hallam-Baker, Andrea Doherty, Magnus Nystrom, Tim Moses, Anders Rundgren, Sean Turner и особенно Robert Philpott за их отклики.

Спасибо Sean Turner за рецензию в январе 2009 г. Спасибо также Anders Rundgren за инициирование обсуждения выбора алгоритмов шифрования (KW-AES-128 в сравнении с AES-128-CBC) и вклад в расчет цифровых подписей с ключами.

Эта работа основана на более ранних работах членов группы OATH17 [OATH] по заданию формата, который можно свободно распространять в техническом сообществе.

16. Литература

16.1. Нормативные документы

[FIPS197] National Institute of Standards, «FIPS Pub 197: Advanced Encryption Standard (AES)», November 2001.

[HOTP] M’Raihi, D., Bellare, M., Hoornaert, F., Naccache, D., and O. Ranen, «HOTP: An HMAC-Based One-Time Password Algorithm», RFC 4226, December 2005.

[IANAPENREG] IANA, «Private Enterprise Numbers», <http://www.iana.org>.

[ISOIEC7812] ISO, «ISO/IEC 7812-1:2006 Identification cards — Identification of issuers — Part 1: Numbering system», October 2006, <http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=39698>.

[OATHMAN] OATH, «List of OATH Manufacturer Prefixes (omp)», April 2009, <http://www.openauthentication.org/oath-id/prefixes/>.

[PKCS5] RSA Laboratories, «PKCS #5: Password-Based Cryptography Standard», Version 2.0, March 1999, <http://www.rsasecurity.com/rsalabs/pkcs/>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC3023] Murata, M., St. Laurent, S., and D. Kohn, «XML Media Types», RFC 3023, January 2001.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, January 2004.

[RFC4288] Freed, N. and J. Klensin, «Media Type Specifications and Registration Procedures», BCP 13, RFC 4288, December 2005.

[RFC4514] Zeilenga, K., «Lightweight Directory Access Protocol (LDAP): String Representation of Distinguished Names», RFC 4514, June 2006.

[RFC4648] Josefsson, S., «The Base16, Base32, and Base64 Data Encodings», RFC 4648, October 2006.

[RFC5646] Phillips, A. and M. Davis, «Tags for Identifying Languages», BCP 47, RFC 5646, September 2009.

[RFC5649] Housley, R. and M. Dworkin, «Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm», RFC 5649, September 2009.

[SP800-67] National Institute of Standards, «NIST Special Publication 800-67 Version 1.1: Recommendation for the Triple Data Encryption Algorithm (TDEA) Block Cipher», NIST Special Publication 800-67, May 2008.

[W3C.REC-xmlschema-2-20041028] Malhotra, A. and P. Biron, «XML Schema Part 2: Datatypes Second Edition», World Wide Web Consortium Recommendation REC-xmlschema-2-20041028, October 2004, <http://www.w3.org/TR/2004/REC-xmlschema-2-20041028>.

[XMLDSIG] Solo, D., Reagle, J., and D. Eastlake, «XML-Signature Syntax and Processing», World Wide Web Consortium FirstEdition REC-xmldsig-core-20020212, February 2002, <http://www.w3.org/TR/2002/REC-xmldsig-core-20020212>.

[XMLENC] Eastlake, D., «XML Encryption Syntax and Processing.», W3C Recommendation, December 2002, <http://www.w3.org/TR/xmlenc-core/>.

[XMLENC11] Reagle, J. and D. Eastlake, «XML Encryption Syntax and Processing Version 1.1», World Wide Web Consortium WD WD-xmlenc-core1-20090730, July 2009, <http://www.w3.org/TR/2009/WD-xmlenc-core1-20090730>.

16.2. Дополнительная литература

[CAP] MasterCard International, «Chip Authentication Program Functional Architecture», September 2004.

[IPsec] Kent, S. and K. Seo, «Security Architecture for the Internet Protocol», RFC 4301, December 2005.

[NIST800-57] Barker, E., Barker, W., Burr, W., Polk, W., and M. Smid, «NIST Special Publication 800-57, Recommendation for Key Management Part 1: General (Revised)», NIST Special Publication 800-57, March 2007.

[OATH] «Initiative for Open AuTHentication», <http://www.openauthentication.org>.

[PSKC-ALGORITHM-PROFILES] Hoyer, P., Pei, M., Machani, S., and A. Doherty, «Additional Portable Symmetric Key Container (PSKC) Algorithm Profiles», Work in Progress, May 2010.

[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, «Uniform Resource Identifier (URI): Generic Syntax», STD 66, RFC 3986, January 2005.

[RFC5226] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, May 2008.

[TLS] Dierks, T. and E. Rescorla, «The Transport Layer Security (TLS) Protocol Version 1.2», RFC 5246, August 2008.

[XMLNS] Hollander, D., Bray, T., and A. Layman, «Namespaces in XML», World Wide Web Consortium FirstEdition REC-xml-names-19990114, January 1999, <http://www.w3.org/TR/1999/REC-xml-names-19990114>.

Приложение A. Примеры использования

В этом приложении описан широкий набор вариантов применения, который стал мотивом разработки спецификации. Эти требования были использованы для выведения основных требований к разработке, рассмотренных ниже.

Эти варианты использования помогут также разобраться с применимостью спецификации к реальным задачам.

A.1. Интерактивное применение

В этом параграфе описаны варианты применения с предоставлением ключей на основе интерактивного протокола.

A.1.1. Доставка ключей от сервера в криптографический модуль

Например, мобильный пользователь хочет получить симметричный ключ для криптографического модуля в своем устройстве. Криптографический модуль производства компании A инициирует процесс предоставления от системы производителя B с использованием стандартного протокола предоставления. Предоставляющий элемент доставляет один или множество ключей в стандартном формате, который может быть обработан мобильным устройством.

В представленном выше варианте вместо пользовательского мобильного телефона ключ может быть предоставлен программному маркеру пользовательского приложения на мобильном компьютере с использованием сетевого протокола. Как и раньше, система предоставления доставит ключ в стандартном формате, который может быть обработан программным маркером на ПК.

Еще в одном варианте конечный пользователь или эмитент ключа хочет обновить или настроить имеющийся ключ и запрашивает контейнер замены ключа. Контейнер может включать (или не включать) новый ключ и может включать новые или измененные атрибуты ключа, такие как новое значение счетчика для применения в HOTP, измененный формат или размер отклика, новое имя и т. п.

A.1.2. Доставка ключей между криптографическими модулями

Пользователь хочет перенести ключ из одного криптографического модуля в другой. Это могут быть модули на одном компьютере или модули на компьютере и мобильном телефоне, когда пользователь хочет перенести ключ из компьютера в телефон. Пользователь может экспортировать ключ и связанные с ним данные в стандартном формате для ввода в другой криптографический модуль.

A.1.3. Доставка ключей из криптографического модуля на сервер

Пользователь хочет активировать и применять новый ключ и связанные с ним данные для системы проверки, которая не знает этот ключ. Ключ может быть встроен в криптографический модуль (например, SD-карта или диск USB), который пользователь купил в местном магазине. Вместе с криптографическим модулем пользователь может получить ключ на компакт-диске (CD) или дискете в стандартном формате. Пользователь может загрузить ключ на сервер по защищенному каналу или импортировать ключ и связанные данные в систему проверки и начать работу с ключом.

A.1.4. Массовый импорт и экспорт ключей с сервера на сервер

Время от времени системе управления ключами может требоваться массовый импорт или экспорт ключей с одного элемента на другой.

Например, вместо импорта ключей от производителя через файл сервер проверки может загрузить ключи с помощью интерактивного протокола. Ключи могут быть загружены в стандартном формате и обработаны системой проверки.

В приведенном выше варианте шлюз представления ключей OTA18, обеспечивающий ключами мобильные телефоны, может получать ключевой материал от эмитента ключей по интерактивному протоколу. Ключи представляются в стандартном формате, обрабатываются шлюзом и последовательно передаются пользователям телефонов.

A.2. Автономное использование

В этом параграфе описаны варианты транспортировки ключей между системами по отдельному каналу (offline) с использованием модели экспорта-импорта.

A.2.1. Массовый экспорт и импорт ключей между серверами

Например, криптографические модули (такие как маркеры аутентификации OTP) могут иметь симметричные ключи, инициализируемые в процессе производства, что требует массового копирования ключей и данных алгоритма для загрузки в систему аутентификации через файл на подключаемом носителе. Производитель представляет ключи и связанные с ними данные в форме файла, содержащего записи в стандартном формате (обычно на CD). Отметим, что производители маркеров и системы проверки могут быть разными. Некоторые криптомодули позволяют локально управлять PIN-кодом (устройство имеет PIN-клавиатуру), поэтому исходные случайные значения PIN, заданные при производстве, следует передавать вместе с ключами, которые они защищают.

Предприятие может переносить ключи и связанные данные из имеющейся системы проверки A в другую систему B. Существующая система обеспечивает предприятию функциональностью, позволяющей экспортировать ключи и связанные данные (например, для маркеров аутентификации OTP) в стандартном формате. Поскольку маркеры OTP имеют стандартный формат, предприятие может импортировать записи маркеров в новую систему проверки B и начать использование имеющихся маркеров. Отметим, что производители двух систем проверки могут быть разными.

Приложение B. Требования

В этом приложении описаны наиболее важные требования, ставшие основой работы. Некоторые требование были выведены из рассмотренных выше вариантов применения.

R1

Формат должен поддерживать передачу множества симметричных ключей и связанных с ними атрибутов для разных алгоритмов, включая HOTP, другие OTP, Challenge/Response и т. п.

R2

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

  • Уникальный идентификатор ключа.
  • Данные об эмитенте.
  • Идентификатор алгоритма.
  • Режим алгоритма.
  • Имя эмитента.
  • Удобное имя ключа.
  • Значение счетчика событий (фактор перемещения для алгоритмов OTP).
  • Значение времени.

R3

Формату следует поддерживать интерактивный и автономный режим, т. е. следует поддерживать вывод в файл, а также использовать интерактивный протокол представления.

R4

Формату следует поддерживать массовое представление симметричных ключей.

R5

Формату следует поддерживать массовое представление значений PIN, относящихся к ключам.

R6

Формату следует поддерживать переносимость на разные платформы, а также следует обеспечивать эффективность расчетов.

R7

Формат должен обеспечивать приемлемый уровень защиты в смысле шифрования и целостности данных.

R8

В интерактивном режиме формату не следует полагаться на защиту транспортного уровня (например, SSL/TLS) для основных требований безопасности.

R9

Формату следует быть расширяемым и обеспечивать точки расширения, позволяющие производителя задавать в будущем дополнительные атрибуты.

R10

Формату следует разрешать распространение данных вывода ключей без самих ключей. Это нужно для поддержки схем динамического управления симметричными ключами на основе алгоритмов вывода ключей на основе предварительно установленного первичного ключа. Данные для вывода ключей обычно содержат ссылку на ключ, а не само значение ключа.

R11

Формату следует разрешать дополнительные операции жизненного цикла, такие как ресинхронизация счетчиков. Это требует защиты конфиденциальности между клиентом и сервером, поэтому можно применять базовый формат защищенного контейнера без передачи ключевого материала.

R12

Формат должен поддерживать использование заранее распространенных общих симметричных ключей для защиты конфиденциальности элементов данных.

R13

Формат должен поддерживать основанное на паролях шифрование (PBE) [PKCS5] для защиты конфиденциальных элементов данных. Это широко применяется в разных вариантах представления.

R14

Формату следует поддерживать асимметричные алгоритмы шифрования (например, RSA) для сквозной защиты конфиденциальных элементов данных. Это нужно в ситуациях, где сложно применить предустановленные общие ключи шифрования.

Адреса авторов

Philip Hoyer

ActivIdentity, Inc.

117 Waterloo Road

London, SE1 8UL

UK

Phone: +44 (0) 20 7960 0220

EMail: phoyer@actividentity.com

Mingliang Pei

VeriSign, Inc.

487 E. Middlefield Road

Mountain View, CA 94043

USA

Phone: +1 650 426 5173

EMail: mpei@verisign.com

Salah Machani

Diversinet, Inc.

2225 Sheppard Avenue East

Suite 1801

Toronto, Ontario M2J 5C2

Canada

Phone: +1 416 756 2324 Ext. 321

EMail: smachani@diversinet.com

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1One-Time Password.

2One-Time Password.

3Challenge/Response.

4Portable Symmetric Key Container.

5 HMAC-Based One-Time Password — одноразовый пароль на основе HMAC.

6При вводе новой версии. Прим. перев.

7Uniform Resource Identifier.

8Message Authentication Code.

9Triple Data Encryption Algorithm — алгоритм тройного шифрования данных.

10International Mobile Equipment Identity — международное отождествление мобильного оборудования.

11Trusted Platform Module — модуль доверенной платформы.

12Chip Authentication Program — программа аутентификации микросхемы.

13Initialization Vector.

14Passphrase-based key derivation.

15Password-based encryption — шифрование на основе пароля.

16Man-in-the-middle — перехват и изменение данных с участием человека.

17Initiative for Open AuTHentication — инициатива открытой аутентификации.

18Over-The-Air — по воздуху (через эфир)

Рубрика: RFC | Комментарии к записи RFC 6030 Portable Symmetric Key Container (PSKC) отключены

RFC 6038 Two-Way Active Measurement Protocol (TWAMP) Reflect Octets and Symmetrical Size Features

Internet Engineering Task Force (IETF)                         A. Morton
Request for Comments: 6038                                 L. Ciavattone
Updates: 5357                                                  AT&T Labs
Category: Standards Track                                   October 2010
ISSN: 2070-1721

Two-Way Active Measurement Protocol (TWAMP) Reflect Octets and Symmetrical Size Features

Октеты отражения и симметричный размер в TWAMP

PDF

Аннотация

В этом документе описаны два тесно связанных свойства протокола двухсторонних активных измерений (Two-Way Active Measurement Protocol или TWAMP) — необязательная возможность возврата отвечающим хостом некоторых октетов команды или заполнения отправителю и необязательный формат пакетов отправителя, обеспечивающий одинаковый размер пакетов в обоих направлениях.

Статус документа

Этот документ содержит проект стандарта Internet (Internet Standards Track).

Документ является результатом работы IETF и выражает согласованное мнение сообщества IETF. Документ был представлен на публичное рассмотрение и обобрен для публикации IESG. Дополнительная информация о стандартах Internet доступна в разделе 2 RFC 5741.

Информацию о текущем статусе документа, обнаруженных ошибках и способах обратной связи можно получить, воспользовавшись ссылкой http://www.rfc-editor.org/info/rfc6038.

Авторские права

Авторские права ((c) 2010) принадлежат IETF Trust и лицам, указанным в числе авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

Документ может содержать материалы из IETF Document или IETF Contribution, опубликованных или публично доступных до 10 ноября 2008 года. Лица, контролирующие авторские права на некоторые из таких документов, могли не предоставить IETF Trust права разрешать внесение изменений в такие документы за рамками процессов IETF Standards. Без получения соответствующего разрешения от лиц, контролирующих авторские права этот документ не может быть изменен вне рамок процесса IETF Standards, не могут также создаваться производные документы за рамками процесса IETF Standards за исключением форматирования документа для публикации или перевода с английского языка на другие языки.

1. Введение

Протокол двухсторонних активных измерений TWAMP [RFC5357] является расширением протокола односторонних измерений OWAMP [RFC4656]. По мере разработки спецификация TWAMP была подвергнута широкому обсуждению, в результате чего было предложено несколько новых свойств TWAMP. Этот документ описывает два тесно связанных свойства TWAMP.

Одним из необязательных свойств отвечающего хоста является возврат ограниченного числа не назначенных (заполнение) октетов элементу Control-Client или Session-Sender в протоколах TWAMP-Control и TWAMP-Test. Благодаря этому, Control-Client или Session-Sender может встраивать октеты информации, которую он считает полезной, и быть уверенным в том что соответствующий тестовый пакет или отклик будет включать эту информации после отражения и возврата (сервером или рефлектором).

Документ также добавляет необязательную возможность гарантировать, что отраженные тестовые пакеты имеют одинаковый размер в обоих направлениях. Это обеспечивается путем задания нового формата пакетов TWAMP-Test Session-Sender. Хотя TWAMP [RFC5357] рекомендует отсекать заполнение для обеспечения симметрии размеров (компенсация увеличения заголовков в пакетах Session-Reflector), отсечка заполнения рефлектором не гарантируется, а при малом объеме заполнения такое выравнивание размера становится невозможным.

Этот документ обновляет базовый протокол TWAMP [RFC5357]. От системы измерения не требуется реализация описанных здесь функций для соответствия [RFC5357].

В документе для битов, помеченных MBZ (Must Be Zero), должно устанавливаться значение 0 при передаче, а получатель должен игнорировать их. Значение HMAC (Hashed Message Authentication Code) должно рассчитываться в соответствии с параграфом 3.2 в [RFC4656].

2. Уровни требований

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе должны интерпретироваться в соответствии с RFC 2119 [RFC2119].

3. Назначение и область действия

Цель этого документа состоит в определении двух необязательных тесно связанных свойств TWAMP [RFC5357]. Эти свойства расширяют возможности хостов TWAMP для выполнения простых операций с пакетами управления и тестов — отражение октетов или заполнения, а также поддержка симметрии размера пакетов TWAMP-Test. Мотивами изменений послужило обеспечение хосту контроллера возможности помечать пакеты индексом для упрощения их идентификации и/или обеспечения одинакового размера пакетов, передаваемых в обоих направлениях.

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

Reflect Octets — отражение октетов

Способность сервера и рефлектора (Server/Session-Reflector) отражать заданные октеты клиенту или отправителю (Client/Session-Sender), а также аналогичное поведение клиента и отправителя.

Symmetrical Size — симметрия размера

Возможность обеспечить протоколу TWAMP-Test одинаковый размер пакетов для обоих направления за счет поддержки нового формата пакетов TWAMP-Test Session-Sender в Session-Sender и Session-Reflector. Меняется только формат тестовых пакетов Session-Sender.

Документ расширяет режимы работы за счет добавления двух значений поля Modes (параграф 3.1 в [RFC4656] для формата сообщения Server Greeting) при сохранении совместимости с реализациями базовой спецификации TWAMP [RFC5357]. Значения, соответствующие новым режимам, заданы в этом документе.

Когда Server и Control-Client согласовали использование режима Reflect Octets при организации управляющего соединения, Control-Client, Server, Session-Sender и Session-Reflector должны соответствовать приведенным ниже требованиям к этому режиму.

Когда Server и Control-Client согласовали использование режима Symmetrical Size при организации управляющего соединения, Control-Client, Server, Session-Sender и Session-Reflector должны соответствовать приведенным ниже требованиям к этому режиму.

4. Расширения TWAMP-Control

Протокол TWAMP-Control [RFC5357] использует поле Modes для идентификации и выбора коммуникационных возможностей и это поле является признанным механизмом расширения. Оба варианта расширения описаны ниже.

4.1. Организация соединения с новыми функциями

Соединения TWAMP организуются по процедуре, определенной в параграфе 3.1 [RFC4656] и параграфе 3.1 [RFC5357]. Новым свойствам нужны две новых битовых позиции (значения) для идентификации способности Server/Session-Reflector отражать конкретные октеты обратно Control-Client/Session-Sender и поддержки нового формата пакетов Session-Sender протокола TWAMP-Test. Выделенные значения и позиции указаны в разделе 7. Взаимодействие с IANA.

Server устанавливает один или оба бита новых режимов в поле Modes сообщения Server Greeting для индикации своих возможностей и желания работать в любом из этих режимов (или в обоих).

Если Control-Client предназначен для работы во всех тестовых сессиях, созданных этим управляющим соединением, с использованием одного или обоих новых режимов, он должен установить соответствующий каждой функции бит в поле Mode сообщения Setup Response. Для этих или иных расширений Control-Client может устанавливать несколько битов поля Mode в сообщении Setup Response.

4.2. Отражение октетов — формат пакета Request-TW-Session

Биты, предназначенные для свойства Reflect Octets в команде Request-TW-Session показаны на рисунке.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      5        |  MBZ  | IPVN  |  Conf-Sender  | Conf-Receiver |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Number of Schedule Slots                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
.                                                               .
.        ... множество полей (66 октетов) не показано ...       .
.                                                               .
.                                                               .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Padding Length  (4 октета)                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Start Time  (8 октетов)                  |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Timeout  (8 октетов)                    |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Type-P Descriptor                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Octets to be reflected    |  Length of padding to reflect |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       MBZ (4 октетов)                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                       HMAC (16 октетов)                       |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Важно отметить, что поле Padding Length по-прежнему задает число октетов заполнения, которые Session-Sender будет добавлять во все пакеты TWAMP-Test, связанные с этим сеансом тестирования. Ниже обсуждается минимальный размер заполнения после определения двух новых полей вслед за полем Type-P Descriptor.

Отметим, что число октетов заполнения, добавляемых в конце тестового пакета Session-Reflector зависит от поддержки процесса отсечки, рекомендованного спецификацией TWAMP (параграф 4.2.1 в [RFC5357]).

Значение Octets to be reflected нужно указывать в 2-октетном поле, как показано на рисунке, и оно задает число октетов, которые Server должен отразить в сообщении Accept Session в соответствии с приведенным ниже описанием.

Значение Length of padding to reflect нужно указывать в 2-октетном поле, включая в него целое число без знака, указывающее количество октетов. Это поле указывает размер заполнения в пакете TWAMP-Test, которое Session-Sender ожидает в отраженном пакете, и число октетов, которые рефлектору нужно вернуть в своем пакете TWAMP-Test (параграф 5.2). Включение этого размера в сообщение Request-TW-Session позволяет серверу определить возможность выполнения конкретного запроса на отражение заполнения в пакетах TWAMP-Test и заранее организовать обработку для Session-Reflector.

Полю Padding Length следует иметь значение не меньше 27 для сессии TWAMP-Test без аутентификации, чтобы можно было выполнить процесс отсечки, рекомендуемый в спецификации TWAMP (параграф 4.2.1 в [RFC5357]). В сессиях с аутентификацией и шифрованием полю Padding Length следует иметь значение не меньше 641 для возможности отсечки в соответствии со спецификацией TWAMP (параграф 4.2.1 в [RFC5357]). Нужно задавать в поле Padding Length значение больше Length of padding to reflect при организации сеанса тестирования с использованием необязательного режима Reflect Octets.

В режиме TWAMP-Test без аутентификации нужно задавать Padding Length не меньше 27 + Length of padding to reflect при организации тестовой сессии с использованием необязательного режима Reflect Octets и процесса отсечки, рекомендуемого спецификацией TWAMP (параграф 4.2.1 в [RFC5357]). В режимах TWAMP-Test с аутентификацией и шифрованием нужно задавать Padding Length не меньше 64 + Length of padding to reflect при организации тестовой сессии с использованием необязательного режима Reflect Octets и процесса отсечки, рекомендуемого спецификацией TWAMP (параграф 4.2.1 в [RFC5357]).

4.3. Отражение октетов — формат пакета Accept Session

Биты, предназначенные для свойства Reflect Octets в команде Accept Session показаны на рисунке.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Accept     |      MBZ      |            Port               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
|                                                               |
|                        SID (16 октетов)                       |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Reflected octets        |         Server octets         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       MBZ (8 октетов)                         |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                       HMAC (16 октетов)                       |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


В поле Reflected octets нужно указывать число октетов Request-TW-Session для отражения и размер поля составляет 2 октета, как показано на рисунке.

В поле Server octets нужно указывать размер информации, которую сервер ожидает получить в заполнении отраженного пакета TWAMP-Test Packet Padding или 0, а размер поля составляет 2 октета, как показано на рисунке. Хотя Server определяет SID, это поле слишком велико (16 октетов) и обычно не появляется в пакетах TWAMP-Test. Перечисленные ниже элементы должны присутствовать в реализации, использующей свойство Reflect Octets.

  • Когда сервер не требует возврата октетов в пакетах TWAMP-Test, он должен указать 0 в поле Server octets.

  • Когда Server задает число октетов, возвращаемых в пакетах TWAMP-Test, он должен передать отличное от 0 значение в поле Server octets, а TWAMP-Test Sender должен включить эти октеты в поле Packet Padding (отраженного пакета).

  • В параграфе 5.1.22 указано, как Server octets должны включаться в заполнение пакета TWAMP-Test, когда это нужно серверу (указано на втором рисунке в этом параграфе).

При выполнении процесса отсечки, рекомендуемого TWAMP в параграфе 4.2.1 [RFC5357], в поле Accept должно быть указано значение 3 (некоторые аспекты запроса не поддерживаются), если расчет размера заполнения показывает, недостаточное число октетов для выравнивания размера тестовых пакетов Session-Sender и Session-Reflector.

4.4. Дополнительные соображения

Значение поля Modes, передаваемое сервером в сообщении Server Greeting, является объединением (OR) режимов, которые сервер готов поддерживать в этой сессии.

На момент публикации этого RFC использовались последние (младшие) 7 битов 32-битового поля Modes. Control-Client, соответствующий этому расширению [RFC5357], может игнорировать старшие биты поля Modes или может поддерживать другие свойства, передаваемые в этих битах. Оставшиеся биты предназначены для будущих расширений протокола.

5. Расширения TWAMP-Test

Протокол TWAMP-Test похож на тестовый протокол OWAMP [RFC4656] за исключением того, что Session-Reflector передает пакеты отправителю (Session-Sender) в ответ на каждый полученный пакет. TWAMP (см. раздел 4 в [RFC5357] определяет два дополнительных формата тестовых пакетов, пережаваемых рефлектором. Выбор подходящего формата зависит от режима защиты. Заданные здесь новые режимы используют октеты заполнения в каждом пакете или требуют отсечки таких октетов в зависимости от выбранного режима защиты.

5.1. Поведение отправителя

В этом параграфе описаны расширения для поведения TWAMP Session-Sender.

5.1.1. Тактирование пакетов

Send Schedule не применяется в TWAMP и не меняется этим документом.

5.1.2. Отражение октетов — формат и содержимое пакета

Формат и содержимое пакета Session-Sender соответствуют процедуре и рекомендациям параграфа 4.1.2 в [RFC4656] (как указано в параграфе 4.1.2 [RFC5357]).

Режим Reflect Octets переназначает исходное поле TWAMP-Test Packet Padding (параграф 4.1.2 в [RFC4656]) для режима без аутентификации, как показано на рисунке ниже.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Timestamp                            |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Error Estimate        |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
|                                                               |
|                 Packet Padding (to be reflected)              |
.                 (число октетов задается командой)             .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
.                                                               .
.                  Additional Packet Padding                    .
.                                                               .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Занчению поля Packet Padding (to be reflected) нужно соответствовать числу октетов, заданному в поле Request-TW-Session Length of padding to reflect для этой тестовой сессии. Эти октеты Session-Sender ожидает получить от Session-Reflector.

Размер поля Additional Packet Padding определяется разностью двух полей команды Request-TW-Session

Additional Packet Padding = Padding Length - Length of padding to reflect

Когда Server назначает октеты для возврата в пакетах TWAMP-Test, он должен передать отличное от 0 значение в поле Server octets, а TWAMP-Test Session-Sender должен включить это значение в первые два октета (Server octets) поля Packet Padding (to be reflected) как показано ниже.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
                                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                |         Server octets         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|         Оставшиеся октеты Packet Padding (to be reflected)    |
.                  (число октетов задается командой)            .
.                                                               .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Поле Server octets содержит те же сведения, которые сервер возвратил клиенту (Control-Client) в сообщении Accept-Session, соответствующем сеансу тестирования (параграф 4.3). В Session-Reflector эти октеты должны быть отражены, как оставшаяся часть поля Packet Padding (to be reflected) field.

Отметим, что Session-Sender может вставлять октеты, используемые в поле Octets to be reflected команды Request-TW-Session, в любое место поля Packet Padding (to be reflected).

5.1.3. Отражение октетов — взаимодействие с отсечкой заполнения

При выборе режима Reflect Octets и выполнении процесса отсечки, рекомедуемого TWAMP (параграф 4.2.1 в [RFC5357]), Session-Sender должен определить минимальное заполнение, требуемое для сохранения одинакового размера тестовых пакетов в обоих направлениях. Объем такого заполнения зависит от режима защиты (без аутентификации, с аутентификацией, с шифрованием) и включения режима Reflect Octets.

При использовании лишь процедуры отсечки TWAMP (параграф 4.2.1 в [RFC5357]) Session-Sender должен добавить в конец пакета достаточное число октетов Packet Padding, чтобы пакеты IP имели одинаковый объем данных (payload) в обоих направлениях (обычно это желательно). Для компенсации большего размера пакетов Session-Reflector отправитель (Session-Sender) должен добавить не менее 27 октетов заполнения в режиме без аутентификации и не менее 643 в режимах с аутентификацией и шифрованием. Размеры пакетов протокола TWAMP-Test и величины отсечки заполнения для получения одного размера пакетов в обоих направлениях показаны в таблице ниже.

Отсечка заполнения TWAMP-Test.

Расположение октетов

Без аутентификации

С аутентификацией и шифрованием

Заголовок рефлектора

41

1121

Заголовок отправителя

14

48

Отсекаемое заполнение

27

641

При использовании режима Reflect Octets вместе с отсечкой, рекомендуемой TWAMP в параграфе 4.2.1 [RFC5357], Session-Sender должен добавить не менее (27 + Length of the padding to reflect) октетов в режиме без аутентификации. В режимах с аутентификацией и шифрованием Session-Sender должен добавить не менее (641 + Length of the padding to reflect) октетов.

5.1.4. Симметрия размера — формат пакетов Session-Sender

При выборе режима Symmetrical Size отправителю (Session-Sender) в режиме без аутентификации нужно использовать показанный ниже формат пакетов TWAMP-Test.


 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Timestamp                            |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Error Estimate        |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
|                                                               |
|                                                               |
|                         MBZ (27 октетов)                      |
|                                                               |
|                                                               |
|                                                               |
+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               |                                               |
+-+-+-+-+-+-+-+-+                                               +
.                                                               .
.                        Packet Padding                         .
.                                                               .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Это свойство требует изменить лишь формат пакетов Session-Sender, а формат пакетов Session-Reflector сохраняется.

5.1.5. Симметрия размера и отражение октетов — формат пакета Session-Sender

При выборе обоих режимов Symmetrical Size и Reflect Octets отправителю (Session-Sender) нужно применять в режиме без аутентификации показанный ниже формат пакетов TWAMP-Test.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Timestamp                            |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Error Estimate        |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
|                                                               |
|                                                               |
|                         MBZ (27 октетов)                      |
|                                                               |
|                                                               |
|                                                               |
+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               |                                               |
+-+-+-+-+-+-+-+-+                                               +
|                  Packet Padding (to be reflected)             |
.                  (число октетов задается командой)            .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
.                                                               .
.                  Additional Packet Padding                    .
.                                                               .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


В этом комбинированном режиме после октетов Packet Padding to be reflected следует 27 октетов MBZ в случае работы без аутентификации и 644 октета MBZ при использовании аутентификации и шифрования.

5.2. Поведение рефлектора

Рефлектор TWAMP следует процедуре и рекомендациям параграфа 4.2 в [RFC5357] с 2 дополнительными функциями.

Reflect Octets

Указанные в поле Packet Padding (to be reflected) октеты тестового пакета Session-Sender должны включаться в тестовый пакет Session-Reflector.

Symmetrical Size

Session-Reflector должен работать, используя формат пакетов Session_Sender5, определенный в параграфе 5.1.4, где Padding Octets отделены от информационных полей.

5.2.1. Отражение октетов — формат и содержимое пакета Session-Reflector

Свойство Reflect Padding переопределяет поле Packet Padding, как показано ниже. При выборе режима Reflect Octets отправителю (Session-Sender6) нужно использовать в случае работы без аутентификации показанный ниже формат пакетов TWAMP-Test.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Timestamp                            |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Error Estimate        |           MBZ                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Receive Timestamp                    |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sender Sequence Number                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sender Timestamp                         |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Sender Error Estimate    |           MBZ                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Sender TTL   |         Packet Padding (from Session-Sender)  |
+-+-+-+-+-+-+-+-+                                               +
.                                                               .
+                                               +-+-+-+-+-+-+-+-+
|          Packet Padding (from Session-Sender) |               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               +
|                                                               |
|                                                               |
.                  Additional Packet Padding                    .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Поле Packet Padding (from Session-Sender) должно указывать столько же октетов как поле Packet Padding (to be reflected) в тестовом пакете Session-Sender, поэтому должно соответствовать размеру, заданному в сообщении Request-TW-Session.

Когда сервер возвращает отличное от 0 значение в поле Server octets сообщения Accept Session (параграф 4.3), рефлектору нужно отразить эти октеты в оставшейся части поля Packet Padding (to be reflected).

Параграф 4.2.1 в [RFC5357] рекомендует использовать в TWAMP процесс отсечки заполнения. При использовании этого процесса с режимом Reflect Octets рефлектор должен отражать указанные октеты из тестового пакета Session-Sender в поле Packet Padding (from Session-Sender) и может повторно использовать дополнительные октеты Packet Padding от Session-Sender. Session-Reflector должен отсекать заполнение так, чтобы отбросить макимальное число октетов для совпадения размера пакета с размером пакета от Session-Sender. При использовании рекомендуемого процесса отсечки Session-Reflector должен оставить 27 октетов заполнения в режиме без аутентификации и 647 в режимах с аутентификацией и шифрованием.

В любом случае Session-Reflector может повторно использовать Packet Padding отправителя, поскольку требования к заполнению совпадают.

5.2.2. Симметрия размера — формат пакета Session-Reflector

При выборе режима Symmetrical Size формат пакетов для режима без аутентификации и режимов с аутентификацией и шифрованием идентичен формату базовой спецификации TWAMP (параграф 4.2.1 в [RFC5357]. Поэтому формат тестовых пакетов Session-Reflector не меняется.

Session-Reflector должен создавать свои тестовые пакеты, используя информацию из пакетов от Session-Sender. Размер пакетов Session-Reflector нужно делать равным размеру пакетов Session-Sender.

5.2.3. Симметрия размера и отражение октетов — формат пакета Session-Sender

При выборе обоих режимов Symmetrical Size и Reflect Octets рефлектор должен работать с пакетами формата Session-Sender, определенного в параграфе 5.1.5, где Padding Octets отделены от информационных полей, а поле Packet Padding (to be reflected) предшествует Additional Padding.

Рефлектору нужно использовать тот же формат пакетов TWAMP-Test, который задан в параграфе 5.2.1.

6. Вопросы безопасности

Расширенные режимы работы не открывают возможности новых атак на хосты, взаиможействующие по протоколу TWAMP [RFC5357].

Применимы все соображения безопасности, относящиеся к двухсторонним измерениям в работающих сетях (см.[RFC4656] и [RFC5357]).

7. Взаимодействие с IANA

Этот документ добавляет два режима работы в реестр IANA для поля TWAMP Modes и описывает поведение при использовании этих режимов. Это поле признано механизмом расширения для TWAMP.

7.1. Спецификация реестра

Агентство IANA создало реестр TWAMP-Modes (по запросу [RFC5618]). Режимы TWAMP указываются в сообщениях TWAMP Server Greeting и Setup Response, как указано в параграфе 3.1 [RFC5357], в соответствии с параграфом 3.1 of [RFC4656] и расширены этим документом. Режимы указываются установкой битов 32-битового поля Modes, которые включены в реестр Modes. Для реестра TWAMP-Modes выделение новых значений (битов) предполагается для новых функций, если нет явных причин поступать иначе (например, использовать комплексное кодирование для расширения в будущем).

7.2. Содержимое реестра

Реестр TWAMP-Modes дополнен приведенными ниже значениями.

Значение

Описание

Определение семантики

32

Reflect Octets

Данный документ, параграф 3.1 (бит 5)

64

Symmetrical Size

Данный документ, параграф 3.1 (бит 6)

8. Благодарности

Авторы благодарят Steve Baillargeon, Walt Steverson и Stina Ross за полезные комментарии и рецензии.

9. Нормативные документы

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC4656] Shalunov, S., Teitelbaum, B., Karp, A., Boote, J., and M. Zekauskas, «A One-way Active Measurement Protocol (OWAMP)», RFC 4656, September 2006.

[RFC5357] Hedayat, K., Krzanowski, R., Morton, A., Yum, K., and J. Babiarz, «A Two-Way Active Measurement Protocol (TWAMP)», RFC 5357, October 2008.

[RFC5618] Morton, A. and K. Hedayat, «Mixed Security Mode for the Two-Way Active Measurement Protocol (TWAMP)», RFC 5618, August 2009.

Адреса авторов

Al Morton

AT&T Labs

200 Laurel Avenue South

Middletown, NJ 07748

USA

Phone: +1 732 420 1571

Fax: +1 732 368 1192

EMail: acmorton@att.com

URI: http://home.comcast.net/~acmacm/

Len Ciavattone

AT&T Labs

200 Laurel Avenue South

Middletown, NJ 07748

USA

Phone: +1 732 420 1239

EMail: lencia@att.com


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1В оригинале указано некорректное значение. См. https://www.rfc-editor.org/errata/eid6409. Прим.перев.

2В оригинале ошибочно указан параграф 4.1.2. См. https://www.rfc-editor.org/rfc/rfc6038.txt. Прим. перев.

3В оригинале указано некорректное значение. См. https://www.rfc-editor.org/errata/eid6408. Прим.перев.

4В оригинале ошибочно указано 56. См. https://www.rfc-editor.org/errata/eid5549. Прим. перев.

5В оригинале ошибочно указано Session_Reflector. См. https://www.rfc-editor.org/errata/eid4259. Прим. перев.

6В оригинале ошибочно указано Session-Sender. См. https://www.rfc-editor.org/errata/eid4260. Прим. перев.

7В оригинале ошибочно указано 56. См. https://www.rfc-editor.org/errata/eid6410. Прим. перев.

Рубрика: RFC | Комментарии к записи RFC 6038 Two-Way Active Measurement Protocol (TWAMP) Reflect Octets and Symmetrical Size Features отключены

RFC 6003 Ethernet Traffic Parameters

Internet Engineering Task Force (IETF)                  D. Papadimitriou
Request for Comments: 6003                                Alcatel-Lucent
Updates: 3471, 3473                                         October 2010
Category: Standards Track
ISSN: 2070-1721

Ethernet Traffic Parameters

Параметры трафика Ethernet

PDF

Аннотация

Этот документ описывает поддержку параметров трафика Ethernet, заданных MEF (Metro Ethernet Forum) в документе MEF10.1, при использовании сигнального протокола резервирования ресурсов с организацией трафика (Resource ReSerVation Protocol — Traffic Engineering или RSVP-TE) для обобщённой коммутации по меткам (Generalized Multi-Protocol Label Switching или GMPLS).

Статус документа

Этот документ является проектом стандарта (Internet Standards Track).

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительная информация о документах Internet Standard представлена в разделе 2 документа RFC 5741.

Информация о статусе этого документа, обнаруженных ошибках и способах обратной связи доступна по ссылке http://www.rfc-editor.org/info/rfc6003.

Авторские права

Авторские права (c) 2010 принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

Согласно [RFC3471], обобщённая коммутация по меткам (GMPLS) позволяет включать в сигнализацию параметры конкретной технологии. Этот документ добавляет объекты Ethernet SENDER_TSPEC и FLOWSPEC для поддержки параметров трафика Ethernet MEF, заданных в [MEF10.1] и ITU-T Ethernet Service Switching [RFC6004], включая:

  • для частных линий Ethernet (Ethernet Private Line или EPL) [MEF6] эти параметры трафика применимы к каждому виртуальному соединению Ethernet (Ethernet Virtual Connection или EVC) через данный порт.

  • Для виртуальных частных линий Ethernet (Ethernet Virtual Private Line или EVPL) [MEF6] эти параметры трафика применимы на уровне виртуальных соединений (Ethernet Virtual Connection или EVC) с одним или несколькими классами обслуживания (Class of Service или CoS), независимо от связанного Virtual LAN ID (VID) или набора VID. Связь между EVC и VID описана в [MEF10.1]. Формат кодирования VID (или набора VID) описан в [RFC6004].

Сказанное не исключает более широкого использования объектов Ethernet SENDER_TSPEC и FLOWSPEC, описанных в этом документе. Например, они могут быть полезны для сигнализации путей Ethernet с коммутацией по меткам (Ethernet Label Switched Path или LSP), в обобщённом запросе метки (Generalized Label Request, см. [RFC3471]), поле Switching Type со значением Layer 2 Switching Capability (L2SC) и поле LSP Encoding Type для Ethernet.

2. Используемые соглашения

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119].

Предполагается знакомство читателя с терминологией [MEF10.1], [RFC3471] и [RFC3473].

3. Обзор

В GMPLS RSVP-TE [RFC3473] объект SENDER_TSPEC используется в сообщении Path для указания пропускной способности, запрошенной для создаваемого LSP, а объект FLOWSPEC применяется в сообщении Resv для указания фактически выделенной LSP пропускной способности. Объект Ethernet SENDER_TSPEC/FLOWSPEC включает тип канала Ethernet (гранулярность коммутации) запрашиваемого LSP и значение MTU для LSP. Другие сведения о характеристиках запрашиваемой пропускной способности LSP передаются в профиле пропускной способности (Bandwidth Profile) как TLV в объекте Ethernet SENDER_TSPEC/FLOWSPEC.

Bandwidth Profile указывает набор параметров трафика, применимых к последовательности кадров услуги (Service Frame) и называемых параметрами профиля пропускной способности в [MEF10.1]. Эти параметры приведены ниже.

  • Committed Rate (предоставляемая скорость) указывает скорость, с которой трафик обещано передавать в Ethernet LSP. Скорость указывается параметрами трафика CIR (Committed Information Rate) и CBS (Committed Burst Size).

    • CIR определяется как средняя скорость (в байтах за единицу времени), до которой сеть обязуется передавать кадры с выполнением своих задач производительности.

    • CBS определяет максимальное число единиц информации (например, байтов), доступных для передачи в пиках кадров, передаваемых со скоростью интерфейса при сохранении соответствия значению CIR.

  • Excess Rate (избыточная скорость) указывает степень превышения трафиков, передаваемым через Ethernet LSP, значения предоставленной (committed) скорости. Excess Rate указывается параметрами трафика EIR (Excess Information Rate) и EBS (Excess Burst Size).

    • EIR определяется как средняя скорость (в байтах за единицу времени) сверх значения CIR, до которой сеть обязуется передавать кадры с выполнением своих задач производительности.

    • EBS определяет максимальное число единиц информации (например, байтов), доступных для передачи в пиках кадров, передаваемых со скоростью интерфейса при сохранении соответствия значению EIR.

  • Color mode (CM — цветовой режим) указывает, используется ли в профиле пропускной способности свойство цвета (color-aware или color-blind).

  • Coupling flag (CF — флаг связывания) указывает один из двух режимов работы алгоритма установки скорости.

4. Объект Ethernet SENDER_TSPEC

Формат объекта Ethernet SENDER_TSPEC (Class-Num = 12, Class-Type = 6) показан на рисунке.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Length             | Class-Num (12)|   C-Type (6)  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Switching Granularity     |              MTU              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                              TLVs                             ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Switching Granularity (SG) — 16 битов

Указывает тип канала, содержащего запрашиваемый путь Ethernet LSP. Значения Ethernet Link Type указаны ниже.

 

Значение

Уровень коммутации

0

Предоставляется сигнализацией, см. [RFC6004].

1

Порт Ethernet (услуга но основе портов).

2

Кадр Ethernet (услуга на основе EVC).

255

Резерв

 

Значения 0 — 2 выделены в этом документе, значения 3 — 239 будут распределяться IANA по процедуре Standards Action [RFC5226], значение 255 зарезервировано этим документом (значение Length для него будет определено RFC со спецификацией), значения 240 — 254 зарезервированы для использования производителями, значения 256 — 65535 оставлены для будущего распределения.

MTU — 16 битов

Размер MTU в октетах. В поле недопустимо указывать значения меньше 46 для Ethernet v2 [ETHv2] и 38 для IEEE 802.3 [IEEE802.3].

TLV (Type-Length-Value)

Объект Ethernet SENDER_TSPEC должен включать хотя бы один элемент TLV и может включать несколько. Формат TLV должен соответствовать показанному ниже.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              Type             |             Length            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                             Value                             ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Type — 16 битов

Определённые в настоящее время значения приведены в таблице.

 

Тип

Размер

Формат

Описание

0

Резерв

Резервное значение

1

Резерв

Резервное значение

2

24

См. параграф 4.13

Ethernet Bandwidth Profile [MEF10.1]

3

8

[RFC6004]

Layer 2 Control Protocol (L2CP)

255

Резерв

Резервное значение

 

Значения 0, 1 и 255 зарезервированы этим документом, который задаёт также значения 2 и 3. Значения 4 — 239 будут выделяться IANA по процедуре Standards Action [RFC5226], значения 240 — 254 зарезервированы для производителей, значения 256 — 65535 в настоящее время не распределены.

Length — 16 битов

Число байтов в TLV с учётом полей Type и Length. Поля значений, размер которых не кратен 4, должны заполняться нулями в конце для выравнивания TLV по 4-октетной границе.

4.1. Ethernet Bandwidth Profile TLV

TLV типа 2 задаёт профиль пропускной способности Ethernet (Ethernet Bandwidth Profile или профиль BW), указывающий верхнюю границу объёма ожидаемых кадров услуги, относящихся в конкретному экземпляру сервиса Ethernet. Объект Ethernet SENDER_TSPEC может включать более одного Ethernet Bandwidth Profile TLV.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Profile    |     Index     |            Reserved           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              CIR                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              CBS                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              EIR                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              EBS                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Profile — 8 битов

Вектор битовых флагов. Определённые в настоящее время флаги указаны ниже.

Флаг 1 (бит 0) — флаг связывания (Coupling Flag или CF).

Флаг 2 (бит 1) — цветовой режим (Color Mode или CM)

Бит 0 является младшим. Остальные флаги зарезервированы их следует сбрасывать (0) при передаче и игнорировать при получении. Установка значения 1 указывает запрос соответствующего профиля измерений. Флаг 1 (CF) позволяет выбрать один из двух алгоритмов соблюдения скорости. Установленный (1) флаг 2 (CM) указывает режим с учётом цвета (color-aware), сброшенный — режим без учёта цвета (color-blind) [MEF10.2].

Index — 8 битов

Ссылка на пропускную способность, выделенную для данного класса трафика в случае запроса LSP с множеством классов. Значение поля должно соответствовать хотя бы одному из значения Class-Type, включённых в объект CLASSTYPE [RFC4124] или EXTENDED_CLASSTYPE object [MCOS].

Данное значение индекса j может быть связано не более чем с N значений Class-Type CTi (i =< N) из объекта EXTENDED_CLASSTYPE. Эта связь применяется, когда один или несколько CTI отображаются на один (общий) профиль BW. Примером является установка произвольного значения из диапазона [0x08,0xF8], связанного с набором CTi, при этом значения [0xF9,0xFF]4 выбираются для резервных наборов. Это обеспечивает сопоставление с одним из 248 предопределённых наборов CTi.

Данное значение индекса j может быть связано с одним CTi (соответствие 1:1). В этом случае установка значения индекса состоит в присвоении 3 младших битов поля Index значению поля CTi (из диапазона [0x00,0x07]). Это применяется при сопоставлении одного CTi с одним или несколькими (выделенными) профилями BW. В первом случае объект Ethernet SENDER_TSPEC включает один Ethernet Bandwidth Profile TLV, во втором — набор из одного или нескольких Ethernet Bandwidth Profile TLV (соответствующий индекс которых связан с одним значением CTi).

Отметим, что текущая спецификация разрешает сочетать общие и выделенные профили BW в одном LSP. Т. е. объект Ethernet SENDER_TSPEC может включать элементы Ethernet Bandwidth Profile TLV, соответствующие индексы которых могут быть взаимно-однозначно (1:1) связаны с одним или множеством Cti.

Для каждого субобъекта в объекте EXTENDED_CLASSTYPE [MCOS]:

  • каждому значению CTi следует взаимно-однозначно соответствовать MEF Customer Edge VLAN CoS (CE-VLAN CoS);

  • пропускная способность BW, запрошенная для поля CTi, может использоваться для учёта пропускной способности.

По умолчанию в поле Index должно устанавливаться значение 0.

Reserved — 16 битов

Эти биты следует сбрасывать (0) при передаче, а при получении они должны игнорироваться.

CIR (Committed Information Rate) — 32 бита

Значение CIR в байт/сек, представленное 32-битовым действительным числом с одинарной точностью и плавающей точкой в формате IEEE (см. [RFC4506]). Значение CIR должно быть неотрицательным.

CBS (Committed Burst Size) — 32 бита

Значение CBS в байтах, представленное 32-битовым действительным числом с одинарной точностью и плавающей точкой в формате IEEE (см. [RFC4506]). При CIR > 0, значение CBS должно быть не меньше максимального размера кадра.

EIR (Excess Information Rate) — 32 бита

Значение EIR, представленное 32-битовым действительным числом с одинарной точностью и плавающей точкой в формате IEEE (см. [RFC4506]). Значение EIR должно быть неотрицательным.

EBS (Excess Burst Size) — 32 бита

Значение EBS в байтах, представленное 32-битовым действительным числом с одинарной точностью и плавающей точкой в формате IEEE (см. [RFC4506]). При EIR > 0, значение EBS должно быть не меньше максимального размера кадра.

5. Объект Ethernet FLOWSPEC

Объект Ethernet FLOWSPEC (Class-Num = 9, Class-Type = 6) имеет такой же формат как Ethernet SENDER_TSPEC.

6. Объект Ethernet ADSPEC

С объектом Ethernet SENDER_TSPEC не связано объекта ADSPEC. Объект ADSPEC не указывается или используется IntServ ADSPEC с принятыми по умолчанию базовыми параметрами характеризации (Default General Characterization Parameters) и фрагментом гарантированного обслуживания (Guaranteed Service), см. [RFC2210].

7. Обработка

Указанные в этом документе объекты Ethernet SENDER_TSPEC и FLOWSPEC могут применяться для сигнализации Ethernet LSP. Для этого в объекте Generalized LABEL_REQUEST (см. [RFC3471]) поле Switching Type должно иметь значение 51 (L2SC), а поле LSP Encoding Type — 2 (Ethernet). Объект Ethernet SENDER_TSPEC передаёт спецификацию трафика, созданную отправителем сессии RSVP, этот объект следует пересылать и доставлять без изменений как посредникам, так и выходным узлам. Объект Ethernet FLOWSPEC передаёт сведения запроса резервирования, созданного получателями. Как и любой другой объект FLOWSPEC, он передаётся в восходящем направлении к входному узлу.

Промежуточные и выходные узлы должны убедиться, что сам узел и интерфейсы, на которых будет создаваться LSP, могут поддерживать запрошенную гранулярность коммутации (Switching Granularity), MTU и значения, включённую в TLV субобъектов. Эти узлы должны быть настроены с теми же предопределёнными наборами CT, что указывает значение индекса, переданное как часть поля Index в Ethernet Bandwidth Profile TLV (параграф 4.1). Если запрошенные значения не поддерживаются, узел-получатель должен генерировать сообщение PathErr с кодом ошибки Traffic Control Error и значением Service unsupported (см. [RFC2205]).

При получении поля MTU со значением меньше минимального размера кадра Ethernet (например, 46 байтов для Ethernet v2, 38 — для IEEE 802.3) узел должен генерировать сообщение PathErr с кодом ошибки Traffic Control Error и значением Bad Tspec (см. [RFC2205]).

Обработка ошибок для объектов CLASSTYPE выполняется по правилам [RFC4124], правила обработки ошибок для объектов EXTENDED_CLASSTYPE заданы в [MCOS]. Кроме того, маршрутизатор с коммутацией по меткам (Label Switching Router или LSR), получивший сообщение Path с объектом EXTENDED_CLASSTYPE и распознавший этот объект и Class-Type, но обнаруживший несоответствие в значениях индексов, должен передать в направлении отправителя сообщение PathErr с кодом ошибки Extended Class-Type Error и значением Class-Type mismatch (см. [RFC2205]).

8. Вопросы безопасности

Этот документ не вносит соображений безопасности в дополнение к указанным в [RFC3473].

Безопасность GMPLS рассмотрена в разделе 11 [RFC3471], который ссылается на [RFC3209] для RSVP-TE. Дополнительные сведения о безопасности MPLS-TE и GMPLS приведены в [RFC5920].

9. Взаимодействие с IANA

Агентство IANA поддерживает реестры и субреестры для RSVP-TE при использовании в GMPLS. Выделенные в этих реестрах значения описаны в последующих параграфах.

9.1. Типы классов объектов RSVP

Этот документ добавляет два новых значения Class Type для имеющихся объектов RSVP. Значения внесены в субреестр Class Names, Class Numbers, and Class Types реестра Resource ReSerVation Protocol (RSVP) Parameters.

 

Номер класса

Имя класса

Документ

9

FLOWSPEC

[RFC2205]

Class Type (C-Type): 6 Ethernet SENDER_TSPEC

[RFC6003]

12

SENDER_TSPEC

[RFC2205]

Class Type (C-Type): 6 Ethernet SENDER_TSPEC

[RFC6003]

 

9.2. Реестр Ethernet Switching Granularities

Агентство IANA поддерживает реестр параметров Generalized Multi-Protocol Label Switching (GMPLS) Signaling Parameters. В этом реестре создан субреестр Ethernet Switching Granularities для значений, которые могут передаваться в поле Switching Granularity объектов Ethernet SENDER_TSPEC. Значения указаны в таблице.

 

0-2

См. ниже

3-239

Не выделены

240-254

Резерв для использования производителями

255

Резерв

256-65535

Не выделены в настоящее время

 

Значения выделяются по процедуре Standards Action. Выделенные в настоящее время значения указаны в таблице.

 

Значение

Гранулярность коммутации

Документ

0

Указывается сигнализацией

[RFC6003][RFC6004]

1

Ethernet Port (для услуг по портам)

[RFC6003]

2

Ethernet Frame (для услуг по EVC)

[RFC6003]

255

Резерв

[RFC6003]

 

9.3. Реестр Ethernet Sender TSpec TLVs

Агентство IANA поддерживает реестр параметров Generalized Multi-Protocol Label Switching (GMPLS) Signaling Parameters. В этом реестре создан субреестр Ethernet Sender Tspec TLVs / Ethernet Flowspec TLVs для значений типа TLV, передаваемых в объектах Ethernet SENDER_TSPEC. Значения типов указаны в таблице.

 

0-3

См. ниже

4-239

Не выделены

240-254

Резерв для использования производителями

255

Резерв

256-65535

Не выделены в настоящее время

 

Значения выделяются по процедуре Standards Action. Выделенные в настоящее время значения указаны в таблице.

 

Тип

Описание

Документ

0

Резерв

[RFC6003]

1

Резерв

[RFC6003]

2

Ethernet Bandwidth Profile

[RFC6003]

3

Layer 2 Control Protocol (L2CP)

[RFC6003]

255

Резерв

[RFC6003]

 

9.4. Профили пропускной способности Ethernet

Агентство IANA поддерживает реестр параметров Generalized Multi-Protocol Label Switching (GMPLS) Signaling Parameters. В этом реестре создан субреестр Ethernet Bandwidth Profiles для указания флагов, передаваемых в Ethernet Bandwidth Profile TLV объекта Ethernet SENDER_TSPEC. Биты флагов выделяются по процедуре IETF Standards Action. Нумерация начинается с 0 для младшего бита. Выделенные биты указаны в таблице.

 

Бит

Значение

Описание

Документ

0

0x01

Coupling Flag (CF)

[RFC6003]

1

0x02

Color Mode (CM)

[RFC6003]

 

10. Благодарности

Спасибо Adrian Farrel за комментарии. Lou Berger предоставил информацию по обработке управляющего трафика.

11. Литература

11.1. Нормативные документы

[MEF10.1] The MEF Technical Specification, «Ethernet Services Attributes Phase 2», MEF 10.1, November 2006.

[RFC2205] Braden, R., Ed., Zhang, L., Berson, S., Herzog, S., and S. Jamin, «Resource ReSerVation Protocol (RSVP) — Version 1 Functional Specification», RFC 2205, September 1997.

[RFC2210] Wroclawski, J., «The Use of RSVP with IETF Integrated Services», RFC 2210, September 1997.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC3209] Awduche, D., Berger, L., Gan, D., Li, T., Srinivasan, V., and G. Swallow, «RSVP-TE: Extensions to RSVP for LSP Tunnels», RFC 3209, December 2001.

[RFC3471] Berger, L., Ed., «Generalized Multi-Protocol Label Switching (GMPLS) Signaling Functional Description», RFC 3471, January 2003.

[RFC3473] Berger, L., Ed., «Generalized Multi-Protocol Label Switching (GMPLS) Signaling Resource ReserVation Protocol-Traffic Engineering (RSVP-TE) Extensions», RFC 3473, January 2003.

[RFC4124] Le Faucheur, F., Ed., «Protocol Extensions for Support of Diffserv-aware MPLS Traffic Engineering», RFC 4124, June 2005.

[RFC4506] Eisler, M., Ed., «XDR: External Data Representation Standard», STD 67, RFC 4506, May 2006.

[RFC5226] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, May 2008.

[RFC6004] Berger, L. and D. Fedyk, «Generalized MPLS (GMPLS) Support for Metro Ethernet Forum and G.8011 Ethernet Services», RFC 6004, October 2010.

11.2. Дополнительная литература

[ETHv2] Digital, Intel, and Xerox, «The Ethernet — A Local Area Network: Data Link Layer and Physical Layer Specifications», Version 2.0, November 1982.

[IEEE802.3] IEEE 802.3 LAN/MAN CSMA/CD (Ethernet) Access Method, IEEE Standard for Information technology- Specific requirements — Part 3: Carrier Sense Multiple Access with Collision Detection (CMSA/CD) Access Method and Physical Layer Specifications, IEEE 802.3-2008.

[MCOS] Minei, I., Gan, D., Kompella, K., and X. Li, «Extensions for Differentiated Services-aware Traffic Engineered LSPs», Work in Progress, June 2006.

[MEF6] The Metro Ethernet Forum, «Ethernet Services Definitions — Phase I», MEF 6, June 2004.

[MEF10.2] The MEF Technical Specification, «Ethernet Services Attributes Phase 2», MEF 10.2, October 2009.

[RFC5920] Fang, L., Ed., «Security Framework for MPLS and GMPLS Networks», RFC 5920, July 2010.

Адрес автора

Dimitri Papadimitriou

Alcatel-Lucent Bell

Copernicuslaan 50

B-2018 Antwerpen, Belgium

Phone: +32 3 2408491

EMail: dimitri.papadimitriou@alcatel-lucent.be


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru


1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

3В оригинале ошибочно указан параграф 3.1, см. https://www.rfc-editor.org/errata/eid2551. Прим. перев.

4В оригинале ошибочно указано [0xF8,0xFF], см. https://www.rfc-editor.org/errata/eid2552. Прим. перев.

Рубрика: RFC | Оставить комментарий

RFC 6020 YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)

Internet Engineering Task Force (IETF)                 M. Bjorklund, Ed.
Request for Comments: 6020                                Tail-f Systems
Category: Standards Track                                   October 2010
ISSN: 2070-1721

YANG — моделирование данных для протокола NETCONF

YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)

PDF

Аннотация

YANG представляет собой язык моделирования данных, используемый в моделях конфигурации и состояний, с которыми работает протокол настройки конфигурации сети (Network Configuration Protocol или NETCONF), вызовы удалённых процедур NETCONF и уведомления NETCONF.

Статус документа

Этот документ является проектом стандарта (Internet Standards Track).

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительная информация о документах Internet Standard представлена в разделе 2 документа RFC 5741.

Информация о статусе этого документа, обнаруженных ошибках и способах обратной связи доступна по ссылке http://www.rfc-editor.org/info/rfc6020.

Авторские права

Авторские права (c) 2011 принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

Документ может содержать материалы из IETF Document или IETF Contribution, опубликованных или публично доступных до 10 ноября 2008 года. Лица, контролирующие авторские права на некоторые из таких документов, могли не предоставить IETF Trust права разрешать внесение изменений в такие документы за рамками процессов IETF Standards. Без получения соответствующего разрешения от лиц, контролирующих авторские права этот документ не может быть изменён вне рамок процесса IETF Standards, не могут также создаваться производные документы за рамками процесса IETF Standards за исключением форматирования документа для публикации или перевода с английского языка на другие языки.

1. Введение

YANG представляет собой язык моделирования данных, используемый в моделях конфигурации и состояний, с которыми работает протокол настройки конфигурации сети (NETCONF), вызовы удалённых процедур NETCONF и уведомления NETCONF. YANG служит для моделирования операций и содержимого уровней NETCONF (см. параграф 1.1 в [RFC4741]).

Этот документ описывает синтаксис и семантику языка YANG, представления модели данных, определённой в модуле YANG на языке XML3, и использование операций NETCONF для манипулирования данными.

2. Уровни требований

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119].

3. Терминология

anyxml

Узел данных, содержащий неизвестный блок (chunk) данных XML.

augment — дополнение

Добавляет новые узлы схемы к ранее определённому узлу.

base type — базовый тип

Тип, на основе которого создан производный тип. Может быть встроенным или производным типом.

built-in type — встроенный тип

Тип данных YANG, определённый в спецификации языка YANG (например, uint32 или string).

choice — выбор

Узел схема, где можно выбрать какой-либо один из имеющихся вариантов.

configuration data — данные конфигурации

Набор данных (с возможностью записи), который требуется для перевода системы из исходного состояния в текущее [RFC4741].

conformance — соответствие

Мера соответствия устройства модели данных.

container — контейнер

Внутренний узел данных, имеющийся в дереве данных не более чем в одном экземпляре. Контейнер не имеет значения и представляет собой набор дочерних узлов.

data definition statement — оператор определения данных

Оператор, определяющий новые узлы данных, — container, leaf, leaf-list, list, choice, case, augment, uses и anyxml.

data model — модель данных

Модель, описывающая представление данных и доступ к ним.

data node — узел данных

Узел в дереве схемы, экземпляр которого может быть создан в дереве данных, — container, leaf, leaf-list, list, anyxml.

data tree — дерево данных

Экземпляр дерева данных конфигурации и состояния в устройстве.

derived type — производный тип

Тип, созданный на основе встроенного (например, uint32) или другого производного типа.

device deviation — отклонение устройства

Отказ устройства корректно реализовать модуль.

extension — расширение

Расширения добавляют в операторы семантику, отличную от YANG. Оператор extension определяет новые операторы для выражения такой семантики.

feature — возможность, функция

Механизм для маркировки части модели как необязательной. Определения могут помечаться именами возможностей и будут применимы только на устройствах, поддерживающих соответствующую возможность.

grouping — группировка

Набор многократно используемых (reusable) узлов схемы, который может использоваться локально в модуле или в других модулях, импортирующих его. Оператор grouping не является оператором определения данных, поэтому он не задаёт каких-либо узлов в дереве схемы.

identifier — идентификатор

Строка, используемая для указания различных элементов YANG по именам.

instance identifier — идентификатор экземпляра

Механизм для идентификации отдельного узла в дереве данных.

interior node — внутренний узел

Узел в иерархии, который не является листом (leaf).

leaf — лист

Узел данных, который существует в дереве данных в количестве не более одного экземпляра. Лист имеет значение, но не имеет дочерних узлов.

leaf-list — лист-список

Похож на лист, но определяет набор однозначно идентифицируемых узлов, а не один узел. Каждый из узлов списка имеет значение, но не имеет узлов-потомков.

list — список

Внутренний узел данных, который может существовать в дереве данных во множестве экземпляров. Список не имеет значения, но имеет набор дочерних узлов.

module — модуль

Модуль YANG определяет иерархию узлов, которые могут использоваться для операций на основе NETCONF. Со своими и импортированными или включёнными из любого источника определениями модуль является самодостаточным и «компилируемым».

RPC4

Вызов удалённой процедуры, используемый в протоколе NETCONF.

RPC operation — операция RPC

Вызов конкретной удалённой процедуры, используемый в протоколе NETCONF. Называется также протокольной операцией.

schema node — узел схемы

Узел в дереве схемы — container, leaf, leaf-list, list, choice, case, rpc, input, output, notification или anyxml.

schema node identifier идентификатор узла схемы

Механизм для указания конкретного узла в дереве схемы.

schema tree — дерево схемы

Определение иерархии, заданное внутри модуля.

state data — данные состояния

Дополнительные данные в системе, которые не относятся к конфигурации, например, доступная лишь для чтения статистика и информация о состоянии [RFC4741].

submodule — субмодуль

Частичное определение модуля, вносящее производные типы, группировки, узлы данных, RPC, действия и уведомления для модуля. Модуль YANG может содержать множество субмодулей.

top-level data node — узел данных верхнего уровня

Узел данных, не имеющий других узлов данных между собой и оператором module или submodule.

uses — использует

Оператор служит для создания экземпляра множества узлов схемы, определённого в операторе grouping. Создаваемые узлы могут быть уточнены и дополнены в соответствии с конкретными потребностями.

3.1. Обязательные узлы

Обязательными узлами являются перечисленные ниже:

  • узлы leaf, choice или anyxml с оператором mandatory, имеющим значение true;

  • узлы list или leaf-list, в которых оператор min-elements имеет значение больше 0;

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

4. Обзор YANG

4.1. Функциональный обзор

Язык YANG служит для моделирования данных в протоколе NETCONF. Модуль YANG определяет иерархии данных, которые могут применяться в операциях на основе NETCONF, включая параметры конфигурации, данные состояния, RPC и уведомления. Это позволило полностью описать данные, передаваемые между клиентами и серверами NETCONF.

YANG моделирует иерархическую организацию данных в виде дерева, где каждый узел имеет имя и значение или набор дочерних узлов. YANG обеспечивает чёткое и краткое описание узлов, а также взаимодействия между ними.

YANG структурирует модели данных в модули и субмодули. Модуль может импортировать определения из внешних модулей и включать определения из субмодулей. Иерархия может дополняться путём позволения модулю добавлять узлы данных в иерархию, определённую в другом модуле. Дополнение может быть условным, когда новые узлы добавляются только при выполнении заданных условий.

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

YANG определяет набор встроенных типов и включает механизм для определения новых типов. Производные типы могут ограничивать набор значений по сравнению с базовым типом, путём применения механизмов типа ограничений на числа элементов или шаблонов (pattern), которые могут применяться клиентами или серверами. Они могут также задавать соглашения по использованию производного типа как, например, основанный на string тип для указания имён хостов.

YANG разрешает использовать группировку узлов для многократного применения (reusable). Создание экземпляра такой группировки позволяет уточнять или дополнять узлы, обеспечивая возможность адаптации узлов к конкретным потребностям. Производные типы и группировки могут определяться в одном модуле и применяться в нем же или в другом модуле или субмодуле, который импортирует или включает данный модуль

Конструкции иерархии данных YANG включают определения списков, которые идентифицируются ключами, отличающимися один от другого. Такие списки могут определяться как сортируемые пользователем или автоматически сортироваться системой. В сортируемых пользователем списках определяются операции для изменения порядка элементов в списке.

Модули YANG могут транслироваться в эквивалентный синтаксис XML, называемый YIN5 (раздел 11), что позволяет приложениям использовать анализаторы XML и сценарии XSLT6 для работы с моделями. Преобразование из YANG в YIN происходит без семантических потерь, поэтому YIN можно обратно преобразовать в YANG.

YANG обеспечивает баланс моделирования данных на верхнем уровне и кодирования битов на нижнем уровне. Читатель модуля YANG может видеть верхний уровень представления модели данных, понимая, как эти данные будут кодироваться в операциях NETCONF.

Язык YANG является расширяемым и позволяет определять расширения органам стандартизации, производителям и отдельным людям. Синтаксис операторов позволяет расширениям естественным образом существовать вместе со стандартными операторами, при этом расширения в модуле YANG достаточно выделяются, чтобы быть заметными.

YANG не пытается решить все возможные задачи, ограничивая область действия выражением моделей данных NETCONF, а не произвольных документов XML или моделей данных. Модели данных, описываемые языком YANG разработаны для упрощения работы с операциями NETCONF.

Насколько это возможно, YANG поддерживает совместимость со структурами SMIv27 [RFC2578] [RFC2579] протокола SNMP8. Основанные на SMIv2 модули MIB могут автоматически преобразовываться в модули YANG с доступом только для чтения (read-only). Однако YANG не обеспечивает трансляции в SMIv2.

Подобно NETCONF, YANG обеспечивает интеграцию с естественной инфраструктурой управления устройством. Это позволяет реализациям использовать имеющиеся механизмы контроля доступа для защиты или показа элементов модели данных.

4.2. Обзор языка

В этом разделе вводятся некоторые важные конструкции YANG, которые будут нужны для понимания специфики языка в последующих параграфах. Такой прогрессивный подход учитывает взаимосвязанную природу концепций и операторов YANG. Подробное описание операторов YANG и их синтаксиса начинается в разделе 7.

4.2.1. Модули и субмодули

Модули содержат три типа операторов: операторы заголовка, операторы версии (revision) и операторы определений. Операторы заголовка описывают модуль и дают информацию о самом модуле, операторы revision указывают сведения об истории модуля, а операторы определений являются телом модуля, где определяется модель данных.

Сервер NETCONF может поддерживать множество модулей, давая разные представления для одних и тех же данных или набор представлений отдельных подмножеств данных сервера. Сервер может также поддерживать единственный модуль, определяющий все доступные данные.

Модуль может разделить фрагменты своих данных на субмодули в соответствии с потребностями владельца модуля. Извне это будет по-прежнему выглядеть единым модулем, независимо от наличия и размера субмодулей.

Оператор include позволяет модулю или субмодулю ссылаться на свои субмодули, а оператор import позволяет ссылаться на данные в других модулях.

4.2.2. Основы моделирования данных

YANG определяет четыре основных типа узлов данных для моделирования данных. В каждом из последующих параграфов примеры показывают синтаксис YANG и соответствующее представление XML.

4.2.2.1. Лист

Узел leaf содержит простые данные типа integer или string, имеет единственное значение конкретного типа и не имеет дочерних узлов.

Пример YANG

       leaf host-name {
           type string;
           description "Имя хоста для данной системы";
       }

Пример NETCONF XML

       <host-name>my.example.com</host-name>

Оператор leaf описан в параграфе 7.6.

4.2.2.2. Список листьев

Список листьев (leaf-list) определяет последовательность значений определённого типа с единственным значением конкретного типа для каждого листа.

Пример YANG

     leaf-list domain-search {
         type string;
         description "Список доменных имён для поиска";
     }

Пример NETCONF XML

     <domain-search>high.example.com</domain-search>
     <domain-search>low.example.com</domain-search>
     <domain-search>everywhere.example.com</domain-search>

Оператор leaf-list описан в параграфе 7.7.

4.2.2.3. Контейнер

Контейнеры служат для группировки связанных узлов в субдерево (ветвь). Контейнер имеет лишь дочерние узлы и не имеет значения. Контейнер может содержать любое число узлов произвольного типа (листья, списки, контейнеры, листья-списки).

Пример YANG

     container system {
         container login {
             leaf message {
                 type string;
                 description
                     "Сообщение при старте сеанса входа в систему";
             }
         }
     }

Пример NETCONF XML

     <system>
       <login>
         <message>Доброе утро</message>
       </login>
     </system>

Оператор container описан в параграфе 7.5.

4.2.2.4. Список

Список определяет последовательность элементов. Каждый элемент подобен структуре или экземпляру записи и однозначно идентифицируется значениями ключевых листьев. Список может определять множество ключевых листьев и включать произвольное число дочерних узлов любого типа (листья, списки, контейнеры и т. п.).

Пример YANG

     list user {
         key "name";
         leaf name {
             type string;
         }
         leaf full-name {
             type string;
         }
         leaf class {
             type string;
         }
     }

Пример NETCONF XML

     <user>
       <name>glocks</name>
       <full-name>Goldie Locks</full-name>
       <class>intruder</class>
     </user>
     <user>
       <name>snowey</name>
       <full-name>Snow White</full-name>
       <class>free-loader</class>
     </user>
     <user>
       <name>rzell</name>
       <full-name>Rapun Zell</full-name>
       <class>tower</class>
     </user>

Оператор list описан в параграфе 7.8.

4.2.2.5. Пример модуля

Ниже показан пример комбинации операторов для определения модуля.

     // Содержимое примера "acme-system.yang"
     module acme-system {
         namespace "http://acme.example.com/system";
         prefix "acme";

         organization "ACME Inc.";
         contact "joe@acme.example.com";
         description
             "Модуль для элементов, реализующих систему ACME.";

         revision 2007-06-09 {
             description "Первый выпуск.";
         }

         container system {
             leaf host-name {
                 type string;
                 description "Имя хоста для этой системы";
             }

             leaf-list domain-search {
                 type string;
                 description "Список доменных имён для поиска";
             }

             container login {
                 leaf message {
                     type string;
                     description
                         "Сообщение, выдаваемое при старте сеанса входа";
                 }

                 list user {
                     key "name";
                     leaf name {
                         type string;
                     }
                     leaf full-name {
                         type string;
                     }
                     leaf class {
                         type string;
                     }
                 }
             }
         }
     }

4.2.3. Данные состояния

YANG может моделировать данные состояния, а также конфигурационные данные в зависимости от оператора config. Когда узел имеет тег config false, это означает, что его субиерархия помечена, как данные состояния, возвращаемые операцией NETCONF <get>, но не <get-config>. Родительские контейнеры, списки и ключевые узлы также указываются, как содержащие контекст для данных состояния.

В приведённом ниже примере для каждого интерфейса определены два узла, определяющие заданную в конфигурации и наблюдаемую скорость. Наблюдаемая скорость не является конфигурационной, поскольку она может быть возвращена операцией NETCONF <get>, но не <get-config>. Наблюдаемая скорость не относится к данным конфигурации и её нельзя установить с помощью <edit-config>.

     list interface {
         key "name";

         leaf name {
             type string;
         }
         leaf speed {
             type enumeration {
                 enum 10m;
                 enum 100m;
                 enum auto;
             }
         }
         leaf observed-speed {
             type uint32;
             config false;
         }
     }

4.2.4. Встроенные типы

Язык YANG имеет набор встроенных типов, подобно многим языкам программирования, но с некоторыми отличиями, которые связаны со специальными требованиями сетевого управления. В таблице перечислены встроенные типы, которые подробно описаны в разделе 9.

Имя

Описание

binary

произвольные двоичные данные

bits

набор битов или флагов

boolean

true или false

decimal64

64-битовое десятичное число со знаком

empty

лист, не имеющий какого-либо значения

enumeration

одно из перечисляемого набора строковых значений

identityref

ссылка на абстрактное отождествление (identity)

instance-identifier

ссылка на узел дерева данных

int8

8-битовое целое число со знаком

int16

16-битовое целое число со знаком

int32

32-битовое целое число со знаком

int64

64-битовое целое число со знаком

leafref

ссылка на экземпляр листа

string

строка символов

uint8

8-битовое целое число без знака

uint16

16-битовое целое число без знака

uint32

32-битовое целое число без знака

uint64

64-битовое целое число без знака

union

выбор одного из входящих в объединение типов

Оператор type описан в параграфе 7.4.

4.2.5. Производные типы (typedef)

YANG позволяет определять производные (derived) типы на основе базовых с помощью оператора typedef. Базовым типом может быть встроенный или ранее определённый производный тип, что позволяет создавать иерархии производных типов.

Производные типы могут указываться в качестве аргумента операторов type.

Пример YANG

     typedef percent {
         type uint8 {
             range "0 .. 100";
         }
         description "Процент";
     }

     leaf completed {
         type percent;
     }

Пример NETCONF XML

     <completed>20</completed>

Оператор typedef описан в параграфе 7.3.

4.2.6. Многократно используемые группы узлов (grouping)

Группы узлов могут собираться в многократно применяемые наборы и помощью оператора grouping. Группировка определяет множество узлов, которое создаётся с помощью оператора uses.

     grouping target {
         leaf address {
             type inet:ip-address;
             description "Целевой адрес IP";
         }
         leaf port {
             type inet:port-number;
             description "Номер целевого порта";
         }
     }

     container peer {
         container destination {
             uses target;
         }
     }

Пример NETCONF XML

     <peer>
       <destination>
         <address>192.0.2.1</address>
         <port>830</port>
       </destination>
     </peer>

Группировка может быть уточнена, что позволяет переопределять в ней некоторые операторы. В приведённом ниже примере уточняется описание (description).

     container connection {
         container source {
             uses target {
                 refine "address" {
                     description "IP-адрес отправителя";
                 }
                 refine "port" {
                     description "Номер порта отправителя";
                 }
             }
         }
         container destination {
             uses target {
                 refine "address" {
                     description "IP-адрес получателя";
                 }
                 refine "port" {
                     description "Номер порта получателя";
                 }
             }
         }
     }

Оператор grouping описан в параграфе 7.11.

4.2.7. Выбор

YANG позволяет модели данных разделять несовместимые узлы в разные варианты с помощью операторов choice и case. Оператор choice содержит набор операторов case, определяющих набор узлов схемы, которые не могут появляться вместе. Каждый case может содержать множество узлов, но каждый узел может появляться только в одном case в рамках оператора choice.

При создании элемента из одного case все элементы прочих case неявно удаляются. Устройство обрабатывает выполнение ограничений, предотвращающих несовместимости в текущей конфигурации.

Узлы choice и case появляются только в дереве схемы и не могут присутствовать в дереве данных или сообщениях NETCONF. Дополнительные уровни иерархии за пределами концептуальной схемы не требуются.

Пример YANG

     container food {
       choice snack {
           case sports-arena {
               leaf pretzel {
                   type empty;
               }
               leaf beer {
                   type empty;
               }
           }
           case late-night {
               leaf chocolate {
                   type enumeration {
                       enum dark;
                       enum milk;
                       enum first-available;
                   }
               }
           }
       }
    }

Пример NETCONF XML

     <food>
       <pretzel/>
       <beer/>
     </food>

Оператор choice описан в параграфе 7.9.

4.2.8. Расширение моделей данных (augment)

YANG позволяет вставлять дополнительные узлы в модель данных как текущего модуля (и его субмодулей), так и внешних модулей. Это полезно, например, для производителей, добавляющих свои параметры в стандартные модели данных с обеспечением совместимости.

Оператор augment определяет место в иерархии модели данных, куда помещаются новые узлы, а оператор when задаёт условия, когда новые узлы становятся пригодными (вступают в силу).

Пример YANG

     augment /system/login/user {
         when "class != 'wheel'";
         leaf uid {
             type uint16 {
                 range "1000 .. 30000";
             }
         }
     }

В этом примере определён узел uid, который начинает действовать, когда class пользователя отличается от wheel.

Если модуль дополняет другой модуль, XML-представление данных будет отражать префикс дополняющего модуля. Например, если приведённый выше пример дополнения происходил в модуле с префиксом other, XML будет выглядеть, как показано ниже.

Пример NETCONF XML

     <user>
       <name>alicew</name>
       <full-name>Alice N. Wonderland</full-name>
       <class>drop-out</class>
       <other:uid>1024</other:uid>
     </user>

Оператор augment описан в параграфе 7.15.

4.2.9. Определения RPC

Язык YANG позволяет определять NETCONF RPC. Имена операций, а также входные и выходные параметры моделируются с использованием операторов определения данных YANG.

Пример YANG

     rpc activate-software-image {
         input {
             leaf image-name {
                 type string;
             }
         }
         output {
             leaf status {
                 type string;
             }
         }
     }

Пример NETCONF XML

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
       <activate-software-image xmlns="http://acme.example.com/system">
         <image-name>acmefw-2.3</image-name>
      </activate-software-image>
     </rpc>
     <rpc-reply message-id="101"
                xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
       <status xmlns="http://acme.example.com/system">
         The image acmefw-2.3 is being installed.
       </status>
     </rpc-reply>

Оператор rpc описан в параграфе 7.13.

4.2.10. Определения уведомлений

Язык YANG позволяет определять уведомления, подходящие для NETCONF. Для задания содержимого уведомления применяются операторы определения данных YANG.

Пример YANG

     notification link-failure {
         description "Был обнаружен отказ канала";
         leaf if-name {
             type leafref {
                 path "/interface/name";
             }
         }
         leaf if-admin-status {
             type admin-status;
         }
         leaf if-oper-status {
             type oper-status;
         }
     }

Пример NETCONF XML

     <notification
         xmlns="urn:ietf:params:netconf:capability:notification:1.0">
       <eventTime>2007-09-01T10:00:00Z</eventTime>
       <link-failure xmlns="http://acme.example.com/system">
         <if-name>so-1/2/3.0</if-name>
         <if-admin-status>up</if-admin-status>
         <if-oper-status>down</if-oper-status>
       </link-failure>
     </notification>

Оператор notification описан в параграфе 7.14.

5. Концепции языка

5.1. Модули и субмодули

Модуль является базовым блоком определений в YANG. Модуль определяет одну модель данных. Модуль может определять полную, согласованную модель, а также дополнять существующую модель новыми узлами.

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

Имена всех стандартных модулей и субмодулей должны быть уникальными. Разработчикам модулей и субмодулей YANG рекомендуется выбирать имена для своих модулей с учётом возможных конфликтов со стандартными или другими фирменными (enterprise) модулями, например, используя название организации в качестве префикса имени модуля.

Модули используют оператор include для перечисления своих субмодулей и оператор import для ссылок на внешние модули. Аналогично, субмодули используют оператор import для ссылки на другие модули и include для ссылки на субмодули внутри модуля. В модуль или субмодуль недопустимо включать субмодули из других модулей, а субмодулям недопустимо импортировать свой модуль.

Операторы import и include служат для обеспечения доступности определений из других модулей и субмодулей:

  • для того, чтобы модуль или субмодуль мог ссылаться на определения из внешнего модуля, этот внешний модуль должен быть импортирован (import).

  • для того, чтобы модуль мог ссылаться на определения одного из своих субмодулей, модуль должен включать (include) этот субмодуль;

  • для того, чтобы субмодуль мог ссылаться на определения из другого субмодуля в том же модуле, первый субмодуль должен включать (include) второй субмодуль.

Недопустимо создавать замкнутые цепочки импорта или включения. Например, если модуль a включает субмодуль b, то b не может включать a.

При ссылке на определение из внешнего модуля должен применяться локально заданный префикс, за которым следует разделитель в форме двоеточия (:) и внешний идентификатор. Ссылки на определения в локальном модуле также могут использовать префиксы. Поскольку встроенные типы данных не относятся к какому-либо модулю и не имеют префикса, для ссылок на встроенные типы данных (например, int32) префиксы применяться не могут.

5.1.1. Импорт и включение по номеру выпуска (Revision)

Опубликованные модули могут независимо изменяться время от времени. Для обеспечения возможности совершенствования модули могут импортироваться с указанием конкретного выпуска (revision). При создании модуля в нем используются текущие выпуски других модулей, которые существовали на момент разработки данного модуля. По мере публикации новых выпусков импортируемых модулей импортирующий модуль не будет автоматически меняться. Если автор модуля готов перейти к более новому выпуску импортируемого модуля, он публикует свой модуль заново с обновлением операторов import. Таким образом авторы модулей явно указывают совместимость с новым выпуском импортируемого модуля.

Для субмодулей ситуация похожа, но проще. Модуль или субмодуль, включающий другие субмодули, должен указать выпуск (revision) включаемых субмодулей. Если субмодуль изменяется, все включающие его модули и субмодули нужно будет изменить, указав ссылку на новый выпуск.

Например, модуль b импортирует модуль a.

     module a {
         revision 2008-01-01 { ... }
         grouping a {
             leaf eh { .... }
         }
     }

     module b {
         import a {
             prefix p;
             revision-date 2008-01-01;
         }

         container bee {
             uses p:a;
         }
     }

Когда автор модуля a публикует новый выпуск, изменения могут оказаться не приемлемыми с точки зрения автора модуля b. Если же новый выпуск пригоден для импорта, автор модуля b публикует свой модуль заново с обновлённым оператором import.

5.1.2. Иерархии модулей

YANG позволяет моделировать данные с множеством иерархий, когда данные могут иметь более одного узла верхнего уровня. Модели с множеством узлов верхнего уровня иногда очень удобны и поддерживаются YANG.

Протокол NETCONF способен передавать любые данные XML в качестве содержимого элементов <config> и <data>. Узлы верхнего уровня модулей YANG представляются внутри этих элементов в произвольном порядке, как дочерние элементы. Такая инкапсуляция гарантирует, что соответствующие сообщения NETCONF всегда будут корректно сформированными документами XML.

Например, экземпляр

     module my-config {
         namespace "http://example.com/schema/config";
         prefix "co";

         container system { ... }
         container routing { ... }
     }

может быть представлен в NETCONF в форме

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config">
             <!-- system data here -->
           </system>
           <routing xmlns="http://example.com/schema/config">
             <!-- routing data here -->
           </routing>
         </config>
       </edit-config>
     </rpc>

5.2. Макет файла

Модули и субмодули YANG обычно сохраняются в файлах с одним оператором module или submodule в каждом файле. Для имён файлов следует использовать приведённую ниже форму.

     module-or-submodule-name ['@' revision-date] ( '.yang' / '.yin' )

Компиляторы YANG могут находить импортируемые модули и включаемые субмодули на базе этих соглашений. Хотя язык YANG определяет модули, инструменты могут компилировать субмодули независимо из соображений производительности и управляемости. Ошибки и предупреждения, которые не могут быть обнаружены во время компиляции субмодуля, могут задерживаться, пока субмодули не будут скомпонованы в единый модуль.

5.3. Пространства имён XML

Все определения YANG задаются внутри модуля, привязанного к определённому пространству имён XML [XML-NAMES], которое является уникальным в глобальном масштабе идентификатором URI [RFC3986]. Клиент и сервер NETCONF используют пространство имён при кодировании данных XML.

Пространства имён XML для модулей, опубликованные в серии RFC [RFC4844], должны выделяться агентством IANA (см раздел 14).

Пространства имён XML для приватных модулей выделяются организацией, владеющей модулем, без централизованной регистрации. Идентификаторы URI для пространств имён должны выбираться так, чтобы не возникало конфликтов со стандартными или другими фирменными пространствами имён. Например, они могут включать имя компании или организации.

Оператор namespace описан в параграфе 7.1.3.

5.3.1. Пространство имён YANG XML

YANG определяет пространство имён XML для операций NETCONF <edit-config> и содержимого <error-info>. Это пространство имеет имя urn:ietf:params:xml:ns:yang:1.

5.4. Преобразование имён группировок, типов и отождествлений

Имена группировок (grouping), типов (type) и отождествлений (identity) преобразуются в контексте их определения, а не в контексте применения. Пользователи grouping, typedef и identity не обязаны импортировать модули или включать субмодули для соблюдения всех ссылок, заданных исходным определением. Это похоже на область действия (scope) в традиционных языках программирования.

Например, если модуль определяет группировку, в которой присутствует ссылка на тип, при использовании этой группировки во втором модуле тип преобразуется (resolve) в контексте исходного (а не второго) модуля. Благодаря этому не возникает неоднозначностей при определении типа в обоих модулях.

5.5. Вложенные определения типов и группировки

Определения типов (typedef) и группировки (grouping) во многих операторах YANG могут быть вложенными, что позволяет лексически охватывать их иерархией операторов, в которой они появляются. Это даёт возможность определять типы и группировки вблизи места их применения, а не на вершине иерархии. Такая близость улучшает читаемость определений.

Задание области действия также позволяет определять типы без учёта конфликтов имён в разных субмодулях. Имена типов можно задавать без добавления в начале строк, предназначенных для предотвращения конфликтов имён в больших модулях.

Наконец, обозначение области действия позволяет автору модуля сохранить типы и группировки (приватными) внутри модуля или субмодуля и предотвратить их повторное использование (reuse). Поскольку за пределами модуля или субмодуля могут применяться лишь типы и группировки верхнего уровня (т. е. те, которые указаны в субоператорах операторов module или submodule), разработчик получает больше контроля над компонентами своих модулей, представленными во внешний мир, может скрыть внутреннюю структуру и установить границу между видимыми извне и приватными частями.

Определениям области действия недопустимо затенять определения с более широкой областью действия. Тип и группировка не могут быть определены, если более высокий уровень в иерархии операторов уже включает определение с таким идентификатором.

Ссылка на тип или группировку без префикса или с префиксом текущего модуля преобразуется (resolve) путём нахождения соответствующего оператора typedef или grouping среди непосредственных субоператоров каждого оператора предка.

5.6. Соответствие

Соответствие модели является мерой того, насколько точно устройство следует модели. Вообще говоря, устройства отвечают за правильную реализацию модели, что позволяет приложениям считать, что устройства одинаково реализуют модель. Отклонения могут сузить возможности модели и увеличить число проблем для использующих её приложений.

Для YANG возможны три варианта соответствия:

  • базовое поведение модели;

  • необязательные функции в составе модели;

  • отклонения от модели.

Эти варианты более подробно рассматриваются ниже.

5.6.1. Базовое поведение

Модель определяет соглашение между клиентом и сервером NETCONF, которое позволяет обеим сторонам верить в то, что другая сторона знает синтаксис и семантику моделируемых данных. Сила YANG заключается в выполнении этого соглашения.

5.6.2. Дополнительные возможности

Во многих моделях авторы делают некоторые части модели не обязательными (условными). Устройство самостоятельно определяет какие из этих частей пригодны и поддерживаются им.

Например, модель данных syslog может включать возможность локального сохранения системных журналов, но разработчик модели понимает, что это возможно лишь при наличии локального хранилища. Если такого хранилища нет, приложению не следует запрашивать у устройства хранение системных журналов.

YANG поддерживает такой механизм условной поддержки с помощью конструкции feature. Это даёт разработчику модели механизм, позволяющий сделать отдельные части модели условными с решением вопроса их поддержки на устройстве. Модель может содержать конструкции, которые поддерживаются не всеми устройствами. Эти функции (возможности) включаются в определение модели, обеспечивая её цельное представление и позволяя приложениям узнать, какие функции поддерживаются для учёта этого в своём поведении.

Модуль может заявлять любое число функций (feature), указываемых простыми строками, и может делать соответствующие части модуля необязательными. Если устройство поддерживает эту функцию, соответствующая часть модуля становится действительной для этого устройства. Если же функция не поддерживается, эта часть модуля становится не пригодной для применения и приложения учитывают это в своём поведении.

Возможности определяются с помощью оператора feature. Определения в модуле, которые являются условными по отношению к этой функции, помечаются оператором if-feature с именем функции (feature) в качестве аргумента.

Дополнительная информация о необязательных функциях (возможностях) приведена в параграфе 7.18.1.

5.6.3. Отклонения от модели

В идеальном мире от всех устройств требуется точная реализация модели и отклонения от неё не разрешаются. Однако в реальности устройства зачастую просто не способны или не предназначены для полной реализации модели. В автоматизации на базе YANG требуются механизмы, с помощью которых устройства смогут информировать приложения о своих отклонениях от модели.

Например, модуль BGP может поддерживать любое число партнёров BGP, а конкретный сервер ограничивается поддержкой 16 партнёров. Любое приложение, пытающееся настроить семнадцатого партнёра, столкнётся с ошибкой. Хотя этой ошибки приложению может оказаться достаточно для того, чтобы понять ограничение, лучше было бы приложению заранее знать об этом и принять соответствующие меры, избавив пользователя от ненужной работы.

Отклонения устройств от модели могут объявляться с использованием оператора deviation, который принимает в качестве аргумента строку с идентификатором узла в дереве схемы. Содержимое этого оператора уточняет информацию об отклонении сервера от заданного в модуле поведения.

Описание оператора deviation приведено в параграфе 7.18.3.

5.6.4. Анонсирование информации о соответствии в сообщении <hello>

Пространство имён URI должно анонсироваться как возможность в сообщении NETCONF <hello> для индикации поддержки модуля YANG сервером NETCONF. URI анонсируемых возможностей должны иметь форму, показанную ниже.

     capability-string   = namespace-uri [ parameter-list ]
     parameter-list      = "?" parameter *( "&" parameter )
     parameter           = revision-parameter /
                           module-parameter /
                           feature-parameter /
                           deviation-parameter
     revision-parameter  = "revision=" revision-date
     module-parameter    = "module=" module-name
     feature-parameter   = "features=" feature *( "," feature )
     deviation-parameter = "deviations=" deviation *( "," deviation )

Параметр revision-date указывает выпуск модуля (см. параграф 7.1.9), который реализует сервер NETCONF, module-name — имя модуля, указанное в операторе module (см. параграф 7.1), namespace-uri — пространство имён URI для модуля, указанное в операторе namespace (см. параграф 7.1.3), feature — имя необязательной функции, реализованной устройством (см. параграф 7.18.1), а deviation — имя модуля, определяющего отклонения устройства (см. параграф 7.18.3).

В списке параметров каждый поименованный параметр должен появляться не более одного раза.

5.6.4.1. Модули

Сервер указывает имена поддерживаемых модулей в сообщении <hello>. Пространства имён модулей кодируются в форме базовых URI в строке возможностей, а имя модуля кодируется в параметре module для базового URI.

Сервер должен анонсировать все возможности всех реализуемых им модулей.

Приведённое ниже сообщение <hello> анонсирует единственный модуль syslog.

   <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <capability>
       http://example.com/syslog?module=syslog&revision=2008-04-01
     </capability>
   </hello>
5.6.4.2. Возможности

Сервер указывает имена поддерживаемых возможностей в сообщении <hello>. В этих сообщениях возможности кодируются в параметре features внутри URI. Значение параметра представляет собой список разделённых запятыми имён возможностей, которые устройство поддерживает для заданного модуля.

Н ниже приведён пример сообщение <hello>, анонсирующего один модуль и информирующего клиента о поддержке возможности local-storage (локальное хранилище) модуля syslog.

<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <capability>
    http://example.com/syslog?module=syslog&features=local-storage
  </capability>
</hello>
5.6.4.3. Отклонения

Отклонения устройства анонсируются с помощью параметра deviations, значением которого служит список разделённых запятыми имён модулей, содержащих отклонения от возможностей.

Приведённое ниже сообщение <hello> анонсирует два модуля, информируя клиента о том, что имеются отклонения от возможностей модуля syslog, перечисленные в модуле my-devs.

   <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
       <capability>
         http://example.com/syslog?module=syslog&deviations=my-devs
       </capability>
       <capability>
         http://example.com/my-deviations?module=my-devs
       </capability>
     </hello>

5.7. Изменение хранилища данных

Модели данных могут разрешать серверу менять хранилище конфигурации способами, которые не заданы явно в сообщениях протокола NETCONF. Например, модель данных может определять листья, которым присваиваются определённые системой значения, если клиент их не предоставил. Формальный механизм задания обстоятельств, при которых такие изменения разрешены, выходит за рамки этой спецификации.

6. Синтаксис YANG

Синтаксис YANG похож на применяемый в SMIng [RFC3780] и языках программирования типа C или C++. Синтаксис в стиле C был осознанно выбран для удобочитаемости, поскольку YANG считает более важным фактором время и усилия читателей моделей YANG, нежели разработчиков модулей и инструментальных средств. Этот раздел посвящён описанию синтаксиса YANG.

Модули YANG используют кодировку символов UTF-8 [RFC3629].

6.1. Лексические маркеры

Модули YANG разбираются как последовательности маркеров. В этом параграфе рассмотрены правила распознавания маркеров во входном потоке. Правила разбора маркеров YANG просты и обеспечивают широкие возможности. Простота вызвана необходимостью упростить реализацию анализаторов, а мощный набор возможностей нужен разработчикам модулей для того, чтобы выразить модули в читаемой форме.

6.1.1. Комментарии

Для комментариев применяется стиль C++. Одиночная строка комментария начинается символами // и заканчивается как все строки. Комментарий блока строк начинается с последовательности /* и завершается последовательностью */.

6.1.2. Маркеры

Маркером (token) в YANG считается ключевое слово, строка, точка с запятой (;) и фигурные скобки ({ и }). Строка может быть заключена в кавычки. Ключевое слово — это одно из ключевых слов YANG, определённых в этом документе, или идентификатор префикса, за которым следует двоеточие (:) и ключевое слово расширения языка. Регистр символов в ключевых словах принимается во внимание. Формальное определение идентификаторов дано в параграфе 6.2.

6.1.3. Кавычки

Если строка содержит пробелы, символы табуляции, точку с запятой (;), скобки ({ или }) или последовательности для обозначения комментариев (//, /*, */), она должна заключаться в двойные или одинарные кавычки.

Если строка в двойных кавычках включает символы завершения строки, за которыми следуют пробелы или табуляторы, используемые для задания отступа в соответствии с макетом файла YANG, эти пробельные символы в начале строк вырезаются вплоть до столбца с открывающей двойной кавычкой (включая его) или первого непробельного символа (что встретится раньше). Любой символ табуляции перед проверкой преобразуется в 8 символов пробела.

Если строка в двойных кавычках содержит символы табуляции или пробела перед завершением строки, эти символы вырезаются.

Строка в одинарных кавычках (‘ ‘) сохраняет значение каждого символа. Символ одинарных кавычек не может использоваться в таких строках даже вместе с символом \.

Внутри строк в двойных кавычках (» «) символ \ имеет специальное значение, которое зависит от следующего непосредственно за ним символа:

\n новая строка;

\t символ табуляции;

\» символ двойной кавычки;

\\ одиночный символ \.

Если после строки в кавычках следует символ сложения (+) и другая строка в кавычках, эти строки объединяются в одну (конкатенация), что позволяет собирать одну большую строку из множества строк ограниченной длины. Перед конкатенацией строк выполняется удаление пробельных символов в начале и замена последовательностей специального назначения с \.

6.1.3.1. Примеры кавычек

Ниже приведён набор эквивалентных строк.

     hello
     "hello"
     'hello'
     "hel" + "lo"
     'hel' + "lo"

Далее показаны несколько строк специального назначения.

     "\""  - строка, содержащая двойную кавычку
     '"'   - строка, содержащая двойную кавычку
     "\n"  - строка, содержащая символы новой строки
     '\n'  - строка, содержащая символ \, за которым следует символ n

Ниже приведены два примера недопустимых строк.

     ''''  - строка в одинарных кавычках не может включать одинарные кавычки
     """   - символ двойных кавычек должен использовать префикс \

Две приведённых ниже строки эквивалентны.

         "first line
            second line"

     "first line\n" + "  second line"

6.2. Идентификаторы

Идентификаторы служат для обозначения различных элементов YANG по именам. Каждый идентификатор начинается с буквы кода ASCII (в верхнем или нижнем регистре) или символа подчёркивания, а далее могут следовать дополнительные буквы, цифры, символы подчёркивания, дефиса и точки в кодировке ASCII. Реализации должны поддерживать идентификаторы размером до 64 символов. Регистр символов в идентификаторах принимается во внимание. Синтаксис идентификаторов формально определён правилом identifier в разделе 12. Идентификаторы могут задаваться в форме строк в кавычках и без кавычек.

6.2.1. Идентификаторы и их пространства имён

Каждый идентификатор действителен в пространстве имён, которое зависит от типа определяемого элемента YANG. Все идентификаторы в одном пространстве имён должны быть уникальными.

  • Все имена модулей и субмодулей используют общее глобальное пространство имён модулей.

  • Все имена расширений, определённых в модуле и его субмодулях, используют общее пространство имён.

  • Все имена функций (feature), определённых в модуле и его субмодулях, используют одно пространство имён.

  • Все имена отождествлений (identity) определённых в модуле и его субмодулях, используют общее пространство имён отождествлений.

  • Все имена производных типов, определённых в родительском узле или на верхнем уровне модуля и его субмодулей, используют общее пространство имён идентификаторов типа. Это пространство имён охватывает все дочерние узлы модуля или родительского узла. Это означает, что любой узел-потомок может использовать данное определение типа (typedef), а использование typedef с таким же именем недопустимо.

  • Все имена группировок, определённых в родительском узле или на верхнем уровне модуля и его субмодулей, используют общее пространство имён группировок. Это пространство имён охватывает все дочерние узлы модуля или родительского узла. Это означает, что любой узел-потомок может использовать данное группировку (grouping), а использование этого же имени для других группировок недопустимо.

  • Все узлы типа leaf, leaf-list, list, container, choice, rpc, notification и anyxml, определённые (напрямую или с помощью оператора uses) в родительском узле или на верхнем уровне модуля и его субмодулей определённых в модуле и его субмодулях, используют общее пространство имён. Это пространство охватывает родительский узел или модуль, если родительский узел не относится к типу case. В последнем случае пространство имён охватывает ближайшего предка, не являющегося узлом типа case или choice.

  • Все узлы case внутри choice используют общее пространство имён идентификаторов. Это пространство охватывает родительский узел choice.

В YANG разрешены ссылки вперёд (упреждающие).

6.3. Операторы

Модуль YANG содержит последовательность операторов. Каждый оператор начинается с ключевого слова, за которым могут следовать аргументы, а затем символ ; или блок субоператоров, заключенный в фигурные скобки ({ })

     statement = keyword [argument] (";" / "{" *statement "}")

Аргумент является строкой (см. параграф 6.1.2).

6.3.1. Расширения языка

Модуль может задавать расширения языка YANG с помощью ключевого слова extension (см. параграф 7.17). Расширения могут импортироваться другими модулями с помощью оператора import (см. параграф 7.1.5). При использовании импортированного расширения ключевое слово расширения должно указываться с префиксом, который применялся для импорта модуля расширения. Если расширение применяется в определившем его модуле, ключевое слово расширения должно указываться с префиксом этого модуля.

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

Если компилятор YANG не поддерживает того или иного расширения, которое присутствует в модуле YANG как неизвестный оператор (см. раздел 12), такой оператор можно игнорировать целиком.

6.4. Вычисление XPath

Язык YANG опирается на язык путей XML (XPath9) 1.0 [XPATH] в качестве нотации для задания множества связей и зависимостей между узлами. Клиенты и серверы NETCONF не обязаны включать интерпретатор XPath, но они должны гарантировать выполнение требований, представленных в модели данных. Способ исполнения этого зависит от реализации. Выражения XPath должны быть корректны синтаксически, а все используемые префиксы должны присутствовать в контексте XPath (см. параграф 6.4.1). Реализация может сделать это вручную вместо использования выражения XPath напрямую.

Модель данных, применяемая в выражении XPath, совпадает с используемой в XPath 1.0 [XPATH] с тем же расширением для потомка корневого узла, что применяется в XSLT 1.0 (см. параграф 3.1 в [XSLT]). Это означает, в частности, что корневой узел может иметь любое число элементов в качестве своих потомков.

6.4.1. Контекст XPath

Все выражения YANG XPath используют приведённое ниже определение контекста XPath.

  • Набор деклараций пространства имён представляет собой набор всех пар префиксов операторов import и пространств имён в модуле, где задано выражение XPath, и всех префиксов операторов prefix для пространства имён URI оператора.

  • Имена без префикса пространства имён относятся к тому же пространству, что идентификатор текущего узла. Внутри группировки это пространство зависит от того, где группировка используется (см. параграф 7.12).

  • Библиотека функций — это основная библиотека, определённая в [XPATH], и функция current(), которая возвращает набор узлов с начальным узлом контекста.

  • Набор привязок переменных пуст.

Механизм обработки имён без префиксов приспособлен из XPath 2.0 [XPATH2.0] и помогает упростить выражения XPath в YANG. Неоднозначностей возникать не может, поскольку идентификаторы узлов YANG всегда являются квалифицированными именами с непустым URI пространства имён.

Узел контекста меняется в зависимости от выражения YANG XPath и указывается там, где определён оператор YANG с выражением XPath.

6.5. Идентификатор узла схемы

Идентификатор узла схемы представляет собой строку, указывающую узел в дереве схемы. Он имеет две формы — абсолютную и наследуемую (descendant), которые определены правилами absolute-schema-nodeid и descendant-schema-nodeid в разделе 12. Идентификатор узла схемы состоит из пути идентификаторов, разделённых символами дробной черты (/). В абсолютном идентификаторе первым символом является /, а за ним следует узел схемы верхнего уровня в локальном или всех импортированных модулях.

Ссылки на идентификаторы, определённые во внешних модулях, должны включать соответствующие префиксы, а ссылки на идентификаторы, определённые в текущем модуле и его субмодулях, могут использовать префикс.

Например, для указания дочернего узла b узла верхнего уровня a может использоваться строка /a/b.

7. Операторы YANG

В этом разделе описаны все операторы YANG.

Отметим, что даже операторы, не имеющие каких-либо субоператоров, определённых в YANG, могут иметь в качестве субоператоров фирменные расширения. Например, оператор description не имеет расширений в YANG, но возможен показанный ниже вариант субоператора.

     description "Некий текст" {
         acme:documentation-flag 5;
     }

7.1. Оператор module

Оператор module определяет имя модуля и собирает воедино все относящиеся к модулю операторы. Аргументом оператора module является имя модуля, за которым следует блок субоператоров с дополнительной информацией о модуле. Имя модуля следует правилам для идентификаторов (см. параграф 6.2).

Имена модулей, публикуемые в RFC [RFC4844], должны выделяться IANA (см. раздел 14).

Частные (фирменные) имена модулей назначаются владеющими модулями организациями без централизованной регистрации. Рекомендуется выбирать имена модулей с учётом возможных конфликтов с другими фирменными модулями и субмодулями. Например, можно использовать название предприятия или организации в качестве префикса для имени модуля.

Модуль обычно имеет показанную ниже структуру.

     module <module-name> {

         // информация заголовка
         <оператор yang-version>
         <оператор namespace>
         <оператор prefix>

         // данные о привязках
         <операторы import>
         <операторы include>

         // метаданные
         <оператор organization>
         <оператор contact>
         <оператор description>
         <оператор reference>

         // история выпусков
         <операторы revision>

         // определения модуля
         <другие операторы>
     }

7.1.1. Субоператоры для module

Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

augment

7.15

0..n

choice

7.9

0..n

contact

7.1.8

0..1

container

7.5

0..n

description

7.19.3

0..1

deviation

7.18.3

0..n

extension

7.17

0..n

feature

7.18.1

0..n

grouping

7.11

0..n

identity

7.16

0..n

import

7.1.5

0..n

include

7.1.6

0..n

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

namespace

7.1.3

1

notification

7.16

0..n

organization

7.1.7

0..1

prefix

7.1.4

1

reference

7.19.4

0..1

revision

7.1.9

0..n

rpc

7.13

0..n

typedef

7.3

0..n

uses

7.12

0..n

yang-version

7.1.2

1

7.1.2. Оператор yang-version

Необязательный оператор yang-version указывает версию языка YANG, использованную при разработке модуля. Аргументом оператора является строка. Для модулей YANG, определённых на основе данной спецификации, она должна иметь значение1.

Обработка операторов yang-version со значением версии, отличающимся от 1 (определена здесь), выходит за рамки данной спецификации. Любой документ, определяющий более высокий номер версии должен определять совместимость этой версии с более ранними.

7.1.3. Оператор namespace

Оператор namespace определяет пространство имён XML, в котором все определённые модулем идентификаторы представляются в XML (за исключением идентификаторов узлов данных внутри группировок — см. параграф 7.13). Аргументом оператора namespace служит идентификатор URI пространства имён.

См. также параграф 5.3.

7.1.4. Оператор prefix

Оператор prefix служит для определения префикса, связанного с модулем и его пространством имён. Аргументом оператора prefix является строка префикса, которая применяется для доступа к модулю. Строка префикса может использоваться в модуле для ссылок на содержащиеся в нем определения (например, if:ifName). Для префиксов применяются такие же правила, как для идентификаторов (см. параграф 6.2).

При использовании в операторе module субоператор prefix определяет префикс, предлагаемый для использования при импорте этого модуля. Для удобочитаемости NETCONF XML клиенту или серверу NETCONF, генерирующему XML или XPath с использованием префиксов, следует применять определённый в модулей префикс в качестве префикса пространства имён XML, если это не вызывает конфликтов.

При использовании в операторе import субоператор prefix определяет префикс, используемый для доступа к определениям в импортируемом модуле. При использовании ссылок на операторы из импортируемого модуля за строкой префикса этого модуля следует двоеточие (:) и идентификатор (например if:ifIndex). Для удобочитаемости модулей YANG определённый модулем префикс следует использовать при импорте модуля, если это не вызывает конфликтов. При возникновении конфликта когда импортируются два разных модуля, имеющих одинаковые префиксы, хотя бы один из них должен импортироваться с другим префиксом.

Все префиксы, включая и префикс самого модуля, должны быть уникальными в рамках модуля или субмодуля.

7.1.5. Оператор import

Оператор import делает доступными операторы из другого модуля или субмодуля. Аргументом оператора служит имя импортируемого модуля, за которым следует блок субоператоров с данными импорта. Импортирующий модуль может:

  • использовать любые группировки (grouping) и определения типов (typedef), заданные на верхнем уровне импортированного модуля и его субмодулей;

  • применять любые расширения, функции и отождествления из импортированного из модуля и его субмодулей;

  • использовать любой узел из дерева схемы импортированного модуля в операторах must, path и when или в качестве целевого узла в операторах augment и deviation.

Обязательный субоператор prefix задаёт префикс для импортируемого модуля в области действия импортирующего модуля и его субмодулей. Для импорта разных модулей можно использовать множество операторов import.

При наличии необязательного субоператора revision-date любые typedef, grouping, extension, feature и identity, указанные в определениях локального модуля, берутся из заданного выпуска импортируемого модуля. Если указанного выпуска импортируемого модуля не существует, возникает ошибка. При отсутствии субоператора revision-date выпуск импортируемого модуля будет не известен.

Недопустимо импортировать множество выпусков одного модуля.

Субоператор

Параграф

Число элементов

prefix

7.1.4

1

revision-date

7.1.5.1

0..1

7.1.5.1. Оператор revision-date для оператора import

Субоператор revision-date используется в операторе import для указания выпуска импортируемого модуля. Оператор revision-date должен соответствовать наиболее свежему оператору revision в импортируемом модуля.

7.1.6. Оператор include

Оператор include делает содержимое субмодуля доступным в родительском модуле или другом субмодуле родительского модуля. Аргументом оператора служит имя включаемого субмодуля. В модули можно включать лишь относящиеся к ним субмодули, указанные оператором belongs-to (см. параграф 7.2.2). В субмодули можно включать лишь другие субмодули того же модуля.

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

При наличии необязательного субоператора revision-date будет включаться указанный выпуск субмодуля. Если указанного выпуска не существует, возникает ошибка. Если субоператор revision-date не задан, выпуск субмодуля будет не известен.

Недопустимо включение в модуль множества выпусков одного субмодуля.

Субоператор

Параграф

Число элементов

revision-date

7.1.5.1

0..1

7.1.7. Оператор organization

Оператор organization указывает сторону, ответственную за этот модуль. Аргументом оператора является строка с текстовым описанием организации, под эгидой которой был разработан модуль.

7.1.8. Оператор contact

Оператор contact указывает контактные сведения для модуля. Аргументом оператора является строка с контактными данными ответственных за техническое обслуживание модуля, включая имя, почтовый адрес, номер телефона и адрес электронной почты.

7.1.9. Оператор revision

Оператор revision указывает историю изменения модуля, включая его начальный выпуск. Последовательность операторов revision детализирует изменения в определении модуля. Аргументом оператора служит строка даты в формате YYYY-MM-DD (год-месяц-число), за которой следует блок субоператоров с информацией о выпуске. Модулю следует включать по крайней мере один оператор revision. Для каждого опубликованного выпуска следует добавлять новый оператор в начале последовательности, чтобы все выпуски перечислялись в обратном хронологическом порядке.

7.1.9.1. Субоператоры для revision

Субоператор

Параграф

Число элементов

description

7.19.3

0..1

reference

7.19.4

0..1

7.1.10. Пример использования

     module acme-system {
         namespace "http://acme.example.com/system";
         prefix "acme";

         import ietf-yang-types {
             prefix "yang";
         }

         include acme-types;

         organization "ACME Inc.";
         contact
             "Joe L. User

              ACME, Inc.
              42 Anywhere Drive
              Nowhere, CA 95134
              USA

              Phone: +1 800 555 0100
              EMail: joe@acme.example.com";

         description
             "Модуль для объектов, реализующих протокол ACME.";

         revision "2007-06-09" {
             description "Первый выпуск.";
         }

         // определения ...
     }

7.2. Оператор submodule

Хотя основным блоком языка YANG является модуль, модули YANG сами могут включать субмодули. Это позволяет разделить сложную модель на несколько частей, где субмодули используют общее пространство имён, определённое родительским модулем.

Оператор submodule задаёт имя субмодуля и группирует все операторы, относящиеся к этому субмодулю. Аргументом оператора submodule является имя субмодуля, за которым следует блок операторов с информацией о субмодуле. Имя субмодуля является идентификатором (см. параграф 6.2).

Имена субмодулей, публикуемые в RFC [RFC4844], должны выделяться IANA (см. раздел 14).

Частные (фирменные) имена субмодулей назначаются владеющими модулями организациями без централизованной регистрации. Рекомендуется выбирать имена для субмодулей с учётом возможных конфликтов со стандартными и другими фирменными модулями и субмодулями. Например, можно использовать в качестве префикса имени субмодуля название предприятия или организации.

Субмодуль обычно имеет показанную ниже структуру.

     submodule <module-name> {
         <оператор yang-version>
         // идентификация модуля
         <оператор belongs-to>
         // операторы привязки
         <операторы import>
         <операторы include>
         // метаданные
         <оператор organization>
         <оператор contact>
         <оператор description>
         <оператор reference>
         // история выпусков
         <операторы revision>
         // определения субмодуля
         <другие операторы>
     }

7.2.1. Субоператоры для submodule


Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

augment

7.15

0..n

belongs-to

7.2.2

1

choice

7.9

0..n

contact

7.1.8

0..1

container

7.5

0..n

description

7.19.3

0..1

deviation

7.18.3

0..n

extension

7.17

0..n

feature

7.18.1

0..n

grouping

7.11

0..n

identity

7.16

0..n

import

7.1.5

0..n

include

7.1.6

0..n

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

notification

7.14

0..n

organization

7.1.7

0..1

reference

7.19.4

0..1

revision

7.1.9

0..n

rpc

7.13

0..n

typedef

7.3

0..n

uses

7.12

0..n

yang-version

7.1.2

0..1

7.2.2. Оператор belongs-to

Оператор belongs-to указывает модуль, к которому субмодуль относится. Аргументом оператора является имя модуля.

Субмодуль должен включаться только в модуль, к которому он относится или в его субмодули.

Обязательный субоператор prefix указывает префикс для модуля, к которому относится этот субмодуль. Все определения в этом модуле и всех его субмодулях доступны при использовании этого префикса.

Субоператор

Параграф

Число элементов

prefix

7.1.4

1

7.2.3. Примеры использования

     submodule acme-types {

         belongs-to "acme-system" {
             prefix "acme";
         }

         import ietf-yang-types {
             prefix "yang";
         }

         organization "ACME Inc.";
         contact
             "Joe L. User

              ACME, Inc.
              42 Anywhere Drive
              Nowhere, CA 95134
              USA

              Phone: +1 800 555 0100
              EMail: joe@acme.example.com";

         description
             "Этот субмодуль определяет общие типы ACME.";

         revision "2007-06-09" {
             description "Первый выпуск.";
         }

         // далее следуют определения ...
     }

7.3. Оператор typedef

Оператор typedef определяет новый тип, который может применяться локально в модуле или субмодуле, а также в других модулях, импортирующих данный, в соответствии с правилами, описанными в параграфе 5.5. Новый тип называется производным (derived), а тип, на основе которого он создан, — базовым. Все производные типы можно отследить по цепочке до встроенного типа YANG.

Аргументом оператора typedef является идентификатор, задающий имя определяемого типа, за которым должен следовать блок субоператоров с подробной информацией об определяемом типе.

В качестве имени производного типа недопустимо использовать какое-либо из имён встроенных типов YANG. Если typedef определяется на верхнем уровне модуля или субмодуля YANG, имя определяемого типа должно быть уникальным в данном модуле.

7.3.1. Субоператоры для typedef

Субоператор

Параграф

Число элементов

default

7.3.4

0..1

description

7.19.3

0..1

reference

7.19.4

0..1

status

7.19.2

0..1

type

7.3.2

1

units

7.3.3

0..1

7.3.2. Оператор type

Оператор type, который должен присутствовать, определяет базовый тип, на основе которого создаётся производный (см. параграф 7.4).

7.3.3. Оператор units

Необязательный оператор units, принимает в качестве аргумента строку, которая даёт текстовое определение единиц, связанных с типом.

7.3.4. Оператор default

Оператор default принимает аргумент в виде строки с принятым по умолчанию значением для нового типа.

Заданное оператором default значение должно быть пригодным для типа, указанного в операторе type.

Если базовый тип имеет принятое по умолчанию значение, а новый производный тип такого значения не задаёт, принятое по умолчанию значение базового типа будет наследоваться производным типом.

Если заданное в качестве принятого по умолчанию значение не пригодно по причине новых ограничений, заданных для производного типа или определения листа, определение производного типа или листа должно указать новое значение, совместимое с этими ограничениями.

7.3.5. Пример использования

     typedef listen-ipv4-address {
       type inet:ipv4-address;
       default "0.0.0.0";
     }

7.4. Оператор type

Оператор type принимает один аргумент в форме строки с именем встроенного типа YANG (см. раздел 9) или производного типа (см. параграф 7.3), за которым может следовать блок субоператоров, используемых для дополнительных ограничений типа.

Ограничения, которые могут быть применены, зависят от типа. Операторы ограничений для всех встроенных типов описаны в параграфах раздела 9.

7.4.1. Субоператоры для type

Субоператор

Параграф

Число элементов

bit

9.7.4

0..n

enum

9.6.4

0..n

length

9.4.4

0..1

path

9.9.2

0..1

pattern

9.4.6

0..n

range

9.2.4

0..1

require-instance

9.13.2

0..1

type

7.4

0..n

7.5. Оператор container

Оператор container служит для определения внутренних узлов данных в дереве схемы. Он принимает один аргумент, служащий идентификатором, за которым следует блок субоператоров с детальной информацией о контейнере.

Узел-контейнер на имеет значения, но имеет список дочерних узлов дерева данных. Дочерние узлы определяются в субоператорах контейнера.

7.5.1. Контейнеры с presence

YANG поддерживает два типа контейнеров — те, которые существуют только для организации иерархии узлов данных, и те, чьё присутствие в конфигурации имеет явное значение.

В первом случае контейнер не имеет своего значения и существует лишь для организации дочерних узлов. Этот стиль применяется по умолчанию.

Например, набор опций скрэмблирования для интерфейсов SONET10 может помещаться в контейнер scrambling для более эффективной организации конфигурационной иерархии и совместного хранения этих узлов. Сам узел scrambling не имеет значения (смысла), поэтому удаление узла, когда он становится пустым, освобождает пользователя от выполнения этой задачи.

Во втором варианте наличие контейнера само по себе несёт некую информацию, представляя один бит данных конфигурации. Для конфигурационных данных контейнер выступает в качестве конфигурационного элемента и средства организации связанных конфигурационных узлов. Такие контейнеры создаются и удаляются явно.

YANG называет контейнеры этого типа контейнерами присутствия (presence container) и они обозначаются оператором presence, который принимает в качестве аргумента текстовую строку, указывающую смысл присутствия узла.

Например, контейнер ssh может включать возможность входа на сервер по протоколу SSH11, но может также включать любые связанные с SSH конфигурационные элементы, такие как скорость соединения или число попыток.

Оператор presence (см. параграф 7.5.5) служит для представления смысла наличия контейнера в дереве данных.

7.5.2. Субоператоры для container

Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

choice

7.9

0..n

config

7.19.1

0..1

container

7.5

0..n

description

7.19.3

0..1

grouping

7.11

0..n

if-feature

7.18.2

0..n

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

must

7.5.3

0..n

presence

7.5.5

0..1

reference

7.19.4

0..1

status

7.19.2

0..1

typedef

7.3

0..n

uses

7.12

0..n

when

7.19.5

0..1

7.5.3. Оператор must

Необязательный оператор must принимает один аргумент в виде строки с выражением XPath (см. параграф 6.4). Он используется для формального выражения ограничений на пригодные данные. Ограничение применяется в соответствии с правилами, указанными в разделе 8.

При проверке хранилища данных на пригодность, все ограничения must концептуально проверяются один раз для каждого узла в дереве данных и для всех используемых листьев с принятыми по умолчанию значениями (см. параграф 6.4.1). Если узла нет в дереве данных или лист не имеет принятого по умолчанию значения, оператор must не оценивается.

Чтобы данные считались пригодными проверка всех таких ограничений должна давать значение true.

Выражения XPath концептуально оцениваются в описанном ниже контексте, дополняющем определение параграфа 6.4.1.

  • Узлом контекста является узел в дереве данных, для которого определён оператор must.

  • Доступное дерево состоит из всех узлов в дереве данных и всех листьев с используемыми значениями, которые приняты по умолчанию (параграф 7.6.1).

Доступное дерево зависит от узла контекста.

  • Если узел контекста представляет конфигурацию, дерево представляет данные в хранилище NETCONF, где существует узел контекста. Корневой узел XPath имеет в качестве потомков все узлы конфигурационных данных верхнего уровня во всех модулях.

  • Если узел контекста представляет данные состояния, деревом являются все данные состояния на устройстве и хранилище <running/>. Корневой узел XPath имеет в качестве потомков все узлы данных во всех модулях.

  • Если узел контекста представляет содержимое уведомления, дерево является документом экземпляра XML для уведомления. Корневой узел XPath имеет в качестве единственного потомка элемент, представляющий уведомление.

  • Если узел контекста представляет входные параметры RPC, дерево является документом экземпляра RPC XML. Корневой узел XPath имеет в качестве единственного потомка элемент, представляющий операцию RPC, которая будет определена.

  • Если узел контекста представляет выходные параметры RPC, дерево является экземпляром документа отклика RPC. Корневой узел XPath имеет в качестве потомков элементы, представляющие выходные параметры RPC.

Результат выражения XPath преобразуется в логическое значение с использованием стандартных правил XPath.

Поскольку все значения листьев в дереве данных концептуально хранятся в канонической форме (см. параграфы 7.6 и 7.7), любые сравнение XPath также выполняются для канонических значений.

Отметим также, что выражение XPath оценивается концептуально. Это означает, что реализация не использует оценщик XPath на устройстве. Однако на практике оценка осуществляется по усмотрению реализации.

7.5.4. Субоператоры для must

Субоператор

Параграф

Число элементов

description

7.19.3

0..1

error-app-tag

7.5.4.2

0..1

error-message

7.5.4.1

0..1

reference

7.19.4

0..1

7.5.4.1. Оператор error-message

Необязательный оператор error-message принимает в качестве аргумента строку. Если оценка ограничений даёт значение false, строка передаётся как <error-message> в <rpc-error>.

7.5.4.2. Оператор error-app-tag

Необязательный оператор error-app-tag принимает в качестве аргумента строку. Если оценка ограничений даёт значение false, строка передаётся как <error-app-tag> в <rpc-error>.

7.5.4.3. Пример использования must и error-message
     container interface {
         leaf ifType {
             type enumeration {
                 enum ethernet;
                 enum atm;
             }
         }
         leaf ifMTU {
             type uint32;
         }
         must "ifType != 'ethernet' or " +
              "(ifType = 'ethernet' and ifMTU = 1500)" {
             error-message "Значение MTU для Ethernet должно быть 1500";
         }
         must "ifType != 'atm' or " +
              "(ifType = 'atm' and ifMTU <= 17966 and ifMTU >= 64)" {
             error-message " Значение MTU для ATM должно быть 64 .. 17966";
         }
     }

7.5.5. Оператор presence

Оператор presence указывает смысл присутствия оператора container в дереве данных. Он принимает в качестве аргумента строку с текстовым описанием смысла присутствия узла.

Если контейнер имеет оператор presence, наличие контейнера в дереве данных имеет некий самостоятельный смысл. В противном случае контейнер служит для представления некой структуры данных и не имеет самостоятельного значения.

Дополнительная информация приведена в параграфе 7.5.1.

7.5.6. Операторы дочерних узлов контейнера

Внутри контейнеры операторы container, leaf, list, leaf-list, uses, choice и anyxmls могут применяться для определения дочерних узлов контейнера.

7.5.7. Правила отображения XML

Узел container представляется в виде элемента XML. Локальное имя элемента служит идентификатором контейнера, а его пространство имён совпадает с пространством имён XML для модуля (см. параграф 7.1.3).

Дочерние узлы контейнера представляются как субэлементы элемента container. Если контейнер определяет входные или выходные параметры RPC или операции (action), эти субэлементы представляются в том же порядке, в котором они определены в операторе container. В остальных случаях субэлементы могут представляться в любом порядке.

Сервер NETCONF, отвечающий на запрос <get> или <get-config>, может отказаться от передачи элемента container, если узел контейнера не имеет оператора presence и дочерних узлов. Поэтому клиент, принявший <rpc-reply> для запроса <get> или <get-config>, должен быть готов обрабатывать ситуации, когда узел контейнера без оператора presence не присутствует в XML.

7.5.8. Операции NETCONF <edit-config>

Контейнеры могут создаваться, удаляться, заменяться и изменяться с помощью операции <edit-config> с атрибутом operation (см. параграф 7.2 в [RFC4741]) в элементе XML этого контейнера.

Если контейнер не имеет оператора presence и последний дочерний узел удалён, сервер NETCONF может удалить этот контейнер.

При обработке сервером NETCONF запроса <edit-config> выполняются следующие правила:

  • если задана операция merge или replace, узел создаётся при его отсутствии;

  • если задана операция create, узел создаётся при его отсутствии, а в случае наличия узла возвращается ошибка data-exists;

  • если задана операция delete, узел удаляется при его наличии, а в случае отсутствия узла возвращается ошибка data-missing.

7.5.9. Пример использования

Для приведённого ниже определения контейнера

     container system {
         description "Содержит различные параметры системы";
         container services {
             description "Настройка доступных извне служб";
             container "ssh" {
                 presence "Включает SSH";
                 description "Настройки службы SSH";
                 // дополнительные листья, контейнеры и т. п. ...
             }
         }
     }

Соответствующий экземпляр XML будет иметь вид

     <system>
       <services>
         <ssh/>
       </services>
     </system>

Присутствие элемента <ssh> разрешает использовать SSH.

Удаление контейнера с помощью <edit-config> имеет вид

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config">
             <services>
               <ssh nc:operation="delete"/>
             </services>
           </system>
         </config>
       </edit-config>
     </rpc>

7.6. Оператор leaf

Оператор leaf служит для определения листа (leaf node) в дереве схемы. Он принимает одни аргумент, являющийся идентификатором, за которым следует блок субоператоров, детализирующих информацию листа.

Узел leaf имеет значение, но не имеет дочерних узлов в дереве данных. Понятно, что значение в дереве данных всегда имеет каноническую форму (см. параграф 9.1).

Узлы типа leaf являются необязательными и могут присутствовать во множестве экземпляров.

Оператор leaf используется для определения скалярных переменных конкретного встроенного или производного типа.

7.6.1. Значение листа по умолчанию

Значением листа по умолчанию является используемое сервером значение при отсутствии этого листа в дереве данных. Использование принятого по умолчанию значения зависит от ближайшего предка в дереве схемы, который не является контейнером без присутствия.

  • Если такого предка нет в дереве схемы, должно использоваться принятое по умолчанию значение.

  • В противном случае, если предок является узлом case, принятое по умолчанию значение должно использоваться, когда любой узел из case существует в дереве данных или узел case является используемым по умолчанию для choice и нет узлов от других вариантов case в дереве данных.

  • В остальных случаях принятое по умолчанию значение должно использоваться при наличии предка в дереве данных.

В этих случаях говорят, что используется принятое по умолчанию значение.

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

Если лист включает оператор default, по умолчанию для листа будет применяться значение, указанное в операторе default. В остальных случаях, если тип листа имеет принятое по умолчанию значение и не является обязательным, для этого листа по умолчанию будет использоваться принятое по умолчанию значение для этого типа. Во всех остальных случаях лист просто не имеет принятого по умолчанию значения.

7.6.2. Субоператоры для leaf

Субоператор

Параграф

Число элементов

config

7.19.1

0..1

default

7.6.4

0..1

description

7.19.3

0..1

if-feature

7.18.2

0..n

mandatory

7.6.5

0..1

must

7.5.3

0..n

reference

7.19.4

0..1

status

7.19.2

0..1

type

7.6.3

1

units

7.3.3

0..1

when

7.19.5

0..1

7.6.3. Оператор type

Оператор type, который должен присутствовать, принимает в качестве аргумента имя существующего встроенного или производного типа. Необязательный блок субоператоров задет ограничения для типа (см. параграф 7.4).

7.6.4. Оператор default

Необязательный оператор default принимает в качестве аргумента строку, задающую принятое по умолчанию значение для листа.

Значение оператора default должно соответствовать типу листа, заданному оператором type.

Оператор default недопустимо включать для узлов, где в качестве значения mandatory установлено true.

Определение принятого по умолчанию значение недопустимо помечать оператором if-feature. Например, ниже представлено неприемлемое определение.

7.6.5. Оператор mandatory

Необязательный оператор принимает в качестве аргумента строку true или false и задаёт ограничения для пригодных данных. Если значение оператора не задано, по умолчанию используется false.

Если для mandatory установлено значение true, поведение ограничений зависит от типа ближайшего предка leaf в дереве схемы, который не является контейнером без присутствия (см. параграф 7.5.1):

  • если такого предка нет в дереве схемы, leaf должен существовать;

  • в противном случае, если предок имеет тип case leaf должен существовать при наличии в дереве данных хотя бы одного узла из case;

  • в остальных случаях leaf должен существовать, если узел-предок существует в дереве данных.

Эти ограничения применяются в соответствии с правилами раздела 8.

7.6.6. Правила отображения XML

Узел leaf представляется в виде элемента XML. Локальное имя элемента является идентификатором листа, а его пространством имён является пространство имён XML для модуля (см. параграф 7.1.3).

Значение узла leaf представляется в XML в соответствии с типом и передаётся в элемент в виде символов.

Сервер NETCONF, отвечающий на запрос <get> или <get-config>, может отказаться от передачи элемента leaf, если узел leaf имеет принятое по умолчанию значения. Поэтому клиент, принявший <rpc-reply> для запроса <get> или <get-config>, должен быть готов обрабатывать ситуации, когда узел leaf не присутствует в XML. В таких случаях известно, что сервер воспользовался принятым по умолчанию значением.

Пример представления дан в параграфе 7.6.8.

7.6.7. Операции NETCONF <edit-config>

При обработке сервером NETCONF запроса <edit-config> для узла leaf выполняются следующие правила:

  • если задана операция merge или replace, узел создаётся при его отсутствии и для него устанавливается значение, найденное в данных XML RPC;

  • если задана операция create, узел создаётся при его отсутствии, а в случае наличия узла возвращается ошибка data-exists;

  • если задана операция delete, узел удаляется при его наличии, а в случае отсутствия узла возвращается ошибка data-missing.

7.6.8. Пример использования

Ниже приведён оператор leaf, помещённый в определённый выше контейнер ssh (см. параграф 7.5.9):

     leaf port {
         type inet:port-number;
         default 22;
         description "Порт, который прослушивает сервер SSH."
     }

Пример соответствующего экземпляра XML будет иметь вид

     <port>2022</port>

Для установки значения leaf с помощью <edit-config> служит

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config">
             <services>
               <ssh>
                 <port>2022</port>
               </ssh>
             </services>
           </system>
         </config>
       </edit-config>
     </rpc>

7.7. Оператор leaf-list

Оператор leaf служит для определения простой скалярной переменной того или иного типа, а оператор leaf-list — для определения массива определённого типа. Оператор leaf-list принимает в качестве параметра идентификатор, за которым следует блок субоператоров с детальной информацией о leaf-list. В данных конфигурации все значения в leaf-list должны быть уникальными. Понятно, что значения в дереве данных должны иметь каноническую форму (см. параграф 9.1).

Если тип, указанный leaf-list, имеет принятое по умолчанию значение, он не оказывает влияния на leaf-list.

7.7.1. Упорядочение

YANG поддерживает два стиля упорядочения элементов в узлах list и leaf-list. Во многих списках порядок элементов не влияет на реализацию конфигурации списка и устройство может сортировать элементы по своему усмотрению. Строка description для списка может предложить порядок для разработчиков реализации сервера. В языке YANG такой стиль называется системным упорядочением (system ordered), а списки помечаются оператором ordered-by system.

Например, список допустимых пользователей обычно сортируется по алфавиту, поскольку порядок расположения пользователей в конфигурации не влияет на создание учётных записей этих пользователей.

В другом стиле списков порядок имеет значение для реализации конфигурации списка и пользователь отвечает за упорядочение элементов, а устройство этот порядок поддерживает. В YANG такие списки называются упорядоченными пользователем (user ordered) и указываются оператором ordered-by user.

Например, список, в соответствии с которым применяются фильтры пакетов к входящему трафику, может влиять на результат фильтрации. Пользователь должен сам решить следует применять фильтр, отбрасывающий все пакеты TCP, до или после фильтра, разрешающего трафик с доверенных интерфейсов. Выбор порядка может быть важен.

YANG обеспечивает в операции NETCONF <edit-config> многочисленные возможности, позволяющие контролировать порядок элементов в списках упорядочиваемых пользователем. Элементы списка могут вставляться или перемещаться, помещаться в начало или конец списка, а также в определённую позицию перед заданным элементом или после него.

Оператор ordered-by описан в параграфе 7.7.57.

7.7.2. Субоператоры для leaf-list

Субоператор

Параграф

Число элементов

config

7.19.1

0..1

description

7.19.3

0..1

if-feature

7.18.2

0..n

max-elements

7.7.4

0..1

min-elements

7.7.3

0..1

must

7.5.3

0..n

ordered-by

7.7.5

0..1

reference

7.19.4

0..1

status

7.19.2

0..1

type

7.4

1

units

7.3.3

0..1

when

7.19.5

0..1

7.7.3. Оператор min-elements

Необязательный оператор min-elements принимает в качестве аргумента неотрицательное целое число, которое задаёт ограничения для количества элементов списка. Действительный список leaf-list или list должен иметь по меньшей мере min-elements элементов

Если оператор min-elements не присутствует, по умолчанию принимается значение 0.

Поведение ограничений зависит от типа ближайшего предка leaf-list или list в дереве схемы, который не является контейнером без присутствия (см. параграф 7.5.1):

  • если такого предка нет в дереве схемы, ограничения применяются;

  • в противном случае, если предок является узлом case, ограничения применяются при наличии любого другого узла от этого case;

  • в остальных случаях ограничения применяются при наличии узла предка.

Далее ограничения применяются в соответствии с правилами раздела 8.

7.7.4. Оператор max-elements

Необязательный оператор max-elements принимает в качестве аргумента положительное целое число или строку unbounded (не ограничено), которые ограничивают число пригодных элементов списка. Действительный список leaf-list или list всегда имеет не более max-elements элементов.

При отсутствии оператора max-elements по умолчанию используется значение unbounded.

Ограничения оператора max-elements применяются в соответствии с правилами раздела 8.

7.7.5. Оператор ordered-by

Оператор ordered-by определяет источник упорядочения элементов списка — пользователь или система. Аргументом оператора может быть строка system или user. При отсутствии оператора по умолчанию применяется system.

Этот оператор игнорируется, если список представляет данные состояния, выходные параметры RPC или содержимое уведомления.

Дополнительная информация приведена в параграфе 7.7.1.

7.7.5.1. Системное упорядочение

Порядок сортировки элементов списка не задан. Реализация может сортировать элементы в удобном для неё порядке. упорядочиваются системой (ordered-by system). Реализациям следует применять для одинаковых данных один и тот же порядок, независимо от места расположения данных. Использование определённого порядка позволяет выполнять сравнение с использованием простых средств типа diff.

Этот порядок применяется по умолчанию.

7.7.5.2. Упорядочение пользователем

Элементы списка сортируются в соответствии с порядком, заданным пользователем. Этот порядок устанавливается с помощью специальных атрибутов XML в запросе <edit-config> (см. параграф 7.7.7).

7.7.6. Правила отображения XML

Узел leaf-list представляется последовательностью элементов XML. Локальное имя каждого элемента служит идентификатором leaf-list, а пространством имён служит пространство имён XML модуля (см. параграф 7.1.3).

Значение каждого элемента leaf-list представляется в XML в соответствии с типом и передаётся в элемент XML как символьные данные.

Элементы XML, представляющие элементы leaf-list, должны размещаться в порядке, заданном пользователем, если leaf-list имеет атрибут ordered-by user. В противном случае порядок зависит от реализации. Элементы XML, представляющие элементы leaf-list, могут чередоваться с элементами братских (sibling) leaf-list, если leaf-list не определяет входные или выходные параметры RPC.

Пример представлен в параграфе 7.7.8.

7.7.7. Операции NETCONF <edit-config>

Элементы leaf-list можно создавать и удалять, но нельзя изменить с помощью <edit-config> путём использования атрибута operation в элементе XML узла leaf-list.

В упорядоченном пользователем leaf-list атрибуты insert и value в пространстве имён YANG XML (параграф 5.3.1) могут служить для управления местом вставки элемента в leaf-list. Они могут применяться в операции create для создания нового элемента в leaf-list, а также в операциях merge или replace для вставки или перемещения элемента.

Атрибут оператора insert может принимать значения first, last, before и after. Для значений before и after должен также указываться атрибут value, задающий имеющуюся в leaf-list запись.

Если атрибут insert не задан для операции create, по умолчанию элемент добавляется в конец списка (last).

Если несколько элементов упорядоченного пользователем leaf-list меняются в одном запросе <edit-config>, элементы изменяются по одному в порядке размещения элементов XML в запросе.

В командах <copy-config> и <edit-config> с операцией replace, покрывающей весь список leaf-list, порядок в leaf-list совпадает с порядком элементов XML в запросе.

При обработке сервером NETCONF запроса <edit-config> для узла leaf-list выполняются следующие правила:

  • если задана операция merge или replace, узел создаётся при его отсутствии;

  • если задана операция create, узел создаётся при его отсутствии, а в случае наличия узла возвращается ошибка data-exists;

  • если задана операция delete, узел удаляется при его наличии, а в случае отсутствия узла возвращается ошибка data-missing.

7.7.8. Пример использования

     leaf-list allow-user  {
         type string;
         description "Список шаблонов имён пользователей для разрешения.";
     }

Соответствующий экземпляр XML имеет вид

     <allow-user>alice</allow-user>
     <allow-user>bob</allow-user>

Для создания в списке нового элемента с использованием принятой по умолчанию для <edit-config> операции merge

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config">
             <services>
               <ssh>
                 <allow-user>eric</allow-user>
               </ssh>
             </services>
           </system>
         </config>
       </edit-config>
     </rpc>

Для упорядоченного пользователем списка leaf-list

     leaf-list cipher  {
         type string;
         ordered-by user;
         description "Список шифров";
     }

Приведённый ниже фрагмент может служить для вставки нового шифра blowfish-cbc после 3des-cbc

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:yang="urn:ietf:params:xml:ns:yang:1">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config">
             <services>
               <ssh>
                 <cipher nc:operation="create"
                         yang:insert="after"
                         yang:value="3des-cbc">blowfish-cbc</cipher>
               </ssh>
             </services>
           </system>
         </config>
       </edit-config>
     </rpc>

7.8. Оператор list

Оператор list используется для определения внутренних узлов данных в дереве схемы. Узлы списков могут присутствовать в дереве данных во множестве экземпляров. Каждый такой экземпляр называется записью списка. Оператор list принимает один аргумент, являющийся идентификатором, за которым следует блок субоператоров с детальной информацией о списке.

Записи списка однозначно идентифицируются значениями ключей списка, если эти ключи определены.

7.8.1. Субоператоры для list

Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

choice

7.9

0..n

config

7.19.1

0..1

container

7.5

0..n

description

7.19.3

0..1

grouping

7.11

0..n

if-feature

7.18.2

0..n

key

7.8.2

0..1

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

max-elements

7.7.4

0..1

min-elements

7.7.3

0..1

must

7.5.3

0..n

ordered-by

7.7.5

0..1

reference

7.19.4

0..1

status

7.19.2

0..1

typedef

7.3

0..n

unique

7.8.3

0..n

uses

7.12

0..n

when

7.19.5

0..1

7.8.2. Оператор key

Оператор key, который должен присутствовать в списках, представляющих конфигурацию, и может присутствовать в остальных случаях, принимает в качестве аргумента строку, содержащую список из одного или множества разделённых пробелами идентификаторов листьев этого списка. Один идентификатор недопустимо включать в несколько ключей. Каждый такой идентификатор листа должен указывать на дочерний лист списка. Листья могут определяться непосредственно с субоператорах или в группировках, используемых списком.

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

Лист, являющийся частью ключа, может быть любого встроенного или производного типа, но недопустимо использовать встроенный тип empty.

Все листья ключа в списке должны иметь то же значение config, что и сам список.

Синтаксис строки key формально определён правилом key-arg в разделе 12.

7.8.3. Оператор unique

Оператор unique служит задаёт ограничения для пригодных элементов списка и принимает аргумент в форме строки с разделёнными пробелами идентификаторами узлов из списка схемы, которые должны быть заданы в форме потомков (см. правило descendant-schema-nodeid в разделе 12). Каждый из этих идентификаторов узлов схемы должен указывать лист.

Если один из указанных листьев представляет данные конфигурации, все указанные листья также должны представлять данные конфигурации.

Оператор unique задаёт, что комбинация значений всех экземпляров листьев, указанных в строке аргумента, включая листья с принятыми по умолчанию значениями, должна быть уникальной в рамках всех экземпляров элементов списка, в которых указанные листья существуют. Ограничение применяется в соответствии с правилами раздела 8.

Синтаксис строки unique формально определён правилом unique-arg из раздела 12.

7.8.3.1. Пример использования

Для показанного ниже списка

     list server {
         key "name";
         unique "ip port";
         leaf name {
             type string;
         }
         leaf ip {
             type inet:ip-address;
         }
         leaf port {
             type inet:port-number;
         }
     }

приведённая ниже конфигурация будет непригодной

     <server>
       <name>smtp</name>
       <ip>192.0.2.1</ip>
       <port>25</port>
     </server>

     <server>
       <name>http</name>
       <ip>192.0.2.1</ip>
       <port>25</port>
     </server>

Следующая конфигурация приемлема, поскольку элементы списка http и ftp не имеют значений для всех упомянутых листьев и не будут приняты во внимание при выполнении ограничений данных оператором unique.

     <server>
       <name>smtp</name>
       <ip>192.0.2.1</ip>
       <port>25</port>
     </server>

     <server>
       <name>http</name>
       <ip>192.0.2.1</ip>
     </server>

     <server>
       <name>ftp</name>
       <ip>192.0.2.1</ip>
     </server>

7.8.4. Операторы дочерних узлов списка

Внутри списка операторы container, leaf, list, leaf-list, uses, choice и anyxmls могут служить для определения дочерних узлов списка.

7.8.5. Правила отображения XML

Список представляется набором элементов XML по одному на каждый элемент списка. Локальное имя каждого элемента является идентификатором списка, а пространством имён служит пространство имён XML для модуля (см. параграф 7.1.3).

Узлы ключей списка представляются в форме субэлементов идентификаторов списка в том же порядке, как они определены в операторе key.

Остальная часть дочерних узлов списка представляется в виде субэлементов для элемента списка после ключей. Если список определяет входные или выходные параметры RPC, субэлементы кодируются в том же порядке, как они определены в операторе list. В стальных случаях порядок может быть произвольным.

Все пробельные символы между субэлементами элемента списка не имеют значения и реализация может добавлять пробельные символы между субэлементами.

Элементы XML, представляющие элементы списка, должны указываться в заданном пользователем порядке, если список имеет тип ordered-by user. В противном случае порядок зависит от реализации. Элементы XML, представляющие элементы списка, могут чередоваться с элементами братских (sibling) списков, если список не определяет входные или выходные параметры RPC.

7.8.6. Операции NETCONF <edit-config>

Элементы списка можно создавать, удалять, заменять и изменять с помощью операции <edit-config> с использованием атрибута operation в элементе XML для списка. В каждом случае значения всех ключей служат для однозначной идентификации элементов списка. Если для элемента списка не заданы все ключи, возвращается ошибка missing-element.

В упорядоченных пользователем списках атрибуты insert и key в пространстве имён YANG XML (параграф 5.3.1) могут служить для управления местом размещения элемента в списке. Они могут применяться в операциях create для вставки новых элементов, а также в операциях merge или replace для вставки для вставки или перемещения элемента.

Атрибут оператора insert может принимать значения first, last, before и after. Для значений before и after должен также указываться атрибут key, задающий имеющийся в списке элемент. Значение атрибута key является ключом, задающим полный идентификатор экземпляра (см. параграф 9.13) для элемента списка.

Если атрибут insert не задан для операции create, по умолчанию элемент добавляется в конец списка (last).

Если несколько элементов упорядоченного пользователем списка меняются в одном запросе <edit-config>, элементы изменяются по одному в порядке размещения элементов XML в запросе.

В командах <copy-config> и <edit-config> с операцией replace, покрывающей весь список, порядок в списке совпадает с порядком элементов XML в запросе.

При обработке сервером NETCONF запроса <edit-config> для узла list выполняются приведённые ниже правила.

  • Если задана операция merge или replace, элемент списка создаётся при его отсутствии. Если элемент списка уже существует и имеются атрибуты insert и key, элемент перемещается в соответствии со значениями этих атрибутов. Если элемент списка существует, но атрибутов insert и key нет, элемент списка не перемещается.

  • Если задана операция create, элемент списка создаётся при его отсутствии, а в случае наличия элемента возвращается ошибка data-exists.

  • Если задана операция delete, элемент списка удаляется при его наличии, а в случае отсутствия элемента возвращается ошибка data-missing.

7.8.7. Пример использования

Для списка

     list user {
         key "name";
         config true;
         description "Это список пользователей системы.";

         leaf name {
             type string;
         }
         leaf type {
             type string;
         }
         leaf full-name {
             type string;
         }
     }

Соответствующий экземпляр XML будет иметь вид

     <user>
       <name>fred</name>
       <type>admin</type>
       <full-name>Fred Flintstone</full-name>
     </user>

Создание нового пользователя barney

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config">
             <user nc:operation="create">
               <name>barney</name>
               <type>admin</type>
               <full-name>Barney Rubble</full-name>
             </user>
           </system>
         </config>
       </edit-config>
     </rpc>

Изменение роли пользователя fred на superuser

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config">
             <user>
               <name>fred</name>
               <type>superuser</type>
             </user>
           </system>
         </config>
       </edit-config>
     </rpc>

Для упорядоченного пользователем списка

     list user {
         description "Это список пользователей системы.";
         ordered-by user;
         config true;

         key "name";

         leaf name {
             type string;
         }
         leaf type {
             type string;
         }
         leaf full-name {
             type string;
         }
     }

Приведённый ниже фрагмент будет использоваться для добавления нового пользователя barney после пользователя fred

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:yang="urn:ietf:params:xml:ns:yang:1">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config"
                xmlns:ex="http://example.com/schema/config">
             <user nc:operation="create"
                   yang:insert="after"
                   yang:key="[ex:name='fred']">
               <name>barney</name>
               <type>admin</type>
               <full-name>Barney Rubble</full-name>
             </user>
           </system>
         </config>
       </edit-config>
     </rpc>

Приведённый ниже фрагмент будет служить для размещения пользователя barney перед пользователем fred

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:yang="urn:ietf:params:xml:ns:yang:1">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config"
                xmlns:ex="http://example.com/schema/config">
             <user nc:operation="merge"
                   yang:insert="before"
                   yang:key="[ex:name='fred']">
               <name>barney</name>
             </user>
           </system>
         </config>
       </edit-config>
     </rpc>

7.9. Оператор choice

Оператор choice определяет набор вариантов, из которых в дереве данных в каждый момент может присутствовать только один. Аргументом оператора является идентификатор, за которым следует блок субоператоров с детальной информацией о выборе. Идентификатор служит для указания узла choice в дереве схемы. В дереве данных узлов choice не существует.

Выбор (choice) включает множество ветвей, каждая из которых определяется субоператором case. Каждая ветвь содержит множество дочерних узлов. Одновременно могут существовать узлы не более, чем из одной ветви.

Дополнительная информация приведена в параграфе 8.3.2.

7.9.1. Субоператоры для choice

Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

case

7.9.2

0..n

config

7.19.1

0..1

container

7.5

0..n

default

7.9.3

0..1

description

7.19.3

0..1

if-feature

7.18.2

0..n

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

mandatory

7.9.4

0..1

reference

7.19.4

0..1

status

7.19.2

0..1

when

7.19.5

0..1

7.9.2. Оператор case для выбора

Оператор case используется для определения вариантов выбора в операторе choice. Он принимает идентификатор в качестве аргумента, за которым следует блок субоператоров, определяющих варианты.

Идентификатор служит для указания узла case в дереве схемы. Узлов case не существует в дереве данных.

Внутри case могут применяться операторы anyxml, choice, container, leaf, list, leaf-list и uses для определения потомков узла case. Идентификаторы всех дочерних узлов должны быть уникальными для всех вариантов case в данном choice. Ниже приведён пример недопустимого выбора.

     choice interface-type {     // Это неприемлемо в YANG
         case a {
             leaf ethernet { ... }
         }
         case b {
             container ethernet { ...}
         }
     }

Для сокращения оператор case может быть опущен, если вариант содержит один оператор anyxml, choice, container, leaf, list или leaf-list. В таких случаях узел case продолжает существовать в дереве схемы и его идентификатором служит идентификатор дочернего узла. Идентификаторы узлов схемы (параграф 6.5) всегда должны явно включать идентификаторы узлов case. Выражение

     choice interface-type {
         container ethernet { ... }
     }

эквивалентно

     choice interface-type {
         case ethernet {
             container ethernet { ... }
         }
     }

Каждый идентификатор case должен быть уникальным в рамках choice.

7.9.2.1. Субоператоры для case

Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

choice

7.9

0..n

container

7.5

0..n

description

7.19.3

0..1

if-feature

7.18.2

0..n

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

reference

7.19.4

0..1

status

7.19.2

0..1

uses

7.13

0..n

when

7.19.5

0..1

7.9.3. Субоператор default для выбора

Оператор default указывает вариант (case), который следует применять по умолчанию, если нет дочерних узлов ни у одного из вариантов choice. Аргументом служит идентификатор заданного по умолчанию варианта (case). Если оператор default не задан, используемого по умолчанию варианта не будет.

Оператор default недопустимо включать в оператор выбора (choice), где для mandatory задано значение true.

Используемый по умолчанию вариант важен лишь при рассмотрении используемых по умолчанию значений в узлах вариантов. Принятые по умолчанию значения для узлов используемого по умолчанию варианта используются в случаях отсутствия каких-либо других вариантов.

Недопустимо наличие обязательных (mandatory) узлов (параграф 3.1), являющихся непосредственными потомками принятого по умолчанию варианта.

Принятые по умолчанию значения дочерних узлов case используются лишь в тех случаях, когда один из таких узлов присутствует в варианте (case) или вариант задан в качестве принятого по умолчанию. Если нет ни одного из дочерних узлов варианта и вариант не задан в качестве принятого по умолчанию, используемые по умолчанию значения дочерних узлов варианта игнорируются.

В приведённом ниже примере выбор (choice) указывает по умолчанию вариант interval и принятое по умолчанию значение будет использоваться, если нет ни одного из листьев daily, time-of-day и manual. Если узел daily присутствует, будет использовано значение, принятое по умолчанию для узла time-of-day.

     container transfer {
         choice how {
             default interval;
             case interval {
                 leaf interval {
                     type uint16;
                     default 30;
                     units minutes;
                 }
             }
             case daily {
                 leaf daily {
                     type empty;
                 }
                 leaf time-of-day {
                     type string;
                     units 24-hour-clock;
                     default 1am;
                 }
             }
             case manual {
                 leaf manual {
                     type empty;
                 }
             }
         }
     }

7.9.4. Оператор mandatory для выбора

Необязательный оператор mandatory принимает в качестве аргумента строку true или false, задающую ограничения для данных. Если для оператора mandatory установлено значение true, должен существовать хотя бы один узел в одном из вариантов choice.

Если оператор не задан, по умолчанию предполагается значение false.

Поведение ограничений зависит от типа ближайшего предка choice в дереве схемы, который не является контейнером без присутствия (см. параграф 7.5.1):

  • если предок является узлом case, ограничение применяется при наличии любого другого узла от этого варианта (case);

  • в остальных случаях ограничение применяется при наличии узла-предка.

Далее ограничения применяются в соответствии с правилами раздела 8.

7.9.5. Правила отображения XML

Узлы choice и case не видны в XML.

Дочерние узлы выбранного варианта (case) должны представляться в том же порядке, как они были определены в операторе case, если это часть определения входных или выходных параметров RPC. В остальных случаях субэлементы могут представляться в любом порядке.

7.9.6. Операции NETCONF <edit-config>

Поскольку в каждый момент может действовать лишь один из вариантов choice, создание узла от одного варианта неявно удаляет все узлы от всех других вариантов. Если операция <edit-config> создаёт узел от case, сервер NETCONF будет удалять все имеющиеся узлы, определённые в других вариантах этого оператора choice.

7.9.7. Пример использования

Для приведённого ниже примера

     container protocol {
         choice name {
             case a {
                 leaf udp {
                     type empty;
                 }
             }
             case b {
                 leaf tcp {
                    type empty;
                 }
             }
         }
     }

Соответствующий экземпляр XML будет иметь вид

     <protocol>
       <tcp/>
     </protocol>

Для смены протокола TCP на UDP может служить приведённый ниже фрагмент.

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
          xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
       <edit-config>
         <target>
           <running/>
         </target>
         <config>
           <system xmlns="http://example.com/schema/config">
             <protocol>
               <udp nc:operation="create"/>
             </protocol>
           </system>
         </config>
       </edit-config>
     </rpc>

7.10. Оператор anyxml

Оператор anyxml определяет внутренний узел в дереве схемы. Оператор принимает идентификатор узла в качестве аргумента, а за ним следует блок субоператоров с информацией anyxml.

Оператор anyxml служит для представления неизвестного блока данных XML, на который не накладывается каких-либо ограничений. Это может быть полезно, например, в откликах RPC. Примером может служить параметр <filter> в операции <get-config> протокола NETCONF.

Узел anyxml не может быть дополнен (см. параграф 7.15).

Поскольку применение anyxml ограничивает манипуляции с содержимым, рекомендуется не использовать оператор anyxml для определения данных конфигурации.

Узел anyxml отсутствует в дереве данных или содержится там в одном экземпляре.

7.10.1. Субоператоры для anyxml

Субоператор

Параграф

Число элементов

config

7.19.1

0..1

description

7.19.3

0..1

if-feature

7.18.2

0..n

mandatory

7.6.5

0..1

must

7.5.3

0..n

reference

7.19.4

0..1

status

7.19.2

0..1

when

7.19.5

0..1

7.10.2. Правила отображения XML

Узел anyxml представляется в виде элемента XML. Локальное имя элемента является идентификатором anyxml, а пространством имён служит пространство имён XML для модуля (см. параграф 7.1.3). Значение узла anyxml представляется в качестве содержимого XML для этого элемента.

Отметим, что любые префиксы XML, используемые в представлении, являются локальными для представления каждого экземпляра. Это означает возможность различного представления XML в разных реализациях.

7.10.3. Операции NETCONF <edit-config>

Узел anyxml рассматривается, как «непрозрачный» (opaque) блок данных. Эти данные могут изменяться лишь целиком.

Любые атрибуты operation, представленные в субэлементах узла anyxml, игнорируются сервером NETCONF.

При обработке сервером NETCONF запроса <edit-config> для узла anyxml выполняются приведённые ниже правила.

  • Если задана операция merge или replace, узел создаётся при его отсутствии, а в качестве значения устанавливается содержимое XML узла anyxml в данных XML для RPC.

  • Если задана операция create, узел создаётся при его отсутствии, а в качестве значения устанавливается содержимое XML узла anyxml в данных XML для RPC. В случае наличия узла возвращается ошибка data-exists.

  • Если задана операция delete, узел удаляется при его наличии, а в случае отсутствия узла возвращается ошибка data-missing.

7.10.4. Пример использования

Для оператора anyxml

     anyxml data;

ниже приведены два варианта корректного представления одного значения anyxml.

     <data xmlns:if="http://example.com/ns/interface">
       <if:interface>
         <if:ifIndex>1</if:ifIndex>
       </if:interface>
     </data>

     <data>
       <interface xmlns="http://example.com/ns/interface">
         <ifIndex>1</ifIndex>
       </interface>
     </data>

7.11. Оператор grouping

Оператор grouping служит для определения блока узлов, который может многократно применяться локально в модуле или субмодуле, а также в импортирующих данный модуль других модулях (в соответствии с правилами параграфа 5.5). Оператор принимает в качестве аргумента идентификатор, за которым следует блок субоператоров с информацией о группировке.

Оператор grouping не задаёт определения данных и по этой причине не определяет каких-либо узлов в дереве схемы.

Группировка напоминает структуры (structure) или записи (record) в традиционных языках программирования.

После определения группировки на неё можно ссылаться в операторе uses (см. параграф 7.12). Группировке недопустимо ссылаться на самое себя ни напрямую, ни опосредовано через цепочку других группировок.

Если группировка определена на верхнем уровне модуля или субмодуля YANG, идентификатор группировки должен быть уникальным внутри модуля.

Группировка — это не просто механизм текстовой подстановки, она также определяет набор узлов. Идентификаторы узлов группировки преобразуются применительно к области, в которой группировка была определена, а не той, где она применяется. Отображения префиксов, имена типов и группировок, использование расширений оцениваются в иерархии, где был применён оператор grouping. Для расширений это означает, что они применяются к самой группировке, а не к использующему узлу.

7.11.1. Субоператоры для grouping

Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

choice

7.9

0..n

container

7.5

0..n

description

7.19.3

0..1

grouping

7.11

0..n

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

reference

7.19.4

0..1

status

7.19.2

0..1

typedef

7.3

0..n

uses

7.12

0..n

7.11.2. Пример использования

     import ietf-inet-types {
         prefix "inet";
     }

     grouping endpoint {
         description "Повторно используемая группа конечных точек.";
         leaf ip {
             type inet:ip-address;
         }
         leaf port {
             type inet:port-number;
         }
     }

7.12. Оператор uses

Оператор uses применяется для ссылок на определения группировок (grouping) и принимает один аргумент, задающий имя группировки.

Эффект ссылки uses на группировку заключается в том, что определённые группировкой узлы копируются в текущее дерево схемы, а затем обновляются в соответствии с операторами refine и augment.

Идентификаторы, определённые в группировке, не привязаны к пространству имён, пока содержимое группировки не будет добавлено в дерево схемы с помощью оператора uses, который не присутствует внутри данной группировки, после чего оно привязывается к пространству имён текущего модуля.

7.12.1. Субоператоры для uses

Субоператор

Параграф

Число элементов

augment

7.15

0..n

description

7.19.3

0..1

if-feature

7.18.2

0..n

reference

7.19.4

0..1

refine

7.12.2

0..n

status

7.19.2

0..1

when

7.19.5

0..1

7.12.2. Оператор refine

Некоторые из свойств каждого узла в группировке могут уточняться с помощью оператора refine, аргументом которого является строка, указывающая узел в этой группировке. Такой узел называется целью уточнения. Если узел в группировке не указан в качестве цели уточнения в операторе refine, он сохраняется без изменений и остаётся в точности таким, каким был определён в группировке.

Строка аргумента представляет собой идентификатор узла-потомка в схеме (см. параграф 6.5).

Оператор позволяет выполнить перечисленные ниже уточнения.

  • Узел leaf или choice может получить используемое по умолчанию значение или обновить имеющееся.

  • Любой узел может получить специализированную строку описания (description).

  • Любой узел может получить специализированную строку ссылки (reference).

  • Любой узел может получить другой оператор config.

  • Узел leaf, anyxml или choice может получить другой оператор mandatory.

  • Контейнер может получить оператор presence.

  • Узел leaf, leaf-list, list, container или anyxml может получить дополнительные выражения must.

  • Узел leaf-list или list может получить другие операторы min-elements или max-elements.

7.12.3. Правила отображения XML

Каждый узел в группировке представляется, как будто он был определён здесь (inline), даже если он импортирован из другого модуля с иным пространством имён XML.

7.12.4. Пример использования

Для использования группировки endpoint, определённой в параграфе 7.11.2, при определении сервера HTTP в каком-то другом модуле можно задать

     import acme-system {
         prefix "acme";
     }

     container http-server {
         leaf name {
             type string;
         }
         uses acme:endpoint;
     }

Соответствующий экземпляр XML будет иметь вид

     <http-server>
       <name>extern-web</name>
       <ip>192.0.2.1</ip>
       <port>80</port>
     </http-server>

Если на сервере HTTP по умолчанию следует применять порт 80, можно добавить оператор default.

     container http-server {
         leaf name {
             type string;
         }
         uses acme:endpoint {
             refine port {
                 default 80;
             }
         }
     }

Если нужно определить список серверов, каждый из которых имеет ip и port в качестве ключей, можно задать

     list server {
         key "ip port";
         leaf name {
             type string;
         }
         uses acme:endpoint;
     }

Ниже приведён пример с ошибкой.

     container http-server {
         uses acme:endpoint;
         leaf ip {          // недопустимо - идентификатор ip применяется дважды
             type string;
         }
     }

7.13. Оператор rpc

Оператор rpc служит для определения операций NETCONF RPC. Он принимает один аргумент в форме идентификатора, за которым следует блок субоператоров, определяющих операцию вызова удалённой процедуры. Аргумент является именем RPC и используется в качестве имени элемента для <rpc>, как указано группой подстановки rpcOperation в [RFC4741].

Оператор rpc определяет узел rpc в дереве схемы. Для узла rpc в схеме также определяются дочерние узлы input и output. Эти узлы определяются в пространстве имён модуля.

7.13.1. Субоператоры для rpc

Субоператор

Параграф

Число элементов

description

7.19.3

0..1

grouping

7.11

0..n

if-feature

7.18.2

0..n

input

7.13.2

0..1

output

7.13.3

0..1

reference

7.19.4

0..1

status

7.19.2

0..1

typedef

7.3

0..n

7.13.2. Оператор input

Необязательный оператор input служит для определения входных параметров операции RPC и не имеет аргументов. Субоператоры для input определяют узлы-потомки для узла input операции RPC.

Если лист в дереве input имеет оператор mandatory со значением true, этот лист должен присутствовать в вызове NETCONF RPC. В противном случае сервер должен возвращать ошибку NETCONF.

Если лист в дереве input имеет принятое по умолчанию значение, сервер NETCONF должен использовать это значение в случаях, описанных в параграфе 7.6.1. В таких ситуациях сервер должен вести себя так, будто при вызове NETCONF RPC принятое по умолчанию значение листа было передано в качестве входного.

Если оператор config присутствует для любого узла в дереве input, оператор config игнорируется.

Если узел имеет оператор when, который даёт значение false, такой узел недопустимо включать в дерево input.

7.13.2.1. Субоператоры для input

Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

choice

7.9

0..n

container

7.5

0..n

grouping

7.11

0..n

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

typedef

7.3

0..n

uses

7.12

0..n

7.13.3. Оператор output

Необязательный оператор output служит для определения выходных параметров операции RPC и не имеет аргументов. Субоператоры для output определяют узлы-потомки узла output определяемой операции.

Если лист дерева имеет оператор mandatory со значением true, лист должен присутствовать в отклике NETCONF RPC.

Если лист в дереве output имеет принятое по умолчанию значение, клиент NETCONF должен использовать это значение в случаях, описанных в параграфе 7.6.1. В таких ситуациях клиент должен вести себя так, будто принятое по умолчанию значение листа присутствует в отклике NETCONF RPC.

Если оператор config присутствует для любого узла в дереве output, оператор config игнорируется.

Если любой из узлов имеет оператор when, выражение которого даёт значение false, такой узел недопустимо включать в дерево output.

7.13.3.1. Субоператоры для output

Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

choice

7.9

0..n

container

7.5

0..n

grouping

7.11

0..n

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

typedef

7.3

0..n

uses

7.12

0..n

7.13.4. Правила отображения XML

Узел rpc представляется как дочерний элемент XML элемента <rpc> в соответствии с группой подстановки rpcOperation [RFC4741]. Локальное имя элемента является идентификатором rpc, а его пространство имён — пространством имён XML для модуля (см. параграф 7.1.3).

Входные параметры представляются дочерними элементами XML для элемента XML узла rpc в том же порядке, как они были определены в операторе input.

Если после успешного вызова RPC не было возвращено выходных параметров, <rpc-reply> содержит только элемент <ok/>, определённый в [RFC4741]. Если выходные параметры присутствуют, они кодируются как дочерние элементы элемента <rpc-reply>, определённого в [RFC4741], с тем же порядком, который был определён в операторе output.

7.13.5. Пример использования

Приведённый ниже пример определяет операцию RPC.

     module rock {
         namespace "http://example.net/rock";
         prefix "rock";

         rpc rock-the-house {
             input {
                 leaf zip-code {
                     type string;
                 }
             }
         }
     }

Соответствующие экземпляры XML для полных rpc и rpc-reply приведены ниже.

     <rpc message-id="101"
          xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
       <rock-the-house xmlns="http://example.net/rock">
         <zip-code>27606-0100</zip-code>
       </rock-the-house>
     </rpc>

     <rpc-reply message-id="101"
                xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
       <ok/>
     </rpc-reply>

7.14. Оператор notification

Оператор notification служит для определения уведомлений NETCONF. Оператор принимает в качестве аргумента идентификатор уведомления, за которым следует блок субоператоров с деталями уведомления. Оператор notification определяет уведомление в дереве схемы.

Если лист в дереве уведомления имеет оператор mandatory со значением true, этот лист должен присутствовать в экземплярах уведомления NETCONF.

Если лист в дереве уведомления имеет принятое по умолчанию значение, клиент NETCONF должен использовать это значение в случаях, описанных в параграфе 7.6.1. К таких ситуациях клиент должен вести себя так, будто лист присутствует в экземпляре уведомления NETCONF с принятым по умолчанию значением.

Поскольку дерево notification не включается в какое-либо хранилище данных, все операторы config для узлов дерева notification игнорируются.

Если оператор config присутствует для любого узла в дереве notification, оператор config игнорируется.

7.14.1. Субоператоры для notification

Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

choice

7.9

0..n

container

7.5

0..n

description

7.19.3

0..1

grouping

7.11

0..n

if-feature

7.18.2

0..n

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

reference

7.19.4

0..1

status

7.19.2

0..1

typedef

7.3

0..n

uses

7.12

0..n

7.14.2. Правила отображения XML

Узел notification, определённый на верхнем уровне модуля, кодируется как дочерний элемент XML для элемента <notification>, определённого в NETCONF Event Notifications [RFC5277]. Локальное имя элемента является идентификатором уведомления, а его пространством имён является пространство имён XML для модуля (см. параграф 7.1.3).

7.14.3. Пример использования

Приведённый ниже пример определяет уведомление.

     module event {
         namespace "http://example.com/event";
         prefix "ev";
         notification event {
             leaf event-class {
                 type string;
             }
             anyxml reporting-entity;
             leaf severity {
                 type string;
             }
         }
     }

Соответствующий экземпляр элемента XML для полного уведомления имеет вид

     <notification
       xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
       <eventTime>2008-07-08T00:01:00Z</eventTime>
       <event xmlns="http://example.com/event">
         <event-class>fault</event-class>
         <reporting-entity>
           <card>Ethernet0</card>
         </reporting-entity>
         <severity>major</severity>
       </event>
     </notification>

7.15. Оператор augment

Оператор augment позволяет модулю или субмодулю добавить узлы к дереву схемы, определённому во внешнем модуле, текущем модуле и его субмодулях, или к узлам из группировки в операторе uses. Аргументом оператора служит строка, указывающая узел в дереве схемы. Этот узел называется целью добавления (augment’s target). Целевой узел должен быть узлом типа container, list, choice, case, input, output и notification. К нему добавляются узлы, указанные с субоператорах, следующих за оператором augment.

Строка дополнения является идентификатором узла схемы (см. параграф 6.5). Если оператор augment относится к верхнему уровню модуля или субмодуля, должна применяться абсолютная форма (определена правилом absolute-schema-nodeid раздела 12) идентификатора узла схемы. Если augment является субоператором для uses, должна применяться наследуемая (descendant) форма (определена правилом descendant-schema-nodeid в разделе 12).

Если целевой узел имеет тип container, list, case, input, output или notification, внутри оператора augment могут применяться субоператоры container, leaf, list, leaf-list, uses и choice.

Если целевой узел является контейнером или списком, внутри оператора augment могут применяться субоператоры action и notification.

Если целевой узел является выбором (choice), внутри оператора augment могут применяться субоператоры case в полной или сокращённой (см. параграф 7.9.2) форме.

Если целевой узел является другим модулем, добавляемым узлам недопустимо быть обязательными (параграф 3.1).

Оператору augment недопустимо добавлять в целевой модуль множество узлов с одним именем из одного модуля.

7.15.1. Субоператоры для augment

Субоператор

Параграф

Число элементов

anyxml

7.10

0..n

case

7.9.2

0..n

choice

7.9

0..n

container

7.5

0..n

description

7.19.3

0..1

if-feature

7.18.2

0..n

leaf

7.6

0..n

leaf-list

7.7

0..n

list

7.8

0..n

reference

7.19.4

0..1

status

7.19.2

0..1

uses

7.12

0..n

when

7.19.5

0..1

7.15.2. Правила отображения XML

Все узлы данных, определённые в операторе augment, задаются как элементы XML, определённые в пространстве имён XML модуля, где указан оператор augment.

При добавлении узла дополняющие потомки кодируются в виде субэлементов дополняемого узла в любом порядке.

7.15.3. Пример использования

В пространстве имён http://example.com/schema/interfaces

     container interfaces {
         list ifEntry {
             key "ifIndex";

             leaf ifIndex {
                 type uint32;
             }
             leaf ifDescr {
                 type string;
             }
             leaf ifType {
                 type iana:IfType;
             }
             leaf ifMtu {
                 type int32;
             }
         }
     }

В пространстве имён http://example.com/schema/ds0

     import interface-module {
         prefix "if";
     }
     augment "/if:interfaces/if:ifEntry" {
         when "if:ifType='ds0'";
         leaf ds0ChannelNumber {
             type ChannelNumber;
         }
     }

Соответствующий экземпляр XML будет иметь вид

     <interfaces xmlns="http://example.com/schema/interfaces"
                 xmlns:ds0="http://example.com/schema/ds0">
       <ifEntry>
         <ifIndex>1</ifIndex>
         <ifDescr>Flintstone Inc Ethernet A562</ifDescr>
         <ifType>ethernetCsmacd</ifType>
         <ifMtu>1500</ifMtu>
       </ifEntry>
       <ifEntry>
         <ifIndex>2</ifIndex>
         <ifDescr>Flintstone Inc DS0</ifDescr>
         <ifType>ds0</ifType>
         <ds0:ds0ChannelNumber>1</ds0:ds0ChannelNumber>
       </ifEntry>
     </interfaces>

В другом примере предполагается наличие выбора (choice), определённого в параграфе 7.9.7. Приведённая ниже конструкция может использоваться для расширения протокольного определения

     augment /ex:system/ex:protocol/ex:name {
         case c {
             leaf smtp {
                 type empty;
             }
         }
     }

Соответствующий экземпляр XML будет иметь вид

     <ex:system>
       <ex:protocol>
         <ex:tcp/>
       </ex:protocol>
     </ex:system>

или

     <ex:system>
       <ex:protocol>
         <other:smtp/>
       </ex:protocol>
     </ex:system>

7.16. Оператор identity

Оператор identity служит для определения нового уникального в глобальном масштабе абстрактного отождествления без конкретного типа. Единственной целью создания такого отождествления является обозначение его имени, семантики и существования. Отождествление может быть определено «с нуля» или произведено на основе одного или нескольких базовых отождествлений. Аргументом identity является идентификатор, указывающий имя этого отождествления, за которым следует блок субоператоров с информацией об отождествлении.

Для определения отождествлений в модели данных может применяться встроенный типа данных identityref (см. параграф 9.10).

7.16.1. Субоператоры для identity

Субоператор

Параграф

Число элементов

base

7.16.2

0..n

description

7.19.3

0..1

reference

7.19.4

0..1

status

7.19.2

0..1

7.16.2. Оператор base

Необязательный оператор base принимает в качестве аргумента строку имени существующего отождествления, на основе которого создаётся производное. Если оператор base не указан, новое отождествление создаётся «с нуля».

Если в базовом имени присутствует префикс, это говорит о том, что базовое отождествление определено в модуле, который импортирован с этим префиксом, или в локальном модуле, если тот использует указанный префикс. В остальных случаях отождествление с указанным именем должно быть определено в текущем модуле или его субмодулях.

Поскольку субмодули не могут включать родительский модуль, любые отождествления в модуле, которые нужно открыть для субмодулей, должны определяться в субмодуле. Другие субмодули могут включать этот субмодуль и видеть определение identity.

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

7.16.3. Пример использования

     module crypto-base {
         namespace "http://example.com/crypto-base";
         prefix "crypto";

         identity crypto-alg {
             description
                "Базовое отождествление, из которого выводятся все 
                 криптоалгоритмы.";
         }
     }

     module des {
         namespace "http://example.com/des";
         prefix "des";

         import "crypto-base" {
             prefix "crypto";
         }

         identity des {
             base "crypto:crypto-alg";
             description "Алгоритм шифрования DES";
         }

         identity des3 {
             base "crypto:crypto-alg";
             description "Алгоритм шифрования Triple DES";
         }
     }

7.17. Оператор extension

Оператор extension позволяет определять новые операторы для языка YANG. Определение нового оператора может импортироваться и использоваться другими модулями.

Аргументом оператора extension является идентификатор, который будет ключевым словом расширения, а за ним должен следовать блок субоператоров с информацией о расширении. Целью оператора extension является определение нового ключевого слова, которое может импортироваться и применяться другими модулями.

Расширение может применяться подобно обычным операторам YANG с именем оператора, за которым следует аргумент, если он был определён оператором extension, а также может следовать блок субоператоров. Имя оператора создаётся путём объединения префикса модуля, в котором было определено расширение, двоеточия (:) и ключевого слова расширения без пробелов между ними. Субоператоры расширения определяются оператором extension, с использованием механизмов, выходящих за рамки данной спецификации. Синтаксически субоператоры должны быть операторами YANG, включая расширения, определённые с использованием операторов extension. Операторы YANG в расширениях должны следовать синтаксическим правила раздела 12.

7.17.1. Субоператоры для extension

Субоператор

Параграф

Число элементов

argument

7.17.2

0..1

description

7.19.3

0..1

reference

7.19.4

0..1

status

7.19.2

0..1

7.17.2. Оператор argument

Необязательный оператор argument принимает в качестве аргумента строку имени аргумента для ключевого слова (расширения). Если оператор argument не задан, ключевое слово будет использоваться без аргументов.

Имя аргумента используется в отображении YIN, где оно служит атрибутом XML или именем элемента в зависимости от субоператора yin-element в этом операторе argument.

7.17.2.1. Субоператор для argument

Субоператор

Параграф

Число элементов

yin-element

7.17.2.2

0..1

7.19.2.2. Оператор yin-element

Необязательный оператор yin-element принимает в качестве аргумента строку true или false. Этот оператор показывает отображается ли argument в элемент или атрибут XML при преобразовании в YIN (см. раздел 11).

Если оператор yin-element не задан, по умолчанию предполагается значение false.

7.17.3. Пример использования

Определение расширения может иметь вид

     module my-extensions {
       ...

       extension c-define {
         description
           "Принимает в качестве аргумента строку имени.
            Обеспечивает использование генератором кода этого имени в 
            #define.";
         argument "name";
       }
     }

Использование расширения может иметь вид

     module my-interfaces {
       ...
       import my-extensions {
         prefix "myext";
       }
       ...

       container interfaces {
         ...
         myext:c-define "MY_INTERFACES";
       }
     }

7.18. Операторы, связанные с соответствием спецификации

В этом разделе определены операторы, связанные с совместимостью, как описано в параграфе 5.6.

7.18.1. Оператор feature

Оператор feature служит для определения механизма, с помощью которого часть схемы помечается, как условная. Определяется имя функции, на которое можно потом ссылаться в операторах if-feature (см. параграф 7.18.2). Узлы схемы, помеченные оператором if-feature, игнорируются сервером, если он не поддерживает заданное в операторе feature выражение. Это позволяет сделать часть модуля YANG условной, в зависимости от возможностей сервера. Модель может представлять возможности сервера внутри себя, что делает её более эффективной и позволяет устройствам выступать в различных ролях.

Аргументом оператора feature является имя новой функции (возможности), которое выбирается в соответствии с правилами для идентификаторов, приведёнными в параграфе 6.2. Это имя используется в операторах if-feature для привязки узлов схемы к данной функции.

В приведённом ниже примере функция local-storage представляет способность устройства локально сохранять сообщения syslog в том или ином его хранилище. Эта функция используется для того, чтобы сделать лист local-storage-limit условным, в зависимости от наличия локального хранилища. Если устройство не укажет поддержку этой функции, узел local-storage-limit не будет поддерживаться.

     module syslog {
         ...
         feature local-storage {
             description
                 "Это свойство означает поддержку устройством локального
                  хранилища (память, флэш или диск), которое может служить
                  для записи сообщений syslog.";
         }

         container syslog {
             leaf local-storage-limit {
                 if-feature local-storage;
                 type uint64;
                 units "kilobyte";
                 config false;
                 description
                     "Объем локального хранилища, который может быть 
                      использован для сообщений syslog.";
             }
         }
     }

Оператор if-feature может использоваться в разных местах в синтаксисе YANG. Определения с пометкой if-feature игнорируются, если устройство не поддерживает данную функцию.

Функции (feature) недопустимо ссылаться на себя ни напрямую, ни опосредованно через цепочку других функций.

Для того, чтобы устройство поддерживало функцию, зависящую от каких-либо других функций (т. е. функцию, включающую один или несколько субоператоров if-feature), это устройство должно поддерживать все связанные зависимостями функции.

7.18.1.1. Субоператоры для feature

Субоператор

Параграф

Число элементов

description

7.19.3

0..1

if-feature

7.18.2

0..n

reference

7.19.4

0..1

status

7.19.2

0..1

7.18.2. Оператор if-feature

Оператор if-feature делает родительский оператор условным. Аргументом является имя функции, заданное оператором feature. Родительский оператор выполняется сервером в том случае, когда он поддерживает эту возможность. При наличии префикса в имени функции, он указывает возможность, определённую в модуле, импортированном с этим префиксом, или локальном модуле, если префикс соответствует префиксу локального модуля. В остальных случаях соответствующее имя должно быть определено в текущем модуле или включённом субмодуле.

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

7.18.3. Оператор deviation

Оператор deviation определяет иерархию модуля, которую устройство полностью не реализует. Аргументом оператора служит строка с идентификатором узла в дереве схемы, который отклоняется от заданного модулем поведения. Этот узел называется целевым узлом отклонения. Содержимое оператора deviation указывает детали отклонения.

Строка аргумента указывает абсолютный идентификатор узла схемы (см. параграф 6.5).

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

Устройствам настоятельно рекомендуется избегать отклонений и они должны использоваться лишь в качестве последнего шанса. Уведомление клиентов об отклонении от стандарта не заменяет собой следование стандартам. Устройство, поведение которого отклоняется от модуля, не будет полностью совместим с этим модулем.

Однако в некоторых случаях конкретное устройство может просто не иметь аппаратных или программных компонент для поддержки отдельных частей стандартного модуля. В таких случаях устройство может попытаться выполнить не поддерживаемую функцию и возвратить клиенту сообщение об ошибке или просто игнорировать запросы. Оба варианта не будут приемлемыми.

Взамен этих вариантов YANG позволяет серверам указать не поддерживаемые части базового модуля или показать использование для их поддержки другого синтаксиса. Делается это с помощью оператора deviation.

7.18.3.1. Субоператоры для deviation

Субоператор

Параграф

Число элементов

description

7.19.3

0..1

deviate

7.18.3.2

1 — n

reference

7.19.4

0..1

7.18.3.2. Оператор deviate

Оператор deviate указывает отклонение реализации устройства для целевого узла от исходного определения. Аргумент оператора может принимать значение not-supported, add, replace или delete.

Значение not-supported показывает, что целевой узел не реализован на этом устройстве.

Значение add добавляет свойства целевому узлу. Свойства для добавления указываются субоператорами оператора deviate. Если свойство может появляться только один раз, его существование в целевом узле недопустимо.

Значение replace заменяет свойства целевого узла. Свойства для замены указываются субоператорами оператора deviate. Заменяемое свойство должно существовать у целевого узла.

Значение delete удаляет свойства целевого узла. Свойства для удаления указываются субоператорами оператора deviate. Ключевое слово субоператора должно соответствовать ключевому слову в целевом узле, а строка аргумента должна совпадать с соответствующей строкой аргумента ключевого слова в целевом узле.

Субоператор

Параграф

Число элементов

config

7.19.1

0..1

default

7.6.4

0..n

mandatory

7.6.5

0..1

max-elements

7.7.4

0..1

min-elements

7.7.3

0..1

must

7.5.3

0..n

type

7.4

0..1

unique

7.8.3

0..n

units

7.3.3

0..1

7.20.3.3. Пример использования

В этом примере устройство информирует клиентское приложение о том, что он не поддерживает службу daytime в стиле RFC 867.

     deviation /base:system/base:daytime {
         deviate not-supported;
     }

В приведённом ниже примере устанавливается используемое сервером по умолчанию значение для листа, у которого такого значения не определено.

     deviation /base:system/base:user/base:type {
         deviate add {
             default "admin"; // новые пользователи по умолчанию admin
         }
     }

В следующем примере сервер ограничивает число серверов имён до 3.

     deviation /base:system/base:name-server {
         deviate replace {
             max-elements 3;
         }
     }

Если исходное определение имело вид

     container system {
         must "daytime or time";
         ...
     }

устройство может удалить ограничение must

     deviation "/base:system" {
         deviate delete {
             must "daytime or time";
         }
     }

7.19. Субоператоры общего назначения

В этом разделе описаны субоператоры, используемые несколькими другими операторами.

7.19.1. Оператор config

Оператор config принимает в качестве аргумента строку true или false. Если config имеет аргумент true, определение представляет конфигурацию. Узлы данных, представляющие конфигурацию, являются частью хранилища конфигурации. Узлы данных, представляющие конфигурацию, будут частью отклика на запрос <get-config> и могут передаваться в запросах <copy-config> или <edit-config>.

Если config имеет аргумент false, определение представляет данные состояния. Узлы данных, представляющих состояние, будут частью отклика на запрос <get>, но не на запрос <get-config> и не могут включаться в запросы <copy-config> или <edit-config>.

Если оператор config не задан, по умолчанию используется значение config родительского узла схемы. Если родительским узлом является case, значение совпадает со значением родителя варианта case.

Если верхний узел на включает config, по умолчанию используется значение true.

Если для узла config имеет значение false, ни один из нижележащих узлов не может иметь config со значением true.

7.19.2. Оператор status

Оператор status принимает в качестве аргумента одно из значений current, deprecated или obsolete:

  • current означает, что определений является текущим и действует;

  • deprecated указывает устаревшее определение, которое, тем не менее, разрешено использовать для обеспечения совместимости с имеющимися старыми реализациями;

  • obsolete указывает отменённое определение, которое не следует применять в новых реализациях и/или может быть удалено.

Если оператор status не задан, по умолчанию предполагается значение current.

Определению типа current недопустимо ссылаться на определения типа deprecated или obsolete в том же модуле.

Определению типа deprecated недопустимо ссылаться на определения типа obsolete в том же модуле.

Например, приведённое ниже определение недействительно.

     typedef my-type {
       status deprecated;
       type int32;
     }

     leaf my-leaf {
       status current;
       type my-type; // не пригоден, поскольку my-type отменен
     }

7.19.3. Оператор description

Оператор description принимает в качестве аргумента строку, содержащую предназначенное для человека текстовое описание данного определения. Текст приводится на языке (языках) выбранном разработчиком модуля. Рекомендуется использовать язык, широко распространённый среди сетевых администраторов, которые будут использовать модуль.

7.19.4. Оператор reference

Оператор reference принимает в качестве аргумента строку, содержащую предназначенную для человека ссылку на внешний документ — другой модуль, который определяет связанную с данным информацию для управления, или документ с дополнительной информацией, относящейся к данному определению.

Например, typedef для типа данных uri может иметь вид

     typedef uri {
       type string;
       reference
         "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax";
       ...
     }

7.19.5. Оператор when

Оператор when делает условным родительский оператор определения данных. Узел, определённый родительским оператором, будет действительным только при выполнении условия, заданного оператором when. Аргументом оператора является выражением XPath (см. параграф 6.4), которое служит для формального задания условий. Если выражение XPath даёт значение true для конкретного экземпляра, узел, определённый родительским оператором, будет действительным.

Дополнительная информация приведена в параграфе 8.3.2.

Выражение XPath концептуально оценивается в описанном ниже контексте в дополнение к определению параграфа 6.4.1

  • Если оператор when является потомком оператора augment, узлом контекста является целевой узел дополнения (augment) в дереве данных, когда целевой узел является узлом данных. В противном случае узлом контекста является узел ближайшего предка целевого узла, который является узлом данных.

  • Если оператор when является потомком оператора uses, choice или case, узлом контекста является ближайший предок узла uses, choice или case n, который является узлом данных.

  • Если оператор when является потомком любого оператора определения, узлом контекста является узел определения данных в дереве данных.

  • Доступное дерево состоит из всех узлов дерева данных и всех листьев, в которых используются принятые по умолчанию значения (параграф 7.6.1).

Доступное дерево зависит от узла контекста, как указано ниже.

  • Если узел контекста представляет конфигурацию, дерево является данными из хранилища NETCONF, где существует узел контекста. Корневой узел XPath имеет в качестве потомков все узлы конфигурационных данных верхнего уровня во всех модулях.

  • Если узел контекста представляет данные состояния, дерево является всеми данными на устройстве и в хранилище <running/>. Корневой узел XPath имеет в качестве потомков все узлы данных верхнего уровня во всех модулях.

  • Если узел контекста представляет содержимое уведомления, дерево является документом экземпляра XML для уведомления. Корневой узел XPath имеет в качестве единственного потомка элемент, представляющий уведомление.

  • Если узел контекста представляет входные параметры RPC, дерево является документом экземпляра RPC XML. Корневой узел XPath имеет в качестве единственного потомка элемент, представляющий операцию RPC.

  • Если узел контекста представляет выходные параметры RPC, дерево является документом экземпляра отклика RPC. Корневой узел XPath имеет в качестве потомков элементы, представляющие выходные параметры RPC.

Результат выражения XPath преобразуется в логическое значение с использованием стандартных правил XPath.

Отметим, что выражение XPath проверяется концептуально. Это означает, что реализация не обязана использовать оценщик XPath на сервере. Оператор when может быть реализован в отдельном коде.

8. Ограничения

8.1. Ограничения для данных

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

  • Ограничение, заданное для данных конфигурации, должно выполняться в дереве данных конфигурации.

  • Ограничение для данных состояния должно выполняться в откликах на операции <get> без фильтра.

  • Ограничение для содержимого уведомления должно выполняться в любом экземпляре уведомления.

  • Если ограничение задано для входных параметров RPC, оно должно выполняться при вызове RPC.

  • Если ограничение задано для выходных параметров RPC, оно должно выполняться в откликах RPC.

8.2. Иерархия ограничений

Условия на родительских узлах влияют на ограничения дочерних узлов как естественное следствие иерархии узлов. Ограничения must, mandatory, min-elements и max-elements не применяются, если родительский узел имеет условие when или if-feature, которое не выполняется на устройстве.

В приведённом примере ограничение mandatory для листа longitude не будет применяться на устройствах без функции has-gps.

       container location {
           if-feature has-gps;
           leaf longitude {
               mandatory true;
               ...
           }
       }

8.3. Модель применения ограничений

Для данных конфигурации имеется три «окна», где ограничения должны применяться:

  • в процессе анализа содержимого (payload) RPC;

  • в процессе выполнения операций NETCONF;

  • в процессе проверки пригодности (validation).

Каждый из этих вариантов рассматривается в последующих параграфах.

8.3.1. Анализ данных

Полученное содержимое RPC должно иметь корректный формат XML, а также следовать иерархии и правилам, определяемым моделями, которые устройство реализует.

  • Если значение данных листа (leaf) не соответствует ограничениям для листа, включая определённые свойствами range, length и pattern, сервер должен ответить сообщением <rpc-error> с тегом <error-tag> invalid-value, а также error-app-tag (параграф 7.5.4.2) и error-message (параграф 7.5.4.1), связанными с ограничениями, если они имеются.

  • Если все ключи элемента списка отсутствуют, сервер должен передать <error-tag> с missing-element в сообщении <rpc-error>.

  • Если присутствуют данные для нескольких вариантов (case) оператора выбора choice, сервер должен передать <error-tag> с bad-element в сообщении <rpc-error>.

  • Если данные для узла имеют метку if-feature, а выражение if-feature даёт значение false на устройстве, сервер должен передать <error-tag> с unknown-element в сообщении <rpc-error>.

  • Если присутствуют данные для узла с оператором when, который даёт значение false, сервер должен передать <error-tag> с unknown-element в сообщении <rpc-error>.

  • Если при обработке вставки узла значения атрибутов before и after не подходят для типа ключевых листьев, сервер должен передать <error-tag> с bad-attribute в сообщении <rpc-error>.

  • Если атрибуты before и after появляются в каком-либо списке, для которого свойство ordered-by имеет значение user, сервер должен передать <error-tag> с unknown- attribute в сообщении <rpc-error>.

8.3.2. Обработка NETCONF <edit-config>

После анализа входных данных сервер NETCONF выполняет операцию <edit-config>, применяя данные к хранилищу конфигурации. В течение этой обработки должны детектироваться следующие ошибки:

  • запросы на удаление не существующих данных;

  • запросы на создание уже имеющихся данных;

  • запросы вставки с параметрами before или after, указывающими отсутствующие элементы.

В процессе обработки <edit-config> выполняются описанные ниже условия.

  • Если операция NETCONF создаёт узлы данных от оператора выбора choice, все существующие узлы из других вариантов case удаляются сервером.

  • Если операция NETCONF меняет узлы данных так, что выражение when на каком-либо узле принимает значения false, такой узел удаляется сервером.

8.3.3. Проверка пригодности

По завершении обработки хранилища данных окончательное содержимое должно соответствовать всем ограничениям пригодности. Эта проверка выполняется в разное время в зависимости от хранилища данных. Если хранилище является рабочим (<running/>) или стартовым (<startup/>), ограничения должны применяться в конце операции <edit-config> или <copy-config>. Если хранилище является «кандидатом» (<candidate/>), применение ограничений откладывается до вызова операции <commit> или <validate>.

  • Все ограничения must должны давать значение true.

  • Все ограничения ссылочной целостности, определённые операторами path должны выполняться.

  • Все ограничения unique для списков должны выполняться.

  • Ограничения min-elements и max-elements применяются для узлов list и leaf-list.

9. Встроенные типы

Язык YANG имеет набор встроенных типов, похожий на используемые в языках программирования, но с некоторыми отличиями, обусловленными специальными требованиями управления информационными моделями.

Могут определяться дополнительные производные типы на основе встроенных и других производных типов. Производные типы могут использовать субтипы для формального ограничения возможных значений.

Различные встроенные типы и производные от них позволяют организовать разные субтипы для ограничения размера и соответствия строкам регулярных выражений (параграфы 9.4.4 и 9.4.6), а также ограничения диапазонов числовых значений (параграф 9.2.4).

Лексическое представление значений некоторых типов применяется в сообщениях NETCONF и при задании принятых по умолчанию значений и числовых диапазонов в модулях YANG.

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

Для большинства типов существует одно каноническое представление значений данного типа. Некоторые типы разрешают множество лексических представлений одного и того же значения, например, положительное число 17 можно записать как +17 или 17. Реализации должны поддерживать все лексические представления, заданные в этом документе.

Когда сервер передаёт NETCONF данные, он должен использовать каноническую форму.

Некоторые типы имеют лексическое представление, которое зависит от контекста XML, в котором они появляются. Такие типы не имеют канонической формы.

9.2. Целочисленные встроенные типы

Язык YANG использует встроенные целочисленные типы int8, int16, int32, int64, uint8, uint16, uint32 и uint64. Они представляют числа разной размерности со знаком или без него:

int8 представляет целые числа от -128 до 127, включительно;

int16 представляет целые числа от -32768 до 32767, включительно;

int32 представляет целые числа от -2147483648 до 2147483647, включительно;

int64 представляет целые числа от -9223372036854775808 до 9223372036854775807, включительно;

uint8 представляет целые числа от 0 до 255, включительно;

uint16 представляет целые числа от 0 до 65535, включительно;

uint32 представляет целые числа от 0 до 4294967295, включительно;

uint64 представляет целые числа от 0 до 18446744073709551615, включительно.

9.2.1. Лексическое представление

Целое число лексически представляется необязательным знаком (+ или -), за которым следуют десятичные цифры. Если знак не указан, предполагается +.

Для удобства при задании используемого по умолчанию целочисленного значения в модуле YANG может применяться другое лексическое представление с использованием шестнадцатеричной или восьмеричной записи. Шестнадцатеричное представление начинается с необязательного знака (+ или -), за которым следует пара символов 0x, а далее последовательность шестнадцатеричных цифр, в которой могут использоваться символы верхнего или нижнего регистра (a — f, A — F). Восьмеричное представления начинается с необязательного знака (+ или -), за которым следует символ 0 и последовательность восьмеричных цифр (0 — 7).

Отметим, что принятое по умолчанию значение в модуле YANG, которое начинается с нуля (0), интерпретируется как восьмеричное число. В представлении XML все числа считаются десятичными и нули в начале значение допускаются.

Примеры:

     // пригодные значения
     +4711                       // допустимое положительное значение
     4711                        // допустимое положительное значение
     -123                        // допустимое отрицательное значение
     0xf00f                      // допустимое положительное шестнадцатеричное значение
     -0xf                        // допустимое отрицательное шестнадцатеричное значение
     052                         // допустимое положительное восьмеричное значение

     // непригодные значения
     - 1                         // недопустимый пробел

9.2.2. Каноническая форма

Каноническая форма положительного целого числа не включает знака +. Нули в начале последовательности цифр не допускаются. Нулевое значение представляется одним символом 0.

9.2.3. Ограничения

Все целые числа могут ограничиваться с помощью оператора range (параграф 9.2.4).

9.2.4. Оператор range

Оператор range, является необязательным субоператором для оператора type и принимает в качестве аргумента строку, выражающую диапазон. Субоператор служит для ограничения диапазонов значений целых и десятичных встроенных типов и производных от них.

Диапазон задаётся явным значением или включительной нижней границей, за которой следуют два символа точки (..) и включительное значение верхней границы. Возможно задание множества значений или диапазонов, разделённых символом |. При задании множеств диапазонов они должны быть не пересекающимися и должны указываться в порядке роста значений. Если ограничение range применяется к типу, который уже имеет такие ограничения, новое ограничение должно соответствовать имеющемуся или быть более сильным (т. е. повышающим нижнюю или/и снижающим верхнюю границу, удаляющим явно заданные значения или расщепляющим диапазон на поддиапазоны с зазорами между ними). Каждое явное значение и граница диапазона в выражении range должно соответствовать ограничиваемому типу или быть одним из специальных значений min или max (минимальное и максимальное допустимые значения для типа, соответственно).

Синтаксис выражения range формально определяется правилом range-arg в разделе 12.

9.2.4.1. Субоператоры для range

Субоператор

Параграф

Число элементов

description

7.19.3

0..1

error-app-tag

7.5.4.2

0..1

error-message

7.5.4.1

0..1

reference

7.19.4

0..1

9.2.5. Пример использования
     typedef my-base-int32-type {
         type int32 {
             range "1..4 | 10..20";
         }
     }
     typedef my-type1 {
       type my-base-int32-type {
         // допустимое ограничение диапазона
         range "11..max"; // 11..20
       }
     }
     typedef my-type2 {
       type my-base-int32-type {
         // недопустимое ограничение диапазона
         range "11..100";
       }
     }

9.3. Встроенный тип decimal64

Встроенный тип decimal64 представляет подмножество действительных чисел, которые могут быть выражены последовательностями десятичных цифр. Пространство значений decimal64 представляет собой подмножество значений, которые могут быть получены путём умножения 64-битового целого числа со знаком на отрицательную степень числа 10 (т. е. значения вида i * 10-n, где i — значение типа integer64, n — целое число от 1 до 18, включительно).

9.3.1. Лексическое представление

Значение decimal64 лексически представляется необязательным знаком (+ или -), за которым следует набор десятичных цифр, а за ним может следовать символ точки (.) в качестве разделителя целой и дробной части и цепочка десятичных цифр дробной части. Если знак не указан, по умолчанию предполагается +.

9.3.2. Каноническая форма

Каноническая форма положительного значения decimal64 не включает знак +. Десятичная точка обязательна. Нули в начале и в конце (дробной части) числа использовать запрещено с учётом того, что перед десятичной точкой и после неё должна присутствовать хотя бы одна цифра. Нулевое значение представляется в виде 0.0.

9.3.3. Ограничения

Тип decimal64 может быть ограничен с помощью оператора range (параграф 9.2.4).

9.3.4. Оператор fraction-digits

Оператор fraction-digits, который служит субоператором для type, должен присутствовать для типа decimal64. Он принимает в качестве аргумента целое число от 1 до 18, включительно. Это значение управляет разностью между смежными значениями decimal64 путём ограничения пространства значений, которое выражается как i * 10-n, n — число цифр дробной части.

В таблице представлены минимальные и максимальные значения для каждого размера дробной части.

Цифр после запятой

Минимум

Максимум

1

-922337203685477580.8

922337203685477580.7

2

-92233720368547758.08

92233720368547758.07

3

-9223372036854775.808

9223372036854775.807

4

-922337203685477.5808

922337203685477.5807

5

-92233720368547.75808

92233720368547.75807

6

-9223372036854.775808

9223372036854.775807

7

-922337203685.4775808

922337203685.4775807

8

-92233720368.54775808

92233720368.54775807

9

-9223372036.854775808

9223372036.854775807

10

-922337203.6854775808

922337203.6854775807

11

-92233720.36854775808

92233720.36854775807

12

-9223372.036854775808

9223372.036854775807

13

-922337.2036854775808

922337.2036854775807

14

-92233.72036854775808

92233.72036854775807

15

-9223.372036854775808

9223.372036854775807

16

-922.3372036854775808

922.3372036854775807

17

-92.23372036854775808

92.23372036854775807

18

-9.223372036854775808

9.223372036854775807

9.3.5. Пример использования

     typedef my-decimal {
       type decimal64 {
         fraction-digits 2;
         range "1 .. 3.14 | 10 | 20..max";
       }
     }

9.4. Встроенный тип string

Встроенный тип string представляет в языке YANG текстовые строки, предназначенные для человека. Допустимо использование символов кодировок Unicode и ISO/IEC 10646 [ISO.10646], включая табуляцию, возврат каретки и перевод строки.

     ;; любой символ Unicode за исключением суррогатных блоков FFFE и FFFF.
     string = *char
     char = %x9 / %xA / %xD / %x20-D7FF / %xE000-FFFD /
            %x10000-10FFFF

9.4.1. Лексическое представление

Значение string лексически представляется символьными данными в документах экземпляров XML.

9.4.2. Каноническая форма

Каноническая форма совпадает с лексическим представлением. Нормализация Unicode для string не применяется.

9.4.3. Ограничения

Строка (string) может быть ограничена операторами length (параграф 9.4.4) и pattern (параграф 9.4.6).

9.4.4. Оператор length

Оператор length, который является необязательным субоператором для type, принимает в качестве аргумента строку с выражением размера. Оператор служит для ограничения встроенного типа string, а также производных от него.

Оператор length ограничивает число символов Unicode в строке.

Диапазон размеров задаётся явным значением или включительной нижней границей, за которой следуют два символа точки (..) и включительное значение верхней границы. Возможно задание множества значений или диапазонов, разделённых символом |. При задании множеств диапазонов они должны быть не пересекающимися и должны указываться в порядке роста значений. Использование отрицательных значений недопустимо. Если ограничение диапазона применяется к типу, который уже имеет такие ограничения, новое ограничение должно соответствовать имеющемуся или быть более сильным (т. е. повышающим нижнюю или/и снижающим верхнюю границу, удаляющим явно заданные значения или расщепляющим диапазон на поддиапазоны с зазорами между ними). Значение размера представляет собой неотрицательное целое число или одно из специальных значений min или max (минимальное и максимальное допустимые значения для типа, соответственно). От реализаций не требуется поддержка размеров больше 18446744073709551615.

Синтаксис выражения length формально описывается правилом length-arg в разделе 12.

9.4.4.1. Субоператоры для length

Субоператор

Параграф

Число элементов

description

7.19.3

0..1

error-app-tag

7.5.4.2

0..1

error-message

7.5.4.1

0..1

reference

7.19.4

0..1

9.4.5. Пример использования

     typedef my-base-str-type {
         type string {
             length "1..255";
         }
     }

     type my-base-str-type {
         // действительное ограничение размера
         length "11 | 42..max"; // 11 | 42..255
     }

     type my-base-str-type {
         // недопустимое ограничение размера
         length "1..999";
     }

9.4.6. Оператор pattern

Оператор pattern, который является необязательным субоператором для type, принимает в качестве аргумента строку регулярного выражения, в соответствии с определением [XSD-TYPES]. Он служит для ограничения встроенного типа string и производных от него типов, значениями, которые соответствуют шаблону pattern.

Если тип (type) имеет множество операторов pattern, выражения объединяются логической операцией AND (И), т. е. строка должна соответствовать всем выражениям.

Если шаблонные ограничения применяются к типу, который уже имеет ограничения по шаблонам, значения должны соответствовать всем шаблонам базового типа в дополнение к новым шаблонам.

9.4.6.1. Субоператоры для pattern

Субоператор

Параграф

Число элементов

description

7.19.3

0..1

error-app-tag

7.5.4.2

0..1

error-message

7.5.4.1

0..1

reference

7.19.4

0..1

9.4.7. Пример использования

Для показанного ниже типа

     type string {
         length "0..4";
         pattern "[0-9a-fA-F]*";
     }

следующие строки соответствуют

     AB          // действительно
     9A00        // действительно

а следующие строки не соответствуют

     00ABAB      // слишком длинная
     xx00        // непригодные символы

9.5. Встроенный тип boolean

Встроенный тип boolean представляет логические значения.

9.5.1. Лексическое представление

Лексическое представление типа boolean имеет два значения true и false, которые должны указываться символами нижнего регистра.

9.5.2. Каноническая форма

Каноническая форма совпадает с лексическим представлением.

9.5.3. Ограничения

Тип boolean не может быть ограничен.

9.6. Встроенный тип enumeration

Встроенный тип enumeration представляет значения из набора заданных имён.

9.6.1. Лексическое представление

Лексическим представлением значения enumeration является строка назначенного имени.

9.6.2. Каноническая форма

Канонической формой является строка назначенного имени.

9.6.3. Ограничения

Тип enumeration может быть ограничен с помощью одного или нескольких операторов enum (параграф 9.6.4), которые указывают подмножество значений базового типа.

9.6.4. Оператор enum

Оператор enum, который является субоператором для type, должен присутствовать для типа enumeration. Он может использоваться несколько раз для задания каждого назначенного имени типа enumeration. Оператор принимает в качестве аргумента строку назначенного имени. Недопустимо указание пустых строк (нулевой размер), а также недопустимо добавление пробельных символов в начале или в конце назначенного имени. Следует избегать использования в именах управляющих кодов Unicode.

Оператор может включать необязательный блок субоператоров с дополнительной информацией.

Назначенные имена в enumeration должны быть уникальными.

При ограничении типа enumeration набор имён нового типа должен быть подмножеством базового набора назначенных имён. Недопустимо изменять эти назначенные имена.

9.6.4.1. Субоператоры для enum

Субоператор

Параграф

Число элементов

description

7.19.3

0..1

reference

7.19.4

0..1

status

7.19.2

0..1

value

9.6.4.2

0..1

9.6.4.2. Оператор value

Необязательный оператор value служит для связывания целочисленного значения с назначенным именем для enum. Это должно быть целое число из диапазона от -2147483648 до 2147483647 и значение должно быть уникальным в рамках типа enumeration. Значение не используется в YANG и XML, но передаётся для удобства разработчиков.

Если значение не задано, оно будет назначаться автоматически. В таких случаях при первом определении будет назначаться значение (0), а противном случае — значение, превышающее на единицу максимальное из использованных значений enum.

Если текущее максимальное значение составляет 2147483647, значение enum должно быть задано для субоператоров enum, следующих за текущим максимальным значением.

9.6.5. Пример использования

     leaf myenum {
         type enumeration {
             enum zero;
             enum one;
             enum seven {
                 value 7;
             }
         }
     }

Лексическое представление листа myenum со значением seven будет иметь вид

     <myenum>seven</myenum>

9.7. Встроенный тип bits

Встроенный тип bits представляет набор битов. Т. е. значение bits служит набором флагов, указанных целочисленными значениями позиции с отсчётом от 0. Каждому биту назначено имя.

9.7.1. Ограничения

Тип bits может быть ограничен с помощью оператора bit (параграф 9.7.4).

9.7.2. Лексическое представление

Лексическое представление типа bits является списком разделённых пробелами назначенных имён флагов bits. Пустая строка говорит об отсутствии установленных флагов.

9.7.3. Каноническая форма

В канонической форме значения битов разделяются одним символом пробела и упорядочиваются по их позициям (см. параграф 9.7.4.2).

9.7.4. Оператор bit

Оператор bit, который служит субоператором для type, должен присутствовать для типа bits. Он используется многократно для каждого именованного бита типа bits. Оператор принимает в качестве аргумента строку с назначенным именем бита, за которой следует блок субоператоров с дополнительной информацией. Для назначенных имён используется такой же синтаксис, как для идентификаторов (см. параграф 6.2).

Назначенные имена в типе bits должны быть уникальными.

9.7.4.1. Субоператоры для bit

Субоператор

Параграф

Число элементов

description

7.19.3

0..1

position

9.7.4.2

0..1

reference

7.19.4

0..1

status

7.19.2

0..1

9.7.4.2. Оператор position

Необязательный оператор position принимает в качестве аргумента неотрицательное целое число, которое задаёт позицию бита в предполагаемом битовом поле. Значение position должно лежать в диапазоне от 0 до 4294967295 и должно быть уникальным в данном типе bits. Значение не используется в YANG и NETCONF, но передаётся для удобства разработчиков.

Если позиция бита не задана, она назначается автоматически. Если субоператор bit задан в первый раз, присваивается значение 0, в противном случае присваивается значение на 1 больше текущего максимального значения битовой позиции.

Если текущее максимальное значение составляет 4294967295, битовая позиция должна быть задана для субоператоров bit, следующих за текущим максимальным значением.

9.7.5. Пример использования

Для приведённого ниже leaf

     leaf mybits {
         type bits {
             bit disable-nagle {
                 position 0;
             }
             bit auto-sense-speed {
                 position 1;
             }
             bit 10-Mb-only {
                 position 2;
             }
         }
         default "auto-sense-speed";
     }

Лексическое представление листа с битовыми полями disable-nagle и 10-mb-only будет иметь вид

     <mybits>disable-nagle 10-Mb-only</mybits>

9.8. Встроенный тип binary

Встроенный тип binary представляет любые двоичные данные, т. е. последовательность октетов.

9.8.1. Ограничения

Тип binary может быть ограничен с помощью оператора length (параграф 9.4.4). Размер значения типа binary указывает число октетов.

9.8.2. Лексическое представление

Значения binary представляются с использованием схемы кодирования base64 (см. раздел 4 в [RFC4648]).

9.8.3. Каноническая форма

Каноническая форма значения binary следует правилам кодирования base64 [RFC4648].

9.9. Встроенный тип leafref

Тип leafref служит для ссылки на конкретный экземпляр leaf в дереве данных. Субоператор path (параграф 9.9.2) служит для выбора набора экземпляров leaf и пространством значений leafref является набор значений экземпляров leaf.

Если свойство require-instance (параграф 9.9.3) имеет значение true, должен существовать узел в дереве данных, или узел, использующий принятое по умолчанию значение (см. параграфы 7.6.1 и 7.7.2), для указанного узла leaf или leaf-list в дереве схемы с таким же значением, как leafref в действительном дереве данных.

Если лист с типом leafref представляет данные конфигурации, указанный ссылкой узел также должен представлять конфигурацию. Такой лист задаёт ограничения для пригодных данных. Все узлы leafref должны указывать на имеющиеся экземпляры leaf или листья, с принятыми по умолчанию значениями (см. параграф 7.6.1), чтобы данные были действительны. Это ограничение применяется в соответствии с правилами раздела 8.

Недопустимы замкнутые цепочки ссылок leafrefs.

Если лист, на который указывает leafref, зависит от одной или нескольких функций (см. параграф 7.20.2), узел leaf с типом leafref должен зависеть от того же набора функций.

9.9.1. Ограничения

Тип leafref не может быть ограничен.

9.9.2. Оператор path

Оператор path, являющийся субоператором для type, должен присутствовать для типа leafref. Оператор принимает в качестве аргумента строку, которая должна указывать на узел leaf или leaf-list.

Синтаксис аргумента path является подмножеством сокращённого синтаксиса XPath. Предикаты служат лишь для ограничения значений узлов ключей для элементов списка. Каждый предикат содержит в точности одну проверку равенства на ключ и может присутствовать множество смежных предикатов, если список имеет множество ключей. Синтаксис формально определён правилом path-arg в разделе 12.

Предикаты используются лишь в тех случаях, когда требуется более одной ссылки на ключ для однозначной идентификации экземпляра листа. Это происходит, если список имеет имеет множество ключей или нужна ссылка на лист, отличающаяся от ключа в списке. В таких случаях обычно задаётся множество leafref, а предикаты служат для их связывания воедино.

Выражение path даёт набор узлов (возможно пустой). Если свойство require-instance имеет значение true, набор узлов должен быть непустым.

Выражение XPath в операторе path концептуально оценивается в указанном ниже варианте контекста в дополнение к приведённому в параграфе 6.4.1 определению.

  • Узлом контекста является узел в дереве данных для которого определён оператор path.

Доступное дерево зависит от узла контекста.

  • Если узел контекста представляет данные конфигурации, дерево будет данными в хранилище NETCONF, где существует узел контекста. Корневой узел XPath имеет в качестве потомков все узлы конфигурационных данных верхнего уровня во всех модулях.

  • В остальных случаях дерево будет данными состояния на устройстве и в хранилище <running/>. Корневой узел XPath имеет в качестве потомков все узлы данных верхнего уровня во всех модулях.

9.9.3. Лексическое представление

Значение leafref лексически представляется так же, как представляет своё значение узел leaf, на который указывает ссылка.

9.9.4. Каноническая форма

Каноническая форма leafref совпадает с канонической формой листа (leaf) на который указывает ссылка.

9.9.5. Пример использования

Для приведённого ниже списка

     list interface {
         key "name";
         leaf name {
             type string;
         }
         leaf admin-status {
             type admin-status;
         }
         list address {
             key "ip";
             leaf ip {
                 type yang:ip-address;
             }
         }
     }

leafref указывает на существующий интерфейс

     leaf mgmt-interface {
         type leafref {
             path "../interface/name";
         }
     }

Ниже представлен соответствующий фрагмент XML.

     <interface>
       <name>eth0</name>
     </interface>
     <interface>
       <name>lo</name>
     </interface>

     <mgmt-interface>eth0</mgmt-interface>

Приведённый ниже оператор leafrefs указывает на существующий адрес интерфейса.

     container default-address {
         leaf ifname {
             type leafref {
                 path "../../interface/name";
             }
         }
         leaf address {
             type leafref {
                 path "../../interface[name = current()/../ifname]"
                    + "/address/ip";
             }
         }
     }

Соответствующий фрагмент XML имеет вид

     <interface>
       <name>eth0</name>
       <admin-status>up</admin-status>
       <address>
         <ip>192.0.2.1</ip>
       </address>
       <address>
         <ip>192.0.2.2</ip>
       </address>
     </interface>
     <interface>
       <name>lo</name>
       <admin-status>up</admin-status>
       <address>
         <ip>127.0.0.1</ip>
       </address>
     </interface>

     <default-address>
       <ifname>eth0</ifname>
       <address>192.0.2.2</address>
     </default-address>

Приведённый ниже список использует leafref для одного из своих ключей. Это похоже на внешний ключ в реляционной базе данных.

     list packet-filter {
         key "if-name filter-id";
         leaf if-name {
             type leafref {
                 path "/interface/name";
             }
         }
         leaf filter-id {
             type uint32;
         }
         ...
     }

Соответствующий фрагмент XML имеет вид

     <interface>
       <name>eth0</name>
       <admin-status>up</admin-status>
       <address>
         <ip>192.0.2.1</ip>
       </address>
       <address>
         <ip>192.0.2.2</ip>
       </address>
     </interface>

     <packet-filter>
       <if-name>eth0</if-name>
       <filter-id>1</filter-id>
       ...
     </packet-filter>
     <packet-filter>
       <if-name>eth0</if-name>
       <filter-id>2</filter-id>
       ...
     </packet-filter>

Приведённое ниже уведомление определяет два leafrefs для ссылки на существующий лист admin-status

     notification link-failure {
         leaf if-name {
             type leafref {
                 path "/interface/name";
             }
         }
         leaf admin-status {
             type leafref {
                 path
                   "/interface[name = current()/../if-name]"
                 + "/admin-status";
             }
         }
     }

Ниже приведён пример соответствующего уведомления XML.

     <notification
       xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
       <eventTime>2008-04-01T00:01:00Z</eventTime>
       <link-failure xmlns="http://acme.example.com/system">
         <if-name>eth0</if-name>
         <admin-status>up</admin-status>
       </link-failure>
     </notification>

9.10. Встроенный тип identityref

Встроенный тип identityref служит для ссылок на существующие отождествления (см. параграф 7.16).

9.10.1. Ограничения

Тип identityref не может быть ограничен.

9.10.2. Оператор base для identityref

Оператор base, который является субоператором для type, должен присутствовать хотя бы однократно для типа identityref. Аргументом служит имя отождествления, определённое оператором identity. Если в имени отождествления имеется префикс, это говорит о том, что отождествление определено в модуле, который импортирован с этим префиксом. В остальных случаях отождествление с совпадающим именем должно быть определено в текущем модуле или включённом в него субмодуле.

Допустимыми значениями для identityref являются любые отождествления, произведённые из базового отождествления identityref. На конкретном сервере пригодные значения могут быть дополнительно ограничены набором отождествлений, определённых в модулях, которые поддерживаются сервером.

9.10.3. Лексическое представление

Тип identityref лексически представляется как полное имя указанной ссылки в соответствии с [XML-NAMES]. Если префикс отсутствует, пространством имён identityref будет принятое по умолчанию пространство имён для элемента, содержащего значение identityref.

Когда identityref присваивается принятое по умолчанию значение с использованием оператора default, имя отождествления в принятом по умолчанию значении может включать префикс. Если префикс присутствует в имени отождествления, он указывает на отождествление, определённое в модуле, который был импортирован с этим префиксом, или префикс текущего модуля, если префикс указывает текущий модуль или один из его субмодулей. В остальных случаях отождествление с совпадающим именем должно быть определено в текущем модуле или включённом субмодуле.

9.10.4. Каноническая форма

Поскольку лексическая форма зависит от контекста XML, в котором это значение имеет место, этот тип не имеет канонической формы.

9.10.5. Пример использования

С определениями отождествлений из параграфа 7.16.3 и приведённым ниже модулем

     module my-crypto {

         namespace "http://example.com/my-crypto";
         prefix mc;

         import "crypto-base" {
             prefix "crypto";
         }

         identity aes {
             base "crypto:crypto-alg";
         }

         leaf crypto {
             type identityref {
                 base "crypto:crypto-alg";
             }
         }
     }

Пример кодирования листа crypto для отождествления des3, определённого в модуле des будет иметь вид

     <crypto xmlns:des="http://example.com/des">des:des3</crypto>

Все префиксы, использованные в представлении, являются локальными для каждого экземпляра представления. Это значит, что один и тот же identityref может по разному кодироваться разными реализациями. Ниже представлен другой пример кодирования того же листа.

     <crypto xmlns:x="http://example.com/des">x:des3</crypto>

Если значение листа crypto вместо модуля aes определено в модуле my-crypto, кодирование может иметь вид

     <crypto xmlns:mc="http://example.com/my-crypto">mc:aes</crypto>

или с использованием принятого по умолчанию пространства имён

     <crypto>aes</crypto>

9.11. Встроенный тип empty

Встроенный тип empty представляет лист, не имеющий какого-либо значения, он лишь даёт информацию о наличии или отсутствии.

Тип empty не может иметь принятого по умолчанию значения.

9.11.1. Ограничения

Тип empty не может быть ограничен.

9.11.2. Лексическое представление

Не применимо.

9.11.3. Каноническая форма

Не применима.

9.11.4. Пример использования

Для показанного ниже листа

     leaf enable-qos {
         type empty;
     }

примером пригодного представления существования листа может быть

     <enable-qos/>

9.12. Встроенный тип union

Встроенный тип union представляет значение, которое соответствует типу одного из членов объединения.

Когда указан тип union, должен присутствовать оператор type (параграф 7.4). Он используется многократно для задания типа каждого члена объединения. Оператор принимает один аргумент, являющийся строкой с именам типа.

В объединение могут входить встроенные и производные типы, однако недопустимо использование встроенных типов empty и leafref.

При проверке пригодности строки, представляющей тип данных union проверка осуществляется для каждого типа, являющегося членом объединения, в порядке, заданном оператором type, пока не будет найдено совпадение.

Любое значение, принятое по умолчанию, или свойство units, определённое в типах членов, не наследуется типом union.

Например,

     type union {
         type int32;
         type enumeration {
             enum "unbounded";
         }
     }

9.12.1. Ограничения

Тип union не может иметь ограничений. Однако каждый из входящих в объединение типов может иметь ограничения, определённые в разделе 9.

9.12.2. Лексическое представление

Лексическим представлением типа union является значение, которое соответствует представлению одного (любого) из входящих в объединение типов.

9.12.3. Каноническая форма

Каноническая форма значения union совпадает с канонической формой значения типа, входящего в объединение.

9.13. Встроенный тип instance-identifier

Встроенный тип instance-identifier служит для однозначной идентификации конкретного экземпляра узла в дереве данных.

Синтаксис для instance-identifier является подмножеством сокращённого синтаксиса XPath и формально определён правилом instance-identifier в разделе 12. Тип применяется для однозначной идентификации узлов в дереве данных. Предикаты применяются только для задания значений ключевых узлов элементов списка, значений элементов leaf-list или позиционных индексов в списках без ключей. Для идентификации элементов списка с ключами каждый предикат состоит из одной проверки равенства на ключ и каждый ключ должен иметь соответствующие предикат.

Если лист типа instance-identifier представляет данные конфигурации и свойство require-instance (параграф 9.13.2) имеет значение true, узел, на который он ссылается, также должен представлять конфигурацию. Такой лист ограничивает пригодные данные. Узлы всех таких листьев должны указывать существующие узлы или узлы leaf, использующие принятые по умолчанию значения (см. параграфы 7.6.1), для того, чтобы данные были пригодны. Это ограничение применяется в соответствии с правилами раздела 8.

Выражение instance-identifier XPath концептуально проверяется в контексте корневого узла доступного дерева в дополнение к определению параграфа 6.4.1.

  • Узлом контекста является корневой узел в доступном дереве.

Доступное дерево зависит от листа с типом instance-identifier.

  • Если узел контекста представляет данные конфигурации, дерево будет данными в хранилище NETCONF, где существует узел контекста. Корневой узел XPath имеет в качестве потомков все узлы конфигурационных данных верхнего уровня во всех модулях.

  • В остальных случаях дерево будет данными состояния на устройстве и в хранилище <running/>. Корневой узел XPath имеет в качестве потомков все узлы данных верхнего уровня во всех модулях.

9.13.1. Ограничения

Тип instance-identifier может быть ограничен с помощью оператора require-instance (параграф 9.13.2).

9.13.2. Оператор require-instance

Оператор require-instance, который является субоператором для type, может присутствовать для типа instance-identifier. Он принимает в качестве аргумента значение true или false. Если оператор отсутствует, по умолчанию принимается значение true.

Если require-instance имеет значение true, это означает, что экземпляр, на который указывается ссылка, должен существовать, чтобы данные были действительны. Ограничения применяются в соответствии с правилами раздела 8.

Если require-instance имеет значение false, это значит, что экземпляр, на который указывает ссылка, может существовать в действительных данных.

9.13.2. Лексическое представление

Значение instance-identifier лексически представляется в форме строки. Все имена узлов в значении instance-identifier должны быть полными с явными префиксами пространства имён и эти префиксы должны быть заявлены в области действия пространства имён XML в элементе XML для instance-identifier.

Все префиксы, используемые в представлении, являются локальными для каждого экземпляра кодирования. Это означает, что instance-identifier может по разному кодироваться разными реализациями.

9.13.3. Каноническая форма

Поскольку лексическая форма зависит от контекста XML, в котором значение имеет место, для этого типа нет канонической формы.

9.13.4. Пример использования

Ниже приведены примеры использования идентификаторов экземпляра.

     /* instance-identifier для container */
     /ex:system/ex:services/ex:ssh

     /* instance-identifier для leaf */
     /ex:system/ex:services/ex:ssh/ex:port

     /* instance-identifier для записи list */
     /ex:system/ex:user[ex:name='fred']

     /* instance-identifier для leaf в записи list */
     /ex:system/ex:user[ex:name='fred']/ex:type

     /* instance-identifier зля записи list с двумя ключами */
     /ex:system/ex:server[ex:ip='192.0.2.1'][ex:port='80']

     /* instance-identifier для записи leaf-list */
     /ex:system/ex:services/ex:ssh/ex:cipher[.='blowfish-cbc']

     /* instance-identifier для записи list без ключей */
     /ex:stats/ex:port[3]

10. Обновление модулей


По мере использования модуля может возникнуть потребность в его обновлении. Однако обновление опубликованных модулей не допускается, если это может вызвать проблемы взаимодействия между клиентами, использующими исходную спецификацию, и сервером, использующим обновлённую спецификацию.

При публикации обновления должен использоваться новый оператор revision (параграф 7.1.9), помещаемый перед имеющимися операторами revision. Если в модуле нет операторов revision, такой оператор должен просто добавляться для обозначения нового выпуска. Кроме того, должны быть внесены все требуемые изменения в операторы metadata, включая organization и contact (см. параграфы 7.1.7 и 7.1.8).

Отметим, что содержащиеся в модуле определения доступны для импорта любому другому модулю путём указания имени данного модуля в операторе import. По этой причине менять имя модуля недопустимо. Кроме того, недопустимо менять оператор namespace, поскольку все элементы XML привязаны к пространству имён.

Устаревшие определения недопустимо удалять из опубликованных модулей, поскольку их идентификаторы ещё могут применяться другими модулями.

Определение в опубликованном модуле может быть пересмотрено любым из приведённых ниже способов.

  • Для типа enumeration могут быть добавлены новые элементы enum с сохранением значения для существующих элементов.

  • Для типа bits могут быть добавлены новые флаги с сохранением позиций имеющихся флагов.

  • Операторы range, length или pattern могут расширять пространство разрешённых значений.

  • Может быть добавлен оператор default для листа (leaf), который не имел принятого по умолчанию значения (напрямую или опосредовано через его тип).

  • Может быть добавлен оператор units.

  • Может быть добавлен или изменён оператор reference.

  • Оператор must может быть удалён или его ограничения ослаблены.

  • Оператор when может быть удалён или его ограничения ослаблены.

  • Оператор mandatory может быть удалён или значение true заменено на false.

  • Оператор min-elements может быть удалён или изменён, чтобы требовать меньше элементов.

  • Оператор max-elements может быть удалён или изменён, чтобы разрешить больше элементов.

  • Оператор description может быть добавлен или уточнён без изменения семантики определения.

  • Могут быть добавлены новые операторы typedef, grouping, rpc, notification, extension, feature и identity.

  • Могут быть добавлены операторы определения данных, если они не добавляют обязательных узлов (параграф 3.1) к имеющимся узлам или на верхнем уровне модуля или субмодуля, а также не создают для тех условных зависимостей от новой функции (т. е. if-feature с указанием новой функции).

  • Могут быть добавлены варианты case.

  • Узел, представляющий данные состояния, может быть изменён для представления данных конфигурации, если он не является обязательным (параграф 3.1).

  • Оператор if-feature может быть удалён, если его узел не является обязательным (параграф 3.1).

  • Оператор status может быть добавлен или значение его изменено с current на deprecated или obsolete, а также с deprecated на obsolete.

  • Оператор type может быть заменён другим оператором type, который не меняет синтаксис и семантику типа. Например, определение типа inline может быть заменено на typedef, но тип int8 нельзя заменить на int16, поскольку это меняет синтаксис.

  • Любой набор узлов определения данных может быть заменён другим набором синтаксически и семантически эквивалентных узлов. Например, набор узлов может быть заменён оператором uses группировки с тем же набором листьев.

  • Модуль может быть разделен на несколько субмодулей или часть субмодулей может быть удалена, если определения модуля не изменятся (за исключением разрешённых здесь изменений).

  • Оператор prefix может быть изменён при условии корректировки всех локальных применений этого префикса.

В остальных случаях при изменении семантики прежнего определения (т. е. внесении изменений, выходящих за рамки перечисленного выше) должно создаваться новое определение с новым идентификатором.

В операторах, включающих какие-либо операторы определения данных в качестве своих субоператоров, недопустимо менять порядок этих субоператоров с определениями.

11. YIN

Модуль YANG может быть преобразован в другой основанный на XML формат, называемый YIN. Преобразованный модуль называется модулем YIN. В этом разделе описаны правила прямого и обратного преобразования между двумя форматами.

Форматы YANG и YIN содержат эквивалентную информацию, но используют разные обозначения. Нотация YIN позволяет разработчикам представлять модули данных YANG в формате XML, что даёт возможность использования богатого набора инструментов XML для фильтрации и проверки данных, автоматизированной генерации кода и других задач. Могут применяться инструменты типа XSLT или валидаторов XML.

Преобразование между YANG и YIN не меняет информационного содержимого модели. Комментарии и пробельные символы не сохраняются.

11.1. Формальное определение YIN

Между ключевыми словами YANG и элементами YIN существует взаимно-однозначное соответствие. Локальное имя элемента YIN идентично соответствующему ключевому слову YANG. Это означает, в частности, что корневым элементом документа YIN всегда будет <module> или <submodule>.

Элементы YIN, соответствующие ключевым словам YANG, относятся к пространству имён, идентификатор URI которого имеет значение urn:ietf:params:xml:ns:yang:yin:1.

Элементы YIN, соответствующие ключевым словам расширений, относятся к пространству имён модуля YANG, в котором ключевое слово было объявлено с помощью оператора extension.

Имена всех элементов YIN должны быть надлежащим образом определены в их пространствах имён (см. выше) с использованием стандартных механизмов [XML-NAMES], т. е. атрибутов xmlns и xmlns:xxx.

Аргумент оператора YANG представляется в YIN атрибутом XML или субэлементом элемента keyword. Отображения для ключевых слов YANG приведены в таблице 1. Для расширений отображение аргумента задаётся оператором extension (см. параграф 7.17) и приведёнными ниже правилами.

  • Если аргумент представлен атрибутом, этот атрибут не имеет пространства имён.

  • Если аргумент представлен элементом, он определяется тем же пространством имён, что и его родительский элемент keyword.

  • Если аргумент представлен как элемент, он должен быть первым потомком элемента keyword.

Субоператоры операторов YANG представляются как (дополнительные) потомки элемента keyword, а их относительный порядок должен совпадать с порядком субоператоров в YANG.

Комментарии YANG могут преобразовываться в комментарии XML.

Таблица 1. Отображение аргументов операторов YANG.

Ключевое слово

Имя аргумента

yin-element

anyxml

name

false

argument

name

false

augment

target-node

false

base

name

false

belongs-to

module

false

bit

name

false

case

name

false

choice

name

false

config

value

false

contact

text

true

container

name

false

default

value

false

description

text

true

deviate

value

false

deviation

target-node

false

enum

name

false

error-app-tag

value

false

error-message

value

true

extension

name

false

feature

name

false

fraction-digits

value

false

grouping

name

false

identity

name

false

if-feature

name

false

import

module

false

include

module

false

input

<no argument>

n/a

key

value

false

leaf

name

false

leaf-list

name

false

length

value

false

list

name

false

mandatory

value

false

max-elements

value

false

min-elements

value

false

module

name

false

must

condition

false

namespace

uri

false

notification

name

false

ordered-by

value

false

organization

text

true

output

<no argument>

n/a

path

value

false

pattern

value

false

position

value

false

prefix

value

false

presence

value

false

range

value

false

reference

text

true

refine

target-node

false

require-instance

value

false

revision

date

false

revision-date

date

false

rpc

name

false

status

value

false

submodule

name

false

type

name

false

typedef

name

false

unique

tag

false

units

name

false

uses

name

false

value

value

false

when

condition

false

yang-version

value

false

yin-element

value

false

11.1.1. Пример использования

Приведённый ниже модуль YANG

     module acme-foo {
         namespace "http://acme.example.com/foo";
         prefix "acfoo";

         import my-extensions {
             prefix "myext";
         }

         list interface {
             key "name";
             leaf name {
                 type string;
             }

             leaf mtu {
                 type uint32;
                 description "MTU для интерфейса.";
                 myext:c-define "MY_MTU";
             }
         }
     }

где расширение c-define определено в параграфе 7.17.3, преобразуется в YIN вида

     <module name="acme-foo"
             xmlns="urn:ietf:params:xml:ns:yang:yin:1"
             xmlns:acfoo="http://acme.example.com/foo"
             xmlns:myext="http://example.com/my-extensions">

       <namespace uri="http://acme.example.com/foo"/>
       <prefix value="acfoo"/>

       <import module="my-extensions">
         <prefix value="myext"/>
       </import>

       <list name="interface">
         <key value="name"/>
         <leaf name="name">
           <type name="string"/>
         </leaf>
         <leaf name="mtu">
           <type name="uint32"/>
           <description>
             <text>MTU для интерфейса.</text>
           </description>
           <myext:c-define name="MY_MTU"/>
         </leaf>
       </list>
     </module>

12. Грамматика ABNF для YANG

В YANG почти все операторы являются неупорядоченными. Грамматика ABNF [RFC5234] определяет канонический порядок. Для улучшения читаемости модулей рекомендуется размещать предложения (clause) в этом порядке.

В грамматике ABNF неупорядоченные операторы отмечены комментариями. Предполагается, что сканер заменит комментарий YANG одиночным символом пробела.

   <CODE BEGINS> file "yang.abnf"
   module-stmt         = optsep module-keyword sep identifier-arg-str
                         optsep
                         "{" stmtsep
                             module-header-stmts
                             linkage-stmts
                             meta-stmts
                             revision-stmts
                             body-stmts
                         "}" optsep

   submodule-stmt      = optsep submodule-keyword sep identifier-arg-str
                         optsep
                         "{" stmtsep
                             submodule-header-stmts
                             linkage-stmts
                             meta-stmts
                             revision-stmts
                             body-stmts
                         "}" optsep

   module-header-stmts = ;; эти операторы могут указываться в любом порядке
                         [yang-version-stmt stmtsep]
                          namespace-stmt stmtsep
                          prefix-stmt stmtsep

   submodule-header-stmts =
                         ;; эти операторы могут указываться в любом порядке
                         [yang-version-stmt stmtsep]
                          belongs-to-stmt stmtsep

   meta-stmts          = ;; эти операторы могут указываться в любом порядке
                         [organization-stmt stmtsep]
                         [contact-stmt stmtsep]
                         [description-stmt stmtsep]
                         [reference-stmt stmtsep]

   linkage-stmts       = ;; эти операторы могут указываться в любом порядке
                         *(import-stmt stmtsep)
                         *(include-stmt stmtsep)

   revision-stmts      = *(revision-stmt stmtsep)

   body-stmts          = *((extension-stmt /
                            feature-stmt /
                            identity-stmt /
                            typedef-stmt /
                            grouping-stmt /
                            data-def-stmt /
                            augment-stmt /
                            rpc-stmt /
                            notification-stmt /
                            deviation-stmt) stmtsep)

   data-def-stmt       = container-stmt /
                         leaf-stmt /
                         leaf-list-stmt /
                         list-stmt /
                         choice-stmt /
                         anyxml-stmt /
                         uses-stmt

   yang-version-stmt   = yang-version-keyword sep yang-version-arg-str
                         optsep stmtend

   yang-version-arg-str = < a string that matches the rule
                           yang-version-arg >

   yang-version-arg    = "1"

   import-stmt         = import-keyword sep identifier-arg-str optsep
                         "{" stmtsep
                             prefix-stmt stmtsep
                             [revision-date-stmt stmtsep]
                         "}"

   include-stmt        = include-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              [revision-date-stmt stmtsep]
                          "}")

   namespace-stmt      = namespace-keyword sep uri-str optsep stmtend

   uri-str             = < a string that matches the rule
                           URI in RFC 3986 >

   prefix-stmt         = prefix-keyword sep prefix-arg-str
                         optsep stmtend

   belongs-to-stmt     = belongs-to-keyword sep identifier-arg-str
                         optsep
                         "{" stmtsep
                             prefix-stmt stmtsep
                         "}"

   organization-stmt   = organization-keyword sep string
                         optsep stmtend

   contact-stmt        = contact-keyword sep string optsep stmtend

   description-stmt    = description-keyword sep string optsep
                         stmtend

   reference-stmt      = reference-keyword sep string optsep stmtend

   units-stmt          = units-keyword sep string optsep stmtend

   revision-stmt       = revision-keyword sep revision-date optsep
                         (";" /
                          "{" stmtsep
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                          "}")

   revision-date       =  date-arg-str

   revision-date-stmt = revision-date-keyword sep revision-date stmtend

   extension-stmt      = extension-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [argument-stmt stmtsep]
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                          "}")

   argument-stmt       = argument-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              [yin-element-stmt stmtsep]
                          "}")

   yin-element-stmt    = yin-element-keyword sep yin-element-arg-str
                         stmtend

   yin-element-arg-str = < a string that matches the rule
                           yin-element-arg >

   yin-element-arg     = true-keyword / false-keyword

   identity-stmt       = identity-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [base-stmt stmtsep]
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                          "}")

   base-stmt           = base-keyword sep identifier-ref-arg-str
                         optsep stmtend

   feature-stmt        = feature-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              *(if-feature-stmt stmtsep)
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                          "}")

   if-feature-stmt     = if-feature-keyword sep identifier-ref-arg-str
                         optsep stmtend

   typedef-stmt        = typedef-keyword sep identifier-arg-str optsep
                         "{" stmtsep
                             ;; эти операторы могут указываться в любом порядке
                             type-stmt stmtsep
                             [units-stmt stmtsep]
                             [default-stmt stmtsep]
                             [status-stmt stmtsep]
                             [description-stmt stmtsep]
                             [reference-stmt stmtsep]
                          "}"

   type-stmt           = type-keyword sep identifier-ref-arg-str optsep
                         (";" /
                          "{" stmtsep
                              type-body-stmts
                          "}")

   type-body-stmts     = numerical-restrictions /
                         decimal64-specification /
                         string-restrictions /
                         enum-specification /
                         leafref-specification /
                         identityref-specification /
                         instance-identifier-specification /
                         bits-specification /
                         union-specification

   numerical-restrictions = range-stmt stmtsep

   range-stmt          = range-keyword sep range-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [error-message-stmt stmtsep]
                              [error-app-tag-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                           "}")

   decimal64-specification = fraction-digits-stmt

   fraction-digits-stmt = fraction-digits-keyword sep
                          fraction-digits-arg-str stmtend

   fraction-digits-arg-str = < a string that matches the rule
                              fraction-digits-arg >

   fraction-digits-arg = ("1" ["0" / "1" / "2" / "3" / "4" /
                               "5" / "6" / "7" / "8"])
                         / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"

   string-restrictions = ;; эти операторы могут указываться в любом порядке
                         [length-stmt stmtsep]
                         *(pattern-stmt stmtsep)

   length-stmt         = length-keyword sep length-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [error-message-stmt stmtsep]
                              [error-app-tag-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                           "}")

   pattern-stmt        = pattern-keyword sep string optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [error-message-stmt stmtsep]
                              [error-app-tag-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                           "}")

   default-stmt        = default-keyword sep string stmtend

   enum-specification  = 1*(enum-stmt stmtsep)

   enum-stmt           = enum-keyword sep string optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [value-stmt stmtsep]
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                           "}")

   leafref-specification =
                         ;; эти операторы могут указываться в любом порядке
                         path-stmt stmtsep
                         [require-instance-stmt stmtsep]

   path-stmt           = path-keyword sep path-arg-str stmtend

   require-instance-stmt = require-instance-keyword sep
                            require-instance-arg-str stmtend

   require-instance-arg-str = < a string that matches the rule
                              require-instance-arg >

   require-instance-arg = true-keyword / false-keyword


   instance-identifier-specification =
                         [require-instance-stmt stmtsep]

   identityref-specification =
                         base-stmt stmtsep

   union-specification = 1*(type-stmt stmtsep)

   bits-specification  = 1*(bit-stmt stmtsep)

   bit-stmt            = bit-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [position-stmt stmtsep]
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                            "}"
                          "}")

   position-stmt       = position-keyword sep
                         position-value-arg-str stmtend

   position-value-arg-str = < a string that matches the rule
                              position-value-arg >

   position-value-arg  = non-negative-integer-value

   status-stmt         = status-keyword sep status-arg-str stmtend

   status-arg-str      = < a string that matches the rule
                           status-arg >

   status-arg          = current-keyword /
                         obsolete-keyword /
                         deprecated-keyword

   config-stmt         = config-keyword sep
                         config-arg-str stmtend

   config-arg-str      = < a string that matches the rule
                           config-arg >

   config-arg          = true-keyword / false-keyword

   mandatory-stmt      = mandatory-keyword sep
                         mandatory-arg-str stmtend

   mandatory-arg-str   = < a string that matches the rule
                           mandatory-arg >

   mandatory-arg       = true-keyword / false-keyword

   presence-stmt       = presence-keyword sep string stmtend

   ordered-by-stmt     = ordered-by-keyword sep
                         ordered-by-arg-str stmtend

   ordered-by-arg-str  = < a string that matches the rule
                           ordered-by-arg >

   ordered-by-arg      = user-keyword / system-keyword

   must-stmt           = must-keyword sep string optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [error-message-stmt stmtsep]
                              [error-app-tag-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                           "}")

   error-message-stmt  = error-message-keyword sep string stmtend
   error-app-tag-stmt  = error-app-tag-keyword sep string stmtend
   min-elements-stmt   = min-elements-keyword sep
                         min-value-arg-str stmtend

   min-value-arg-str   = < a string that matches the rule
                           min-value-arg >

   min-value-arg       = non-negative-integer-value

   max-elements-stmt   = max-elements-keyword sep
                         max-value-arg-str stmtend

   max-value-arg-str   = < a string that matches the rule
                           max-value-arg >

   max-value-arg       = unbounded-keyword /
                         positive-integer-value

   value-stmt          = value-keyword sep integer-value stmtend

   grouping-stmt       = grouping-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                              *((typedef-stmt /
                                 grouping-stmt) stmtsep)
                              *(data-def-stmt stmtsep)
                          "}")

   container-stmt      = container-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [when-stmt stmtsep]
                              *(if-feature-stmt stmtsep)
                              *(must-stmt stmtsep)
                              [presence-stmt stmtsep]
                              [config-stmt stmtsep]
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                              *((typedef-stmt /
                                 grouping-stmt) stmtsep)
                              *(data-def-stmt stmtsep)
                          "}")

   leaf-stmt           = leaf-keyword sep identifier-arg-str optsep
                         "{" stmtsep
                             ;; эти операторы могут указываться в любом порядке
                             [when-stmt stmtsep]
                             *(if-feature-stmt stmtsep)
                             type-stmt stmtsep
                             [units-stmt stmtsep]
                             *(must-stmt stmtsep)
                             [default-stmt stmtsep]
                             [config-stmt stmtsep]
                             [mandatory-stmt stmtsep]
                             [status-stmt stmtsep]
                             [description-stmt stmtsep]
                             [reference-stmt stmtsep]
                          "}"

   leaf-list-stmt      = leaf-list-keyword sep identifier-arg-str optsep
                         "{" stmtsep
                             ;; эти операторы могут указываться в любом порядке
                             [when-stmt stmtsep]
                             *(if-feature-stmt stmtsep)
                             type-stmt stmtsep
                             [units-stmt stmtsep]
                             *(must-stmt stmtsep)
                             [config-stmt stmtsep]
                             [min-elements-stmt stmtsep]
                             [max-elements-stmt stmtsep]
                             [ordered-by-stmt stmtsep]
                             [status-stmt stmtsep]
                             [description-stmt stmtsep]
                             [reference-stmt stmtsep]
                          "}"

   list-stmt           = list-keyword sep identifier-arg-str optsep
                         "{" stmtsep
                             ;; эти операторы могут указываться в любом порядке
                             [when-stmt stmtsep]
                             *(if-feature-stmt stmtsep)
                             *(must-stmt stmtsep)
                             [key-stmt stmtsep]
                             *(unique-stmt stmtsep)
                             [config-stmt stmtsep]
                             [min-elements-stmt stmtsep]
                             [max-elements-stmt stmtsep]
                             [ordered-by-stmt stmtsep]
                             [status-stmt stmtsep]
                             [description-stmt stmtsep]
                             [reference-stmt stmtsep]
                             *((typedef-stmt /
                                grouping-stmt) stmtsep)
                             1*(data-def-stmt stmtsep)
                          "}"

   key-stmt            = key-keyword sep key-arg-str stmtend

   key-arg-str         = < a string that matches the rule
                           key-arg >

   key-arg             = node-identifier *(sep node-identifier)

   unique-stmt         = unique-keyword sep unique-arg-str stmtend

   unique-arg-str      = < a string that matches the rule
                           unique-arg >

   unique-arg          = descendant-schema-nodeid
                         *(sep descendant-schema-nodeid)

   choice-stmt         = choice-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [when-stmt stmtsep]
                              *(if-feature-stmt stmtsep)
                              [default-stmt stmtsep]
                              [config-stmt stmtsep]
                              [mandatory-stmt stmtsep]
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                              *((short-case-stmt / case-stmt) stmtsep)
                          "}")

   short-case-stmt     = container-stmt /
                         leaf-stmt /
                         leaf-list-stmt /
                         list-stmt /
                         anyxml-stmt

   case-stmt           = case-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [when-stmt stmtsep]
                              *(if-feature-stmt stmtsep)
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                              *(data-def-stmt stmtsep)
                          "}")

   anyxml-stmt         = anyxml-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [when-stmt stmtsep]
                              *(if-feature-stmt stmtsep)
                              *(must-stmt stmtsep)
                              [config-stmt stmtsep]
                              [mandatory-stmt stmtsep]
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                           "}")

   uses-stmt           = uses-keyword sep identifier-ref-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [when-stmt stmtsep]
                              *(if-feature-stmt stmtsep)
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                              *(refine-stmt stmtsep)
                              *(uses-augment-stmt stmtsep)
                          "}")

   refine-stmt         = refine-keyword sep refine-arg-str optsep
                         (";" /
                          "{" stmtsep
                              (refine-container-stmts /
                               refine-leaf-stmts /
                               refine-leaf-list-stmts /
                               refine-list-stmts /
                               refine-choice-stmts /
                               refine-case-stmts /
                               refine-anyxml-stmts)
                          "}")

   refine-arg-str      = < a string that matches the rule
                           refine-arg >

   refine-arg          = descendant-schema-nodeid

   refine-container-stmts =
                         ;; эти операторы могут указываться в любом порядке
                         *(must-stmt stmtsep)
                         [presence-stmt stmtsep]
                         [config-stmt stmtsep]
                         [description-stmt stmtsep]
                         [reference-stmt stmtsep]

   refine-leaf-stmts   = ;; эти операторы могут указываться в любом порядке
                         *(must-stmt stmtsep)
                         [default-stmt stmtsep]
                         [config-stmt stmtsep]
                         [mandatory-stmt stmtsep]
                         [description-stmt stmtsep]
                         [reference-stmt stmtsep]

   refine-leaf-list-stmts =
                         ;; эти операторы могут указываться в любом порядке
                         *(must-stmt stmtsep)
                         [config-stmt stmtsep]
                         [min-elements-stmt stmtsep]
                         [max-elements-stmt stmtsep]
                         [description-stmt stmtsep]
                         [reference-stmt stmtsep]

   refine-list-stmts   = ;; эти операторы могут указываться в любом порядке
                         *(must-stmt stmtsep)
                         [config-stmt stmtsep]
                         [min-elements-stmt stmtsep]
                         [max-elements-stmt stmtsep]
                         [description-stmt stmtsep]
                         [reference-stmt stmtsep]

   refine-choice-stmts = ;; эти операторы могут указываться в любом порядке
                         [default-stmt stmtsep]
                         [config-stmt stmtsep]
                         [mandatory-stmt stmtsep]
                         [description-stmt stmtsep]
                         [reference-stmt stmtsep]

   refine-case-stmts   = ;; эти операторы могут указываться в любом порядке
                         [description-stmt stmtsep]
                         [reference-stmt stmtsep]

   refine-anyxml-stmts = ;; эти операторы могут указываться в любом порядке
                         *(must-stmt stmtsep)
                         [config-stmt stmtsep]
                         [mandatory-stmt stmtsep]
                         [description-stmt stmtsep]
                         [reference-stmt stmtsep]

   uses-augment-stmt   = augment-keyword sep uses-augment-arg-str optsep
                         "{" stmtsep
                             ;; эти операторы могут указываться в любом порядке
                             [when-stmt stmtsep]
                             *(if-feature-stmt stmtsep)
                             [status-stmt stmtsep]
                             [description-stmt stmtsep]
                             [reference-stmt stmtsep]
                             1*((data-def-stmt stmtsep) /
                                (case-stmt stmtsep))
                          "}"

   uses-augment-arg-str = < a string that matches the rule uses-augment-arg >
   uses-augment-arg    = descendant-schema-nodeid

   augment-stmt        = augment-keyword sep augment-arg-str optsep
                         "{" stmtsep
                             ;; эти операторы могут указываться в любом порядке
                             [when-stmt stmtsep]
                             *(if-feature-stmt stmtsep)
                             [status-stmt stmtsep]
                             [description-stmt stmtsep]
                             [reference-stmt stmtsep]
                             1*((data-def-stmt stmtsep) /
                                (case-stmt stmtsep))
                          "}"

   augment-arg-str     = < a string that matches the rule
                           augment-arg >

   augment-arg         = absolute-schema-nodeid

   unknown-statement   = prefix ":" identifier [sep string] optsep
                         (";" / "{" *unknown-statement2 "}")

   unknown-statement2   = [prefix ":"] identifier [sep string] optsep
                         (";" / "{" *unknown-statement2 "}")

   when-stmt           = when-keyword sep string optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                           "}")

   rpc-stmt            = rpc-keyword sep identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              *(if-feature-stmt stmtsep)
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                              *((typedef-stmt /
                                 grouping-stmt) stmtsep)
                              [input-stmt stmtsep]
                              [output-stmt stmtsep]
                          "}")

   input-stmt          = input-keyword optsep
                         "{" stmtsep
                             ;; эти операторы могут указываться в любом порядке
                             *((typedef-stmt /
                                grouping-stmt) stmtsep)
                             1*(data-def-stmt stmtsep)
                         "}"

   output-stmt         = output-keyword optsep
                         "{" stmtsep
                             ;; эти операторы могут указываться в любом порядке
                             *((typedef-stmt /
                                grouping-stmt) stmtsep)
                             1*(data-def-stmt stmtsep)
                         "}"

   notification-stmt   = notification-keyword sep
                         identifier-arg-str optsep
                         (";" /
                          "{" stmtsep
                              ;; эти операторы могут указываться в любом порядке
                              *(if-feature-stmt stmtsep)
                              [status-stmt stmtsep]
                              [description-stmt stmtsep]
                              [reference-stmt stmtsep]
                              *((typedef-stmt /
                                 grouping-stmt) stmtsep)
                              *(data-def-stmt stmtsep)
                          "}")

   deviation-stmt      = deviation-keyword sep
                         deviation-arg-str optsep
                         "{" stmtsep
                             ;; эти операторы могут указываться в любом порядке
                             [description-stmt stmtsep]
                             [reference-stmt stmtsep]
                             (deviate-not-supported-stmt /
                               1*(deviate-add-stmt /
                                  deviate-replace-stmt /
                                  deviate-delete-stmt))
                         "}"

   deviation-arg-str   = < a string that matches the rule
                           deviation-arg >

   deviation-arg       = absolute-schema-nodeid

   deviate-not-supported-stmt =
                         deviate-keyword sep
                         not-supported-keyword optsep
                         (";" /
                          "{" stmtsep
                          "}")

   deviate-add-stmt    = deviate-keyword sep add-keyword optsep
                         (";" /
                          "{" stmtsep
                              [units-stmt stmtsep]
                              *(must-stmt stmtsep)
                              *(unique-stmt stmtsep)
                              [default-stmt stmtsep]
                              [config-stmt stmtsep]
                              [mandatory-stmt stmtsep]
                              [min-elements-stmt stmtsep]
                              [max-elements-stmt stmtsep]
                          "}")

   deviate-delete-stmt = deviate-keyword sep delete-keyword optsep
                         (";" /
                          "{" stmtsep
                              [units-stmt stmtsep]
                              *(must-stmt stmtsep)
                              *(unique-stmt stmtsep)
                              [default-stmt stmtsep]
                          "}")

   deviate-replace-stmt = deviate-keyword sep replace-keyword optsep
                         (";" /
                          "{" stmtsep
                              [type-stmt stmtsep]
                              [units-stmt stmtsep]
                              [default-stmt stmtsep]
                              [config-stmt stmtsep]
                              [mandatory-stmt stmtsep]
                              [min-elements-stmt stmtsep]
                              [max-elements-stmt stmtsep]
                          "}")

   ;; Диапазоны

   range-arg-str       = < a string that matches the rule
                           range-arg >

   range-arg           = range-part *(optsep "|" optsep range-part)

   range-part          = range-boundary
                         [optsep ".." optsep range-boundary]

   range-boundary      = min-keyword / max-keyword /
                         integer-value / decimal-value

   ;; Размеры

   length-arg-str      = < a string that matches the rule
                           length-arg >

   length-arg          = length-part *(optsep "|" optsep length-part)

   length-part         = length-boundary
                         [optsep ".." optsep length-boundary]

   length-boundary     = min-keyword / max-keyword /
                         non-negative-integer-value

   ;; Дата

   date-arg-str        = < a string that matches the rule
                           date-arg >

   date-arg            = 4DIGIT "-" 2DIGIT "-" 2DIGIT

   ;; Идентификаторы узлов схемы

   schema-nodeid       = absolute-schema-nodeid /
                         descendant-schema-nodeid
   absolute-schema-nodeid = 1*("/" node-identifier)

   descendant-schema-nodeid =
                         node-identifier
                         absolute-schema-nodeid

   node-identifier     = [prefix ":"] identifier

   ;; Идентификаторы экземпляров

   instance-identifier = 1*("/" (node-identifier *predicate))

   predicate           = "[" *WSP (predicate-expr / pos) *WSP "]"

   predicate-expr      = (node-identifier / ".") *WSP "=" *WSP
                         ((DQUOTE string DQUOTE) /
                          (SQUOTE string SQUOTE))

   pos                 = non-negative-integer-value

   ;; Путь leafref

   path-arg-str        = < a string that matches the rule
                           path-arg >

   path-arg            = absolute-path / relative-path

   absolute-path       = 1*("/" (node-identifier *path-predicate))

   relative-path       = 1*(".." "/") descendant-path

   descendant-path     = node-identifier
                         [*path-predicate absolute-path]

   path-predicate      = "[" *WSP path-equality-expr *WSP "]"

   path-equality-expr  = node-identifier *WSP "=" *WSP path-key-expr

   path-key-expr       = current-function-invocation *WSP "/" *WSP
                         rel-path-keyexpr

   rel-path-keyexpr    = 1*(".." *WSP "/" *WSP)
                         *(node-identifier *WSP "/" *WSP)
                         node-identifier

   ;;; Ключевые слова, использующие базовый синтаксис abnf без учёта регистра

   ;; ключевые слова для операторов
   anyxml-keyword      = 'anyxml'
   argument-keyword    = 'argument'
   augment-keyword     = 'augment'
   base-keyword        = 'base'
   belongs-to-keyword  = 'belongs-to'
   bit-keyword         = 'bit'
   case-keyword        = 'case'
   choice-keyword      = 'choice'
   config-keyword      = 'config'
   contact-keyword     = 'contact'
   container-keyword   = 'container'
   default-keyword     = 'default'
   description-keyword = 'description'
   enum-keyword        = 'enum'
   error-app-tag-keyword = 'error-app-tag'
   error-message-keyword = 'error-message'
   extension-keyword   = 'extension'
   deviation-keyword   = 'deviation'
   deviate-keyword     = 'deviate'
   feature-keyword     = 'feature'
   fraction-digits-keyword = 'fraction-digits'
   grouping-keyword    = 'grouping'
   identity-keyword    = 'identity'
   if-feature-keyword  = 'if-feature'
   import-keyword      = 'import'
   include-keyword     = 'include'
   input-keyword       = 'input'
   key-keyword         = 'key'
   leaf-keyword        = 'leaf'
   leaf-list-keyword   = 'leaf-list'
   length-keyword      = 'length'
   list-keyword        = 'list'
   mandatory-keyword   = 'mandatory'
   max-elements-keyword = 'max-elements'
   min-elements-keyword = 'min-elements'
   module-keyword      = 'module'
   must-keyword        = 'must'
   namespace-keyword   = 'namespace'
   notification-keyword= 'notification'
   ordered-by-keyword  = 'ordered-by'
   organization-keyword= 'organization'
   output-keyword      = 'output'
   path-keyword        = 'path'
   pattern-keyword     = 'pattern'
   position-keyword    = 'position'
   prefix-keyword      = 'prefix'
   presence-keyword    = 'presence'
   range-keyword       = 'range'
   reference-keyword   = 'reference'
   refine-keyword      = 'refine'
   require-instance-keyword = 'require-instance'
   revision-keyword    = 'revision'
   revision-date-keyword = 'revision-date'
   rpc-keyword         = 'rpc'
   status-keyword      = 'status'
   submodule-keyword   = 'submodule'
   type-keyword        = 'type'
   typedef-keyword     = 'typedef'
   unique-keyword      = 'unique'
   units-keyword       = 'units'
   uses-keyword        = 'uses'
   value-keyword       = 'value'
   when-keyword        = 'when'
   yang-version-keyword= 'yang-version'
   yin-element-keyword = 'yin-element'

   ;; прочие ключевые слова
   add-keyword         = 'add'
   current-keyword     = 'current'
   delete-keyword      = 'delete'
   deprecated-keyword  = 'deprecated'
   false-keyword       = 'false'
   max-keyword         = 'max'
   min-keyword         = 'min'
   not-supported-keyword = 'not-supported'
   obsolete-keyword    = 'obsolete'
   replace-keyword     = 'replace'
   system-keyword      = 'system'
   true-keyword        = 'true'
   unbounded-keyword   = 'unbounded'
   user-keyword        = 'user'

   current-function-invocation = current-keyword *WSP "(" *WSP ")"

   ;; Базовые правила
   prefix-arg-str      = < a string that matches the rule
                           prefix-arg >

   prefix-arg          = prefix

   prefix              = identifier

   identifier-arg-str  = < a string that matches the rule
                           identifier-arg >

   identifier-arg      = identifier

   ;; Идентификаторам НЕДОПУСТИМО начинаться с (('X'|'x') ('M'|'m') ('L'|'l'))
   identifier          = (ALPHA / "_")
                         *(ALPHA / DIGIT / "_" / "-" / ".")

   identifier-ref-arg-str = < a string that matches the rule
                           identifier-ref-arg >

   identifier-ref-arg  = [prefix ":"] identifier

   string              = < an unquoted string as returned by
                           the scanner >

   integer-value       = ("-" non-negative-integer-value)  /
                          non-negative-integer-value

   non-negative-integer-value = "0" / positive-integer-value

   positive-integer-value = (non-zero-digit *DIGIT)

   zero-integer-value  = 1*DIGIT

   stmtend             = ";" / "{" *unknown-statement "}"

   sep                 = 1*(WSP / line-break)
                         ; безусловный разделитель

   optsep              = *(WSP / line-break)
   stmtsep             = *(WSP / line-break / unknown-statement)

   line-break          = CRLF / LF

   non-zero-digit      = %x31-39

   decimal-value       = integer-value ("." zero-integer-value)

   SQUOTE              = %x27
                         ; ' (одинарная кавычка)

   ;;
   ;; Основные правила RFC 5234
   ;;
   ALPHA               = %x41-5A / %x61-7A
                         ; A-Z / a-z

   CR                  = %x0D
                         ; возврат каретки

   CRLF                = CR LF
                         ; стандарт новой строки в Internet

   DIGIT               = %x30-39
                         ; 0-9

   DQUOTE              = %x22
                         ; " (двойная кавычка)

   HEXDIG              = DIGIT /
                         %x61 / %x62 / %x63 / %x64 / %x65 / %x66
                         ; только a..f в нижнем регистре

   HTAB                = %x09
                         ; горизонтальная табуляция

   LF                  = %x0A
                         ; перевод строки

   SP                  = %x20
                         ; пробел

   VCHAR               = %x21-7E
                         ; видимые (печатные) символы

   WSP                 = SP / HTAB
                         ; пустое пространство (пробельные символы)
   <CODE ENDS>

13. Сообщения об ошибках, связанных с YANG

Множество откликов NETCONF об ошибках определено для ошибок, связанных с обработкой модели данных. Если имеющий отношение к делу оператор YANG имеет субоператор error-app-tag, этот оператор заменяет принятое по умолчанию значение, описанное ниже.

13.1. Сообщение для данных, нарушающих unique

Если операция NETCONF будет давать конфигурацию, в которой ограничение unique перестаёт выполняться, возвращается описанная ниже ошибка.

     error-tag:      отказ операции
     error-app-tag:  данные не уникальны
     error-info:     <non-unique>: содержит экземпляр идентификатора,
                     указывающий на лист, нарушающий ограничение unique.
                     Этот элемент указывает 1 раз для каждого не 
                     уникального leaf.

                     Элемент <non-unique> относится к пространству имён 
                     YANG urn:ietf:params:xml:ns:yang:1.

13.2. Сообщение для данных, нарушающих max-elements

Если операция NETCONF будет создавать конфигурацию, где узел list или leaf-list включает слишком много элементов, возвращается описанная ниже ошибка.

     error-tag:      отказ операции
     error-app-tag:  слишком много элементов

Эта ошибка возвращается однократно и error-path указывает узел списка, даже при возникновении более одного избыточного потомка.

13.3. Сообщение для данных, нарушающих min-elements

Если операция NETCONF будет создавать конфигурацию, где узел list или leaf-list включает слишком мало элементов, возвращается описанная ниже ошибка.

     error-tag:      отказ операции
     error-app-tag:  слишком мало элементов

Эта ошибка возвращается однократно и error-path указывает узел списка, даже при возникновении более одного недостающего потомка.

13.4. Сообщение для данных, нарушающих must

Если операция NETCONF будет создавать конфигурацию, где нарушены ограничения, заданные оператором must, возвращается описанная ниже ошибка, если нет конкретного субоператора error-app-tag для оператора must.

     error-tag:      отказ операции
     error-app-tag:  нарушение must

13.5. Сообщение для данных, нарушающих require-instance

Если операция NETCONF будет создавать конфигурацию, где лист типа instance-identifier с оператором require-instance, имеющим значение true, указывает на несуществующий экземпляр, возвращается описанная ниже ошибка.

     error-tag:      данные отсутствуют
     error-app-tag:  требуется экземпляр
     error-path:     путь к instance-identifier.

13.6. Сообщение для данных, не соответствующих типу leafref

Если операция NETCONF будет создавать конфигурацию, где лист типа leafref указывает на несуществующий экземпляр возвращается описанная ниже ошибка.

     error-tag:      данные отсутствуют
     error-app-tag:  требуется экземпляр
     error-path:     путь к leafref.

13.7. Сообщение для данных, нарушающих обязательный choice

Если операция NETCONF будет создавать конфигурацию, где не существует узлов в обязательном выборе (choice), возвращается описанная ниже ошибка.

     error-tag:      данные отсутствуют
     error-app-tag:  отсутствует choice
     error-path:     путь к элементу с отсутствующим choice.
     error-info:     <missing-choice>: имя отсутствующего обязательного
                     оператора choice.
                     Элемент <missing-choice> относится к пространству имён 
                     YANG urn:ietf:params:xml:ns:yang:1.

13.8. Сообщение для данных, нарушающих insert

Если в <edit-config> используется insert и атрибут key или value для узла list или leaf-list и key или value указывает несуществующий экземпляр, возвращается описанная ниже ошибка.

     error-tag:      некорректный атрибут
     error-app-tag:  отсутствующий экземпляр

14. Взаимодействие с IANA

Этот документ определяет реестр для имён модуля и субмодулей YANG с именем YANG Module Names.

В этот реестр следует включать перечисленные ниже записи:

  • имя модуля или субмодуля;

  • назначенное для модуля пространство имён XML;

  • префикс модуля;

  • имя модуля, к которому относится субмодуль;

  • ссылка на документацию (суб)модуля (например, номер RFC).

Реестр изначально пуст.

Для выделения значений требуется публикация RFC в соответствии с RFC 5226 [RFC5226]. Имена регистрируемых модулей YANG должны соответствовать правилам, приведённым в параграфе 6.2 и должны иметь префикс.

Префикс ietf- зарезервирован для документов IETF [RFC4844], irtf- зарезервирован для документов IRTF. Модули, публикуемые в других потоках RFC должны иметь аналогичный подходящий префикс.

Все имена регистрируемых модулей и субмодулей должны быть уникальными.

Все пространства имён XML в реестре должны быть уникальными.

Этот документ регистрирует два URI для пространств имён YANG YIN XML в реестре IETF XML [RFC3688]. В соответствии с форматом RFC 3688 добавлены приведённые ниже регистрации.

     URI: urn:ietf:params:xml:ns:yang:yin:1
     URI: urn:ietf:params:xml:ns:yang:1
     Registrant Contact: The IESG.
     XML: N/A, the requested URIs are XML namespaces.

Этот документ регистрирует два новых типа, определенных в следующих параграфах.

14.1. Тип носителя application/yang

  MIME media type name:  application
  MIME subtype name:  yang
  Mandatory parameters:  none
  Optional parameters:  none
  Encoding considerations:  8-bit
  Security considerations:  See Section 15 in RFC 6020
  Interoperability considerations:  None
  Published specification:  RFC 6020
  Applications that use this media type:
    YANG module validators, web servers used for downloading YANG
    modules, email clients, etc.
  Additional information:
     Magic Number:  None
     File Extension:  .yang
     Macintosh file type code:  'TEXT'
  Personal and email address for further information:
     Martin Bjorklund <mbj@tail-f.com>
  Intended usage:  COMMON
  Author:
     This specification is a work item of the IETF NETMOD working group,
     with mailing list address <netmod@ietf.org>.
  Change controller:
     The IESG <iesg@ietf.org>

14.2. Тип носителя application/yin+xml

  MIME media type name:  application
  MIME subtype name:  yin+xml
  Mandatory parameters:  none
  Optional parameters:
     "charset":  This parameter has identical semantics to the charset
     parameter of the "application/xml" media type as specified in
     [RFC3023].
  Encoding considerations:
     Identical to those of "application/xml" as
     described in [RFC3023], Section 3.2.
  Security considerations:  See Section 15 in RFC 6020
  Interoperability considerations:  None
  Published specification:  RFC 6020
  Applications that use this media type:
    YANG module validators, web servers used for downloading YANG
    modules, email clients, etc.
  Additional information:
     Magic Number:  As specified for "application/xml" in [RFC3023],
                    Section 3.2.
     File Extension:  .yin
     Macintosh file type code:  'TEXT'
  Personal and email address for further information:
     Martin Bjorklund <mbj@tail-f.com>
  Intended usage:  COMMON
  Author:
     This specification is a work item of the IETF NETMOD working group,
     with mailing list address <netmod@ietf.org>.
  Change controller:
     The IESG <iesg@ietf.org>

15. Вопросы безопасности

Этот документ определяет язык для записи и чтения описаний управляющей информации. Язык сам по себе не оказывает влияния на безопасность Internet.

Применимы соображения по части безопасности, рассмотренные для протокола NETCONF (раздел 9 в [RFC6241]).

Данные, моделируемые в YANG, могут содержать деликатную информацию. RPC и уведомления, определённые в YANG могут служить для переноса деликатной информации.

Имеются вопросы безопасности, связанные с использованием данных, моделируемых в YANG. Такие вопросы следует рассматривать в документах, описывающих модели данных и документах для интерфейсом, применяемых для работы с данными (например, в документах NETCONF).

Данные, моделируемые в YANG, зависят от:

  • безопасности передающей инфраструктуры, используемой для обмена деликатной информацией;

  • безопасности приложений, которые хранят и выпускают такую деликатную информацию;

  • адекватности механизмов аутентификации и контроля доступа для ограничения доступа к данным.

Анализаторы YANG должны быть отказоустойчивы к документам к некорректным форматированием. Чтение некорректно сформированных документов из неизвестных или недоверенных источников может приводить к получению атакующим привилегий пользователя, применяющего анализатор YANG. В предельном случае это может подвергать риску всю машину.

16. Участники работы

Ниже перечислены лица, внёсшие значимый вклад в разработку исходного документа YANG.

— Andy Bierman (Brocade)

— Balazs Lengyel (Ericsson)

— David Partain (Ericsson)

— Juergen Schoenwaelder (Jacobs University Bremen)

— Phil Shafer (Juniper Networks)

17. Благодарности

Редактор выражает благодарность всем, кто предоставил значимые комментарии к разным версиям этого документа: Mehmet Ersue, Washam Fan, Joel Halpern, Leif Johansson, Ladislav Lhotka, Gerhard Muenz, Tom Petch, Randy Presuhn, David Reid и Bert Wijnen.

18. Литература

18.1. Нормативные документы

[ISO.10646] International Organization for Standardization, «Information Technology — Universal Multiple-Octet Coded Character Set (UCS)», ISO Standard 10646:2003, 2003.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC3023] Murata, M., St. Laurent, S., and D. Kohn, «XML Media Types», RFC 3023, January 2001.

[RFC3629] Yergeau, F., «UTF-8, a transformation format of ISO 10646», STD 63, RFC 3629, November 2003.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, January 2004.

[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, «Uniform Resource Identifier (URI): Generic Syntax», STD 66, RFC 3986, January 2005.

[RFC4648] Josefsson, S., «The Base16, Base32, and Base64 Data Encodings», RFC 4648, October 2006.

[RFC4741] Enns, R., «NETCONF Configuration Protocol», RFC 4741, December 2006.

[RFC5226] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, May 2008.

[RFC5234] Crocker, D. and P. Overell, «Augmented BNF for Syntax Specifications: ABNF», STD 68, RFC 5234, January 2008.

[RFC5277] Chisholm, S. and H. Trevino, «NETCONF Event Notifications», RFC 5277, July 2008.

[XML-NAMES] Hollander, D., Tobin, R., Thompson, H., Bray, T., and A. Layman, «Namespaces in XML 1.0 (Third Edition)», World Wide Web Consortium Recommendation REC-xml-names-20091208, December 2009, <http://www.w3.org/TR/2009/REC-xml-names-20091208>.

[XPATH] Clark, J. and S. DeRose, «XML Path Language (XPath) Version 1.0», World Wide Web Consortium Recommendation REC-xpath-19991116, November 1999, <http://www.w3.org/TR/1999/REC-xpath-19991116>.

[XSD-TYPES] Malhotra, A. and P. Biron, «XML Schema Part 2: Datatypes Second Edition», World Wide Web Consortium Recommendation REC-xmlschema-2-20041028, October 2004, <http://www.w3.org/TR/2004/REC-xmlschema-2-20041028>.

18.2. Дополнительная литература

[RFC2578] McCloghrie, K., Ed., Perkins, D., Ed., and J. Schoenwaelder, Ed., «Structure of Management Information Version 2 (SMIv2)», STD 58, RFC 2578, April 1999.

[RFC2579] McCloghrie, K., Ed., Perkins, D., Ed., and J. Schoenwaelder, Ed., «Textual Conventions for SMIv2», STD 58, RFC 2579, April 1999.

[RFC3780] Strauss, F. and J. Schoenwaelder, «SMIng — Next Generation Structure of Management Information», RFC 3780, May 2004.

[RFC4844] Daigle, L. and Internet Architecture Board, «The RFC Series and RFC Editor», RFC 4844, July 2007.

[XPATH2.0] Berglund, A., Boag, S., Chamberlin, D., Fernandez, M., Kay, M., Robie, J., and J. Simeon, «XML Path Language (XPath) 2.0», World Wide Web Consortium Recommendation REC-xpath20-20070123, January 2007, <http://www.w3.org/TR/2007/REC-xpath20-20070123>.

[XSLT] Clark, J., «XSL Transformations (XSLT) Version 1.0», World Wide Web Consortium Recommendation REC-xslt-19991116, November 1999, <http://www.w3.org/TR/1999/REC-xslt-19991116>.


Адрес автора

Martin Bjorklund (редактор)

Tail-f Systems

EMail: mbj@tail-f.com


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru


1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

3Extensible Markup Language — расширяемый язык разметки.

4Remote Procedure Call.

5YANG Independent Notation — независимая от YANG нотация.

6Extensible Stylesheet Language Transformation — преобразование расширяемого языка стилей.

7Structure of Management Information — структура данных управления.

8Simple Network Management Protocol — простой протокол управления сетями.

9XML Path Language — язык путей XML.

10Synchronous Optical Network — синхронная оптическая сеть.

11Secure SHell — защищенная командная оболочка.

Рубрика: RFC | Комментарии к записи RFC 6020 YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF) отключены

RFC 6022 YANG Module for NETCONF Monitoring

Internet Engineering Task Force (IETF)                          M. Scott
Request for Comments: 6022                                      Ericsson
Category: Standards Track                                   M. Bjorklund
ISSN: 2070-1721                                           Tail-f Systems
                                                            October 2010

YANG Module for NETCONF Monitoring

Модуль YANG для мониторинга NETCONF

PDF

Аннотация

В этом документе определена модель данных протокола управления сетью (Network Configuration Protocol или NETCONF) для мониторинга протокола NETCONF. Данные мониторинга включают сведения о хранилищах данных, сессиях, блокировках и статистике NETCONF, упрощающие управление сервером NETCONF. Документ также определяет для клиентов NETCONF методы обнаружения моделей данных, поддерживаемых сервером NETCONF, и новую операцию NETCONF <get-schema> для их извлечения.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 RFC 5741.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке http://www.rfc-editor.org/info/rfc6022.

Авторские права

Авторские права (Copyright (c) 2010) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

Документ может содержать материалы из IETF Document или IETF Contribution, опубликованных или публично доступных до 10 ноября 2008 года. Лица, контролирующие авторские права на некоторые из таких документов, могли не предоставить IETF Trust права разрешать внесение изменений в такие документы за рамками процессов IETF Standards. Без получения соответствующего разрешения от лиц, контролирующих авторские права этот документ не может быть изменён вне рамок процесса IETF Standards, не могут также создаваться производные документы за рамками процесса IETF Standards за исключением форматирования документа для публикации или перевода с английского языка на другие языки.

1. Введение

Этот документ задаёт модель YANG [RFC6020] для мониторинга протокола NETCONF. Модель обеспечивает сведения о сессиях NETCONF и поддерживаемой схеме, как указано в [RFC4741].

Такие факторы, как разные форматы схем, необязательность функций (feature) и контроль доступа могут влиять на применимость и уровень детализации, которые сервер NETCONF передаёт клиенту при организации сессии. Заданные этим документом методы учитывают потребность в дополнительных средствах для запроса и извлечения сведений о схеме и состоянии NETCONF с сервера NETCONF. Они дополняют имеющиеся базовые возможности и операции NETCONF, не влияя на поведение сервера.

Определена новая операция <get-schema> для поддержки явного получения схемы через NETCONF.

1.1. Уровни требований

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119].

2. Модель данных для мониторинга NETCONF

Заданная в этом документе модель данных для мониторинга NETCONF обеспечивает эксплуатационные сведения о сервере NETCONF. Это включает детали протокола NETCONF (например, протокольные счётчики, такие как in-sessions), а также данные, связанные с извлечением схем (например, список схем).

Сервер, реализующий эту модель (urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring), должен анонсировать возможность URI, как описано в [RFC6020].

В этом разделе представлен обхор модели данных для мониторинга. Подробное описание приведено в модуле YANG (5. Модель данных мониторинга NETCONF).

2.1. Ветвь /netconf-state

Контейнер netconf-state является корнем модели данных для мониторинга.

   netconf-state
       /capabilities
       /datastores
       /schemas
       /sessions
       /statistics

capabilities

Список возможностей NETCONF, поддерживаемых сервером.

datastores

Список конфигурационных хранилищ NETCONF (например, running, startup, candidate), поддерживаемых устройством, и связанные с этим сведения.

schemas

Список поддерживаемых сервером схем, включая сведения для идентификации схем и поддержки их извлечения.

sessions

Список активных сессий NETCONF на устройстве, включая счётчики на уровне сессий для всех сессий NETCONF.

statistics

Глобальные счётчики сервера NETCONF.

2.1.1. Ветвь /netconf-state/capabilities

Ветвь /netconf-state/capabilities содержит возможности, поддерживаемые сервером NETCONF. Список должен включать все возможности, передаваемые в процессе организации сессии, которые применимы на момент запроса.

2.1.2. Ветвь /netconf-state/datastores

Ветвь /netconf-state/datastores содержит список всех доступных на сервере NETCONF хранилищ данных и сведения о состоянии их блокировки.

   datastore
       /name
       /locks

name (leaf, netconf-datastore-type)

Перечисление поддерживаемых хранилищ — candidate, running, startup.

locks (grouping, lock-info)

Список блокировок для хранилища данных с указанием глобальной и частичной блокировки [RFC5717]. Для частичных блокировок возвращается список заблокированных узлов и выражения, исходно применявшиеся для запроса блокировки.

2.1.3. Ветвь /netconf-state/schemas

Список поддерживаемых сервером NETCONF схем.

   schema
       /identifier   (key)
       /version      (key)
       /format       (key)
       /namespace
       /location

Элементы identifier, version, format служат ключами для списка схем и применяются в операции <get-schema>.

identifier (string)

Идентификатор записи списка схем, используемый в операции <get-schema>, который может применяться также иными методами, такими как извлечение файла.

version (string)

Версия поддерживаемой схемы. Сервер NETCONF может одновременно поддерживать несколько версий. Каждая версия должна индивидуально указываться в списке, идентификаторы совпадают, местоположения могут различаться, а версии разные.
Для моделей данных YANG версия указывается значением наиболее свежего оператора YANG revision в модуле или субмодуле или пустой строкой при отсутствии оператора revision.

format (identifyref, schema-format)

Язык моделирования данных, использованный в схеме. Язык представляется как идентификатор (отождествление) YANG. Этот документ задаёт идентификаторы xsd, yang, yin, rng, rnc (5. Модель данных мониторинга NETCONF).

namespace (inet:uri)

Пространство имён расширяемого языка разметки (Extensible Markup Language или XML) [XML-NAMES], заданное схемой.

location (union: enum, inet:uri)

Одно или несколько мест, откуда можно извлечь эту схему. Для каждой схемы следует указывать хотя бы 1 место.

2.1.4. Ветвь /netconf-state/sessions

Список сведений о сеансах управления NETCONF, который должен включать все активные сессии NETCONF.

   session
       /session-id (key)
       /transport
       /username
       /source-host
       /login-time
       /in-rpcs
       /in-bad-rpcs
       /out-rpc-errors
       /out-notifications

session-id (uint32, 1..max)

Уникальный идентификатор сессии NETCONF, как указано в [RFC4741].

transport (identityref, transport)

Указывает транспорт для каждой сессии, представляемый идентификатором YANG. Этот документ определяет netconf-ssh, netconf-soap-over-beep, netconf-soap-over-https, netconf-beep, netconf-tls (см. раздел 5).

username (string)

Идентификатор клиента, который был аутентифицирован транспортным протоколом NETCONF. Алгоритм выведения имени пользователя зависит от транспорта NETCONF и применяемого механизма аутентификации.

source-host (inet:host)

Идентификатор хоста (IP-адрес или имя) клиента NETCONF.

login-time (yang:date-and-time)

Время организации сессии по часам сервера.

in-rpcs (yang:zero-based-counter32)

Число полученных корректных сообщений <rpc>.

in-bad-rpcs (yang:zero-based-counter32)

Число сообщений, полученных, когда ожидалось сообщение <rpc>, и не являющихся корректными сообщениями <rpc>. Это включает ошибки синтаксического анализа XML и ошибки на уровне rpc.

out-rpc-errors (yang:zero-based-counter32)

Число сообщения <rpc-reply>, переданных с элементом <rpc-error>.

out-notifications (yang:zero-based-counter32)

Число переданных сообщения <notification>.

2.1.5. Ветвь /netconf-state/statistics

Статистика производительности сервера NETCONF.

   statistics
       /netconf-start-time
       /in-bad-hellos
       /in-sessions
       /dropped-sessions
       /in-rpcs
       /in-bad-rpcs
       /out-rpc-errors
       /out-notifications

statistics

Данные производительности сервера NETCONF, относящиеся к сеансам управления.

netconf-start-time (yang:date-and-time)

Дата и время начала работы подсистемы управления.

in-bad-hellos (yang:zero-based-counter32)

Число сеансов, отброшенных без уведомления по получению недействительного сообщения <hello>.

in-sessions (yang:zero-based-counter32)

Число запущенных сессий.

dropped-sessions (yang:zero-based-counter32)

Число сессий с аномальным завершением, например, по тайм-ауту или закрытию транспорта.

in-rpcs (yang:zero-based-counter32)

Число принятых корректных сообщений <rpc>.

in-bad-rpcs (yang:zero-based-counter32)

Число сообщений, полученных, когда ожидалось сообщение <rpc>, не являющихся корректными сообщениями <rpc>.

out-rpc-errors (yang:zero-based-counter32)

Число сообщения <rpc-reply> переданных с элементом <rpc-error>.

out-notifications (yang:zero-based-counter32)

Число переданных сообщений <notification>.

3. Зависящие от схемы операции

3.1. <get-schema>

Эта операция служит для извлечения схемы с сервера NETCONF.

Параметры

identifier (string)

Идентификатор записи в списке схем. Обязательный параметр.

version (string)

Запрашиваемая версия схемы. Необязательный параметр.

format (identityref, schema-format)

Язык моделирования данных в схеме (по умолчанию yang). Необязательный параметр.

Позитивный отклик

Сервер NETCONF возвращает запрошенную схему.

Негативный отклик

Если запрошенной схемы нет, возвращается <error-tag> invalid-value. Если запросу соответствует несколько схем, возвращается <error-tag> operation-failed и <error-app-tag> data-not-unique.

4. Примеры

4.1. Извлечение списка схем с помощью <get>

Клиент NETCONF получает список поддерживаемых схем от сервера NETCONF, извлекая ветвь /netconf-state/schemas с помощью операции <get>. Доступная схема для запрашивающей сессии возвращается в отклике с элементами <identifier>, <version>, <format>, <location>. Данные отклика можно использовать для определения доступной схемы и её версий. Сама схема (т. е. содержимое) не возвращается в отклике. Необязательный элемент <location> содержит URI, который можно использовать для извлечения схемы по другому протоколу, такому как ftp [RFC0959] или http(s) [RFC2616] [RFC2818], или специальное значение NETCONF, указывающее, что схему можно извлечь с помощью операции <get-schema>. Пример запроса приведён ниже.

<rpc message-id="101"
     xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <get>
    <filter type="subtree">
      <netconf-state xmlns=
      "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
        <schemas/>
      </netconf-state>
    </filter>
  </get>
</rpc>

Сервер NETCONF возвращает список схем, доступных для извлечения.

<rpc-reply message-id="101"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <data>
    <netconf-state
    xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
      <schemas>
        <schema>
          <identifier>foo</identifier>
          <version>1.0</version>
          <format>xsd</format>
          <namespace>http://example.com/foo</namespace>
          <location>ftp://ftp.example.com/schemas/foo_1.0.xsd</location>
          <location>http://www.example.com/schema/foo_1.0.xsd</location>
          <location>NETCONF</location>
        </schema>
        <schema>
          <identifier>foo</identifier>
          <version>1.1</version>
          <format>xsd</format>
          <namespace>http://example.com/foo</namespace>
          <location>ftp://ftp.example.com/schemas/foo_1.1.xsd</location>
          <location>http://www.example.com/schema/foo_1.1.xsd</location>
          <location>NETCONF</location>
        </schema>
        <schema>
          <identifier>bar</identifier>
          <version>2008-06-01</version>
          <format>yang</format>
          <namespace>http://example.com/bar</namespace>
          <location>
            http://example.com/schema/bar@2008-06-01.yang
          </location>
          <location>NETCONF</location>
        </schema>
        <schema>
          <identifier>bar-types</identifier>
          <version>2008-06-01</version>
          <format>yang</format>
          <namespace>http://example.com/bar</namespace>
          <location>
            http://example.com/schema/bar-types@2008-06-01.yang
          </location>
          <location>NETCONF</location>
        </schema>
      </schemas>
    </netconf-state>
  </data>
</rpc-reply>

4.2. Извлечение экземпляров схем

На основе отклика из предыдущего параграфа ниже приведены примеры извлечения схем foo, bar, bar-types в нескольких форматах из нескольких мест.

  1. Foo версии 1.0 в формате xsd:

    1. по протоколу FTP из ftp://ftp.example.com/schemas/foo_1.0.xsd;

    2. по протоколу HTTP из http://www.example.com/schema/foo_1.0.xsd;

    3. с помощью <get-schema> с указанием идентификатора, версии и сормата

           <rpc message-id="101"
             xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
             <get-schema
             xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
               <identifier>foo</identifier>
               <version>1.0</version>
               <format>xsd</format>
             </get-schema>
           </rpc>
    
           <rpc-reply message-id="101"
             xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
             <data
             xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
               <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
                 <!-- Здесь размещается содержимое схемы foo 1.0 xsd -->
               </xs:schema>
             </data>
       </rpc-reply>
  2. bar версии 2008-06-01 в формате YANG:

    1. по протоколу HTTP из http://example.com/schema/bar@2008-06-01.yang;

    2. с помощью <get-schema> с параметрами идентификатора и версии

             <rpc message-id="102"
               xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
               <get-schema
               xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
                 <identifier>bar</identifier>
                 <version>2008-06-01</version>
               </get-schema>
             </rpc>
    
             <rpc-reply message-id="102"
               xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
               <data
               xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
                 module bar {
                   // Возвращён принятый по умолчанию формат (yang)
                   // Содержимое модуля yang bar версии 2008-06-01
                 }
               </data>
             </rpc-reply>
  3. bar-types версии 2008-06-01 в принятом по умолчанию формате YANG:

    1. с помощью <get-schema> с параметром identifier

       <rpc message-id="103"
         xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
         <get-schema
         xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
           <identifier>bar-types</identifier>
         </get-schema>
       </rpc>

       <rpc-reply message-id="103"
         xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
         <data
         xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
           module bar-types {
             // Возвращён принятый по умолчанию формат (yang)
             // Содержимое модуля yang bar-types последней версии (2008-06-01)
           }
         </data>
       </rpc-reply>

5. Модель данных мониторинга NETCONF

Ниже представлена модель данных YANG заданная этим документом. Модуль YANG импортирует определения типов из [RFC6021] и ссылается на [RFC4741], [RFC4742], [RFC4743], [RFC4744], [RFC5539], [xmlschema-1], [RFC6020], [ISO/IEC19757-2:2008], [RFC5717].

<CODE BEGINS> file "ietf-netconf-monitoring@2010-10-04.yang"
module ietf-netconf-monitoring {

  namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring";
  prefix "ncm";

  import ietf-yang-types { prefix yang; }
  import ietf-inet-types { prefix inet; }

  organization
    "IETF NETCONF (Network Configuration) Working Group";

  contact
    "WG Web:   <http://tools.ietf.org/wg/netconf/> 
     WG List:  <mailto:netconf@ietf.org> 

     WG Chair: Mehmet Ersue
               <mailto:mehmet.ersue@nsn.com> 

     WG Chair: Bert Wijnen
               <mailto:bertietf@bwijnen.net> 

     Editor:   Mark Scott
               <mailto:mark.scott@ericsson.com> 

     Editor:   Martin Bjorklund
               <mailto:mbj@tail-f.com>"; 

  description
    "Модуль мониторинга NETCONF. Все элементы доступны лишь для чтения.

     Авторские права (Copyright (c) 2010) принадлежат IETF Trust
     и лицам, указанным в качестве авторов кода. Все права защищены.

     Распространение и использование в исходной или двоичной форме с
     изменениями или без таковых разрешено в соответствии с лицензией
     Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
     Provisions применительно к документам IETF
     (http://trustee.ietf.org/license-info). 
 
     Эта версия данного модуля YANG является частью RFC 6022, где
     правовые вопросы рассмотрены более полно.";

  revision 2010-10-04 {
    description
      "Initial revision.";
    reference
      "RFC 6022: YANG Module for NETCONF Monitoring";
  }

  typedef netconf-datastore-type {
    type enumeration {
      enum running;
      enum candidate;
      enum startup;
    }
    description
      "Перечисление возможных типов хранилищ NETCONF.";
    reference
      "RFC 4741: NETCONF Configuration Protocol";
  }

  identity transport {
    description
      "базовый идентификатор для типов транспорта NETCONF.";
  }

  identity netconf-ssh {
    base transport;
    description
      "NETCONF по протоколу SSH.";
    reference
      "RFC 4742: Using the NETCONF Configuration Protocol
                 over Secure SHell (SSH)";
  }

  identity netconf-soap-over-beep {
    base transport;
    description
      "NETCONF по протоколу SOAP на основе протокола BEEP.";
    reference
      "RFC 4743: Using NETCONF over the Simple Object
                 Access Protocol (SOAP)";
  }

  identity netconf-soap-over-https {
    base transport;
    description
      "NETCONF по протоколу SOAP на основе протокола HTTPS.";
    reference
      "RFC 4743: Using NETCONF over the Simple Object
                 Access Protocol (SOAP)";
  }

  identity netconf-beep {
    base transport;
    description
      "NETCONF по протоколу BEEP.";
    reference
      "RFC 4744: Using the NETCONF Protocol over the
                 Blocks Extensible Exchange Protocol (BEEP)";
  }

  identity netconf-tls {
    base transport;
    description
      "NETCONF по протоколу TLS.";
    reference
      "RFC 5539: NETCONF over Transport Layer Security (TLS)";
  }

  identity schema-format {
    description
      "Базовый идентификатор языка моделирования данных в схеме.";
  }

  identity xsd {
    base schema-format;
    description
      "Определение схемы W3C XML.";
    reference
      "W3C REC REC-xmlschema-1-20041028:
         XML Schema Part 1: Structures";
  }

  identity yang {
    base schema-format;
    description
      "Язык моделирования данных YANG для NETCONF.";
    reference
      "RFC 6020:  YANG - A Data Modeling Language for the
                  Network Configuration Protocol (NETCONF)";
  }

  identity yin {
    base schema-format;
    description
      "Синтаксис YIN для YANG.";
    reference
      "RFC 6020:  YANG - A Data Modeling Language for the
                  Network Configuration Protocol (NETCONF)";
  }

  identity rng {
    base schema-format;
    description
      "Обычный язык для XML Next Generation (RELAX NG).";
    reference
      "ISO/IEC 19757-2:2008: RELAX NG";
  }

  identity rnc {
    base schema-format;
    description
      "Компактный синтаксис Relax NG";
    reference
      "ISO/IEC 19757-2:2008: RELAX NG";
  }

  grouping common-counters {
    description
      "Счётчики для сессий и глобальные с данными от всех сессий.";

    leaf in-rpcs {
      type yang:zero-based-counter32;
      description
        "Число принятых корректных сообщений <rpc>.";
    }
    leaf in-bad-rpcs {
      type yang:zero-based-counter32;
      description
        "Число сообщений, полученных при ожидании <rpc>, которые не были
         корректными сообщениями <rpc>. Учитываются ошибки анализа XML и
         ошибки на уровне rpc.";
    }
    leaf out-rpc-errors {
      type yang:zero-based-counter32;
      description
        "Число переданных сообщений <rpc-reply> с <rpc-error>.";
    }
    leaf out-notifications {
      type yang:zero-based-counter32;
      description
        "Число переданных сообщений <notification>.";
    }
  }

  container netconf-state {
    config false;
    description
      "Контейнер netconf-state является корнем для модели данных 
       мониторинга.";

    container capabilities {
      description
        "Список поддерживаемых сервером возможностей NETCONF.";

      leaf-list capability {
        type inet:uri;
        description
          "Список поддерживаемых сервером возможностей NETCONF.";
      }
    }

    container datastores {
      description
        "Список хранилищ конфигурации NETCONF.";

      list datastore {
        key name;
        description
          "Список хранилищ конфигурации NETCONF, поддерживаемых
           сервером NETCONF, и связанных с ними сведений.";

        leaf name {
          type netconf-datastore-type;
          description
            "Имя хранилища, связанного с этой записью списка.";
        }
        container locks {
          presence
            "Этот контейнер присутствует только при блокировке
             хранилища.";
          description
            "Операции NETCONF <lock> и <partial-lock> позволяют клиенту
             заблокировать конкретные ресурсы в хранилище. Сервер
             NETCONF будет препятствовать изменению заблокированных
             ресурсов всеми сессиями, кроме задавшей блокировку.

             Данные мониторинга обеспечиваются для каждой записи 
             хранилища, включая такие детали, как сессия, задавшая
             блокировку, тип блокировки (глобальная или частичная) и
             список заблокированных ресурсов. Поддерживается множество
             блокировок в хранилище.";

          grouping lock-info {
            description
              "Связанные с блокировкой параметры, общие для глобальной 
               и частичной блокировки.";

            leaf locked-by-session {
              type uint32;
              mandatory true;
              description
                "Идентификатор сессии, заблокировавшей этот ресурс.
                 Глобальные и частичные блокировки ДОЛЖНЫ включать
                 идентификатор сессии NETCONF.

                 Если блокировку держит сессия, не контролируемая 
                 сервером NETCONF (например, CLI), указывается 0.";
              reference
                "RFC 4741: NETCONF Configuration Protocol";
            }
            leaf locked-time {
              type yang:date-and-time;
              mandatory true;
              description
                "Дата и время блокировки ресурса.";
            }
          }

          choice lock-type {
            description
              "Тип блокировки (глобальная или частичная).";

            container global-lock {
              description
                "Присутствует при глобальной блокировке.";
              uses lock-info;
            }

            list partial-lock {
              key lock-id;
              description
                "Список частичных блокировок.";
              reference
                "RFC 5717: Partial Lock Remote Procedure Call (RPC) for
                           NETCONF";

              leaf lock-id {
                type uint32;
                description
                  "Идентификатор блокировки из отклика <partial-lock>.";
              }
              uses lock-info;
              leaf-list select {
                type yang:xpath1.0;
                min-elements 1;
                description
                  "Выражение xpath, использованное для запроса
                   блокировки. Выражение выбора указывает исходно
                   предусмотренную область действия блокировки.";
              }
              leaf-list locked-node {
                type instance-identifier;
                description
                  "Список идентификаторов экземпляров (т. е. 
                   блокированных узлов).

                   Область действия частичной блокировки указывает 
                   список блокированных узлов.";
              }
            }
          }
        }
      }
    }

    container schemas {
      description
        "Список схем моделей данных, поддерживаемых сервером.";

      list schema {
        key "identifier version format";

        description
          "Список схем моделей данных, поддерживаемых сервером.";

        leaf identifier {
          type string;
          description
            "Идентификатор, однозначно указывающий схему. Указывается
             в операции <get-schema> и может служить для других целей,
             таких как извлечение файлов.

             Для языков моделирования, поддерживающих или требующих 
             имя модели данных (например, модуля YANG), идентификатор
             ДОЛЖЕН соответствовать имени. Для моделей данных YANG 
             идентификатором является имя модуля или субмодуля. В ином 
             случае МОЖНО применять такой идентификатор, как имя файла";
        }
        leaf version {
          type string;
          description
            "Версия поддерживаемой схемы. Сервер NETCONF МОЖЕТ 
             поддерживать одновременно несколько версий. Каждая версия
             ДОЛЖНА указываться отдельно в списке схем с тем же 
             идентификатором, возможно, другим местом, но со своей
             версией.

             Для моделей данных YANG версией служит значение самого
             свежего оператора revision в модуле или субмодуле. При 
             отсутствии revision указывается пустая строка.";
        }
        leaf format {
          type identityref {
            base schema-format;
          }
          description
            "Язык моделирования данных, используемый схемой (в настоящее
             время это xsd, yang, yin, rng, rnc). Для моделей YANG
             ДОЛЖЕН поддерживаться формат yang и МОЖЕТ поддерживаться
             формат yin.";
        }
        leaf namespace {
          type inet:uri;
          mandatory true;
          description
            "Пространство имён XML, заданное моделью данных.

             Для моделей YANG это пространство имён модуля. Если запись
             списка описывает субмодуль, это поле содержит пространство
             имён модуля, к которому относится субмодуль.";
        }
        leaf-list location {
          type union {
            type enumeration {
              enum "NETCONF";
            }
            type inet:uri;
          }
          description
            "Одно или несколько мест, откуда можно извлечь схему. В этом
             списке СЛЕДУЕТ указывать хотя бы 1 записи на схему.

             Схема может размещаться в удалённой файловой системе 
             (например, ссылка на извлечение по протоколу ftp) или
             непосредственно на сервере, поддерживающем операцию
             <get-schema> (указывается значением NETCONF).";
        }
      }
    }

    container sessions {
      description
        "Этот контейнер включает данные для сеансов управления NETCONF.
         Список сессий ДОЛЖЕН включать все активные сессии NETCONF.";

      list session {
        key session-id;
        description
          "В этом списке ДОЛЖНЫ быть все активные сессии NETCONF, 
           поддерживаемые сервером NETCONF.";

        leaf session-id {
          type uint32 {
            range "1..max";
          }
          description
            "Уникальный идентификатор сессии NETCONF (RFC 4741).";
          reference
            "RFC 4741: NETCONF Configuration Protocol";
        }
        leaf transport {
          type identityref {
            base transport;
          }
          mandatory true;
          description
            "Указывает транспорт для сессии, например, 
             netconf-ssh, netconf-soap, и т. п.";
        }
        leaf username  {
          type string;
          mandatory true;
          description
            "Имя пользователя, указывающее клиента, аутентифицированного
             транспортным протоколом NETCONF. Алгоритм вывода имени
             зависит от транспорта NETCONF и применяемого механизма
             аутентификации.";
        }
        leaf source-host {
          type inet:host;
          description
            "Идентификатор хоста клиента NETCONF. Значение зависит
             от реализации (например, hostname, адрес IPv4 или IPv6)";
        }

        leaf login-time {
          type yang:date-and-time;
          mandatory true;
          description
            "Время организации сессии по часам сервера.";
        }
        uses common-counters {
          description
            "Счётчики для сессии. Отсчёт с 0 по сбросом при старте
             сессии и достижении максимального значения.";
        }
      }
    }

    container statistics {
      description
        "Статистика, относящаяся в серверу NETCONF.";

      leaf netconf-start-time {
        type yang:date-and-time;
        description
          "Дата и время запуска подсистемы управления.";
      }
      leaf in-bad-hellos {
        type yang:zero-based-counter32;
        description
          "Число сессий сброшенных без уведомления по получению 
           непригодного сообщения <hello>, включая <hello> с атрибутом
           session-id, некорректным пространством имён, неверным 
           объявлением возможностей.";
      }
      leaf in-sessions {
        type yang:zero-based-counter32;
        description
          "Число запущенных сессий. Счётчик инкрементируется при
           передаче сообщения <hello> с <session-id>.

          in-sessions - in-bad-hellos =
              число корректно созданных сессий netconf";
      }
      leaf dropped-sessions {
        type yang:zero-based-counter32;
        description
          "Число аварийно завершённых сессий, например, по тайм-ауту или
           закрытию транспорта. Счётчик не увеличивается при корректном
           завершении сессии операцией <close-session> или уничтожении
           операцией <kill-session>.";
      }
      uses common-counters {
        description
          "Глобальные счётчики, собранные из всех сессий. Отсчёт с 0 со
           сбросом при реинициализации сервера NETCONF или достижении
           максимального значения.";
      }
    }
  }

  rpc get-schema {
    description
      "Операция извлечения схемы с сервера NETCONF.

       Положительный отклик:
         сервер NETCONF возвращает запрошенную схему.

       Отрицательный отклик:
         если запрошенной схемы нет, возвращается <error-tag> 
         invalid-value.

         Если запросу соответствует не одна схема, возвращается
         <error-tag> operation-failed и <error-app-tag> 
         data-not-unique.";

    input {
      leaf identifier {
        type string;
        mandatory true;
        description
          "Идентификатор записи в списке схем.";
      }
      leaf version {
        type string;
        description
          "Версия запрошенной схемы. При отсутствии этого параметра и
           наличии на сервере нескольких версий схемы возвращается 
           ошибка data-not-unique, как указано выше.";
      }

      leaf format {
        type identityref {
          base schema-format;
        }
        description
           "Язык моделирования данных в схеме. Если параметр не указан и
            на сервере имеется не 1 формат схемы, возвращается 
           ошибка data-not-unique, как указано выше.";
      }
    }
    output {
        anyxml data {
          description
            "Содержимое схемы.";
      }
    }
  }
}
<CODE ENDS>

6. Вопросы безопасности

Заданный здесь модуль YANG предназначен для доступа по протоколу NETCONF [RFC4741]. Нижним уровнем NETCONF является защищённый транспорт с обязательной реализацией SSH [RFC4742].

Некоторые из доступных для чтения узлов модуля YANG могут быть конфиденциальными или уязвимыми в некоторых сетевых средах. Важно обеспечить контроль считывания таких узлов (например, через get, get-config, notification).

Контейнеры, листья и узлы данных с их чувствительностью или уязвимостью указаны ниже.

/netconf-state/sessions/session/username

Содержит идентификаторы, которые можно использовать для попытки аутентификации на сервере.
Узел username нужен лишь для мониторинге и не следует применять его с иными целями, например, для контроля доступа, без внимательного учёта связанных с этим ограничений. Например, серверы A и B могут сообщать одно значение username, но применять его с разными целями.

7. Благодарности

Авторы благодарны Andy Bierman, Mehmet Ersue, Washam Fan, David Harrington, Balazs Lengyel, Hideki Okita, Juergen Schoenwaelder, Bert Wijnen и многим другим членам рабочей группы NETCONF за важный вклад в этот документ. Хочется также особо отметить работу Sharon Chisholm над NETCONF Monitoring Schema [NETCONF] и вклад в этот документ.

8. Взаимодействие с IANA

Этот документ регистрирует URI в реестре The IETF XML Registry в соответствии с [RFC3688]

     URI: urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring
     Registrant Contact: The IESG.
     XML: N/A, запрошенный URI является пространством имён XML.

Документ регистрирует модуль в реестре YANG Module Names в соответствии с [RFC6020]

     name: ietf-netconf-monitoring
     namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring
     prefix: ncm
     reference: RFC 6022

9. Литература

9.1. Нормативные документы

[ISO/IEC19757-2:2008] ISO/IEC, «Document Schema Definition Language (DSDL) — Part 2: Regular-grammar-based validation — RELAX NG», December 2008, <http://www.iso.org/iso/catalogue_detail.htm?csnumber=37605>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC4741] Enns, R., «NETCONF Configuration Protocol», RFC 4741, December 2006.

[RFC4742] Wasserman, M. and T. Goddard, «Using the NETCONF Configuration Protocol over Secure SHell (SSH)», RFC 4742, December 2006.

[RFC4743] Goddard, T., «Using NETCONF over the Simple Object Access Protocol (SOAP)», RFC 4743, December 2006.

[RFC4744] Lear, E. and K. Crozier, «Using the NETCONF Protocol over the Blocks Extensible Exchange Protocol (BEEP)», RFC 4744, December 2006.

[RFC5539] Badra, M., «NETCONF over Transport Layer Security (TLS)», RFC 5539, May 2009.

[RFC5717] Lengyel, B. and M. Bjorklund, «Partial Lock Remote Procedure Call (RPC) for NETCONF», RFC 5717, December 2009.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, October 2010.

[RFC6021] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6021, October 2010.

[XML-NAMES] Hollander, D., Tobin, R., Thompson, H., Bray, T., and A. Layman, «Namespaces in XML 1.0 (Third Edition)», World Wide Web Consortium Recommendation REC-xml-names-20091208, December 2009, <http://www.w3.org/TR/2009/REC-xml-names-20091208>.

[xmlschema-1] Biron, Paul V. and Ashok. Malhotra, «XML Schema Part 1: Structures Second Edition W3C Recommendation 28 October 2004», October 2004, <http://www.w3.org/TR/xmlschema-1>.

9.2. Дополнительная литература

[NETCONF] Chisholm, S. and H. Trevino, «NETCONF Monitoring Schema», Work in Progress, February 2007.

[RFC0959] Postel, J. and J. Reynolds, «File Transfer Protocol», STD 9, RFC 959, October 1985.

[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, «Hypertext Transfer Protocol — HTTP/1.1», RFC 2616, June 1999.

[RFC2818] Rescorla, E., «HTTP Over TLS», RFC 2818, May 2000.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, January 2004.

Адреса авторов

Mark Scott
Ericsson
3500 Carling Ave
Nepean, Ontario K2H 8E9
Canada
EMail: mark.scott@ericsson.com
 
Martin Bjorklund
Tail-f Systems
Klara Norra Kyrkogata 31
SE-111 22 Stockholm,
Sweden
EMail: mbj@tail-f.com
 

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru


1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

Рубрика: RFC | Оставить комментарий

RFC 6021 Common YANG Data Types

Заменен RFC 6991

Рубрика: RFC | Комментарии к записи RFC 6021 Common YANG Data Types отключены

RFC 5889 IP Addressing Model in Ad Hoc Networks

Internet Engineering Task Force (IETF)                  E. Baccelli, Ed.
Request for Comments: 5889                                         INRIA
Category: Informational                                 M. Townsley, Ed.
ISSN: 2070-1721                                            Cisco Systems
                                                          September 2010

IP Addressing Model in Ad Hoc Networks

Модель адресации IP в сетях Ad Hoc

PDF

Аннотация

В этом документе описана модель настройки адресов IP и префиксов подсетей на интерфейсах маршрутизаторов, подключенных к каналам с неопределенными свойствами связности.

Статус документа

Этот документ не является спецификацией стандартного протокола Internet и опубликован лишь для информации.

Документ является результатом работы IETF1 и выражает согласованное мнение сообщества IETF. Документ был вынесен на общее рассмотрение и одобрен для публикации IESG2. Не все документы, одобренные IESG, рассматриваются в качестве возможных стандартов Internet того или иного уровня (см. раздел 2 в RFC 5741).

Информацию о статусе документа, обнаруженных в нем ошибках и способах обратной связи можно найти по ссылке http://www.rfc-editor.org/info/rfc5889.

Авторские права

Авторские права (Copyright (c) 2010) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К этому документу применимы права и ограничения, перечисленные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включенные в этот документ, распространяются в соответствии с упрощенной лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

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

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

Связность на канальном уровне обычно предполагается неопределенной, если она не является планируемой или меняется во времени. Сети специального назначения (ad hoc) являются типичным примером неопределенной связности на канальном уровне. Протоколы маршрутизации для таких сетей специально предусматривают обнаружение и поддержку путей через сеть даже при работе с соединениями, не обеспечивающими детерминированной связности, при условии настройки адресов IP на интерфейсах маршрутизаторов. В этом документе предложена модель для настройки адресов IP и масок подсетей на интерфейсах маршрутизаторов в каналы с неопределенными свойствами связности, обеспечивающая работу протоколов маршрутизации и пересылки пакетов данных.

Отметим, что маршрутизаторам могут также требоваться дополнительные префиксы IP для приложений, работающих непосредственно на маршрутизаторе, или подключенных к нему хостов или сетей. Для IPv6 это могут быть глобальные адреса [RFC3587], уникальные в локальном масштабе (Unique-Local) [RFC4193] или адреса на канале (Link-Local) [RFC4291]. Для IPv4 адреса могут быть глобальными (публичными) или приватными [RFC1918]. В общем случае глобальные адреса предпочтительней, хотя очевидно, что они не всегда доступны через механизмы автоматической настройки. Однако в этом документе автоматическая настройка префиксов, используемых приложениями общего назначения, считается проблемой, рассматриваемой отдельно от автоматической настройки префиксов и масок, требуемых для работы протоколов маршрутизации. Документ посвящен второй задаче — типе адреса IP и маске подсети, настройка которых требуется для протокола маршрутизации и пересылки пакетов данных.

2. Терминология

В документе применяются термины и концепции, заданные в [RFC1918] и [RFC4632] для IPv4 и в [RFC4291] для IPv6.

3. Заявление о применимости

Эта модель содержит рекомендации по настройке IP-адресов и префиксов подсетей IP на интерфейсах маршрутизаторов, подключенных к каналам с неопределенными свойствами связности.

При наличии более конкретных предположений о связности между интерфейсами или (постоянной) достижимости некоторых адресов это следует учитывать при настройке префиксов подсетей.

4. Настройка префикса подсети IP

Если канал, к которому подключен интерфейс, позволяет не делать предположений по подключении к другим интерфейсам, единственными адресами, предполагаемыми «на канале», являются адреса самого интерфейса. Отметим, что полезность локальных для канала адресов (link-local) в качестве адреса «на канале» весьма ограничена, несмотря на их наличие (см. раздел 6).

Таким образом, при настройке префикса для таких интерфейсов не следует делать какие-либо предположения о прямом (один интервал) соединении IP с адресами IP, отличными от адреса самого интерфейса. Это предполагает следующий принцип:

  • на таком интерфейсе не следует настраивать префикс подсети «на канале» (on-link).

Отметим, что при включенном между парой интерфейсов обмене на канальном уровне будет возможен и обмен пакетами IP даже при отсутствующей или различающейся настройке подсети IP на этих интерфейсах.

Если же можно сделать предположения о связности интерфейсов или постоянной достижимости некоторых адресов, их следует принимать во внимание при настройке префиксов подсетей IP, задавая соответствующий префикс или префиксы интерфейсу на канале.

5. Настройка адреса IP

Протоколы маршрутизации, работающие на маршрутизаторах, могут предъявлять разные требования в части уникальности адресов интерфейсов. Некоторые не вносят таких требований, другие требуют уникальность от локальной до масштаба (по меньшей мере) домена маршрутизации (как указано в [RFC1136]).

Протоколы маршрутизации, которые не требуют уникального адреса IP в домене маршрутизации, используют отдельный уникальный идентификатор в самом протоколе маршрутизации. Такие идентификаторы могут задаваться при производстве или в процессе настройки.

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

  • Адрес IP, назначаемый интерфейсу, подключенному к каналу с неопределенными свойствами связности, следует делать уникальным по меньшей мере в масштабе домена маршрутизации.

6. Модель адресации

В разделах 4 и 5 указаны принципы настройки адресов IP и префиксов подсетей на интерфейсах маршрутизаторов, подключенных к каналам с неопределенными свойствами связности. Далее даются рекомендации на основе этих принципов для адресов IPv6 и IPv4.

Отметим, что приведенные в документе рекомендации несколько различаются для IPv6 и IPv4, поскольку IPv6 предлагает отсутствующие в IPv4 возможности (т. е., возможность просто не задавать префикс сети на канале для интерфейса IPv6), которые делают модель «более чистой».

6.1. Модель IPv6

Для IPv6 принципы, указанные в разделах 4 и 5 диктуют следующие правила:

  • IP-адресу на интерфейсе следует быть уникальным по меньшей мере в домене маршрутизации;

  • префикс подсети не задается на канальном (on-link) интерфейсе.

Отметим, что хотя локальные для канала адреса IPv6 назначаются каждому интерфейсу в соответствии с [RFC4291], в общем случае они мало полезны на каналах с неопределенными свойствами связности, поскольку соединения с соседями могут постоянно меняться. Известные ограничения указаны ниже.

  • В общем случае нет механизма, гарантирующего уникальность адресов IPv6 link-local среди множества каналов, хотя локальным для канала адресам IID в форме измененных EUI-64 следует быть глобально уникальными.

  • Маршрутизаторы не могут пересылать пакеты с адресами link-local для отправителя или получателя в другие каналы ([RFC4291]), хотя большую часть времени маршрутизатор занимается именно такой пересылкой.

Поэтому следует поощрять решения по автоматической настройке, сосредоточенные на установке IP-адресов, не являющихся IPv6 link-local.

6.2. Модель IPv4

Для IPv4 принципы, указанные в разделах 4 и 5 диктуют правила, похожие на указанные в параграфе 6.1 для IPv6.

  • IP-адресу на интерфейсе следует быть уникальным по меньшей мере в домене маршрутизации;

  • префикс подсети на интерфейсе должен иметь размер 32 бита.

Отметим, что использования адресов IPv4 link-local [RFC3927] в этом контексте следует избегать для большинства приложений, поскольку приведенные в параграфе 6.1 ограничения действительны и для адресов IPv4 link-local. Эти ограничения усугубляются меньшим пулом адресов IPv4 link-local и большей зависимостью от обнаружения дубликатов (Duplicate Address Detection или DAD).

7. Вопросы безопасности

Этот документ посвящен настройке адресов IP и масок подсетей, требуемой для работы протоколов маршрутизации и пересылки данных. В [RFC4593] рассмотрены базовые углозы для протоколов маршрутизации, применимость которых не зависит от наличия интерфейсов с неопределенными свойствами связности. Поэтому описанная здесь модель не создает новых угроз.

Однако возможно отсутствие заранее созданной инфраструктуры или органа, разрешающего использование интерфейсов с неопределенными свойствами связности, может упростить организацию атак, описанных в [RFC4593]. В частности, может быть сложнее обнаружение и локализация злонамеренной неверной конфигурации.

8. Литература

8.1. Нормативные документы

[RFC1136] Hares, S. and D. Katz, «Administrative Domains and Routing Domains: A model for routing in the Internet», RFC 1136, December 1989.

[RFC4291] Hinden, R. and S. Deering, «IP Version 6 Addressing Architecture», RFC 4291, February 2006.

[RFC3927] Cheshire, S., Aboba, B., and E. Guttman, «Dynamic Configuration of IPv4 Link-Local Addresses», RFC 3927, May 2005.

[RFC1918] Rekhter, Y., Moskowitz, B., Karrenberg, D., de Groot, G., and E. Lear, «Address Allocation for Private Internets», BCP 5, RFC 1918, February 1996.

[RFC4193] Hinden, R. and B. Haberman, «Unique Local IPv6 Unicast Addresses», RFC 4193, October 2005.

[RFC3587] Hinden, R., Deering, S., and E. Nordmark, «IPv6 Global Unicast Address Format», RFC 3587, August 2003.

[RFC4632] Fuller, V. and T. Li, «Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan», BCP 122, RFC 4632, August 2006.

8.2. Дополнительная литература

[RFC4593] Barbir, A., Murphy, S., and Y. Yang, «Generic Threats to Routing Protocols», RFC 4593, October 2006.

Приложение A. Участники работы

Этот документ отражает обсуждение и результаты работы нескольких человек, включая (по алфавиту) Teco Boot, Thomas Clausen, Ulrich Herberg, Thomas Narten, Erik Nordmark, Charles Perkins, Zach Shelby, Dave Thaler.

Адреса авторов

Emmanuel Baccelli (editor)

INRIA

EMail: Emmanuel.Baccelli@inria.fr

URI: http://www.emmanuelbaccelli.org/

Mark Townsley (editor)

Cisco Systems

EMail: mark@townsley.net


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

Рубрика: RFC | Комментарии к записи RFC 5889 IP Addressing Model in Ad Hoc Networks отключены