<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.0.36 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-wendt-modern-identity-registry-01" category="std">

  <front>
    <title abbrev="idreg">Identity Registry (idreg)</title>

    <author initials="C." surname="Wendt" fullname="Chris Wendt">
      <organization>Comcast</organization>
      <address>
        <postal>
          <street>One Comcast Center</street>
          <city>Philadelphia, PA  19103</city>
          <country>USA</country>
        </postal>
        <email>chris-ietf@chriswendt.net</email>
      </address>
    </author>

    <date year="2017" month="March" day="13"/>

    <area>ART</area>
    <workgroup>modern</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document will describe an approach for how a distributed identity registry model might look.  It will consider both public registry components of the data model necessary for routing calls from one globally routable identity to another.  It will also consider part of the private registry components a provider may need to manage associations with users or customers.  Other topics include provider associations, application or service association, and the ability to support multiple identities associated with a user/subscriber (e.g. telephone number and e-mail identity).</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>There are many useful VoIP and user to user communications applications that desire the ability to provide services that don’t depend on a single entity or provider to manage the end-to-end identities associated with that application.  For example, using the VoIP protocol, SIP <xref target="RFC3261"/>, the telephone network provides a federated mechanism that using a publicly known identity, the telephone number, a customer of a telephone provider A can call a customer of telephone provider B based on managed routing databases and routing rules.  XMPP <xref target="RFC6120"/> is another example of a protocol that allowed federation of communications based on the username and domain of the host of the XMPP server.
Each of these examples uses service specific databases or registries that are generally protocol or application specific, however today application providers general provide many applications or services for a user which generally share the use of common communications identities like telephone numbers, e-mail identities, or identities associated with web based IdPs.</t>

</section>
<section anchor="terminology" title="Terminology">

<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL
NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this
document are to be interpreted as described in <xref target="RFC2119"/>.</t>

</section>
<section anchor="overview" title="Overview">

<t>The identity registry model proposed in this document supports the model where there are a few actors in the model relevant to providing communications services.</t>

<t><list style="symbols">
  <t>Provider - An entity that provide a service to customers and manages there identity in the network.</t>
  <t>User/Subscriber - The entity that is using the services of the provider.</t>
  <t>Service Identity - A globally unique identifier representing a application or service being made available to users/subscribers by multiple providers.</t>
  <t>Public Identity - A publicly known identity that the user associates with a service. This identity must be globally unique to a user/subscriber. It must also be provably associated to a given user/subscriber that claims the association.</t>
  <t>Routing Identity - A uniquely and globally routable identity used specifically in signaling calls between users.</t>
</list></t>

<t>This data model can be used to build the shared data between providers that support the federated service in order for users that are associated with one provider to call another provider.</t>

<section anchor="identity-data-model" title="Identity Data Model">

<figure><artwork><![CDATA[
                          ___________
                         |           |
                         |   User/   |\
                         | Subscriber|  \
                         | (Private) |    \
                         |___________|    Uses Services of    
                               |           ___\_______
                               |           |          |
                         Subscribes to     | Provider |
                               |           |__________|
                          _____|_____       /
                         |           |  Offers a
                         | Service   |  /
                         | Identity  |/
                         |___________|
                               |
                               |
                       Using (one or more)
                               |
              _________________|___________________
         _____|_____      _____|_____        _____|_____
        |           |    |           |      |           |
        |  Public   |    |  Public   |      |  Public   |
        | Identity 1|    | Identity 2|  ... | Identity N|
        |___________|    |___________|      |___________|
              |________________|__________________|
                               |  
                    is network addressable by
                           ____|_____
                          |          |
                          | Routing  |
                          | Identity |
                          |__________|

]]></artwork></figure>

</section>
<section anchor="other-identity-registry-attributes" title="Other identity registry attributes">

<t>The identity registry MUST support functions such as the following:</t>

<t><list style="symbols">
  <t>The ability to query for available/unused identities for the purposes of either identifying conflicts before committing to the registry or identify unused identities that are part of a pool (e.g. telephone numbers)</t>
  <t>The ability to allocate identities for future use at individual levels or at block levels, such as NPA-NXX level telephone numbers or perhaps wildcard identities, e.g. *@example.com.</t>
  <t>The ability to update/transfer/port identities from one provider to another provider.</t>
  <t>The ability to digitally sign transactions to a provider for validation of legitimate transactions.  Or forensic analysis of illegitimate transactions.</t>
</list></t>

<t>It is anticipated that this identity registry would be used with <xref target="I-D.wendt-modern-drip"/> for supporting a continuously and timely updated local registry for a given service identity the provider is offering.</t>

</section>
</section>
<section anchor="message-and-control-flows" title="Message and Control Flows">

