lsd0002

LSD0002: re:claimID
Log | Files | Refs | README

draft-schanzen-reclaimid.xml (21226B)


      1 <?xml version='1.0' encoding='utf-8'?>
      2 <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent" [
      3 <!ENTITY RFC1034 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.1034.xml">
      4 <!ENTITY RFC1035 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.1035.xml">
      5 <!ENTITY RFC2119 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
      6 <!ENTITY RFC2782 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2782.xml">
      7 <!ENTITY RFC3629 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3629.xml">
      8 <!ENTITY RFC3686 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3686.xml">
      9 <!ENTITY RFC3826 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3826.xml">
     10 <!ENTITY RFC3912 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3912.xml">
     11 <!ENTITY RFC5869 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5869.xml">
     12 <!ENTITY RFC5890 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5890.xml">
     13 <!ENTITY RFC5891 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5891.xml">
     14 <!ENTITY RFC6781 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6781.xml">
     15 <!ENTITY RFC6895 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6895.xml">
     16 <!ENTITY RFC6979 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6979.xml">
     17 <!ENTITY RFC7748 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7748.xml">
     18 <!ENTITY RFC8032 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8032.xml">
     19 <!ENTITY RFC8126 PUBLIC '' "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8126.xml">
     20 ]>
     21 <?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
     22 <?rfc strict="yes" ?>
     23 <?rfc toc="yes" ?>
     24 <?rfc symrefs="yes"?>
     25 <?rfc sortrefs="yes" ?>
     26 <?rfc compact="yes" ?>
     27 <?rfc subcompact="no" ?>
     28 <rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="info" docName="draft-schanzen-reclaimid-00" ipr="trust200902" obsoletes="" updates="" submissionType="IETF" xml:lang="en" version="3">
     29  <!-- xml2rfc v2v3 conversion 2.26.0 -->
     30  <front>
     31   <title abbrev="reclaimid">
     32    re:claimID - A System for Self-sovereign, Decentralised Identity Management and Personal Data Sharing
     33   </title>
     34   <seriesInfo name="Internet-Draft" value="draft-schanzen-reclaimid-00"/>
     35   <author fullname="Martin Schanzenbach" initials="M." surname="Schanzenbach">
     36    <organization>GNUnet e.V.</organization>
     37    <address>
     38     <postal>
     39      <street>Boltzmannstrasse 3</street>
     40      <city>Garching</city>
     41      <code>85748</code>
     42      <country>DE</country>
     43     </postal>
     44     <email>schanzen@gnunet.org</email>
     45    </address>
     46   </author>
     47   <author fullname="Christian Grothoff" initials="C." surname="Grothoff">
     48    <organization>Berner Fachhochschule</organization>
     49    <address>
     50     <postal>
     51      <street>Hoeheweg 80</street>
     52      <city>Biel/Bienne</city>
     53      <code>2501</code>
     54      <country>CH</country>
     55     </postal>
     56     <email>grothoff@gnunet.org</email>
     57    </address>
     58   </author>
     59 
     60   <!-- Meta-data Declarations -->
     61   <area>General</area>
     62   <workgroup>Independent Stream</workgroup>
     63   <keyword>identity management</keyword>
     64   <abstract>
     65    <t>This document contains the re:claimID technical specification.</t>
     66   </abstract>
     67  </front>
     68  <middle>
     69    <section anchor="introduction" numbered="true" toc="default">
     70      <name>Introduction</name>
     71      <t>
     72        re:claimID is a decentralized, self-sovereign identity management
     73        system. It allows users to be in control over their digital identities
     74        without having to rely on central identity provider services (IdPs) in
     75        order to share personal data.
     76      </t>
     77      <t>
     78        re:claimID is built upon the GNU Name System <xref target="GNS"/>
     79        for data sharing and storage.
     80        It leverages the zone privacy and key blinding properties of the name
     81        system in order to provide a secure sharing and authorization mechanism.
     82      </t>
     83      <t>
     84        The system supports both "self-asserted" as well as third party asserted
     85        identity attributes. The assertion mechanisms are out of scope of this
     86        document.
     87      </t>
     88      <t>
     89        The re:claimID system can used and integrated into the OpenID Connect
     90        protocol.
     91      </t>
     92      <t>
     93        This document defines the normative wire format of resource records, resolution processes,
     94        cryptographic routines and security considerations for use by implementors.
     95      </t>
     96      <t>
     97        The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
     98        NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
     99        "OPTIONAL" in this document are to be interpreted as described
    100        in <xref target="RFC2119"/>.
    101      </t>
    102    </section>
    103    <section anchor="identities" numbered="true" toc="default">
    104      <name>Identities</name>
    105      <t>
    106        An identity in re:claimID is defined through a zone in GNS.
    107        As such, the creation of a zone in GNS implicitly also creates
    108        a re:claimID identity.
    109      </t>
    110      <section anchor="attributes" numbered="true" toc="default">
    111        <name>Attributes</name>
    112        <t>
    113          A re:claimID identity attribute is stored in GNS under records
    114          of type "RECLAIM_ATTRIBUTE". An attribute consists of an identifier,
    115          an optional attestation identifier, a type, a flag, a name and data.
    116          The record format of a RECLAIM_ATTRIBUTE is as follows:
    117        </t>
    118          <figure anchor="figure_gnsattribute">
    119            <artwork name="" type="" align="left" alt=""><![CDATA[
    120 0     8     16    24    32    40    48    56
    121 +-----+-----+-----+-----+-----+-----+-----+-----+
    122 |         TYPE          |         FLAG          |
    123 +-----+-----+-----+-----+-----+-----+-----+-----+
    124 |                      ID                       |
    125 |                                               |
    126 |                                               |
    127 |                                               |
    128 +-----+-----+-----+-----+-----+-----+-----+-----+
    129 |                    ATTESTATION                |
    130 |                                               |
    131 |                                               |
    132 |                                               |
    133 +-----+-----+-----+-----+-----+-----+-----+-----+
    134 |         NSIZE         |          DSIZE        |
    135 +-----+-----+-----+-----+-----+-----+-----+-----+
    136 /                  NAME + DATA                  /
    137 /                                               /
    138 +-----------------------------------------------+
    139              ]]></artwork>
    140            <!--        <postamble>which is a very simple example.</postamble>-->
    141          </figure>
    142          <t>
    143            where:
    144          </t>
    145          <dl>
    146            <dt>TYPE</dt>
    147            <dd>
    148              Is the 32 bit attribute type as defined in the GANA registry.
    149            </dd>
    150            <dt>FLAG</dt>
    151            <dd>
    152              Is a 32 bit attribute flag combination as defined in the GANA registry
    153            </dd>
    154            <dt>ID</dt>
    155            <dd>
    156              Is a 256 bit attribute identifier.
    157            </dd>
    158            <dt>ATTESTATION</dt>
    159            <dd>
    160              Is the 256 bit credential identifier which asserts this attribute.
    161              0 means no attestation.
    162            </dd>
    163            <dt>NSIZE</dt>
    164            <dd>
    165              32 bit length of the attribute name in bytes.
    166            </dd>
    167            <dt>DSIZE</dt>
    168            <dd>
    169              32 bit length of the attribute data.
    170            </dd>
    171            <dt>NAME</dt>
    172            <dd>
    173              The attribute name. A UTF-8 string with NULL byte at the end.
    174            </dd>
    175            <dt>DATA</dt>
    176            <dd>
    177              The attribute data.
    178            </dd>
    179          </dl>
    180      </section>
    181      <section anchor="credentials" numbered="true" toc="default">
    182        <name>Credentials</name>
    183        <t>
    184          A re:claimID credential is stored in GNS under records
    185          of type "RECLAIM_CREDENTIAL". A credential consists of an identifier,
    186          a type, a flag, a name and data.
    187          The record format of a RECLAIM_CREDENTIAL is as follows:
    188        </t>
    189          <figure anchor="figure_gnscred">
    190            <artwork name="" type="" align="left" alt=""><![CDATA[
    191 0     8     16    24    32    40    48    56
    192 +-----+-----+-----+-----+-----+-----+-----+-----+
    193 |         TYPE          |         FLAG          |
    194 +-----+-----+-----+-----+-----+-----+-----+-----+
    195 |                      ID                       |
    196 |                                               |
    197 |                                               |
    198 |                                               |
    199 +-----+-----+-----+-----+-----+-----+-----+-----+
    200 |         NSIZE         |          DSIZE        |
    201 +-----+-----+-----+-----+-----+-----+-----+-----+
    202 /                  NAME + DATA                  /
    203 /                                               /
    204 +-----------------------------------------------+
    205              ]]></artwork>
    206            <!--        <postamble>which is a very simple example.</postamble>-->
    207          </figure>
    208          <t>
    209            where:
    210          </t>
    211          <dl>
    212            <dt>TYPE</dt>
    213            <dd>
    214              Is the 32 bit credential type as defined in the GANA registry.
    215            </dd>
    216            <dt>FLAG</dt>
    217            <dd>
    218              Is a 32 bit credential flag combination as defined in the GANA registry
    219            </dd>
    220            <dt>ID</dt>
    221            <dd>
    222              Is a 256 bit credential identifier.
    223            </dd>
    224            <dt>NSIZE</dt>
    225            <dd>
    226              32 bit length of the credential name in bytes.
    227            </dd>
    228            <dt>DSIZE</dt>
    229            <dd>
    230              32 bit length of the credential data.
    231            </dd>
    232            <dt>NAME</dt>
    233            <dd>
    234              The credential name. A UTF-8 string with NULL byte at the end.
    235            </dd>
    236            <dt>DATA</dt>
    237            <dd>
    238              The credential data.
    239            </dd>
    240          </dl>
    241     </section>
    242     <section anchor="tickets" numbered="true" toc="default">
    243       <name>Tickets</name>
    244       <t>
    245         In order to share a set of identity attributes with a third party,
    246         re:claimID introduces the concept of "Tickets". A Ticket may be
    247         issued by a user for an identity to a relying party.
    248         The Ticket may then be used by the relying party to retrieve the
    249         shared attributes from the name system.
    250       </t>
    251       <t>
    252         A ticket is a GNS name that points to information pertaining to
    253         the authorization given to the relying party.
    254         The ticket has the format:
    255       </t>
    256       <figure>
    257 	<artwork type="abnf"><![CDATA[
    258 ticket = "TID.IDENTITY.zkey"
    259 TID = *gnslabel
    260 IDENTITY = *gnslabel
    261 ]]>
    262         </artwork>
    263       </figure>
    264        <t>
    265          The TID essentially serves as a shared secret between user and
    266          relying party. knowledge of the IDENTITY key and the TID allows
    267          the relying party to iteratively query attribute data in GNS.
    268          The record set under the TID label contains references to the shared attributes as
    269          well as any credential presentations which attest attribute values.
    270          The record set also includes the AUDIENCE key.
    271        </t>
    272        <section anchor="rp_rr" numbered="true" toc="default">
    273         <name>Relying party reference</name>
    274        <t>
    275          A RP resource record is stored in GNS under records
    276          of type "RECLAIM_RP". An RP reference
    277          is stored in GNS under the TID.
    278          The record format of a RECLAIM_RP is as follows:
    279        </t>
    280          <figure anchor="figure_gnsrp">
    281            <artwork name="" type="" align="left" alt=""><![CDATA[
    282 0     8     16    24    32    40    48    56
    283 +-----+-----+-----+-----+-----+-----+-----+-----+
    284 |                 AUDIENCE KEY                  |
    285 |                                               |
    286 |                                               |
    287 |                                               |
    288 +-----+-----+-----+-----+-----+-----+-----+-----+
    289              ]]></artwork>
    290            <!--        <postamble>which is a very simple example.</postamble>-->
    291          </figure>
    292          <t>
    293            where:
    294          </t>
    295          <dl>
    296            <dt>AUDIENCE KEY</dt>
    297            <dd>
    298              Is the audience zone key.
    299            </dd>
    300          </dl>
    301       </section>
    302        <section anchor="attrrefs" numbered="true" toc="default">
    303         <name>Attribute References</name>
    304        <t>
    305          An attribute reference is stored in GNS under records
    306          of type "RECLAIM_ATTRIBUTE_REF". An attribute reference
    307          is stored in GNS under a label derived from a ticket ID.
    308          The reference points to an actual attribute ID.
    309          The record format of a RECLAIM_ATTRIBUTE_REF is as follows:
    310        </t>
    311          <figure anchor="figure_gnsattrref">
    312            <artwork name="" type="" align="left" alt=""><![CDATA[
    313 0     8     16    24    32    40    48    56
    314 +-----+-----+-----+-----+-----+-----+-----+-----+
    315 |                 ATTRIBUTE ID                  |
    316 |                                               |
    317 |                                               |
    318 |                                               |
    319 +-----+-----+-----+-----+-----+-----+-----+-----+
    320              ]]></artwork>
    321            <!--        <postamble>which is a very simple example.</postamble>-->
    322          </figure>
    323          <t>
    324            where:
    325          </t>
    326          <dl>
    327            <dt>ATTRIBUTE ID</dt>
    328            <dd>
    329              Is the 256 bit attribute ID of an existing attribute.
    330            </dd>
    331          </dl>
    332       </section>
    333       <section anchor="credpres" numbered="true" toc="default">
    334         <name>Credential Presentations</name>
    335        <t>
    336          A re:claimID presentation is stored in GNS under records
    337          of type "RECLAIM_PRESENTATION". A presentation is derived from a
    338          credential and may contain only a subset of the attestations.
    339          The presentation construct is used to support selective disclosure
    340          of third party issued credentials. It consists of
    341          a type, a flag, a name and data.
    342          The record format of a RECLAIM_PRESENTATION is as follows:
    343        </t>
    344          <figure anchor="figure_gnspres">
    345            <artwork name="" type="" align="left" alt=""><![CDATA[
    346 0     8     16    24    32    40    48    56
    347 +-----+-----+-----+-----+-----+-----+-----+-----+
    348 |         TYPE          |         FLAG          |
    349 +-----+-----+-----+-----+-----+-----+-----+-----+
    350 |                      ID                       |
    351 |                                               |
    352 |                                               |
    353 |                                               |
    354 +-----+-----+-----+-----+-----+-----+-----+-----+
    355 |         NSIZE         |          DSIZE        |
    356 +-----+-----+-----+-----+-----+-----+-----+-----+
    357 /                  NAME + DATA                  /
    358 /                                               /
    359 +-----------------------------------------------+
    360              ]]></artwork>
    361            <!--        <postamble>which is a very simple example.</postamble>-->
    362          </figure>
    363          <t>
    364            where:
    365          </t>
    366          <dl>
    367            <dt>TYPE</dt>
    368            <dd>
    369              Is the 32 bit presentation type as defined in the GANA registry.
    370            </dd>
    371            <dt>FLAG</dt>
    372            <dd>
    373              Is a 32 bit presentation flag combination as defined in the GANA registry
    374            </dd>
    375            <dt>ID</dt>
    376            <dd>
    377              Is a 256 bit credential identifier.
    378            </dd>
    379            <dt>NSIZE</dt>
    380            <dd>
    381              32 bit length of the presentation name in bytes.
    382            </dd>
    383            <dt>DSIZE</dt>
    384            <dd>
    385              32 bit length of the credential data.
    386            </dd>
    387            <dt>NAME</dt>
    388            <dd>
    389              The credential name. A UTF-8 string with NULL byte at the end.
    390            </dd>
    391            <dt>DATA</dt>
    392            <dd>
    393              The credential data.
    394            </dd>
    395          </dl>
    396 
    397       </section>
    398     </section>
    399   </section>
    400    <section anchor="access" numbered="true" toc="default">
    401      <name>Access Management</name>
    402      <section anchor="authorization" numbered="true" toc="default">
    403        <name>Authorization</name>
    404      </section>
    405      <section anchor="revocation" numbered="true" toc="default">
    406        <name>Revocation</name>
    407      </section>
    408    </section>
    409    <section anchor="openid" numbered="true" toc="default">
    410      <name>OpenID Connect Integration</name>
    411      <section anchor="openidclientreg" numbered="true" toc="default">
    412        <name>Client Registration</name>
    413      </section>
    414      <section anchor="AuthorizationCode" numbered="true" toc="default">
    415        <name>Authorization Code</name>
    416      </section>
    417      <section anchor="IDToken" numbered="true" toc="default">
    418        <name>ID Token</name>
    419      </section>
    420      <section anchor="UserinfoEndpoint" numbered="true" toc="default">
    421        <name>Userinfo Endpoint</name>
    422      </section>
    423 
    424    </section>
    425    <section anchor="encoding" numbered="true" toc="default">
    426      <name>Internationalization and Character Encoding</name>
    427      <t>
    428          All attribute names in re:claimID are encoded in UTF-8
    429        <xref target="RFC3629" />.
    430      </t>
    431    </section>
    432 
    433    <section anchor="security" numbered="true" toc="default">
    434      <name>Security Considerations</name>
    435     <section anchor="tickets_generation" numbered="true" toc="default">
    436       <name>Ticket generation</name>
    437       <t>
    438         The TID in a Ticket <bcp14>SHOULD</bcp14> have at least 256 bits of entropy.
    439         The TID could be generated by simply sampling 32 bytes of random data and
    440         encoding it using a suitable text encoding compatible with GNS labels such as
    441         Base64.
    442       </t>
    443       <t>
    444         The TID <bcp14>MAY</bcp14> be derived using more sophisticated means in order to
    445         be able to relax security requirements on the exchange or storage of authorization metadata.
    446         One option is to derive the TID using ephemeral Diffie-Hellman.
    447         The user would first create an ephemeral key pair and calculate the TID in order to
    448         populate the GNS resource records:
    449       </t>
    450       <artwork name="" type="" align="left" alt=""><![CDATA[
    451 CreateTid(AUDIENCE_PK):
    452   x := rand() 
    453   ETK := X25519 (x, AUDIENCE_PK)
    454   dhs := X25519 (x, G)
    455   TID := Base64 (SHA-512 (dhs))
    456   return (TID,ETK)
    457   ]]></artwork>
    458       <t> 
    459         This allows to the user to only transfer the ETK which can in turn be
    460         used by the relying party to calculate the ticket identifier (TID)
    461         using its private key:
    462       </t>
    463        <artwork name="" type="" align="left" alt=""><![CDATA[
    464 CalculateTid(AUDIENCE_SK,ETK):
    465   dhs := X25519 (AUDIENCE_SK, G)
    466   return TID := Base64 (SHA-512 (dhs))
    467   ]]></artwork>
    468    </section>
    469    </section>
    470    <section anchor="gana" numbered="true" toc="default">
    471        <name>GANA Considerations</name>
    472        <t>
    473          GANA is requested to populate this registry as follows:
    474        </t>
    475        <figure anchor="figure_rrtypenums">
    476          <artwork name="" type="" align="left" alt=""><![CDATA[
    477 Number: 65549
    478 Name: RECLAIM_TICKET
    479 Contact: N/A
    480 References: [This.I-D]
    481 Description: Ticket
    482 
    483 Number: 65549
    484 Name: RECLAIM_ATTRIBUTE
    485 Contact: N/A
    486 References: [This.I-D]
    487 Description: Identity attribute
    488 
    489 Number: 65550
    490 Name: RECLAIM_ATTRIBUTE_REF
    491 Contact: N/A
    492 References: [This.I-D]
    493 Description: Refrerence to identity attribute
    494 
    495 Number: 65551
    496 Name: RECLAIM_OIDC_CLIENT
    497 Contact: N/A
    498 References: [This.I-D]
    499 Description: OIDC client description
    500 
    501 Number: 65552
    502 Name: RECLAIM_OIDC_REDIRECT
    503 Contact: N/A
    504 References: [This.I-D]
    505 Description: OIDC client redirect(s)
    506 
    507 Number: 65553
    508 Name: RECLAIM_CREDENTIAL
    509 Contact: N/A
    510 References: [This.I-D]
    511 Description: Credential
    512 
    513 Number: 65554
    514 Name: RECLAIM_PRESENTATION
    515 Contact: N/A
    516 References: [This.I-D]
    517 Description: Credential presentation
    518            ]]></artwork>
    519        </figure>
    520        <t>
    521          GANA is requested to amend the "GNUnet Signature Purpose" registry
    522          as follows:
    523        </t>
    524        <figure anchor="figure_purposenums">
    525          <artwork name="" type="" align="left" alt=""><![CDATA[
    526 Purpose: 27
    527 Name: RECLAIM_CODE_SIGN
    528 References: [This.I-D]
    529 Description: Signature in OIDC authorization code
    530            ]]></artwork>
    531        </figure>
    532      </section>
    533      <!-- gana -->
    534      <section>
    535        <name>Test Vectors</name>
    536      </section>
    537    </middle>
    538    <back>
    539      <references>
    540        <name>Normative References</name>
    541 
    542        &RFC2119;
    543        &RFC3629;
    544 
    545        <reference anchor="GNS" target="https://lsd.gnunet.org/lsd0001">
    546          <front>
    547            <title>The GNU Name System</title>
    548           <author initials="M." surname="Schanzenbach" fullname="Martin Schanzenbach">
    549             <organization>GNUnet e.V.</organization>
    550           </author>
    551 
    552           <author initials="C." surname="Grothoff" fullname="Christian Grothoff">
    553             <organization>GNUnet e.V.</organization>
    554           </author>
    555 
    556           <author initials="B." surname="Fix"
    557             fullname="Bernd Fix">
    558             <organization>GNUnet e.V.</organization>
    559           </author>
    560            <date year="2020" month="March"/>
    561          </front>
    562        </reference>
    563      </references>
    564    </back>
    565  </rfc>