<?xml version="1.0"?>
<?xml-stylesheet href="docbook.xsl" type="text/xsl" ?>
<book xmlns="http://docbook.org/ns/docbook" version="5.0">
  <info>
    <title>Credential Service Specification</title>
    <titleabbrev>Credential</titleabbrev>
    <releaseinfo>19.12</releaseinfo>
    <author>
      <orgname>ONVIF™</orgname>
      <uri>www.onvif.org</uri>
    </author>
    <pubdate>December 2019</pubdate>
    <mediaobject>
      <imageobject>
        <imagedata fileref="media/logo.png" contentwidth="60mm" />
      </imageobject>
    </mediaobject>
    <copyright>
      <year>2008-2020</year>
      <holder>ONVIF™ All rights reserved.</holder>
    </copyright>
    <legalnotice>
      <para>Recipients of this document may copy, distribute, publish, or display this document so long as this copyright notice, license and disclaimer are retained with all copies of the document. No license is granted to modify this document.</para>
      <para>THIS DOCUMENT IS PROVIDED "AS IS," AND THE CORPORATION AND ITS MEMBERS AND THEIR AFFILIATES, MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THIS DOCUMENT ARE SUITABLE FOR ANY PURPOSE; OR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</para>
      <para>IN NO EVENT WILL THE CORPORATION OR ITS MEMBERS OR THEIR AFFILIATES BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR RELATING TO ANY USE OR DISTRIBUTION OF THIS DOCUMENT, WHETHER OR NOT (1) THE CORPORATION, MEMBERS OR THEIR AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR (2) SUCH DAMAGES WERE REASONABLY FORESEEABLE, AND ARISING OUT OF OR RELATING TO ANY USE OR DISTRIBUTION OF THIS DOCUMENT.  THE FOREGOING DISCLAIMER AND LIMITATION ON LIABILITY DO NOT APPLY TO, INVALIDATE, OR LIMIT REPRESENTATIONS AND WARRANTIES MADE BY THE MEMBERS AND THEIR RESPECTIVE AFFILIATES TO THE CORPORATION AND OTHER MEMBERS IN CERTAIN WRITTEN POLICIES OF THE CORPORATION.</para>
    </legalnotice>
    <revhistory>
      <revision>
        <revnumber>1.0</revnumber>
        <date>Jun 2015</date>
        <author>
          <personname>PACS WG</personname>
        </author>
        <revremark>Initial version</revremark>
      </revision>
      <revision>
        <revnumber>17.06</revnumber>
        <date>Jun 2017</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Change request 2068, 2069, 2071, 2079, 2080, 2081, 2098, 2112, 2111, 2113</revremark>
      </revision>
      <revision>
        <revnumber>17.12</revnumber>
        <date>Dec 2017</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Change request 2147, 2149</revremark>
      </revision>
      <revision>
        <revnumber>18.06</revnumber>
        <date>Jun 2018</date>
        <author>
          <personname>Patrik Björling Rygert</personname>
        </author>
        <revremark>Added support for client-supplied tokens
Added default duration for temporarily suspended credentials
Added extended grant time for credentials</revremark>
      </revision>
      <revision>
        <revnumber>19.06</revnumber>
        <date>Jun 2019</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <revremark>Change request 2450, 2455</revremark>
      </revision>
      <revision>
        <revnumber>19.12</revnumber>
        <date>Dec 2019</date>
        <author>
          <personname>Hiroyuki Sano</personname>
        </author>
        <author>
          <personname>Patrik Björling Rygert</personname>
        </author>
        <revremark>Change request 2470, 2637