<section anchor="queries" title="Queries">

<t>Typical queries for finding a globally routable identity should be in the context of a public identity and service identity for an allocated routing identity.</t>

</section>
<section anchor="allocationassignment" title="Allocation/Assignment">

<t>When a provider customer has decided to allocate a given single or block level set of telephone numbers there is a PUT command that allocates the number, given the number wasn’t already allocated between the GET and the PUT.
As a result of a successful allocation, the telephone number will be removed from the unallocated bucket.</t>

<section anchor="api-definition" title="API definition">

<figure><artwork><![CDATA[
Request:
  PUT /idreg/createidentity

  Pass the following object (JSON) in the body.

  ---------------------------------------------------------------
  Property      Type         Description
  ---------------------------------------------------------------
  user_type     string       (MAND) Type representing user/sub
  user_type_id  string       (MAND) ID associated with user
                             Example: accountID of user
  user_info     stringified  (OPT) User specific metadata
                JSON         
  service_id    string       (MAND) Service type identifier
                             Example: "pstn", "voip". "volte"
  public_id     string       (MAND) User associated service
                             identifier. Example: telephone
                             number

  An Authorization Header MUST be included with a JWT including
  timestamp, x5u, and signature that will be associated with this
  transaction.
]]></artwork></figure>
<figure><artwork><![CDATA[
Response:
  ---------------------------------------------------------------
  Code  Status
  ---------------------------------------------------------------
  201   user profile created, associate public id,
        returns new routing ID
  200   user profile and public id association already exists
        returns the same routing ID (Idempotent)
  204   service identifier not found
  400   input errors
  401   unauthorized API access - Signature validation failed
  5xx   errors related to DB access and other system anomalies

  For HTTP/1.1 200 OK and HTTP/1.1 201 Created responses:
  ----------------------------------------------------------------
  Property     Type         Description
  ----------------------------------------------------------------
  user_id      string       Globally Unique ID (UUID) for user.
  routing_id   string       routing ID

]]></artwork></figure>

</section>
<section anchor="example" title="Example">

<t>As part of the allocation, the service provider will be required to provide following information:</t>

<t><list style="symbols">
  <t>publicID: telephone number in e.164 format (e.g., +12155551212).</t>
  <t>serviceID: “voip” by default, other services potentially in future.</t>
  <t>routingID: SIP URI with telephone number + domain representing service provider of record (e.g., sip:+12155551212@voip.example.com).</t>
  <t>timestamp: a timestamp retrieved from a common NTP server representing time of allocation, used for validating which service provider allocated first in race condition scenarios, and just for logging and historical reference in general.</t>
  <t>x5u: used for validation of signature</t>
  <t>signature: using a provider level <xref target="RFC5280"/> based private key/certificate, the provider MUST sign the information above to validate the change to the registry.</t>
</list></t>

</section>
</section>
<section anchor="update-entryport" title="Update Entry/Port">
<t>If a provider needs to update information related to an allocated entry, such as adding a publicID, modify routingID, etc.  or if there is a port where a new service provider will overwrite the entry with new information, the API should be the same.</t>

<t>There is a GET operation to read the current entry information, if the provider needs this information, (e.g., read/modify/write).
There also is a PUT operation that will write the updated entry information.  This will require a new timestamp and signature to validate the security of the operation and logging/historical purposes.</t>

<section anchor="api-definition-1" title="API definition">
<t>The PUT /idreg/createidentity API can be used for updates to entries as it’s an idempotent API.  For porting of telephone numbers either createidentity or a combination of the delete described in the next section and createidentity can be used.</t>

</section>
</section>
<section anchor="removalde-allocation" title="Removal/de-allocation">
<t>If a provider wants to remove an entry for the case where a customer removes his service and no longer wants to own or associate a public identity, a DELETE operation will be provided that will delete the entry, and for the case of a telephone number, will put the telephone number back in the pool of unallocated numbers.</t>

<section anchor="api-definition-2" title="API definition">

<figure><artwork><![CDATA[
Request:
  DELETE /idreg/identitymapping/serviceid/:id/publicid/:id

  Pass the following object (JSON) in the body.

  ---------------------------------------------------------------
  Property      Type         Description
  ---------------------------------------------------------------
  service_id    string       (MAND) Service type identifier
                             Example: "pstn", "voip". "volte"
  public_id     string       (MAND) User associated service
                             identifier. Example: telephone
                             number

  An Authorization Header MUST be included with a JWT including
  timestamp, x5u, and signature that will be associated with this
  transaction.
]]></artwork></figure>
<figure><artwork><![CDATA[
Response:
  ---------------------------------------------------------------
  Code  Status
  ---------------------------------------------------------------
  200   public ID association deleted
  204   record with service_id and public_id in request URI not
        found
  400   input errors
  401   unauthorized API access - Signature validation failed
  5xx   errors related to DB access and other system anomalies

  For HTTP/1.1 200 OK and HTTP/1.1 201 Created responses:
  ----------------------------------------------------------------
  Property     Type         Description
  ----------------------------------------------------------------
  user_id      string       Globally Unique ID (UUID) for user.
  routing_id   string       routing ID

]]></artwork></figure>

