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>