Added support for white- and blacklisting of credential identifiers
Updated command table format</revremark>
      </revision>
    </revhistory>
  </info>
  <preface>
    <title>Contributors</title>
    <informaltable>
      <tgroup cols="2">
        <colspec colname="c1" colwidth="54*" />
        <colspec colname="c2" colwidth="46*" />
        <tbody valign="top">
          <row>
            <entry valign="bottom">
              <para>ASSA ABLOY</para>
            </entry>
            <entry valign="bottom">
              <para>Patrik Björling Rygert</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>ASSA ABLOY</para>
            </entry>
            <entry valign="bottom">
              <para>Mattias Rengstedt</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Axis Communications AB </para>
            </entry>
            <entry valign="bottom">
              <para>Marcus Johansson</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Axis Communications AB </para>
            </entry>
            <entry valign="bottom">
              <para>Robert Rosengren</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Axis Communications AB</para>
            </entry>
            <entry valign="bottom">
              <para>Derek Wang</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Axis Communications AB</para>
            </entry>
            <entry valign="bottom">
              <para>Emil Selinder</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Bosch</para>
            </entry>
            <entry valign="bottom">
              <para>Mohane Caliaperoumal</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Bosch</para>
            </entry>
            <entry valign="bottom">
              <para>Dirk Schreiber</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Honeywell</para>
            </entry>
            <entry valign="bottom">
              <para>Uvaraj Thangarajan</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Honeywell</para>
            </entry>
            <entry valign="bottom">
              <para>Neelendra Bhandari</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Honeywell</para>
            </entry>
            <entry valign="bottom">
              <para>Mayur Salgar</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Honeywell</para>
            </entry>
            <entry valign="bottom">
              <para>Vinay Ghule</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>PACOM</para>
            </entry>
            <entry valign="bottom">
              <para>Eugene Scully</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Siemens AG</para>
            </entry>
            <entry valign="bottom">
              <para>Lokeshwar K</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Siemens AG</para>
            </entry>
            <entry valign="bottom">
              <para>Suresh Raman</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Siemens AG</para>
            </entry>
            <entry valign="bottom">
              <para>Suresh Krishnamurthy</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Dahua Technology</para>
            </entry>
            <entry valign="bottom">
              <para>Weiming Mao</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Dahua Technology</para>
            </entry>
            <entry valign="bottom">
              <para>Hui Xu</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Hikvision Digital Technology</para>
            </entry>
            <entry valign="bottom">
              <para>Shuanglong Liao</para>
            </entry>
          </row>
          <row>
            <entry valign="bottom">
              <para>Hikvision Digital Technology</para>
            </entry>
            <entry valign="bottom">
              <para>Yuanyuan Zheng</para>
            </entry>
          </row>
        </tbody>
      </tgroup>
    </informaltable>
  </preface>
  <chapter>
    <title>Scope</title>
    <section>
      <title>General</title>
      <para>This specification defines the web service interface for integration with physical access control systems. This includes discovering components and support of the configuration of the credentials components.</para>
      <para>Supplementary dedicated services such as access control and access rules services will be defined in separate document.</para>
      <para>Web service usage and common ONVIF functionality are outside the scope of this document. Please refer to [ONVIF Core Specification] for more information.</para>
    </section>
    <section>
      <title>Conventions</title>
      <para>The key words “shall”, “shall not”, “should”, “should not”, “may”, “need not”, “can”, “cannot” in this specification are to be interpreted as described in Annex H of [ISO/IEC Directives].</para>
    </section>
    <section>
      <title>Namespaces</title>
      <para>This document references the following namespaces:</para>
      <table>
        <title>Referenced namespaces (with prefix)</title>
        <tgroup cols="2">
          <colspec colname="c1" colwidth="13*" />
          <colspec colname="c2" colwidth="87*" />
          <tbody valign="top">
            <row>
              <entry>
                <para> Prefix </para>
              </entry>
              <entry>
                <para> Namespace URI </para>
              </entry>
            </row>
            <row>
              <entry>
                <para>env</para>
              </entry>
              <entry>
                <para>
                  <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/2003/05/soap-envelope">http://www.w3.org/2003/05/soap-envelope</link>
                </para>
              </entry>
            </row>
            <row>
              <entry>
                <para>ter</para>
              </entry>
              <entry>
                <para>
                  <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/ver10/error">http://www.onvif.org/ver10/error</link>
                </para>
              </entry>
            </row>
            <row>
              <entry>
                <para>xs </para>
              </entry>
              <entry>
                <para>
                  <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</link>
                </para>
              </entry>
            </row>
            <row>
              <entry>
                <para>tt</para>
              </entry>
              <entry>
                <para>
                  <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/ver10/schema">http://www.onvif.org/ver10/schema</link>
                </para>
              </entry>
            </row>
            <row>
              <entry>
                <para>pt</para>
              </entry>
              <entry>
                <para>
                  <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/ver10/pacs">http://www.onvif.org/ver10/pacs</link>
                </para>
              </entry>
            </row>
            <row>
              <entry>
                <para>tns1</para>
              </entry>
              <entry>
                <para>
                  <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/ver10/topics">http://www.onvif.org/ver10/topics</link>
                </para>
              </entry>
            </row>
            <row>
              <entry>
                <para>tcr</para>
              </entry>
              <entry>
                <para>
                  <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/ver10/credential/wsdl">http://www.onvif.org/ver10/credential/wsdl</link>
                </para>
              </entry>
            </row>
          </tbody>
        </tgroup>
      </table>
    </section>
  </chapter>
  <chapter>
    <title>Normative references</title>
    <para>The following documents, in whole or in part, are normatively referenced in this document and are indispensable for its application. For dated references, only the edition cited applies. For undated references, the latest edition of the referenced document (including any amendments) applies.</para>
    <para>ONVIF Core Specification</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/specs/core/ONVIF-Core-Specification.pdf"></link>&gt;</para>
    <para>ONVIF PACS Architecture and Design Considerations</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.onvif.org/specs/wp/ONVIF-PACS-Architecture-and-Design-Considerations.pdf"></link>&gt;</para>
    <para>ONVIF Access Rules Service Specification</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.onvif.org/specs/srv/access/ONVIF-AccessRules-Service-Spec.pdf"></link>&gt;</para>
    <para>ONVIF Door Control Service Specification</para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.onvif.org/specs/srv/door/ONVIF-DoorControl-Service-Spec.pdf"></link>&gt;</para>
    <para>ISO 16484-5<emphasis>, ISO 16484-5:2017, Building automation and control systems (BACS) – Part 5: Data communication protocol, Annex P – BACnet Encoding of Standard Authentication Factor Formats (Normative)</emphasis></para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.iso.org/obp/ui/#iso:std:iso:16484:-5:ed-6:v1:en"></link>&gt;</para>
    <para>ISO 8601<emphasis>, ISO 8601:2004, Data elements and interchange formats – Information</emphasis><emphasis>interchange – Representation of dates and times</emphasis></para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.iso.org/obp/ui/#iso:std:iso:8601:ed-3:v1:en"></link>&gt;</para>
    <para>ISO/IEC Directives<emphasis>, ISO/IEC Directives Part 2, Principles and rules for the structure and drafting of ISO and IEC documents, Edition 7.0, May 2016</emphasis></para>
    <para role="reference">&lt;<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.iec.ch/members_experts/refdocs/iec/isoiecdir-2%7Bed7.0%7Den.pdf"></link>&gt;</para>
  </chapter>
  <chapter>
    <title>Terms, definitions and abbreviations</title>
    <section>
      <title>Terms and definitions</title>
      <para>For the purposes of this document, the following terms and definitions apply.</para>
      <informaltable>
        <tgroup cols="2">
          <colspec colname="c1" colwidth="22*" />
          <colspec colname="c2" colwidth="78*" />
          <tbody valign="top">
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Anti-Passback</emphasis>
                </para>
              </entry>
              <entry>
                <para>Operating mode which requires user validation when leaving a security controlled area in order to be able to re-enter and vice versa.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Anti-Passback Violation State</emphasis>
                </para>
              </entry>
              <entry>
                <para>A signal stating if the anti-passback rules have been violated for a credential.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Access Profile</emphasis>
                </para>
              </entry>
              <entry>
                <para>A collection of access policies. Is used to define role based access.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Credential</emphasis>
                </para>
              </entry>
              <entry>
                <para>A physical/tangible object, a piece of knowledge, or a facet of a person's physical being, that enables an individual access to a given physical facility or computer-based information system.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Credential Format</emphasis>
                </para>
              </entry>
              <entry>
                <para>The credential data can be formatted in many different ways. ONVIF supports the BACnet format types in [ISO 16484-5].</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Credential Holder</emphasis>
                </para>
              </entry>
              <entry>
                <para>Associates a credential with a user. Typically it holds a reference to a credential and a reference to a user.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Credential Identifier</emphasis>
                </para>
              </entry>
              <entry>
                <para>Card number, unique card information, PIN, fingerprint, or other biometric information, etc., that can be validated in an access point.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Credential Number</emphasis>
                </para>
              </entry>
              <entry>
                <para>A sequence of bytes uniquely identifying a credential at an access point.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Credential State</emphasis>
                </para>
              </entry>
              <entry>
                <para>The credential state indicates if a credential is enabled or disabled. The state also indicates if anti-passback has been violated or not. The state may also contain a reason why the credential was disabled.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Duress</emphasis>
                </para>
              </entry>
              <entry>
                <para>Forcing a person to provide access to a secure area against that person's wishes.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Format Type</emphasis>
                </para>
              </entry>
              <entry>
                <para>See Credential Format.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Validity Period</emphasis>
                </para>
              </entry>
              <entry>
                <para>From a certain point in time, to a later point in time. </para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Reset Anti-Passback Violation</emphasis>
                </para>
              </entry>
              <entry>
                <para>See Credential Forgive.</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Credential Forgive</emphasis>
                </para>
              </entry>
              <entry>
                <para>Command which re-enables a credential that has violated the anti-passback rules.</para>
              </entry>
            </row>
          </tbody>
        </tgroup>
      </informaltable>
    </section>
    <section>
      <title>Abbreviated terms</title>
      <informaltable>
        <tgroup cols="2">
          <colspec colname="c1" colwidth="22*" />
          <colspec colname="c2" colwidth="78*" />
          <tbody valign="top">
            <row>
              <entry>
                <para>
                  <emphasis role="bold">PACS</emphasis>
                </para>
              </entry>
              <entry valign="middle">
                <para>Physical Access Control System</para>
              </entry>
            </row>
          </tbody>
        </tgroup>
      </informaltable>
    </section>
  </chapter>
  <chapter>
    <title>Overview</title>
    <para>The credential service specification defines the commands to configure credentials. </para>
    <para>A credential holds information that can be validated in an access point, such as unique card information, PIN, biometric information, etc. A credential also holds information on what the credential can access via credential access profiles, which ties the credential to access profiles as described in [ONVIF Access Rules Service Specification]. </para>
    <para>A credential is assigned to a person (called credential holder) and has a validity that specifies the period during which the credential can be used to get access.</para>
    <para>Consider the following example:</para>
    <para>A credential is assigned to a consultant to be temporarily used during one week (April 2<superscript>nd</superscript>- April 6<superscript>th</superscript>). The start date/time of the validity is set to the morning of April 2<superscript>nd</superscript> and the end date/time of the validity is set to the evening of April 6<superscript>th</superscript>.</para>
    <para>This particular credential is a card with number 987654321 and the consultant is given the personal pin code 1234. Both pieces of information are stored in the credential. The card number is a credential identifier of type pt:Card and the pin code is a credential identifier of type pt:PIN (see section <xref linkend="_Ref409689452" /> for supported identifier types).</para>
    <para>The consultant will help out with the installation of a server so he needs access to the server room, and of course also access to the other common facilities at the office. The access profile “IT support access” gives access to the server room during office hours, and the access profile “Staff access” gives access to the rest of the office, The references to both access profiles are stored on the credential in the CredentialAccessProfile structure.</para>
    <para>A credential service object model representation is shown in Figure 1</para>
    <figure>
      <title>Main data structures in the credential service</title>
      <mediaobject>
        <imageobject>
          <imagedata fileref="media/Credential/image2.svg" contentwidth="131.41mm" contentdepth="83.55mm" />
        </imageobject>
      </mediaobject>
    </figure>
  </chapter>
  <chapter>
    <title>Credentials</title>
    <section>
      <title>General</title>
      <para>This service offers commands for configuring the credentials.</para>
    </section>
    <section>
      <title>Service capabilities</title>
      <section>
        <title>General</title>
        <para>The device shall provide service capabilities in two ways:</para>
        <orderedlist>
          <listitem>
            <para>With the GetServices method of Device service when IncludeCapability is true. Please refer to [ONVIF Core Specification] for more details.</para>
          </listitem>
          <listitem>
            <para>With the GetServiceCapabilities method.</para>
          </listitem>
        </orderedlist>
      </section>
      <section>
        <title>Data structures</title>
        <section xml:id="_Ref409689452">
          <title>ServiceCapabilities</title>
          <para>The service capabilities reflect optional functionality of a service. The information is static and does not change during device operation. The following capabilities are available:</para>
          <variablelist>
            <varlistentry>
              <term>MaxLimit</term>
              <listitem><para>The maximum number of entries returned by a single Get&lt;Entity&gt;List or Get&lt;Entity&gt; request. The device shall never return more than this number of entities in a single response. </para></listitem>
            </varlistentry>
            <varlistentry>
              <term>CredentialValiditySupported</term>
              <listitem><para>Indicates that the device supports credential validity.</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>CredentialAccessProfileValiditySupported</term>
              <listitem><para>Indicates that the device supports validity on the association between a
                credential and an access profile.</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>ValiditySupportsTimeValue</term>
              <listitem><para>Indicates that the device supports both date and time value for validity. If set
                to false, then the time value is ignored.</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>MaxCredentials</term>
              <listitem><para>The maximum number of credential supported by the device.</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>MaxAccessProfilesPerCredential</term>
              <listitem><para>The maximum number of access profiles for a credential.</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>ResetAntipassbackSupported</term>
              <listitem><para>Indicates the device supports resetting of anti-passback violations and
                notifying on anti-passback violations.</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>SupportedIdentifierType</term>
              <listitem><para>A list of identifier types that the device supports. Is of type text.</para></listitem>
              <listitem><para>Identifier types starting with the prefix pt: are reserved to define ONVIF-specific types
                as defined in pt:RecognitionType. Please note that pt:REX is not an identifier type. For custom defined
                identifier types, free text can be used.</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>SupportedExemptionType</term>
              <listitem><para>A list of exemptions that the device supports. Exemption types starting with the prefix pt: are
                reserved to define ONVIF-specific types. For custom defined exemption types, free text can be used. The
                following types are defined by ONVIF:</para></listitem>
              <listitem><para>pt:ExemptFromAuthentication	Supports ExemptedFromAuthentication in section
                <xref linkend="_Ref505001039" />.</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>ClientSuppliedTokenSupported</term>
              <listitem><para>Indicates that the client is allowed to supply the token when creating credentials. To enable
                the use of the command SetCredential, the value must be set to true.</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>DefaultCredentialSuspensionDuration</term>
              <listitem><para>The default time period that the credential will temporary be suspended (e.g. by using the
                wrong PIN a predetermined number of times).</para></listitem>
              <listitem><para>The time period is defined as an [ISO 8601] duration string (e.g. “PT5M”).</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>MaxWhitelistedItems</term>
              <listitem><para>The maximum number of whitelisted credential identifiers supported by the
                device. Defaults to zero.</para></listitem>
            </varlistentry>
            <varlistentry>
              <term>MaxBlacklistedItems</term>
              <listitem><para>The maximum number of blacklisted credential identifiers supported by the device.
                Defaults to zero.</para></listitem>
            </varlistentry>
          </variablelist>
        </section>
      </section>
      <section>
        <title>GetServiceCapabilities command</title>
        <para>This operation returns the capabilities of the credential service.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">
                Capabilities – [tcr:ServiceCapabilities]</para>
              <para role="text">List of capabilities as defined above.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">None</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">PRE_AUTH</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
    </section>
    <section>
      <title>Credential information</title>
      <section>
        <title>General</title>
        <para>A credential holds information that can be validated in an access point (card information, PIN, etc.) and what the credential can access (access profiles).</para>
      </section>
      <section>
        <title>Data structures</title>
        <section>
          <title>CredentialInfo</title>
          <para>The CredentialInfo type represents the credential as a logical object. The structure contains the basic information of a specific credential instance. The device shall provide the following fields for each credential.</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">token</emphasis>
              </para>
              <para>A service unique identifier of the credential.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">CredentialHolderReference</emphasis>
              </para>
              <para>An external reference to a person holding this credential. The reference is a username or used ID in an external system, such as a directory service.</para>
            </listitem>
          </itemizedlist>
          <para>To provide more information, the device may include the following optional fields:</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">Description</emphasis>
              </para>
              <para>User readable description for the credential. It shall be up to 1024 characters.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">ValidFrom</emphasis>
              </para>
              <para>The start date/time validity of the credential. If the ValiditySupportsTimeValue capability is set to false, then only date is supported (time is ignored).</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">ValidTo</emphasis>
              </para>
              <para>The expiration date/time validity of the credential. If the ValiditySupportsTimeValue capability is set to false, then only date is supported (time is ignored).</para>
              <para>The end time is exclusive, meaning that the exact moment in time is not part of the period.</para>
            </listitem>
          </itemizedlist>
          <para>If ValiditySupportsTimeValue is set to false, then a ValidFrom date implicitly means 00:00 that day, and a ValidTo date implicitly means that the whole day is included in the range. E.g. the validity June 6 to June 7 is the same as June 6 00:00 to June 8 00:00 (note that the end time is exclusive).</para>
        </section>
        <section>
          <title> Credential</title>
          <para>A Credential is a physical/tangible object, a piece of knowledge, or a facet of a person’s physical being, that enables an individual access to a given physical facility or computer-based information system. A credential holds one or more credential identifiers. To gain access one or more identifiers may be required.</para>
          <para>The device shall include all properties of the CredentialInfo structure and also a list of credential identifiers and a list of credential access profiles.</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">CredentialIdentifier</emphasis>
              </para>
              <para>A list of credential identifier structures. At least one credential identifier is required. Maximum one credential identifier structure per type is allowed.</para>
            </listitem>
          </itemizedlist>
          <para>To provide more information, the device may include the following optional fields:</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">CredentialAccessProfile</emphasis>
              </para>
              <para>A list of credential access profile structures.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">Attribute</emphasis>
              </para>
              <para>A list of credential attributes as name value pairs. Key name types starting with the prefix pt: are reserved to define ONVIF-specific types. For custom defined key name types, free text can be used.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">ExtendedGrantTime</emphasis>
              </para>
              <para>A boolean indicating that the credential holder needs extra time to get through the door. ExtendedReleaseTime will be added to ReleaseTime, and ExtendedOpenTime will be added to OpenTime (see section 5.3.2.4 in [ONVIF Door Control Service Specification]).</para>
            </listitem>
          </itemizedlist>
        </section>
        <section xml:id="_Ref505001039">
          <title>CredentialIdentifier</title>
          <para>A credential identifier is a card number, unique card information, PIN or biometric information such as fingerprint, iris, vein, face recognition, that can be validated in an access point.</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">Type</emphasis>
              </para>
              <para>Contains the details of the credential identifier type. Is of type CredentialIdentifierType.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">ExemptedFromAuthentication</emphasis>
              </para>
              <para>If set to true, this credential identifier is not considered for authentication. For example if the access point requests Card plus PIN, and the credential identifier of type PIN is exempted from authentication, then the access point will not prompt for the PIN.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">Value</emphasis>
              </para>
              <para>The value of the identifier in hexadecimal representation.</para>
            </listitem>
          </itemizedlist>
        </section>
        <section>
          <title>CredentialIdentifierType</title>
          <para>Specifies the name of credential identifier type and its format for the credential value.</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">Name</emphasis>
              </para>
              <para>The name of the credential identifier type, such as pt:Card, pt:PIN, etc.  (see section <xref linkend="_Ref409689452" /> for supported credential identifier types).</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">FormatType</emphasis>
              </para>
              <para>Specifies the format of the credential value for the specified identifier type name. See section <xref linkend="_Ref421712088" /> below.</para>
            </listitem>
          </itemizedlist>
        </section>
        <section xml:id="_Ref421712088">
          <title>CredentialIdentifierFormatTypeInfo</title>
          <para>Contains information about a format type.</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">FormatType</emphasis>
              </para>
              <para>A format type supported by the device. A list of supported format types is provided in [ISO 16484-5]. The BACnet type “CUSTOM” is not used in this specification. Instead device manufacturers can define their own format types.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">Description</emphasis>
              </para>
              <para>User readable description of the credential identifier format type. It shall be up to 1024 characters. For custom types, it is recommended to describe how the octet string is encoded (following the structure in column <emphasis>Authentication Factor Value Encoding</emphasis> of [ISO 16484-5]).</para>
            </listitem>
          </itemizedlist>
        </section>
        <section>
          <title>CredentialAccessProfile</title>
          <para>The association between a credential and an access profile.</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">AccessProfileToken</emphasis>
              </para>
              <para>The reference token of the associated access profile. Access profiles are defined in [ONVIF Access Rules Service Specification].</para>
            </listitem>
          </itemizedlist>
          <para>The device may include the following optional fields:</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">ValidFrom</emphasis>
              </para>
              <para>The start date/time of the validity for the association between the credential and the access profile. If the ValiditySupportsTimeValue capability is set to false, then only date is supported (time is ignored).</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">ValidTo</emphasis>
              </para>
              <para>The end date/time of the validity for the association between the credential and the access profile. The end time is exclusive, meaning that the exact moment in time is not part of the period.</para>
            </listitem>
          </itemizedlist>
          <para>Devices without ValiditySupportsTimeValue support shall ignore the time value and interpret the provided date as inclusive.</para>
          <para>For example if ValiditySupportsTimeValue is set to false, then a ValidFrom date implicitly means 00:00 that day, and a ValidTo date implicitly means that the whole day is included in the range. E.g. the validity June 6 to June 7 is the same as June 6 00:00 to June 8 00:00 (note that the end time is exclusive).</para>
        </section>
        <section xml:id="_Ref453669909">
          <title>CredentialData</title>
          <para>A combination of a credential and its state.</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">Credential</emphasis>
              </para>
              <para>The credential.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">CredentialState</emphasis>
              </para>
              <para>The state of the credential.</para>
            </listitem>
          </itemizedlist>
        </section>
        <section>
          <title>CredentialState</title>
          <para>The CredentialState structure contains information about the state of the credential and optionally the reason of why the credential was disabled.</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">Enabled</emphasis>
              </para>
              <para>True if the credential is enabled or false if the credential is disabled.</para>
            </listitem>
          </itemizedlist>
          <para>The device may include the following optional fields:</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">Reason</emphasis>
              </para>
              <para>The reason of disabling the credential. Reason <phrase>types </phrase>starting with the prefix pt: are reserved to define ONVIF-specific types. For custom defined reason types, free text can be used. The following types are defined by ONVIF:</para>
              <itemizedlist>
                <listitem>
                  <para>pt:CredentialLockedOut	Access is denied due to credential locked out</para>
                </listitem>
                <listitem>
                  <para>pt:CredentialBlocked	Access is denied because the credential has deliberately been blocked by the operator</para>
                </listitem>
                <listitem>
                  <para>pt:CredentialLost	Access is denied due to the credential being reported as lost</para>
                </listitem>
                <listitem>
                  <para>pt:CredentialStolen	Access is denied due to the credential being reported as stolen</para>
                </listitem>
                <listitem>
                  <para>pt:CredentialDamaged	Access is denied due to the credential being reported as damaged</para>
                </listitem>
                <listitem>
                  <para>pt:CredentialDestroyed	Access is denied due to the credential being reported as destroyed</para>
                </listitem>
                <listitem>
                  <para>pt:CredentialInactivity	Access is denied due to credential inactivity</para>
                </listitem>
                <listitem>
                  <para>pt:CredentialExpired	Access is denied because the credential has expired</para>
                </listitem>
                <listitem>
                  <para>pt:CredentialRenewalNeeded	Access is denied because the credential requires a renewal (e.g. new PIN or fingerprint enrollment)</para>
                </listitem>
              </itemizedlist>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">AntipassbackState</emphasis>
              </para>
              <para>A structure indicating the anti-passback state. This field shall be supported if the ResetAntipassbackSupported capability is set to true.</para>
            </listitem>
          </itemizedlist>
        </section>
        <section>
          <title>Anti-passback State</title>
          <para>A structure containing anti-passback related state information.</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">AntipassbackViolated</emphasis>
              </para>
              <para>Indicates if anti-passback is violated for the credential.</para>
            </listitem>
          </itemizedlist>
        </section>
        <section>
          <title>CredentialIdentifierItem</title>
          <para>A credential identifier is a card number, unique card information, PIN or biometric information such as fingerprint, iris, vein, face recognition, that can be validated in an access point.</para>
          <itemizedlist>
            <listitem>
              <para>
                <emphasis role="bold">Type</emphasis>
              </para>
              <para>Contains the details of the credential identifier type. Is of type CredentialIdentifierType.</para>
            </listitem>
            <listitem>
              <para>
                <emphasis role="bold">Value</emphasis>
              </para>
              <para>The value of the identifier in hexadecimal representation.</para>
            </listitem>
          </itemizedlist>
        </section>
      </section>
      <section>
        <title>GetCredentialInfo command</title>
        <para>This <phrase>operation requests </phrase>a list of CredentialInfo items matching the given tokens. </para>
        <para>The device shall ignore tokens it cannot resolve and shall return an empty list if there are no items matching the specified tokens. <phrase>The device shall not return a fault in this case.</phrase></para>
        <para>If the number of requested items is greater than MaxLimit, a TooManyItems fault shall be returned.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Token<phrase> – unbounded [</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">Tokens of CredentialInfo items to get.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">CredentialInfo <phrase>– optional, unbounded [</phrase>tcr:CredentialInfo<phrase>]</phrase></para>
              <para role="text">List of CredentialInfo items.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">
                <phrase>env:</phrase>Sender<phrase> – ter:</phrase>InvalidArgs<phrase> – ter:</phrase>TooManyItems</para>
              <para role="text">Too many items were requested, see MaxLimit capability.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetCredentialInfoList command</title>
        <para>This operation requests a list of all CredentialInfo items provided by the device.</para>
        <para>A call to this method shall return a StartReference when not all data is returned and more data is available. The reference shall be valid for retrieving the next set of data. Please refer to section 4.8.3 in [ONVIF PACS Architecture and Design Considerations] for more details.</para>
        <para>The number of items returned shall not be greater than the Limit parameter.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Limit<phrase> – optional [</phrase>xs:int<phrase>]</phrase></para>
              <para role="text">Maximum number of entries to return. If not specified, less than one or higher than what the device supports, the number of items is determined by the device.</para>
              <para role="param">StartReference <phrase>– optional [</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">Start returning entries from this start reference. If not specified, entries shall start from the beginning of the dataset.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">NextStartReference <phrase>– optional [</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">StartReference to use in next call to get the following items. If absent, no more items to get.</para>
              <para role="param">CredentialInfo <phrase>– optional, unbounded [</phrase>tcr: CredentialInfo<phrase>]</phrase></para>
              <para role="text">List of CredentialInfo items.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidStartReference</para>
              <para role="text">StartReference is invalid or has timed out. Client needs to start fetching from the beginning.</para>
            </listitem>
          </varlistentry>
        </variablelist>
        <para>access class:</para>
      </section>
      <section>
        <title>GetCredentials command</title>
        <para>This operation <phrase>requests a list of </phrase>Credential items matching the given tokens. </para>
        <para>The device shall ignore tokens it cannot resolve and shall return an empty list if there are no items matching the specified tokens. The device shall not return a fault in this case.</para>
        <para>If the number of requested items is greater than MaxLimit, a TooManyItems fault shall be returned.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Token<phrase> – unbounded [</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">Tokens of Credential items to get.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Credential <phrase>– optional, unbounded [</phrase>tcr:Credential<phrase>]</phrase></para>
              <para role="text">List of Credential items.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">
                <phrase>env:</phrase>Sender<phrase> – ter:</phrase>InvalidArgs<phrase> – ter:</phrase>TooManyItems</para>
              <para role="text">Too many items were requested, see MaxLimit capability.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SECRET</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetCredentialList command</title>
        <para>This operation requests a list of all Credential items provided by the device. </para>
        <para>A call to this method shall return a StartReference when not all data is returned and more data is available. The reference shall be valid for retrieving the next set of data. Please refer to section 4.8.3 in [ONVIF PACS Architecture and Design Considerations] for more details. </para>
        <para>The number of items returned shall not be greater than the Limit parameter.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Limit<phrase> – optional [</phrase>xs:int<phrase>]</phrase></para>
              <para role="text">Maximum number of entries to return. If not specified, less than one or higher than what the device supports, the number of items is determined by the device.</para>
              <para role="param">StartReference <phrase>– optional [</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">Start returning entries from this start reference. If not specified, entries shall start from the beginning of the dataset.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">NextStartReference <phrase>– optional [</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">StartReference to use in next call to get the following items. If absent, no more items to get.</para>
              <para role="param">Credential <phrase>– optional, unbounded [</phrase>tcr:Credential<phrase>]</phrase></para>
              <para role="text">List of Credential items.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidStartReference</para>
              <para role="text">StartReference is invalid or has timed out. Client needs to start fetching from the beginning.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SECRET</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>CreateCredential command</title>
        <para>This operation creates the specified credential in the device. </para>
        <para>A call to this method takes a credential structure and a credential state structure as input parameters. The credential state can be created in disabled or enabled state. </para>
        <para>The token field of the Credential structure shall be empty and the device shall allocate a token for the credential. The allocated token shall be returned in the response. </para>
        <para>If the client sends any value in the token field, the device shall return InvalidArgVal as a generic fault code.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Credential – <phrase>[</phrase>tcr:Credential<phrase>]</phrase></para>
              <para role="text">The credential to create.</para>
              <para role="param">State – <phrase>[</phrase>tcr:CredentialState<phrase>]</phrase></para>
              <para role="text">The state of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">Token – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the created credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">
                <phrase>env:Sender – ter:</phrase>CapabilityViolated<phrase> – ter:</phrase>MaxCredentials</para>
              <para role="text">There is not enough space to create a new credential, see the MaxCredentials capability.</para>
              <para role="param">env:Sender – ter:<phrase>CapabilityViolated</phrase> – ter:MaxAccessProfilesPerCredential</para>
              <para role="text">There are too many access profiles per credential, see the MaxAccessProfilesPerCredential capability.</para>
              <para role="param">env:Sender – ter:<phrase>CapabilityViolated</phrase> – ter:CredentialValiditySupported</para>
              <para role="text">Credential validity is not supported by device, see the CredentialValiditySupported capability.</para>
              <para role="param">env:Sender – ter:<phrase>CapabilityViolated</phrase> – ter:CredentialAccessProfileValiditySupported</para>
              <para role="text">Credential access profile validity is not supported by the device, see the CredentialAccessProfileValiditySupported capability<phrase>.</phrase></para>
              <para role="param">env:Sender – ter:<phrase>CapabilityViolated</phrase> – ter:SupportedIdentifierType</para>
              <para role="text">Specified identifier type is not supported by device, see the SupportedIdentifierType capability<phrase>.</phrase></para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:DuplicatedIdentifierType</para>
              <para role="text">The same identifier type was used more than once.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidFormatType</para>
              <para role="text">Specified identifier format type is not supported by the device.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidIdentifierValue</para>
              <para role="text">Specified identifier value is not as per FormatType definition.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:DuplicatedIdentifierValue</para>
              <para role="text">The same combination of identifier type, format and value was used more than once (some devices may not support duplicate identifier values).</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:ReferenceNotFound</para>
              <para role="text">A referred entity token is not found (some devices may not validate referred entities).</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:SupportedExemptionType</para>
              <para role="text">Specified exemption type is not supported by the device, see the SupportedExemptionType capability.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetCredential command</title>
        <para>This method is used to synchronize a credential in a client with the device.</para>
        <para>A call to this method takes a credential structure and a credential state structure as input parameters. The token field of the credential must not be empty.</para>
        <para>If a credential with the specified token does not exist in the device, the credential is created. The credential state can be created in disabled or enabled state. </para>
        <para>If a credential with the specified token exists in the device, then the credential is modified. The credential state will be set according to the specified state (this behavior differs from the ModifyCredential command). All existing credential identifiers and credential access profiles are removed and replaced with the specified entities.</para>
        <para>A device that signals support for the ClientSuppliedTokenSupported capability shall implement this command. </para>
        <para>If no token was specified in the request, the device shall return InvalidArgs as a generic fault code.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">CredentialData – <phrase>[</phrase>tcr:CredentialData<phrase>]</phrase></para>
              <para role="text">The credential and state to create or modify.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Receiver – ter:CapabilityViolated – ter:ClientSuppliedTokenSupported</para>
              <para role="text">The device does not support that the client supplies the token.</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:MaxCredentials</para>
              <para role="text">There is not enough space to create a new credential, see the MaxCredentials capability.</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:MaxAccessProfilesPerCredential</para>
              <para role="text">There are too many access profiles per credential, see the MaxAccessProfilesPerCredential capability.</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:CredentialValiditySupported</para>
              <para role="text">Credential validity is not supported by device, see the CredentialValiditySupported capability.</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:CredentialAccessProfileValiditySupported</para>
              <para role="text">Credential access profile validity is not supported by the device, see the CredentialAccessProfileValiditySupported capability.</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:SupportedIdentifierType</para>
              <para role="text">Specified identifier type is not supported by device, see the SupportedIdentifierType capability.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:DuplicatedIdentifierType</para>
              <para role="text">The same identifier type was used more than once.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidFormatType</para>
              <para role="text">Specified identifier format type is not supported by the device.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidIdentifierValue</para>
              <para role="text">Specified identifier value is not as per FormatType definition.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:DuplicatedIdentifierValue</para>
              <para role="text">The same combination of identifier type, format and value was used more than once (some devices may not support duplicate identifier values).</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:ReferenceNotFound</para>
              <para role="text">A referred entity token is not found (some devices may not validate referred entities).</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:SupportedExemptionType</para>
              <para role="text">Specified exemption type is not supported by the device, see the SupportedExemptionType capability.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>ModifyCredential command</title>
        <para>This operation modifies the specified credential. </para>
        <para>The token of the credential to modify is specified in the token field of the Credential structure and shall not be empty. All other fields in the structure shall overwrite the fields in the specified credential.</para>
        <para>When an existing credential is modified, the state is not modified explicitly. The only way for a client to change the state of a credential is to explicitly call the EnableCredential, DisableCredential or ResetAntipassback command.</para>
        <para>All existing credential identifiers and credential access profiles are removed and replaced with the specified entities.</para>
        <para>If no token was specified in the request, the device shall return InvalidArgs as a generic fault code.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Credential – <phrase>[</phrase>tcr:Credential<phrase>]</phrase></para>
              <para role="text">The credential to modify.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:MaxAccessProfilesPerCredential</para>
              <para role="text">There are too many access profiles per credential, see the MaxAccessProfilesPerCredential capability</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:CredentialValiditySupported</para>
              <para role="text">Credential validity is not supported by device, see the CredentialValiditySupported capability</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:CredentialAccessProfileValiditySupported</para>
              <para role="text">Credential access profile validity is not supported by device, see the CredentialAccessProfileValiditySupported capability</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:SupportedIdentifierType</para>
              <para role="text">Specified identifier type is not supported by device, see the SupportedIdentifierType capability</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:DuplicatedIdentifierType</para>
              <para role="text">The same identifier type was used more than once.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidFormatType</para>
              <para role="text">Specified identifier format type is not supported by the device.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidIdentifierValue</para>
              <para role="text">Specified identifier value is not as per FormatType definition.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:DuplicatedIdentifierValue</para>
              <para role="text">The same combination of identifier type, format and value was used more than once (some devices may not support duplicate identifier values).</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:ReferenceNotFound</para>
              <para role="text">A referred entity token is not found (some devices may not validate referred entities).</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:SupportedExemptionType</para>
              <para role="text">Specified exemption type is not supported by the device, see the SupportedExemptionType capability.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>DeleteCredential command</title>
        <para>This method deletes the specified credential. </para>
        <para>If it is associated with one or more entities some devices may not be able to delete the credential, and consequently a ReferenceInUse fault shall be generated.</para>
        <para>If no token was specified in the request, the device shall return InvalidArgs as a generic fault code.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Token – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential to delete.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetCredentialState command</title>
        <para>This method returns the state for the specified credential.</para>
        <para>If the capability ResetAntipassbackSupported is set to true, then the device shall supply the anti-passback state in the returned credential state structure.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Token – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">State – <phrase>[</phrase>tcr:CredentialState<phrase>]</phrase></para>
              <para role="text">The state of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SENSITIVE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>EnableCredential command</title>
        <para>This method is used to enable a credential. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Token – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">ACTUATE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>DisableCredential command</title>
        <para>This method is used to disable a credential. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Token – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">ACTUATE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>ResetAntipassbackViolation command</title>
        <para>This method is used to reset anti-passback violations for a specified credential. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">CredentialToken – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">ACTUATE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetSupportedFormatTypes command</title>
        <para>This method returns all the supported format types of a specified identifier type that is supported by the device.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">CredentialIdentifierTypeName <phrase>– [</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">Name of the credential identifier type.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">FormatTypeInfo – unbounded [<phrase>tcr:</phrase>CredentialIdentifierFormatTypeInfo]</para>
              <para role="text">Identifier format types.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Identifier type is not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetCredentialIdentifiers command</title>
        <para>This method returns all the credential identifiers for a credential. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">CredentialToken – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">CredentialIdentifier – optional, unbounded [<phrase>tcr:</phrase>CredentialIdentifier]</para>
              <para role="text">Identifiers of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SECRET</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetCredentialIdentifier command</title>
        <para>This operation creates or updates a credential identifier for a credential.</para>
        <para>If the type of specified credential identifier already exists, the current credential identifier of that type is replaced. Otherwise the credential identifier is added.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">CredentialToken – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential.</para>
              <para role="param">CredentialIdentifier – [<phrase>tcr:</phrase>CredentialIdentifier]</para>
              <para role="text">Identifier of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:SupportedIdentifierType</para>
              <para role="text">Specified identifier type is not supported by device, see the SupportedIdentifierType capability.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidFormatType</para>
              <para role="text">Specified identifier format type is not supported by the device.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidIdentifierValue</para>
              <para role="text">Specified identifier value is not as per FormatType definition.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>DeleteCredentialIdentifier command</title>
        <para>This method deletes all the identifier values for the specified type. However, if the identifier type name doesn’t exist in the device, it will be silently ignored without any response.</para>
        <para>Note that each credential needs at least one identifier and an attempt to delete the last identifier will result in a fault.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">CredentialToken – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential.</para>
              <para role="param">CredentialIdentifierTypeName <phrase>– [</phrase>pt:Name<phrase>]</phrase></para>
              <para role="text">Name of the credential identifier type.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
              <para role="param">env:Sender – ter:ConstraintViolated – ter:MinIdentifiersPerCredential</para>
              <para role="text">The last (or unique) identifier cannot be removed.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetCredentialAccessProfiles command</title>
        <para>This method returns all the credential access profiles for a credential. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">CredentialToken – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">CredentialAccessProfile – optional, unbounded [<phrase>tcr:</phrase>CredentialAccessProfile]</para>
              <para role="text">Access profiles of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>SetCredentialAccessProfiles command</title>
        <para>This operation adds or updates the credential access profiles for a credential. </para>
        <para>The device shall update the credential access profile if the access profile token in the specified credential access profile matches. Otherwise the credential access profile is added.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">CredentialToken – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential.</para>
              <para role="param">CredentialAccessProfile – unbounded [<phrase>tcr:</phrase>CredentialAccessProfile]</para>
              <para role="text">Access profiles of the credential.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:MaxAccessProfilesPerCredential</para>
              <para role="text">There are too many access profiles per credential, see the MaxAccessProfilesPerCredential capability.</para>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:CredentialAccessProfileValiditySupported</para>
              <para role="text">Credential access profile validity is not supported by the device, see the CredentialAccessProfileValiditySupported capability.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:ReferenceNotFound</para>
              <para role="text">A referred entity token is not found (some devices may not validate referred entities).</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">ACTUATE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>DeleteCredentialAccessProfiles command</title>
        <para>This method deletes credential access profiles for the specified credential token. </para>
        <para>However, if no matching credential access profiles are found, the corresponding access profile tokens are silently ignored without any response.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">CredentialToken – <phrase>[</phrase>pt:ReferenceToken<phrase>]</phrase></para>
              <para role="text">The token of the credential.</para>
              <para role="param">AccessProfileToken – unbounded [<phrase>pt:ReferenceToken</phrase>]</para>
              <para role="text">Tokens of access profiles.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:NotFound</para>
              <para role="text">Credential token is not found.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">ACTUATE</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetWhitelist command</title>
        <para>This command requests a list of all whitelisted credential identifiers in the device.</para>
        <para>A device with capability MaxWhitelistedItems greater than zero, shall implement this command. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Limit<phrase> – optional [</phrase>xs:int<phrase>]</phrase></para>
              <para role="text">Maximum number of entries to return. If not specified, less than one or higher than what the device supports, the number of items is determined by the device.</para>
              <para role="param">StartReference <phrase>– optional [</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">Start returning entries from this start reference. If not specified, entries shall start from the beginning of the dataset.</para>
              <para role="param">IdentifierType <phrase>– optional</phrase><phrase>[</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">Get only whitelisted credential identifiers with the specified identifier type.</para>
              <para role="param">FormatType <phrase>– optional</phrase><phrase>[</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">Get only whitelisted credential identifiers with the specified identifier format type.</para>
              <para role="param">Value <phrase>– optional</phrase><phrase>[</phrase>xs:hexBinary<phrase>]</phrase></para>
              <para role="text">Get only whitelisted credential identifiers with the specified identifier value.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">NextStartReference <phrase>– optional [</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">StartReference to use in next call to get the following items. If absent, no more items to get.</para>
              <para role="param">Identifier – optional, unbounded [<phrase>tcr:</phrase>CredentialIdentifierItem]</para>
              <para role="text">The whitelisted credential identifiers matching the request criteria.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidStartReference</para>
              <para role="text">StartReference is invalid or has timed out. Client needs to start fetching from the beginning.</para>
              <para role="param">env:<phrase>Sender</phrase> – ter:CapabilityViolated – ter:SupportedIdentifierType</para>
              <para role="text">Specified identifier type is not supported by the device, see the SupportedIdentifierType capability.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidFormatType</para>
              <para role="text">Specified identifier format type is not supported by the device.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SECRET</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>AddToWhitelist command</title>
        <para>This command adds the specified credential identifiers to the whitelist.</para>
        <para>A device with capability MaxWhitelistedItems greater than zero, shall implement this command.</para>
        <para>If a specified whitelist item also is blacklisted, the item shall be removed from the blacklist.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Identifier – unbounded [<phrase>tcr:</phrase>CredentialIdentifierItem]</para>
              <para role="text">The credential identifiers to be added to the whitelist.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:<phrase>MaxWhitelistedItems</phrase></para>
              <para role="text">There is not enough space to create a new whitelist item, see the MaxWhitelistedItems capability.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:TooManyItems</para>
              <para role="text">Too many items were specified, see MaxLimit capability.</para>
              <para role="param">env:<phrase>Sender</phrase> – ter:CapabilityViolated – ter:SupportedIdentifierType</para>
              <para role="text">Specified identifier type is not supported by the device, see the SupportedIdentifierType capability.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidFormatType</para>
              <para role="text">Specified identifier format type is not supported by the device.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>RemoveFromWhitelist command</title>
        <para>This command removes the specified credential identifiers from the whitelist.</para>
        <para>A device with capability MaxWhitelistedItems greater than zero, shall implement this command.</para>
        <para>This command is idempotent and is safe to repeat even if the specified whitelist items do not exist.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Identifier – unbounded [<phrase>tcr:</phrase>CredentialIdentifierItem]</para>
              <para role="text">The credential identifiers to be removed from the whitelist.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:TooManyItems</para>
              <para role="text">Too many items were specified, see MaxLimit capability.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>DeleteWhitelist command</title>
        <para>This command deletes all credential identifiers from the whitelist.</para>
        <para>A device with capability MaxWhitelistedItems greater than zero, shall implement this command.</para>
        <para>This command is idempotent and is safe to repeat even if the whitelist already is empty.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">None</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>GetBlacklist command</title>
        <para>This command requests a list of all blacklisted credential identifiers in the device.</para>
        <para>A device with capability MaxBlacklistedItems greater than zero, shall implement this command. </para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Limit<phrase> – optional [</phrase>xs:int<phrase>]</phrase></para>
              <para role="text">Maximum number of entries to return. If not specified, less than one or higher than what the device supports, the number of items is determined by the device.</para>
              <para role="param">StartReference <phrase>– optional [</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">Start returning entries from this start reference. If not specified, entries shall start from the beginning of the dataset.</para>
              <para role="param">IdentifierType <phrase>– optional</phrase><phrase>[</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">Get only <phrase>blacklisted </phrase>credential identifiers with the specified identifier type.</para>
              <para role="param">FormatType <phrase>– optional</phrase><phrase>[</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">Get only <phrase>blacklisted </phrase>credential identifiers with the specified identifier format type.</para>
              <para role="param">Value <phrase>– optional</phrase><phrase>[</phrase>xs:hexBinary<phrase>]</phrase></para>
              <para role="text">Get only <phrase>blacklisted </phrase>credential identifiers with the specified identifier value.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="param">NextStartReference <phrase>– optional [</phrase>xs:string<phrase>]</phrase></para>
              <para role="text">StartReference to use in next call to get the following items. If absent, no more items to get.</para>
              <para role="param">Identifier – optional, unbounded [<phrase>tcr:</phrase>CredentialIdentifierItem]</para>
              <para role="text">The <phrase>blacklisted </phrase>credential identifiers matching the request criteria.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidStartReference</para>
              <para role="text">StartReference is invalid or has timed out. Client needs to start fetching from the beginning.</para>
              <para role="param">env:<phrase>Sender</phrase> – ter:CapabilityViolated – ter:SupportedIdentifierType</para>
              <para role="text">Specified identifier type is not supported by the device, see the SupportedIdentifierType capability.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidFormatType</para>
              <para role="text">Specified identifier format type is not supported by the device.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">READ_SYSTEM_SECRET</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>AddToBlacklist command</title>
        <para>This command adds the specified credential identifiers to the blacklist.</para>
        <para>A device with capability MaxBlacklistedItems greater than zero, shall implement this command.</para>
        <para>If a specified blacklist item also is whitelisted, the item shall be removed from the whitelist.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Identifier – unbounded [<phrase>tcr:</phrase>CredentialIdentifierItem]</para>
              <para role="text">The credential identifiers to be added to the <phrase>blacklist</phrase>.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:CapabilityViolated – ter:<phrase>MaxBlacklistedItems</phrase></para>
              <para role="text">There is not enough space to create a new <phrase>blacklist </phrase>item, see the MaxBlacklistedItems capability.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:TooManyItems</para>
              <para role="text">Too many items were specified, see MaxLimit capability.</para>
              <para role="param">env:<phrase>Sender</phrase> – ter:CapabilityViolated – ter:SupportedIdentifierType</para>
              <para role="text">Specified identifier type is not supported by the device, see the SupportedIdentifierType capability.</para>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:InvalidFormatType</para>
              <para role="text">Specified identifier format type is not supported by the device.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>RemoveFromBlacklist command</title>
        <para>This command removes the specified credential identifiers from the blacklist.</para>
        <para>A device with capability MaxBlacklistedItems greater than zero, shall implement this command.</para>
        <para>This command is idempotent and is safe to repeat even if the specified <phrase>blacklist</phrase> items do not exist.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="param">Identifier – unbounded [<phrase>tcr:</phrase>CredentialIdentifierItem]</para>
              <para role="text">The credential identifiers to be removed from the <phrase>blacklist</phrase>.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="param">env:Sender – ter:InvalidArgVal – ter:TooManyItems</para>
              <para role="text">Too many items were specified, see MaxLimit capability.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
      <section>
        <title>DeleteBlacklist command</title>
        <para>This command deletes all credential identifiers from the blacklist.</para>
        <para>A device with capability MaxBlacklistedItems greater than zero, shall implement this command.</para>
        <para>This command is idempotent and is safe to repeat even if the <phrase>blacklist</phrase> already is empty.</para>
        <variablelist role="op">
          <varlistentry>
            <term>request</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>response</term>
            <listitem>
              <para role="text">This is an empty message.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>faults</term>
            <listitem>
              <para role="text">None</para>
            </listitem>
          </varlistentry>
          <varlistentry>
            <term>access class</term>
            <listitem>
              <para role="access">WRITE_SYSTEM</para>
            </listitem>
          </varlistentry>
        </variablelist>
      </section>
    </section>
  </chapter>
  <chapter>
    <title>Notification topics</title>
    <section>
      <title>General</title>
      <para>This section defines notification topics specific to the credential service. </para>
    </section>
    <section>
      <title>Event overview (informative)</title>
      <para>The credential service specifies events when credential state changes and when credentials are changed.</para>
      <para>The main topics for status changes are:</para>
      <itemizedlist>
        <listitem>
          <para>tns1:Credential/State/Enabled</para>
        </listitem>
        <listitem>
          <para>tns1:Credential/State/ApbViolation</para>
        </listitem>
      </itemizedlist>
      <para>The main topics for configuration change notifications are:</para>
      <itemizedlist>
        <listitem>
          <para>tns1:Configuration/Credential/Changed</para>
        </listitem>
        <listitem>
          <para>tns1:Configuration/Credential/Removed</para>
        </listitem>
      </itemizedlist>
    </section>
    <section>
      <title>Status changes</title>
      <section>
        <title>General</title>
        <para>The device shall provide the status change events to inform subscribed clients when credential entity status is changed. The device shall use the topics defined in this section associated with the respective message description.</para>
      </section>
      <section>
        <title>Credential</title>
        <para>Whenever the credential state (enabled or disabled) is changed, the device shall provide the following event (the Reason field is one of the listed in section <xref linkend="_Ref453669909" />, e.g. “pt:CredentialLost”):</para>
        <programlisting><![CDATA[Topic: tns1:Credential/State/Enabled
<tt:MessageDescription IsProperty=”false”>
  <tt:Source>
    <tt:SimpleItemDescription Name=”CredentialToken”
      Type=”pt:ReferenceToken”/>
  </tt:Source>
  <tt:Data>
    <tt:SimpleItemDescription Name=”State”
      Type=”xs:boolean”/>
    <tt:SimpleItemDescription Name=”Reason”
      Type=”xs:string”/>
    <tt:SimpleItemDescription Name=”ClientUpdated”
      Type=”xs:boolean”/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
        <para>ClientUpdated is set to true if the state change was initiated by the client. ClientUpdated is set to false if the device initiated the state change (e.g. because the wrong PIN was entered three times in a row).</para>
        <para>The device shall provide the following event whenever there is any anti-passback violation:</para>
        <programlisting><![CDATA[Topic: tns1:Credential/State/ApbViolation
<tt:MessageDescription IsProperty=”false”>
  <tt:Source>
    <tt:SimpleItemDescription Name=”CredentialToken”
      Type=”pt:ReferenceToken”/>
  </tt:Source>
  <tt:Data>
    <tt:SimpleItemDescription Name=”ApbViolation”
      Type=”xs:boolean”/>
    <tt:SimpleItemDescription Name=”ClientUpdated”
      Type=”xs:boolean”/>
  </tt:Data>
</tt:MessageDescription>
]]></programlisting>
      </section>
    </section>
    <section>
      <title>Configuration changes</title>
      <section>
        <title>General</title>
        <para>Whenever configuration data has been changed, added or been removed, the device shall provide these events to inform subscribed clients.</para>
      </section>
      <section>
        <title>Credential</title>
        <para>Whenever configuration data for a credential (including credential identifiers and credential access profiles) is changed, or if a credential is added, the device shall provide the following event:</para>
        <programlisting><![CDATA[Topic: tns1:Configuration/Credential/Changed
<tt:MessageDescription IsProperty=”false”>
  <tt:Source>
    <tt:SimpleItemDescription Name=”CredentialToken”
      Type=”pt:ReferenceToken”/>
  </tt:Source>
</tt:MessageDescription>
]]></programlisting>
        <para>Whenever a credential is removed, the device shall provide the following event:</para>
        <programlisting><![CDATA[Topic: tns1:Configuration/Credential/Removed
<tt:MessageDescription IsProperty=”false”>
  <tt:Source>
    <tt:SimpleItemDescription Name=”CredentialToken”
      Type=”pt:ReferenceToken”/>
  </tt:Source>
</tt:MessageDescription>
]]></programlisting>
      </section>
    </section>
  </chapter>
  <appendix role="revhistory">
    <title>Revision History</title>
    <para />
  </appendix>
</book>