</section>
</section>
</section>
<section anchor="security_considerations" title="Security Considerations">

<t>TBD</t>

</section>
<section anchor="acknowledgements" title="Acknowledgements">

<t>Thanks to Harsha Bellur for collaboration on developing this model and it’s implementation.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference anchor='I-D.wendt-modern-drip'>
<front>
<title>Distributed Registry Protocol</title>

<author initials='H' surname='Bellur' fullname='Harsha Bellur'>
    <organization />
</author>

<author initials='C' surname='Wendt' fullname='Chris Wendt'>
    <organization />
</author>

<date month='July' day='8' year='2016' />

<abstract><t>This document describes a protocol for allowing a distributed set of nodes to synchronize a set of information in real-time with minimal amount of delay.  This is useful for registry types of information like identity and telephone numbers with associated routing and ownership information and could be extended to support other distributed real-time information updates as well.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-wendt-modern-drip-01' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-wendt-modern-drip-01.txt' />
</reference>




    </references>

    <references title='Informative References'>





<reference  anchor='RFC2119' target='http://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor='RFC3261' target='http://www.rfc-editor.org/info/rfc3261'>
<front>
<title>SIP: Session Initiation Protocol</title>
<author initials='J.' surname='Rosenberg' fullname='J. Rosenberg'><organization /></author>
<author initials='H.' surname='Schulzrinne' fullname='H. Schulzrinne'><organization /></author>
<author initials='G.' surname='Camarillo' fullname='G. Camarillo'><organization /></author>
<author initials='A.' surname='Johnston' fullname='A. Johnston'><organization /></author>
<author initials='J.' surname='Peterson' fullname='J. Peterson'><organization /></author>
<author initials='R.' surname='Sparks' fullname='R. Sparks'><organization /></author>
<author initials='M.' surname='Handley' fullname='M. Handley'><organization /></author>
<author initials='E.' surname='Schooler' fullname='E. Schooler'><organization /></author>
<date year='2002' month='June' />
<abstract><t>This document describes Session Initiation Protocol (SIP), an application-layer control (signaling) protocol for creating, modifying, and terminating sessions with one or more participants.  These sessions include Internet telephone calls, multimedia distribution, and multimedia conferences.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='3261'/>
<seriesInfo name='DOI' value='10.17487/RFC3261'/>
</reference>



<reference  anchor='RFC5280' target='http://www.rfc-editor.org/info/rfc5280'>
<front>
<title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
<author initials='D.' surname='Cooper' fullname='D. Cooper'><organization /></author>
<author initials='S.' surname='Santesson' fullname='S. Santesson'><organization /></author>
<author initials='S.' surname='Farrell' fullname='S. Farrell'><organization /></author>
<author initials='S.' surname='Boeyen' fullname='S. Boeyen'><organization /></author>
<author initials='R.' surname='Housley' fullname='R. Housley'><organization /></author>
<author initials='W.' surname='Polk' fullname='W. Polk'><organization /></author>
<date year='2008' month='May' />
<abstract><t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet.  An overview of this approach and model is provided as an introduction.  The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms.  Standard certificate extensions are described and two Internet-specific extensions are defined.  A set of required certificate extensions is specified.  The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions.  An algorithm for X.509 certification path validation is described.  An ASN.1 module and examples are provided in the appendices.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='5280'/>
<seriesInfo name='DOI' value='10.17487/RFC5280'/>
</reference>



<reference  anchor='RFC6120' target='http://www.rfc-editor.org/info/rfc6120'>
<front>
<title>Extensible Messaging and Presence Protocol (XMPP): Core</title>
<author initials='P.' surname='Saint-Andre' fullname='P. Saint-Andre'><organization /></author>
<date year='2011' month='March' />
<abstract><t>The Extensible Messaging and Presence Protocol (XMPP) is an application profile of the Extensible Markup Language (XML) that enables the near-real-time exchange of structured yet extensible data between any two or more network entities.  This document defines XMPP's core protocol methods: setup and teardown of XML streams, channel encryption, authentication, error handling, and communication primitives for messaging, network availability (&quot;presence&quot;), and request-response interactions.  This document obsoletes RFC 3920.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6120'/>
<seriesInfo name='DOI' value='10.17487/RFC6120'/>
</reference>




    </references>



  </back>
</rfc>

