diff options
Diffstat (limited to 'doc/rfc/rfc9498.txt')
-rw-r--r-- | doc/rfc/rfc9498.txt | 3963 |
1 files changed, 3963 insertions, 0 deletions
diff --git a/doc/rfc/rfc9498.txt b/doc/rfc/rfc9498.txt new file mode 100644 index 0000000..43994a1 --- /dev/null +++ b/doc/rfc/rfc9498.txt @@ -0,0 +1,3963 @@ + + + + +Independent Submission M. Schanzenbach +Request for Comments: 9498 Fraunhofer AISEC +Category: Informational C. Grothoff +ISSN: 2070-1721 Berner Fachhochschule + B. Fix + GNUnet e.V. + November 2023 + + + The GNU Name System + +Abstract + + This document provides the GNU Name System (GNS) technical + specification. GNS is a decentralized and censorship-resistant + domain name resolution protocol that provides a privacy-enhancing + alternative to the Domain Name System (DNS) protocols. + + This document defines the normative wire format of resource records, + resolution processes, cryptographic routines, and security and + privacy considerations for use by implementers. + + This specification was developed outside the IETF and does not have + IETF consensus. It is published here to inform readers about the + function of GNS, guide future GNS implementations, and ensure + interoperability among implementations (for example, pre-existing + GNUnet implementations). + +Status of This Memo + + This document is not an Internet Standards Track specification; it is + published for informational purposes. + + This is a contribution to the RFC Series, independently of any other + RFC stream. The RFC Editor has chosen to publish this document at + its discretion and makes no statement about its value for + implementation or deployment. Documents approved for publication by + the RFC Editor are not candidates for any level of Internet Standard; + see Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9498. + +Copyright Notice + + Copyright (c) 2023 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. + +Table of Contents + + 1. Introduction + 1.1. Requirements Notation + 2. Terminology + 3. Overview + 3.1. Names and Zones + 3.2. Publishing Binding Information + 3.3. Resolving Names + 4. Zones + 4.1. Zone Top-Level Domain (zTLD) + 4.2. Zone Revocation + 5. Resource Records + 5.1. Zone Delegation Records + 5.1.1. PKEY + 5.1.2. EDKEY + 5.2. Redirection Records + 5.2.1. REDIRECT + 5.2.2. GNS2DNS + 5.3. Auxiliary Records + 5.3.1. LEHO + 5.3.2. NICK + 5.3.3. BOX + 6. Record Encoding for Remote Storage + 6.1. The Storage Key + 6.2. Plaintext Record Data (RDATA) + 6.3. The Resource Record Block + 7. Name Resolution + 7.1. Start Zones + 7.2. Recursion + 7.3. Record Processing + 7.3.1. REDIRECT + 7.3.2. GNS2DNS + 7.3.3. BOX + 7.3.4. Zone Delegation Records + 7.3.5. NICK + 8. Internationalization and Character Encoding + 9. Security and Privacy Considerations + 9.1. Availability + 9.2. Agility + 9.3. Cryptography + 9.4. Abuse Mitigation + 9.5. Zone Management + 9.6. DHTs as Remote Storage + 9.7. Revocations + 9.8. Zone Privacy + 9.9. Zone Governance + 9.10. Namespace Ambiguity + 10. GANA Considerations + 10.1. GNUnet Signature Purposes Registry + 10.2. GNS Record Types Registry + 10.3. .alt Subdomains Registry + 11. IANA Considerations + 12. Implementation and Deployment Status + 13. References + 13.1. Normative References + 13.2. Informative References + Appendix A. Usage and Migration + A.1. Zone Dissemination + A.2. Start Zone Configuration + A.3. Globally Unique Names and the Web + A.4. Migration Paths + Appendix B. Example Flows + B.1. AAAA Example Resolution + B.2. REDIRECT Example Resolution + B.3. GNS2DNS Example Resolution + Appendix C. Base32GNS + Appendix D. Test Vectors + D.1. Base32GNS Encoding/Decoding + D.2. Record Sets + D.3. Zone Revocation + Acknowledgements + Authors' Addresses + +1. Introduction + + This specification describes the GNU Name System (GNS), a censorship- + resistant, privacy-preserving, and decentralized domain name + resolution protocol. GNS cryptographically secures the binding of + names to arbitrary tokens, enabling it to double in some respects as + an alternative to some of today's public key infrastructures. + + Per Domain Name System (DNS) terminology [RFC1035], GNS roughly + follows the idea of a local root zone deployment (see [RFC8806]), + with the difference that the design encourages alternative roots and + does not expect all deployments to use the same or any specific root + zone. In the GNS reference implementation, users can autonomously + and freely delegate control of names to zones through their local + configurations. GNS expects each user to be in control of their + setup. By following the guidelines in Section 9.10, users should + manage to avoid any confusion as to how names are resolved. + + Name resolution and zone dissemination are based on the principle of + a petname system where users can assign local names to zones. The + GNS has its roots in ideas from the Simple Distributed Security + Infrastructure [SDSI], enabling the decentralized mapping of secure + identifiers to memorable names. One of the first academic + descriptions of the cryptographic ideas behind GNS can be found in + [GNS]. + + This document defines the normative wire format of resource records, + resolution processes, cryptographic routines, and security and + privacy considerations for use by implementers. + +1.1. Requirements Notation + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + +2. Terminology + + Apex Label: This type of label is used to publish resource records + in a zone that can be resolved without providing a specific label. + It is the GNS method for providing what is called the "zone apex" + in DNS [RFC4033]. The apex label is represented using the + character U+0040 ("@" without the quotes). + + Application: An application is a component that uses a GNS + implementation to resolve names into records and processes its + contents. + + Blinded Zone Key: A blinded zone key is a key derived from a zone + key and a label. The zone key and any blinded zone key derived + from it are unlinkable without knowledge of the specific label + used for the derivation. + + Extension Label: This type of label is used to refer to the + authoritative zone that the record is in. The primary use for the + extension label is in redirections where the redirection target is + defined relative to the authoritative zone of the redirection + record (see Section 5.2). The extension label is represented + using the character U+002B ("+" without the quotes). + + Label Separator: Labels in a name are separated using the label + separator U+002E ("." without the quotes). In GNS, except for + zone Top-Level Domains (zTLDs) (see below) and boxed records (see + Section 5.3.3), every label separator in a name indicates + delegation to another zone. + + Label: A GNS label is a label as defined in [RFC8499]. Labels are + UTF-8 strings in Unicode Normalization Form C (NFC) + [Unicode-UAX15]. The apex label and the extension label have + special purposes in the resolution protocol that are defined in + the rest of this document. Zone administrators MAY disallow + certain labels that might be easily confused with other labels + through registration policies (see also Section 9.4). + + Name: A name in GNS is a domain name as defined in [RFC8499]: names + are UTF-8 strings [RFC3629] consisting of an ordered list of + labels concatenated with a label separator. Names are resolved + starting from the rightmost label. GNS does not impose length + restrictions on names or labels. However, applications MAY ensure + that name and label lengths are compatible with DNS and, in + particular, Internationalized Domain Names for Applications (IDNA) + [RFC5890]. In the spirit of [RFC5895], applications MAY + preprocess names and labels to ensure compatibility with DNS or + support specific user expectations -- for example, according to + [Unicode-UTS46]. A GNS name may be indistinguishable from a DNS + name, and care must be taken by applications and implementers when + handling GNS names (see Section 9.10). In order to avoid + misinterpretation of example domains with (reserved) DNS domains, + this document uses the suffix ".gns.alt" in compliance with + [RFC9476]. ".gns.alt" is also registered in the GANA ".alt + Subdomains" registry [GANA]. + + Resolver: In this document, a resolver is the component of a GNS + implementation that provides the recursive name resolution logic + defined in Section 7. + + Resource Record: A GNS resource record is the information associated + with a label in a GNS zone. A GNS resource record contains + information as defined by its resource record type. + + Start Zone: In order to resolve any given GNS name, an initial Start + Zone must be determined for this name. The Start Zone can be + explicitly defined as part of the name using a zTLD. Otherwise, + it is determined through a local suffix-to-zone mapping (see + Section 7.1). + + Top-Level Domain (TLD): The rightmost part of a GNS name is a GNS + TLD. A GNS TLD can consist of one or more labels. Unlike DNS + TLDs (defined in [RFC8499]), GNS does not expect all users to use + the same global root zone. Instead, with the exception of zTLDs + (see Section 4.1), GNS TLDs are typically part of the + configuration of the local resolver (see Section 7.1) and thus + might not be globally unique. + + Zone: A GNS zone contains authoritative information (resource + records). A zone is uniquely identified by its zone key. Unlike + DNS zones, a GNS zone does not need to have an SOA record under + the apex label. + + Zone Key: The zone key is a key that uniquely identifies a zone. It + is usually a public key of an asymmetric key pair. However, the + established technical term "public key" is misleading, as in GNS a + zone key may be a shared secret that should not be disclosed to + unauthorized parties. + + Zone Key Derivation Function: The zone key derivation function + (ZKDF) blinds a zone key using a label. + + Zone Publisher: The zone publisher is the component of a GNS + implementation that provides local zone management and publication + as defined in Section 6. + + Zone Owner: The zone owner is the holder of the secret (typically a + private key), which (together with a label and a value to sign) + allows the creation of zone signatures that can be validated + against the respective blinded zone key. + + Zone Top-Level Domain (zTLD): A GNS zTLD is a sequence of GNS labels + at the end of a GNS name. The zTLD encodes a zone type and zone + key of a zone (see Section 4.1). Due to the statistical + uniqueness of zone keys, zTLDs are also globally unique. A zTLD + label sequence can only be distinguished from ordinary TLD label + sequences by attempting to decode the labels into a zone type and + zone key. + + Zone Type: The type of a GNS zone determines the cipher system and + binary encoding format of the zone key, blinded zone keys, and + cryptographic signatures. + +3. Overview + + GNS exhibits the three properties that are commonly used to describe + a petname system: + + Global names through the concept of zTLDs: + As zones can be uniquely identified by their zone keys and are + statistically unique, zTLDs are globally unique mappings to zones. + Consequently, GNS domain names with a zTLD suffix are also + globally unique. Names with zTLD suffixes are not memorable. + + Memorable petnames for zones: + Users can configure local, memorable references to zones. Such + petnames serve as zTLD monikers that provide convenient names for + zones to the local operator. The petnames may also be published + as suggestions for other users searching for a good label to use + when referencing the respective zone. + + A secure mapping from names to records: + GNS allows zone owners to map labels to resource records or to + delegate authority of names in the subdomain induced by a label to + other zones. Zone owners may choose to publish this information + to make it available to other users. Mappings are encrypted and + signed using keys derived from the respective label before being + published in remote storage. When names are resolved, signatures + on resource records, including delegations, are verified by the + recursive resolver. + + In the remainder of this document, the "implementer" refers to the + developer building a GNS implementation that includes the resolver, + zone publisher, and supporting configuration such as Start Zones (see + Section 7.1). + +3.1. Names and Zones + + It follows from the above that GNS does not support names that are + simultaneously global, secure, and memorable. Instead, names are + either global and not memorable or not globally unique and memorable. + An example for a global name pointing to the record "example" in a + zone is as follows: + + example.000G006K2TJNMD9VTCYRX7BRVV3HAEPS15E6NHDXKPJA1KAJJEG9AFF884 + + Now consider the case where a user locally configured the petname + "pet.gns.alt" for the zone with the "example" record of the name + above. The name "example.pet.gns.alt" would then point to the same + record as the globally unique name above, but name resolution would + only work on the local system where the "pet.gns.alt" petname is + configured. + + The delegation of petnames and subsequent resolution of delegation + build on ideas from the Simple Distributed Security Infrastructure + [SDSI]. In GNS, any user can create and manage any number of zones + (see Section 4) if their system provides a zone publisher + implementation. For each zone, the zone type determines the + respective set of cryptographic operations and the wire formats for + encrypted data, public keys, and signatures. A zone can be populated + with mappings from labels to resource records (see Section 5) by its + owner. A label can be mapped to a delegation record; this results in + the corresponding subdomain being delegated to another zone. + Circular delegations are explicitly allowed, including delegating a + subdomain to its immediate parent zone. In order to support (legacy) + applications as well as to facilitate the use of petnames, GNS + defines auxiliary record types in addition to supporting existing DNS + records. + +3.2. Publishing Binding Information + + Zone contents are encrypted and signed before being published in + remote key-value storage (see Section 6), as illustrated in Figure 1. + In this process, unique zone identification is hidden from the + network through the use of key blinding. Key blinding allows the + creation of signatures for zone contents using a blinded public/ + private key pair. This blinding is realized using a deterministic + key derivation from the original zone key and corresponding private + key using record label values as inputs from which blinding factors + are derived. Specifically, the zone owner can derive blinded private + keys for each record set published under a label, and a resolver can + derive the corresponding blinded public keys. It is expected that + GNS implementations use decentralized remote storage entities, such + as distributed hash tables (DHTs), in order to facilitate + availability within a network without the need for dedicated + infrastructure. The specification of such a distributed or + decentralized storage entity is out of scope for this document, but + possible existing implementations include those based on [RFC7363], + [Kademlia], or [R5N]. + + Host A | Remote | Host B + | Storage | + | | + | +---------+ | + | / /| | + Publish | +---------+ | | Publish + +-----------+ Records | | | | | Records +-----------+ + | Zone |----------|->| Record | |<-|----------| Zone | + | Publisher | | | Storage | | | | Publisher | + +-----------+ | | |/ | +-----------+ + A | +---------+ | A + | | | | + +---------+ | | +---------+ + / | /| | | / | /| + +---------+ | | | +---------+ | + | | | | | | | | + | Local | | | | | Local | | + | Zones | | | | | Zones | | + | |/ | | | |/ + +---------+ | | +---------+ + + Figure 1: An Example Diagram of Two Hosts Publishing GNS Zones + + A zone publisher implementation SHOULD be provided as part of a GNS + implementation to enable users to create and manage zones. If this + functionality is not implemented, names can still be resolved if zone + keys for the initial step in the name resolution have been configured + (see Section 7) or if the names end with a zTLD suffix. + +3.3. Resolving Names + + Applications use the resolver to look up GNS names. Starting from a + configurable Start Zone, names are resolved by following zone + delegations recursively, as illustrated in Figure 2. For each label + in a name, the recursive GNS resolver fetches the respective record + set from the storage layer (see Section 7). Without knowledge of the + label values and the zone keys, the different derived keys are + unlinkable to both the original zone key and each other. This + prevents zone enumeration (except via expensive online brute-force + attacks): to confirm the affiliation of a query or the corresponding + encrypted record set with a specific zone requires knowledge of both + the zone key and the label, neither of which is disclosed to remote + storage by the protocol. At the same time, the blinded zone key and + digital signatures associated with each encrypted record set allow + resolvers and oblivious remote storage to verify the integrity of the + published information without disclosing anything about the + originating zone or the record sets. + + Local Host | Remote + | Storage + | + | +---------+ + | / /| + | +---------+ | + +-----------+ Name +----------+ Recursive | | | | + | | Lookup | | Resolution | | Record | | + |Application|--------->| Resolver |-------------|->| Storage | | + | |<---------| |<------------|--| |/ + +-----------+ Results +----------+ Intermediate| +---------+ + A Results | + | | + +---------+ | + / | /| | + +---------+ | | + | | | | + | Start | | | + | Zones | | | + | |/ | + +---------+ | + + Figure 2: High-Level View of the GNS Resolution Process + +4. Zones + + A zone in GNS is uniquely identified by its zone type (ztype) and + zone key. Each zone can be referenced by its zTLD (see Section 4.1), + which is a string that encodes the zone type and zone key. The ztype + is a unique 32-bit number that corresponds to a resource record type + number identifying a delegation record type in the GANA "GNS Record + Types" registry [GANA]. The ztype is a unique identifier for the set + cryptographic functions of the zone and the format of the delegation + record type. Any ztype registration MUST define the following set of + cryptographic functions: + + KeyGen() -> d, zkey + A function for generating a new private key d and the + corresponding public zone key zkey. + + ZKDF(zkey, label) -> zkey' + A ZKDF that blinds a zone key zkey using a label. zkey and zkey' + must be unlinkable. Furthermore, blinding zkey with different + values for the label must result in different, unlinkable zkey' + values. + + S-Encrypt(zkey, label, expiration, plaintext) -> ciphertext + A symmetric encryption function that encrypts the plaintext to + derive ciphertext based on key material derived from the zone key + zkey, a label, and an expiration timestamp. In order to leverage + performance-enhancing caching features of certain underlying + storage entities -- in particular, DHTs -- a deterministic + encryption scheme is recommended. + + S-Decrypt(zkey, label, expiration, ciphertext) -> plaintext + A symmetric decryption function that decrypts the ciphertext into + plaintext based on key material derived from the zone key, a + label, and an expiration timestamp. + + Sign(d, message) -> signature + A function for signing a message using the private key d, yielding + an unforgeable cryptographic signature. In order to leverage + performance-enhancing caching features of certain underlying + storage entities -- in particular, DHTs -- a deterministic + signature scheme is recommended. + + Verify(zkey, message, signature) -> boolean + A function for verifying that the signature was created using the + private key d corresponding to the zone key zkey where d,zkey := + KeyGen(). The function returns a boolean value of "TRUE" if the + signature is valid and "FALSE" otherwise. + + SignDerived(d, label, message) -> signature + A function for signing a message (typically encrypted record data) + that can be verified using the derived zone key zkey' := + ZKDF(zkey, label). In order to leverage performance-enhancing + caching features of certain underlying storage entities -- in + particular, DHTs -- a deterministic signature scheme is + recommended. + + VerifyDerived(zkey', message, signature) -> boolean + A function for verifying the signature using the derived zone key + zkey' := ZKDF(zkey, label). The function returns a boolean value + of "TRUE" if the signature is valid and "FALSE" otherwise. + Depending on the signature scheme used, this function can be + identical to the Verify() function. + + The cryptographic functions of the default ztypes are specified with + their corresponding delegation records as discussed in Section 5.1. + In order to support cryptographic agility, additional ztypes MAY be + defined in the future that replace or update the default ztypes + defined in this document. All ztypes MUST be registered as dedicated + zone delegation record types in the GANA "GNS Record Types" registry + (see [GANA]). When defining new record types, the cryptographic + security considerations of this document -- in particular, + Section 9.3 -- apply. + +4.1. Zone Top-Level Domain (zTLD) + + A zTLD is a string that encodes the zone type and zone key into a + domain name suffix. A zTLD is used as a globally unique reference to + a zone in the process of name resolution. It is created by encoding + a binary concatenation of the zone type and zone key (see Figure 3). + The used encoding is a variation of the Crockford Base32 encoding + [CrockfordB32] called Base32GNS. The encoding and decoding symbols + for Base32GNS, including this variation, are defined in Table 4, + found in Appendix C. The functions for encoding and decoding based + on Table 4 are called Base32GNS-Encode and Base32GNS-Decode, + respectively. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | ZONE TYPE | ZONE KEY / + +-----+-----+-----+-----+ / + / / + / / + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 3: The Binary Representation of the zTLD + + The ZONE TYPE MUST be encoded in network byte order. The format of + the ZONE KEY depends entirely on the ZONE TYPE. + + Consequently, a zTLD is encoded and decoded as follows: + + zTLD := Base32GNS-Encode(ztype||zkey) + ztype||zkey := Base32GNS-Decode(zTLD) + + where "||" is the concatenation operator. + + The zTLD can be used "as is" as a rightmost label in a GNS name. If + an application wants to ensure DNS compatibility of the name, it MAY + also represent the zTLD as follows: if the zTLD is less than or equal + to 63 characters, it can be used as a zTLD as is. If the zTLD is + longer than 63 characters, the zTLD is divided into smaller labels + separated by the label separator. Here, the most significant bytes + of the "ztype||zkey" concatenation must be contained in the rightmost + label of the resulting string and the least significant bytes in the + leftmost label of the resulting string. This allows the resolver to + determine the ztype and zTLD length from the rightmost label and to + subsequently determine how many labels the zTLD should span. A GNS + implementation MUST support the division of zTLDs in DNS-compatible + label lengths. For example, assuming a zTLD of 130 characters, the + division is as follows: + + zTLD[126..129].zTLD[63..125].zTLD[0..62] + +4.2. Zone Revocation + + In order to revoke a zone key, a signed revocation message MUST be + published. This message MUST be signed using the private key of the + zone. The revocation message is broadcast to the network. The + specification of the broadcast mechanism is out of scope for this + document. A possible broadcast mechanism for efficient flooding in a + distributed network is implemented in [GNUnet]. Alternatively, + revocation messages could also be distributed via a distributed + ledger or a trusted central server. To prevent flooding attacks, the + revocation message MUST contain a proof of work (PoW). The + revocation message, including the PoW, MAY be calculated ahead of + time to support timely revocation. + + For all occurrences below, "Argon2id" is the password-based key + derivation function as defined in [RFC9106]. For the PoW + calculations, the algorithm is instantiated with the following + parameters: + + S: The salt. Fixed 16-byte string: "GnsRevocationPow" + + t: Number of iterations: 3 + + m: Memory size in KiB: 1024 + + T: Output length of hash in bytes: 64 + + p: Parallelization parameter: 1 + + v: Algorithm version: 0x13 + + y: Algorithm type (Argon2id): 2 + + X: Unused + + K: Unused + + Figure 4 illustrates the format of the data "P" on which the PoW is + calculated. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | POW | + +-----------------------------------------------+ + | TIMESTAMP | + +-----------------------------------------------+ + | ZONE TYPE | ZONE KEY / + +-----+-----+-----+-----+ / + / / + / / + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 4: The Format of the PoW Data + + POW: A 64-bit value that is a solution to the PoW. In network byte + order. + + TIMESTAMP: Denotes the absolute 64-bit date when the revocation was + computed. In microseconds since midnight (0 hour), January 1, + 1970 UTC in network byte order. + + ZONE TYPE: The 32-bit zone type in network byte order. + + ZONE KEY: The 256-bit public key zkey of the zone that is being + revoked. The wire format of this value is defined by the ZONE + TYPE. + + Usually, PoW schemes require that one POW value be found, such that a + specific number of leading zeroes are found in the hash result. This + number is then referred to as the difficulty of the PoW. In order to + reduce the variance in time it takes to calculate the PoW, a valid + GNS revocation requires that a number of different PoWs (Z, as + defined below) must be found that on average have at least D leading + zeroes. + + Given an average difficulty of D, the proofs have an expiration time + of EPOCH. Applications MAY calculate proofs with a difficulty that + is higher than D by providing POW values where there are (on average) + more than D bits of leading zeroes. With each additional bit of + difficulty, the lifetime of the proof is prolonged by another EPOCH. + Consequently, by calculating a more difficult PoW, the lifetime of + the proof -- and thus the persistence of the revocation message -- + can be increased on demand by the zone owner. + + The parameters are defined as follows: + + Z: The number of PoWs that are required. Its value is fixed at 32. + + D: The lower limit of the average difficulty. Its value is fixed at + 22. + + EPOCH: A single epoch. Its value is fixed at 365 days in + microseconds. + + The revocation message wire format is illustrated in Figure 5. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | TIMESTAMP | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | TTL | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | POW_0 | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | ... | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | POW_(Z-1) | + +-----------------------------------------------+ + | ZONE TYPE | ZONE KEY / + +-----+-----+-----+-----+ / + / / + / / + +-----+-----+-----+-----+-----+-----+-----+-----+ + / SIGNATURE / + / / + / / + / / + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 5: The Revocation Message Wire Format + + TIMESTAMP: Denotes the absolute 64-bit date when the revocation was + computed. In microseconds since midnight (0 hour), January 1, + 1970 UTC in network byte order. This is the same value as the + timestamp used in the individual PoW calculations. + + TTL: Denotes the relative 64-bit time to live of the record in + microseconds in network byte order. The field SHOULD be set to + EPOCH * 1.1. Given an average number of leading zeroes D', then + the field value MAY be increased up to (D'-D+1) * EPOCH * 1.1. + Validators MAY reject messages with lower or higher values when + received. + + POW_i: The values calculated as part of the PoW, in network byte + order. Each POW_i MUST be unique in the set of POW values. To + facilitate fast verification of uniqueness, the POW values MUST be + given in strictly monotonically increasing order in the message. + + ZONE TYPE: The 32-bit zone type corresponding to the zone key in + network byte order. + + ZONE KEY: The public key zkey of the zone that is being revoked and + the key to be used to verify SIGNATURE. + + SIGNATURE: A signature over a timestamp and the zone zkey of the + zone that is revoked and corresponds to the key used in the PoW. + The signature is created using the Sign() function of the + cryptosystem of the zone and the private key (see Section 4). + + The signature in the revocation message covers a 32-bit header + prefixed to the TIMESTAMP, ZONE TYPE, and ZONE KEY fields. The + header includes the key length and signature purpose. The wire + format is illustrated in Figure 6. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | SIZE | PURPOSE (0x03) | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | TIMESTAMP | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | ZONE TYPE | ZONE KEY / + +-----+-----+-----+-----+ / + / / + / / + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 6: The Wire Format of the Revocation Data for Signing + + SIZE: A 32-bit value containing the length of the signed data in + bytes in network byte order. + + PURPOSE: A 32-bit signature purpose flag. The value of this field + MUST be 3. The value is encoded in network byte order. It + defines the context in which the signature is created so that it + cannot be reused in other parts of the protocol that might include + possible future extensions. The value of this field corresponds + to an entry in the GANA "GNUnet Signature Purposes" registry + [GANA]. + + TIMESTAMP: Field as defined in the revocation message above. + + ZONE TYPE: Field as defined in the revocation message above. + + ZONE KEY: Field as defined in the revocation message above. + + In order to validate a revocation, the following steps MUST be taken: + + 1. The signature MUST be verified against the zone key. + + 2. The set of POW values MUST NOT contain duplicates; this MUST be + checked by verifying that the values are strictly monotonically + increasing. + + 3. The average number of leading zeroes D' resulting from the + provided POW values MUST be greater than or equal to D. + Implementers MUST NOT use an integer data type to calculate or + represent D'. + + The TTL field in the revocation message is informational. A + revocation MAY be discarded without checking the POW values or the + signature if the TTL (in combination with TIMESTAMP) indicates that + the revocation has already expired. The actual validity period of + the revocation MUST be determined by examining the leading zeroes in + the POW values. + + The validity period of the revocation is calculated as (D'-D+1) * + EPOCH * 1.1. The EPOCH is extended by 10% in order to deal with + poorly synchronized clocks. The validity period added on top of the + TIMESTAMP yields the expiration date. If the current time is after + the expiration date, the revocation is considered stale. + + Verified revocations MUST be stored locally. The implementation MAY + discard stale revocations and evict them from the local store at any + time. + + It is important that implementations broadcast received revocations + if they are valid and not stale. Should the calculated validity + period differ from the TTL field value, the calculated value MUST be + used as the TTL field value when forwarding the revocation message. + Systems might disagree on the current time, so implementations MAY + use stale but otherwise valid revocations but SHOULD NOT broadcast + them. Forwarded stale revocations MAY be discarded by the receiver. + + Any locally stored revocation MUST be considered during delegation + record processing (see Section 7.3.4). + +5. Resource Records + + A GNS implementation SHOULD provide a mechanism for creating and + managing local zones as well as a persistence mechanism (such as a + local database) for resource records. A new local zone is + established by selecting a zone type and creating a zone key pair. + If this mechanism is not implemented, no zones can be published in + storage (see Section 6) and name resolution is limited to non-local + Start Zones (see Section 7.1). + + A GNS resource record holds the data of a specific record in a zone. + The resource record format is illustrated in Figure 7. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | EXPIRATION | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | SIZE | FLAGS | TYPE | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | DATA / + / / + / / + + Figure 7: The Resource Record Wire Format + + EXPIRATION: Denotes the absolute 64-bit expiration date of the + record. In microseconds since midnight (0 hour), January 1, 1970 + UTC in network byte order. + + SIZE: Denotes the 16-bit size of the DATA field in bytes in network + byte order. + + FLAGS: A 16-bit field indicating special properties of the resource + record. The semantics of the different bits are defined below. + + TYPE: The 32-bit resource record type in network byte order. This + type can be one of the GNS resource records as defined in + Section 5, a DNS record type as defined in [RFC1035], or any of + the complementary standardized DNS resource record types. Note + that values below 2^16 are reserved for 16-bit DNS resource record + types allocated by IANA [RFC6895]. Values above 2^16 are + allocated by the GANA "GNS Record Types" registry [GANA]. + + DATA: The variable-length resource record data payload. The content + is defined by the respective type of the resource record. + + The FLAGS field is used to indicate special properties of the + resource record. An application creating resource records MUST set + all bits in FLAGS to 0 unless it specifically understands and wants + to set the respective flag. As additional flags can be defined in + future protocol versions, if an application or implementation + encounters a flag that it does not recognize, the flag MUST be + ignored. However, all implementations MUST understand the SHADOW and + CRITICAL flags defined below. Any combination of the flags specified + below is valid. Figure 8 illustrates the flag distribution in the + 16-bit FLAGS field of a resource record: + + 0 13 14 15 + +--------...+-------------+-------+---------+ + | Reserved |SUPPLEMENTAL |SHADOW |CRITICAL | + +--------...+-------------+-------+---------+ + + Figure 8: The Resource Record Flag Wire Format + + CRITICAL: If this flag is set, it indicates that processing is + critical. Implementations that do not support the record type or + are otherwise unable to process the record MUST abort resolution + upon encountering the record in the resolution process. + + SHADOW: If this flag is set, this record MUST be ignored by + resolvers unless all (other) records of the same record type have + expired. Used to allow zone publishers to facilitate good + performance when records change by allowing them to put future + values of records into storage. This way, future values can + propagate and can be cached before the transition becomes active. + + SUPPLEMENTAL: This is a supplemental record. It is provided in + addition to the other records. This flag indicates that this + record is not explicitly managed alongside the other records under + the respective name but might be useful for the application. + +5.1. Zone Delegation Records + + This section defines the initial set of zone delegation record types. + Any implementation SHOULD support all zone types defined here and MAY + support any number of additional delegation records defined in the + GANA "GNS Record Types" registry (see [GANA]). Not supporting some + zone types will result in resolution failures if the respective zone + type is encountered. This can be a valid choice if some zone + delegation record types have been determined to be cryptographically + insecure. Zone delegation records MUST NOT be stored or published + under the apex label. A zone delegation record type value is the + same as the respective ztype value. The ztype defines the + cryptographic primitives for the zone that is being delegated to. A + zone delegation record payload contains the public key of the zone to + delegate to. A zone delegation record MUST have the CRITICAL flag + set and MUST be the only non-supplemental record under a label. + There MAY be inactive records of the same type that have the SHADOW + flag set in order to facilitate smooth key rollovers. + + In the following, "||" is the concatenation operator of two byte + strings. The algorithm specification uses character strings such as + GNS labels or constant values. When used in concatenations or as + input to functions, the zero terminator of the character strings MUST + NOT be included. + +5.1.1. PKEY + + In GNS, a delegation of a label to a zone of type "PKEY" is + represented through a PKEY record. The PKEY DATA entry wire format + is illustrated in Figure 9. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | PUBLIC KEY | + | | + | | + | | + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 9: The PKEY Wire Format + + PUBLIC KEY: A 256-bit Ed25519 public key. + + For PKEY zones, the zone key material is derived using the curve + parameters of the twisted Edwards representation of Curve25519 + [RFC7748] (the reasoning behind choosing this curve can be found in + Section 9.3) with the ECDSA scheme [RFC6979]. The following naming + convention is used for the cryptographic primitives of PKEY zones: + + d: A 256-bit Ed25519 private key (clamped private scalar). + + zkey: The Ed25519 public zone key corresponding to d. + + p: The prime of edwards25519 as defined in [RFC7748], i.e., 2^255 - + 19. + + G: The group generator (X(P),Y(P)). With X(P),Y(P) of edwards25519 + as defined in [RFC7748]. + + L: The order of the prime-order subgroup of edwards25519 as defined + in [RFC7748]. + + KeyGen(): The generation of the private scalar d and the curve point + zkey := d*G (where G is the group generator of the elliptic curve) + as defined in Section 2.2 of [RFC6979] represents the KeyGen() + function. + + The zone type and zone key of a PKEY are 4 + 32 bytes in length. + This means that a zTLD will always fit into a single label and does + not need any further conversion. Given a label, the output zkey' of + the ZKDF(zkey, label) function is calculated as follows for PKEY + zones: + + ZKDF(zkey, label): + PRK_h := HKDF-Extract("key-derivation", zkey) + h := HKDF-Expand(PRK_h, label || "gns", 512 / 8) + zkey' := (h mod L) * zkey + return zkey' + + The PKEY cryptosystem uses an HMAC-based key derivation function + (HKDF) as defined in [RFC5869], using SHA-512 [RFC6234] for the + extraction phase and SHA-256 [RFC6234] for the expansion phase. + PRK_h is key material retrieved using an HKDF that uses the string + "key-derivation" as the salt and the zone key as the initial keying + material. h is the 512-bit HKDF expansion result and must be + interpreted in network byte order. The expansion information input + is a concatenation of the label and the string "gns". The + multiplication of zkey with h in ZKDF() is a point multiplication, + while the multiplication of d with h in SignDerived() below is a + scalar multiplication. + + The Sign() and Verify() functions for PKEY zones are implemented + using 512-bit ECDSA deterministic signatures as specified in + [RFC6979]. The same functions can be used for derived keys: + + SignDerived(d, label, message): + zkey := d * G + PRK_h := HKDF-Extract("key-derivation", zkey) + h := HKDF-Expand(PRK_h, label || "gns", 512 / 8) + d' := (h * d) mod L + return Sign(d', message) + + A signature is valid for the derived public key zkey' := ZKDF(zkey, + label) if the following holds: + + VerifyDerived(zkey', message, signature): + return Verify(zkey', message, signature) + + The S-Encrypt() and S-Decrypt() functions use AES in counter mode as + defined in [MODES] (CTR-AES256): + + S-Encrypt(zkey, label, expiration, plaintext): + PRK_k := HKDF-Extract("gns-aes-ctx-key", zkey) + PRK_n := HKDF-Extract("gns-aes-ctx-iv", zkey) + K := HKDF-Expand(PRK_k, label, 256 / 8) + NONCE := HKDF-Expand(PRK_n, label, 32 / 8) + BLOCK_COUNTER := 0x0000000000000001 + IV := NONCE || expiration || BLOCK_COUNTER + return CTR-AES256(K, IV, plaintext) + + S-Decrypt(zkey, label, expiration, ciphertext): + PRK_k := HKDF-Extract("gns-aes-ctx-key", zkey) + PRK_n := HKDF-Extract("gns-aes-ctx-iv", zkey) + K := HKDF-Expand(PRK_k, label, 256 / 8) + NONCE := HKDF-Expand(PRK_n, label, 32 / 8) + BLOCK_COUNTER := 0x0000000000000001 + IV := NONCE || expiration || BLOCK_COUNTER + return CTR-AES256(K, IV, ciphertext) + + The key K and counter Initialization Vector (IV) are derived from the + record label and the zone key zkey, using an HKDF as defined in + [RFC5869]. SHA-512 [RFC6234] is used for the extraction phase and + SHA-256 [RFC6234] for the expansion phase. The output keying + material is 32 bytes (256 bits) for the symmetric key and 4 bytes (32 + bits) for the NONCE. The symmetric key K is a 256-bit AES key + [RFC3826]. + + The nonce is combined with a 64-bit IV and a 32-bit block counter as + defined in [RFC3686]. The block counter begins with a value of 1, + and it is incremented to generate subsequent portions of the key + stream. The block counter is a 32-bit integer value in network byte + order. The format of the counter IV used by the S-Encrypt() and + S-Decrypt() functions is illustrated in Figure 10. + + 0 8 16 24 32 + +-----+-----+-----+-----+ + | NONCE | + +-----+-----+-----+-----+ + | EXPIRATION | + | | + +-----+-----+-----+-----+ + | BLOCK COUNTER | + +-----+-----+-----+-----+ + + Figure 10: Structure of the Counter IV as Used in S-Encrypt() and + S-Decrypt() + +5.1.2. EDKEY + + In GNS, a delegation of a label to a zone of type "EDKEY" is + represented through an EDKEY record. The EDKEY DATA entry wire + format is illustrated in Figure 11. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | PUBLIC KEY | + | | + | | + | | + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 11: The EDKEY DATA Wire Format + + PUBLIC KEY: A 256-bit EdDSA zone key. + + For EDKEY zones, the zone key material is derived using the curve + parameters of the twisted Edwards representation of Curve25519 + [RFC7748] (a.k.a. Ed25519) with the Ed25519 scheme [ed25519] as + specified in [RFC8032]. The following naming convention is used for + the cryptographic primitives of EDKEY zones: + + d: A 256-bit EdDSA private key. + + a: An integer derived from d using the SHA-512 hash function as + defined in [RFC8032]. + + zkey: The EdDSA public key corresponding to d. It is defined as the + curve point a*G where G is the group generator of the elliptic + curve as defined in [RFC8032]. + + p: The prime of edwards25519 as defined in [RFC8032], i.e., 2^255 - + 19. + + G: The group generator (X(P),Y(P)). With X(P),Y(P) of edwards25519 + as defined in [RFC8032]. + + L: The order of the prime-order subgroup of edwards25519 as defined + in [RFC8032]. + + KeyGen(): The generation of the private key d and the associated + public key zkey := a*G (where G is the group generator of the + elliptic curve and a is an integer derived from d using the + SHA-512 hash function) as defined in Section 5.1.5 of [RFC8032] + represents the KeyGen() function. + + The zone type and zone key of an EDKEY are 4 + 32 bytes in length. + This means that a zTLD will always fit into a single label and does + not need any further conversion. + + The "EDKEY" ZKDF instantiation is based on [Tor224]. As noted above + for KeyGen(), a is calculated from d using the SHA-512 hash function + as defined in Section 5.1.5 of [RFC8032]. Given a label, the output + of the ZKDF function is calculated as follows: + + ZKDF(zkey, label): + /* Calculate the blinding factor */ + PRK_h := HKDF-Extract("key-derivation", zkey) + h := HKDF-Expand(PRK_h, label || "gns", 512 / 8) + /* Ensure that h == h mod L */ + h := h mod L + + zkey' := h * zkey + return zkey' + + Implementers SHOULD employ a constant-time scalar multiplication for + the constructions above to protect against timing attacks. + Otherwise, timing attacks could leak private key material if an + attacker can predict when a system starts the publication process. + + The EDKEY cryptosystem uses an HKDF as defined in [RFC5869], using + SHA-512 [RFC6234] for the extraction phase and HMAC-SHA-256 [RFC6234] + for the expansion phase. PRK_h is key material retrieved using an + HKDF that uses the string "key-derivation" as the salt and the zone + key as the initial keying material. The blinding factor h is the + 512-bit HKDF expansion result. The expansion information input is a + concatenation of the label and the string "gns". The result of the + HKDF must be clamped and interpreted in network byte order. a is the + 256-bit integer corresponding to the 256-bit private key d. The + multiplication of zkey with h is a point multiplication. + + The Sign(d, message) and Verify(zkey, message, signature) procedures + MUST be implemented as defined in [RFC8032]. + + Signatures for EDKEY zones use a derived private scalar d'; this is + not compliant with [RFC8032]. As the private key that corresponds to + the derived private scalar is not known, it is not possible to + deterministically derive the signature part R according to [RFC8032]. + Instead, signatures MUST be generated as follows for any given + message and private zone key: a nonce is calculated from the highest + 32 bytes of the expansion of the private key d and the blinding + factor h. The nonce is then hashed with the message to r. This way, + the full derivation path is included in the calculation of the R + value of the signature, ensuring that it is never reused for two + different derivation paths or messages. + + SignDerived(d, label, message): + /* Key expansion */ + dh := SHA-512(d) + /* EdDSA clamping */ + a := dh[0..31] + a[0] := a[0] & 248 + a[31] := a[31] & 127 + a[31] := a[31] | 64 + /* Calculate zkey corresponding to d */ + zkey := a * G + + /* Calculate blinding factor */ + PRK_h := HKDF-Extract("key-derivation", zkey) + h := HKDF-Expand(PRK_h, label || "gns", 512 / 8) + /* Ensure that h == h mod L */ + h := h mod L + + d' := (h * a) mod L + nonce := SHA-256(dh[32..63] || h) + r := SHA-512(nonce || message) + R := r * G + S := r + SHA-512(R || zkey' || message) * d' mod L + return (R,S) + + A signature (R,S) is valid for the derived public key zkey' := + ZKDF(zkey, label) if the following holds: + + VerifyDerived(zkey', message, signature): + (R,S) := signature + return S * G == R + SHA-512(R, zkey', message) * zkey' + + The S-Encrypt() and S-Decrypt() functions use XSalsa20 as defined in + [XSalsa20] and use the XSalsa20-Poly1305 encryption function: + + S-Encrypt(zkey, label, expiration, plaintext): + PRK_k := HKDF-Extract("gns-xsalsa-ctx-key", zkey) + PRK_n := HKDF-Extract("gns-xsalsa-ctx-iv", zkey) + K := HKDF-Expand(PRK_k, label, 256 / 8) + NONCE := HKDF-Expand(PRK_n, label, 128 / 8) + IV := NONCE || expiration + return XSalsa20-Poly1305(K, IV, plaintext) + + S-Decrypt(zkey, label, expiration, ciphertext): + PRK_k := HKDF-Extract("gns-xsalsa-ctx-key", zkey) + PRK_n := HKDF-Extract("gns-xsalsa-ctx-iv", zkey) + K := HKDF-Expand(PRK_k, label, 256 / 8) + NONCE := HKDF-Expand(PRK_n, label, 128 / 8) + IV := NONCE || expiration + return XSalsa20-Poly1305(K, IV, ciphertext) + + The result of the XSalsa20-Poly1305 encryption function is the + encrypted ciphertext followed by the 128-bit authentication tag. + Accordingly, the length of encrypted data equals the length of the + data plus the 16 bytes of the authentication tag. + + The key K and counter IV are derived from the record label and the + zone key zkey using an HKDF as defined in [RFC5869]. SHA-512 + [RFC6234] is used for the extraction phase and SHA-256 [RFC6234] for + the expansion phase. The output keying material is 32 bytes (256 + bits) for the symmetric key and 16 bytes (128 bits) for the NONCE. + The symmetric key K is a 256-bit XSalsa20 key [XSalsa20]. No + additional authenticated data (AAD) is used. + + The nonce is combined with an 8-byte IV. The IV is the expiration + time of the resource record block in network byte order. The + resulting counter (IV) wire format is illustrated in Figure 12. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | NONCE | + | | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | EXPIRATION | + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 12: The Counter Block Initialization Vector + +5.2. Redirection Records + + Redirection records are used to redirect resolution. Any + implementation SHOULD support all redirection record types defined + here and MAY support any number of additional redirection records + defined in the GANA "GNS Record Types" registry [GANA]. Redirection + records MUST have the CRITICAL flag set. Not supporting some record + types can result in resolution failures. This can be a valid choice + if some redirection record types have been determined to be insecure, + or if an application has reasons to not support redirection to DNS + for reasons such as complexity or security. Redirection records MUST + NOT be stored or published under the apex label. + +5.2.1. REDIRECT + + A REDIRECT record is the GNS equivalent of a CNAME record in DNS. A + REDIRECT record MUST be the only non-supplemental record under a + label. There MAY be inactive records of the same type that have the + SHADOW flag set in order to facilitate smooth changes of redirection + targets. No other records are allowed. Details on the processing of + this record are provided in Section 7.3.1. A REDIRECT DATA entry is + illustrated in Figure 13. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | REDIRECT NAME | + / / + / / + | | + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 13: The REDIRECT DATA Wire Format + + REDIRECT NAME: The name to continue with. This value can be a + regular name or a relative name. Relative GNS names are indicated + by an extension label (U+002B ("+")) as the rightmost label. The + string is UTF-8 encoded and zero terminated. + +5.2.2. GNS2DNS + + A GNS2DNS record delegates resolution to DNS. The resource record + contains a DNS name for the resolver to continue with in DNS followed + by a DNS server. Both names are in the format defined in [RFC1034] + for DNS names. There MAY be multiple GNS2DNS records under a label. + There MAY also be DNSSEC DS records or any other records used to + secure the connection with the DNS servers under the same label. + There MAY be inactive records of the same type or types that have the + SHADOW flag set in order to facilitate smooth changes of redirection + targets. No other non-supplemental record types are allowed in the + same record set. A GNS2DNS DATA entry is illustrated in Figure 14. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | NAME | + / / + / / + | | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | DNS SERVER NAME | + / / + / / + | | + +-----------------------------------------------+ + + Figure 14: The GNS2DNS DATA Wire Format + + NAME: The name to continue with in DNS. The value is UTF-8 encoded + and zero terminated. + + DNS SERVER NAME: The DNS server to use. This value can be an IPv4 + address in dotted-decimal form, an IPv6 address in colon- + hexadecimal form, or a DNS name. It can also be a relative GNS + name ending with a "+" as the rightmost label. The implementation + MUST check the string syntactically for an IP address in the + respective notation before checking for a relative GNS name. If + all three checks fail, the name MUST be treated as a DNS name. + The value is UTF-8 encoded and zero terminated. + + NOTE: If an application uses DNS names obtained from GNS2DNS records + in a DNS request, they MUST first be converted to an IDNA-compliant + representation [RFC5890]. + +5.3. Auxiliary Records + + This section defines the initial set of auxiliary GNS record types. + Any implementation SHOULD be able to process the specified record + types according to Section 7.3. + +5.3.1. LEHO + + The LEHO (LEgacy HOstname) record is used to provide a hint for + legacy hostnames: applications can use the GNS to look up IPv4 or + IPv6 addresses of Internet services. However, connecting to such + services sometimes not only requires the knowledge of an IP address + and port but also requires the canonical DNS name of the service to + be transmitted over the transport protocol. In GNS, legacy hostname + records provide applications the DNS name that is required to + establish a connection to such a service. The most common use case + is HTTP virtual hosting and TLS Server Name Indication [RFC6066], + where a DNS name must be supplied in the HTTP "Host"-header and the + TLS handshake, respectively. Using a GNS name in those cases might + not work, as it might not be globally unique. Furthermore, even if + uniqueness is not an issue, the legacy service might not even be + aware of GNS. + + A LEHO resource record is expected to be found together with A or + AAAA resource records with IPv4 or IPv6 addresses. A LEHO DATA entry + is illustrated in Figure 15. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | LEGACY HOSTNAME | + / / + / / + | | + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 15: The LEHO DATA Wire Format + + LEGACY HOSTNAME: A UTF-8 string (which is not zero terminated) + representing the legacy hostname. + + NOTE: If an application uses a LEHO value in an HTTP request header + (e.g., a "Host"-header), it MUST be converted to an IDNA-compliant + representation [RFC5890]. + +5.3.2. NICK + + Nickname records can be used by zone administrators to publish a + label that a zone prefers to have used when it is referred to. This + is a suggestion for other zones regarding what label to use when + creating a delegation record (Section 5.1) containing this zone key. + This record SHOULD only be stored locally under the apex label "@" + but MAY be returned with record sets under any label as a + supplemental record. Section 7.3.5 details how a resolver must + process supplemental and non-supplemental NICK records. A NICK DATA + entry is illustrated in Figure 16. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | NICKNAME | + / / + / / + | | + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 16: The NICK DATA Wire Format + + NICKNAME: A UTF-8 string (which is not zero terminated) representing + the preferred label of the zone. This string MUST be a valid GNS + label. + +5.3.3. BOX + + GNS lookups are expected to return all of the required useful + information in one record set. This avoids unnecessary additional + lookups and cryptographically ties together information that belongs + together, making it impossible for an adversarial storage entity to + provide partial answers that might omit information critical for + security. + + This general strategy is incompatible with the special labels used by + DNS for SRV and TLSA records. Thus, GNS defines the BOX record + format to box up SRV and TLSA records and include them in the record + set of the label they are associated with. For example, a TLSA + record for "_https._tcp.example.org" will be stored in the record set + of "example.org" as a BOX record with service (SVC) 443 (https), + protocol (PROTO) 6 (tcp), and record TYPE "TLSA". For reference, see + also [RFC2782]. A BOX DATA entry is illustrated in Figure 17. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | PROTO | SVC | TYPE | + +-----------+-----------------------------------+ + | RECORD DATA | + / / + / / + | | + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 17: The BOX DATA Wire Format + + PROTO: The 16-bit protocol number in network byte order. Values + below 2^8 are reserved for 8-bit Internet Protocol numbers + allocated by IANA [RFC5237] (e.g., 6 for TCP). Values above 2^8 + are allocated by the GANA "GNUnet Overlay Protocols" registry + [GANA]. + + SVC: The 16-bit service value of the boxed record in network byte + order. In the case of TCP and UDP, it is the port number. + + TYPE: The 32-bit record type of the boxed record in network byte + order. + + RECORD DATA: A variable-length field containing the "DATA" format of + TYPE as defined for the respective TYPE. Thus, for TYPE values + below 2^16, the format is the same as the respective record type's + binary format in DNS. + +6. Record Encoding for Remote Storage + + Any API that allows storing a block under a 512-bit key and + retrieving one or more blocks from a key can be used by an + implementation for remote storage. To be useful, and to be able to + support the defined zone delegation record encodings, the API MUST + permit storing blocks of size 176 bytes or more and SHOULD allow + blocks of size 1024 bytes or more. In the following, it is assumed + that an implementation realizes two procedures on top of storage: + + PUT(key, block) + GET(key) -> block + + A GNS implementation publishes blocks in accordance with the + properties and recommendations of the underlying remote storage. + This can include a periodic refresh operation to preserve the + availability of published blocks. + + There is no mechanism for explicitly deleting individual blocks from + remote storage. However, blocks include an EXPIRATION field, which + guides remote storage implementations to decide when to delete + blocks. Given multiple blocks for the same key, remote storage + implementations SHOULD try to preserve and return the block with the + largest EXPIRATION value. + + All resource records from the same zone sharing the same label are + encrypted and published together in a single resource record block + (RRBLOCK) in the remote storage under a key q, as illustrated in + Figure 18. A GNS implementation MUST NOT include expired resource + records in blocks. An implementation MUST use the PUT storage + procedure when record sets change to update the zone contents. + Implementations MUST ensure that the EXPIRATION fields of RRBLOCKs + increase strictly monotonically for every change, even if the + smallest expiration time of records in the block does not increase. + + Local Host | Remote + | Storage + | + | +---------+ + | / /| + | +---------+ | + +-----------+ | | | | + | | +-----------+PUT(q, RRBLOCK) | | Record | | + | User | | Zone |----------------|->| Storage | | + | | | Publisher | | | |/ + +-----------+ +-----------+ | +---------+ + | A | + | | Zone records | + | | grouped by label | + | | | + | +---------+ | + |Create / Delete / | /| | + |and Update +---------+ | | + |Local Zones | | | | + | | Local | | | + +-------------->| Zones | | | + | |/ | + +---------+ | + + Figure 18: Management and Publication of Local Zones in + Distributed Storage + + Storage key derivation and record block creation are specified in the + following sections and illustrated in Figure 19. + + +----------+ +-------+ +------------+ +-------------+ + | Zone Key | | Label | | Record Set | | Private Key | + +----------+ +-------+ +------------+ +-------------+ + | | | | + | | v | + | | +-----------+ | + | +---------->| S-Encrypt | | + +----------|---------->+-----------+ | + | | | | | + | | | v v + | | | +-------------+ + | +---------------|-->| SignDerived | + | | | +-------------+ + | | | | + | v v v + | +------+ +--------------+ + +----->| ZKDF |------->| Record Block | + +------+ +--------------+ + | + v + +------+ +-------------+ + | Hash |------->| Storage Key | + +------+ +-------------+ + + Figure 19: Storage Key and Record Block Creation Overview + +6.1. The Storage Key + + The storage key is derived from the zone key and the respective label + of the contained records. The required knowledge of both the zone + key and the label in combination with the similarly derived symmetric + secret keys and blinded zone keys ensures query privacy (see + [RFC8324], Section 3.5). + + Given a label, the storage key q is derived as follows: + + q := SHA-512(ZKDF(zkey, label)) + + label: A UTF-8 string under which the resource records are + published. + + zkey: The zone key. + + q: The 512-bit storage key under which the resource record block is + published. It is the SHA-512 hash [RFC6234] over the derived zone + key. + +6.2. Plaintext Record Data (RDATA) + + GNS records from a zone are grouped by their labels such that all + records under the same label are published together as a single block + in storage. Such grouped record sets MAY be paired with supplemental + records. + + Record data (RDATA) is the format used to encode such a group of GNS + records. The binary format of RDATA is illustrated in Figure 20. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | EXPIRATION | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | SIZE | FLAGS | TYPE | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | DATA / + / / + / / + +-----+-----+-----+-----+-----+-----+-----+-----+ + | EXPIRATION | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | SIZE | FLAGS | TYPE | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | DATA / + / / + +-----+-----+-----+-----+-----+-----+-----+-----+ + | PADDING / + / / + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 20: The RDATA Wire Format + + EXPIRATION, SIZE, TYPE, FLAGS, and DATA: Definitions for these + fields are provided below Figure 7 in Section 5. + + PADDING: When serializing records into RDATA, a GNS implementation + MUST ensure that the size of the RDATA is a power of two using + this field. The field MUST be set to zero and MUST be ignored on + receipt. As a special exception, record sets with (only) a zone + delegation record type are never padded. + +6.3. The Resource Record Block + + The resource records grouped in an RDATA are encrypted using the + S-Encrypt() function defined by the zone type of the zone to which + the resource records belong and prefixed with metadata into a + resource record block (RRBLOCK) for remote storage. The GNS RRBLOCK + wire format is illustrated in Figure 21. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | SIZE | ZONE TYPE | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | ZONE KEY / + / (BLINDED) / + | | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | SIGNATURE | + / / + / / + | | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | EXPIRATION | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | BDATA | + / / + / / + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 21: The RRBLOCK Wire Format + + SIZE: A 32-bit value containing the length of the block in bytes in + network byte order. Despite the message format's use of a 32-bit + value, implementations MAY refuse to publish blocks beyond a + certain size significantly below the theoretical block size limit + of 4 GB. + + ZONE TYPE: The 32-bit ztype in network byte order. + + ZONE KEY (BLINDED): The blinded zone key "ZKDF(zkey, label)" to be + used to verify SIGNATURE. The length and format of the blinded + public key depend on the ztype. + + SIGNATURE: The signature is computed over the EXPIRATION and BDATA + fields as shown in Figure 22. The length and format of the + signature depend on the ztype. The signature is created using the + SignDerived() function of the cryptosystem of the zone (see + Section 4). + + EXPIRATION: Specifies when the RRBLOCK expires and the encrypted + block SHOULD be removed from storage and caches, as it is likely + stale. However, applications MAY continue to use non-expired + individual records until they expire. The RRBLOCK expiration + value MUST be computed by first determining for each record type + present in the RRBLOCK the maximum expiration time of all records + of that type, including shadow records. Then, the minimum of all + of these expiration times is taken. The final expiration time is + then the larger value of (1) the previous EXPIRATION value of a + previous RRBLOCK for the same storage key plus one (if any) and + (2) the computed minimum expiration time across the contained + record types. This ensures strict monotonicity (see Section 9.3). + This is a 64-bit absolute date in microseconds since midnight (0 + hour), January 1, 1970 UTC in network byte order. + + BDATA: The encrypted RDATA computed using S-Encrypt() with the zone + key, label, and expiration time as additional inputs. Its + ultimate size and content are determined by the S-Encrypt() + function of the ztype. + + The signature over the public key covers a 32-bit pseudo header + conceptually prefixed to the EXPIRATION and BDATA fields. The wire + format is illustrated in Figure 22. + + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | SIZE | PURPOSE (0x0F) | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | EXPIRATION | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | BDATA | + / / + / / + +-----+-----+-----+-----+-----+-----+-----+-----+ + + Figure 22: The Wire Format Used for Creating the Signature of the + RRBLOCK + + SIZE: A 32-bit value containing the length of the signed data in + bytes in network byte order. + + PURPOSE: A 32-bit signature purpose flag in network byte order. The + value of this field MUST be 15. It defines the context in which + the signature is created so that it cannot be reused in other + parts of the protocol that might include possible future + extensions. The value of this field corresponds to an entry in + the GANA "GNUnet Signature Purposes" registry [GANA]. + + EXPIRATION: Field as defined in the RRBLOCK message above. + + BDATA: Field as defined in the RRBLOCK message above. + +7. Name Resolution + + Names in GNS are resolved by recursively querying the record storage. + Recursive in this context means that a resolver does not provide + intermediate results for a query to the application. Instead, it + MUST respond to a resolution request with either the requested + resource record or an error message if resolution fails. Figure 23 + illustrates how an application requests the lookup of a GNS name (1). + The application MAY provide a desired record type to the resolver. + Subsequently, a Start Zone is determined (2) and the recursive + resolution process started. This is where the desired record type is + used to guide processing. For example, if a zone delegation record + type is requested, the resolution of the apex label in that zone must + be skipped, as the desired record is already found. Details on how + the resolution process is initiated and each iterative result (3a,3b) + in the resolution is processed are provided in the sections below. + The results of the lookup are eventually returned to the application + (4). The implementation MUST NOT filter the returned resource record + sets according to the desired record type. Filtering of record sets + is typically done by the application. + + Local Host | Remote + | Storage + | + | +---------+ + | / /| + | +---------+ | + +-----------+ (1) Name +----------+ | | | | + | | Lookup | | (3a) GET(q) | | Record | | + |Application|----------| Resolver |---------------|->| Storage | | + | |<---------| |<--------------|--| |/ + +-----------+ (4) +----------+ (3b) RRBLOCK | +---------+ + Records A | + | | + (2) Determination of | | + Start Zone | | + | | + +---------+ | + / | /| | + +---------+ | | + | | | | + | Start | | | + | Zones | | | + | |/ | + +---------+ | + + Figure 23: The Recursive GNS Resolution Process + +7.1. Start Zones + + The resolution of a GNS name starts by identifying the Start Zone + suffix. Once the Start Zone suffix is identified, recursive + resolution of the remainder of the name is initiated (see + Section 7.2). There are two types of Start Zone suffixes: zTLDs and + local suffix-to-zone mappings. The choice of available suffix-to- + zone mappings is at the sole discretion of the local system + administrator or user. This property addresses the issue of a single + hierarchy with a centrally controlled root and the related issue of + distribution and management of root servers in DNS (see Sections 3.12 + and 3.10 of [RFC8324], respectively). + + For names ending with a zTLD, the Start Zone is explicitly given in + the suffix of the name to resolve. In order to ensure uniqueness of + names with zTLDs, any implementation MUST use the given zone as the + Start Zone. An implementation MUST first try to interpret the + rightmost label of the given name as the beginning of a zTLD (see + Section 4.1). If the rightmost label cannot be (partially) decoded + or if it does not indicate a supported ztype, the name is treated as + a normal name and Start Zone discovery MUST continue with finding a + local suffix-to-zone mapping. If a valid ztype can be found in the + rightmost label, the implementation MUST try to synthesize and decode + the zTLD to retrieve the Start Zone key according to Section 4.1. If + the zTLD cannot be synthesized or decoded, the resolution of the name + fails and an error is returned to the application. Otherwise, the + zone key MUST be used as the Start Zone: + + Example name: www.example.<zTLD> + => Start Zone: zkey of type ztype + => Name to resolve from Start Zone: www.example + + For names not ending with a zTLD, the resolver MUST determine the + Start Zone through a local suffix-to-zone mapping. Suffix-to-zone + mappings MUST be configurable through a local configuration file or + database by the user or system administrator. A suffix MAY consist + of multiple GNS labels concatenated with a label separator. If + multiple suffixes match the name to resolve, the longest matching + suffix MUST be used. The suffix length of two results MUST NOT be + equal. This indicates a misconfiguration, and the implementation + MUST return an error. The following is a non-normative example + mapping of Start Zones: + + Example name: www.example.xyz.gns.alt + Local suffix mappings: + xyz.gns.alt = zTLD0 := Base32GNS(ztype0||zkey0) + example.xyz.gns.alt = zTLD1 := Base32GNS(ztype1||zkey1) + example.com.gns.alt = zTLD2 := Base32GNS(ztype2||zkey2) + ... + => Start Zone: zkey1 + => Name to resolve from Start Zone: www + + The process given above MAY be supplemented with other mechanisms if + the particular application requires a different process. If no Start + Zone can be identified, resolution MUST fail and an error MUST be + returned to the application. + +7.2. Recursion + + In each step of the recursive name resolution, there is an + authoritative zone zkey and a name to resolve. The name MAY be + empty. If the name is empty, it is interpreted as the apex label + "@". Initially, the authoritative zone is the Start Zone. + + From here, the following steps are recursively executed, in order: + + 1. Extract the rightmost label from the name to look up. + + 2. Calculate q using the label and zkey as defined in Section 6.1. + + 3. Perform a storage query GET(q) to retrieve the RRBLOCK. + + 4. Check that (a) the block is not expired, (b) the SHA-512 hash of + the derived authoritative zone key zkey' from the RRBLOCK matches + the query q, and (c) the signature is valid. If any of these + tests fail, the RRBLOCK MUST be ignored and, if applicable, the + storage lookup GET(q) MUST continue to look for other RRBLOCKs. + + 5. Obtain the RDATA by decrypting the BDATA contained in the RRBLOCK + using S-Decrypt() as defined by the zone type, effectively + inverting the process described in Section 6.3. + + Once a well-formed block has been decrypted, the records from RDATA + are subjected to record processing. + +7.3. Record Processing + + In record processing, only the valid records obtained are considered. + To filter records by validity, the resolver MUST at least check the + expiration time and the FLAGS field of the respective record. + Specifically, the resolver MUST disregard expired records. + Furthermore, SHADOW and SUPPLEMENTAL flags can also exclude records + from being considered. If the resolver encounters a record with the + CRITICAL flag set and does not support the record type, the + resolution MUST be aborted and an error MUST be returned. + Information indicating that the critical record could not be + processed SHOULD be returned in the error description. The + implementation MAY choose not to return the reason for the failure, + merely complicating troubleshooting for the user. + + The next steps depend on the context of the name that is being + resolved: + + Case 1: If the filtered record set consists of a single REDIRECT + record, the remainder of the name is prepended to the REDIRECT + DATA and the recursion is started again from the resulting name. + Details are provided in Section 7.3.1. + + Case 2: If the filtered record set consists exclusively of one or + more GNS2DNS records, resolution continues with DNS. Details are + provided in Section 7.3.2. + + Case 3: If the remainder of the name to be resolved is of the format + "_SERVICE._PROTO" and the record set contains one or more matching + BOX records, the records in the BOX records are the final result + and the recursion is concluded as described in Section 7.3.3. + + Case 4: If the current record set consists of a single delegation + record, resolution of the remainder of the name is delegated to + the target zone as described in Section 7.3.4. + + Case 5: If the remainder of the name to resolve is empty, the record + set is the final result. If any NICK records are in the final + result set, they MUST first be processed according to + Section 7.3.5. Otherwise, the record result set is directly + returned as the final result. + + Finally, if none of the above cases are applicable, resolution fails + and the resolver MUST return an empty record set. + +7.3.1. REDIRECT + + If the remaining name is empty and the desired record type is + REDIRECT, the resolution concludes with the REDIRECT record. If the + rightmost label of the REDIRECT NAME is the extension label (U+002B + ("+")), resolution continues in GNS with the new name in the current + zone. Otherwise, the resulting name is resolved via the default + operating system name resolution process. This can in turn trigger a + GNS name resolution process, depending on the system configuration. + If resolution continues in DNS, the name MUST first be converted to + an IDNA-compliant representation [RFC5890]. + + In order to prevent infinite loops, the resolver MUST implement loop + detection or limit the number of recursive resolution steps. The + loop detection MUST be effective even if a REDIRECT found in GNS + triggers subsequent GNS lookups via the default operating system name + resolution process. + +7.3.2. GNS2DNS + + A resolver returns GNS2DNS records when all of the following + conditions are met: + + 1. The resolver encounters one or more GNS2DNS records; + + 2. The remaining name is empty; and + + 3. The desired record type is GNS2DNS. + + Otherwise, it is expected that the resolver first resolves the IP + addresses of the specified DNS name servers. The DNS name MUST be + converted to an IDNA-compliant representation [RFC5890] for + resolution in DNS. GNS2DNS records MAY contain numeric IPv4 or IPv6 + addresses, allowing the resolver to skip this step. The DNS server + names might themselves be names in GNS or DNS. If the rightmost + label of the DNS server name is the extension label (U+002B ("+")), + the rest of the name is to be interpreted relative to the zone of the + GNS2DNS record. If the DNS server name ends in a label + representation of a zone key, the DNS server name is to be resolved + against the GNS zone zkey. + + Multiple GNS2DNS records can be stored under the same label, in which + case the resolver MUST try all of them. The resolver MAY try them in + any order or even in parallel. If multiple GNS2DNS records are + present, the DNS name MUST be identical for all of them. Otherwise, + it is not clear which name the resolver is supposed to follow. If + different DNS names are present, the resolution fails and an + appropriate error SHOULD be returned to the application. + + If there are DNSSEC DS records or any other records used to secure + the connection with the DNS servers stored under the label, the DNS + resolver SHOULD use them to secure the connection with the DNS + server. + + Once the IP addresses of the DNS servers have been determined, the + DNS name from the GNS2DNS record is appended to the remainder of the + name to be resolved and is resolved by querying the DNS name + server(s). The synthesized name has to be converted to an IDNA- + compliant representation [RFC5890] for resolution in DNS. If such a + conversion is not possible, the resolution MUST be aborted and an + error MUST be returned. Information indicating that the critical + record could not be processed SHOULD be returned in the error + description. The implementation MAY choose not to return the reason + for the failure, merely complicating troubleshooting for the user. + + As the DNS servers specified are possibly authoritative DNS servers, + the GNS resolver MUST support recursive DNS resolution and MUST NOT + delegate this to the authoritative DNS servers. The first successful + recursive name resolution result is returned to the application. In + addition, the resolver SHOULD return the queried DNS name as a + supplemental LEHO record (see Section 5.3.1) with a relative + expiration time of one hour. + + Once the transition from GNS to DNS is made through a GNS2DNS record, + there is no "going back". The (possibly recursive) resolution of the + DNS name MUST NOT delegate back into GNS and should only follow the + DNS specifications. For example, names contained in DNS CNAME + records MUST NOT be interpreted by resolvers that support both DNS + and GNS as GNS names. + + GNS resolvers SHOULD offer a configuration option to disable DNS + processing to avoid information leakage and provide a consistent + security profile for all name resolutions. Such resolvers would + return an empty record set upon encountering a GNS2DNS record during + the recursion. However, if GNS2DNS records are encountered in the + record set for the apex label and a GNS2DNS record is explicitly + requested by the application, such records MUST still be returned, + even if DNS support is disabled by the GNS resolver configuration. + +7.3.3. BOX + + When a BOX record is received, a GNS resolver must unbox it if the + name to be resolved continues with "_SERVICE._PROTO". Otherwise, the + BOX record is to be left untouched. This way, TLSA (and SRV) records + do not require a separate network request, and TLSA records become + inseparable from the corresponding address records. + +7.3.4. Zone Delegation Records + + When the resolver encounters a record of a supported zone delegation + record type (such as PKEY or EDKEY) and the remainder of the name is + not empty, resolution continues recursively with the remainder of the + name in the GNS zone specified in the delegation record. + + Whenever a resolver encounters a new GNS zone, it MUST check against + the local revocation list (see Section 4.2) to see whether the + respective zone key has been revoked. If the zone key was revoked, + the resolution MUST fail with an empty result set. + + Implementations MUST NOT allow multiple different zone delegations + under a single label (except if some are shadow records). + Implementations MAY support any subset of ztypes. Implementations + MUST NOT process zone delegation records stored under the apex label + ("@"). If a zone delegation record is encountered under the apex + label, resolution fails and an error MUST be returned. The + implementation MAY choose not to return the reason for the failure, + merely impacting troubleshooting information for the user. + + If the remainder of the name to resolve is empty and a record set was + received containing only a single delegation record, the recursion is + continued with the record value as the authoritative zone and the + apex label "@" as the remaining name. The exception is the case + where the desired record type as specified by the application is + equal to the ztype, in which case the delegation record is returned. + +7.3.5. NICK + + NICK records are only relevant to the recursive resolver if the + record set in question is the final result, which is to be returned + to the application. The encountered NICK records can be either + supplemental (see Section 5) or non-supplemental. If the NICK record + is supplemental, the resolver only returns the record set if one of + the non-supplemental records matches the queried record type. It is + possible that one record set contains both supplemental and non- + supplemental NICK records. + + The differentiation between a supplemental and non-supplemental NICK + record allows the application to match the record to the + authoritative zone. Consider the following example: + + Query: alice.example.gns.alt (type=A) + Result: + A: 192.0.2.1 + NICK: eve (non-supplemental) + + In this example, the returned NICK record is non-supplemental. For + the application, this means that the NICK belongs to the zone + "alice.example.gns.alt" and is published under the apex label along + with an A record. The NICK record is interpreted as follows: the + zone defined by "alice.example.gns.alt" wants to be referred to as + "eve". In contrast, consider the following: + + Query: alice.example.gns.alt (type=AAAA) + Result: + AAAA: 2001:db8::1 + NICK: john (supplemental) + + In this case, the NICK record is marked as supplemental. This means + that the NICK record belongs to the zone "example.gns.alt" and is + published under the label "alice" along with a AAAA record. Here, + the NICK record should be interpreted as follows: the zone defined by + "example.gns.alt" wants to be referred to as "john". This + distinction is likely useful for other records published as + supplemental. + +8. Internationalization and Character Encoding + + All names in GNS are encoded in UTF-8 [RFC3629]. Labels MUST be + canonicalized using Normalization Form C (NFC) [Unicode-UAX15]. This + does not include any DNS names found in DNS records, such as CNAME + record data, which is internationalized through the IDNA + specifications; see [RFC5890]. + +9. Security and Privacy Considerations + +9.1. Availability + + In order to ensure availability of records beyond their absolute + expiration times, implementations MAY allow relative expiration time + values of records to be locally defined. Records can then be + published recurringly with updated absolute expiration times by the + implementation. + + Implementations MAY allow users to manage private records in their + zones that are not published in storage. Private records are treated + just like regular records when resolving labels in local zones, but + their data is completely unavailable to non-local users. + +9.2. Agility + + The security of cryptographic systems depends on both the strength of + the cryptographic algorithms chosen and the strength of the keys used + with those algorithms. This security also depends on the engineering + of the protocol used by the system to ensure that there are no non- + cryptographic ways to bypass the security of the overall system. + This is why developers of applications managing GNS zones SHOULD + select a default ztype considered secure at the time of releasing the + software. For applications targeting end users that are not expected + to understand cryptography, the application developer MUST NOT leave + the ztype selection of new zones to end users. + + This document concerns itself with the selection of cryptographic + algorithms used in GNS. The algorithms identified in this document + are not known to be broken (in the cryptographic sense) at the + current time, and cryptographic research so far leads us to believe + that they are likely to remain secure into the foreseeable future. + However, this is not necessarily forever, and it is expected that new + revisions of this document will be issued from time to time to + reflect the current best practices in this area. + + In terms of crypto-agility, whenever the need for an updated + cryptographic scheme arises to, for example, replace ECDSA over + Ed25519 for PKEY records, it can simply be introduced through a new + record type. Zone administrators can then replace the delegation + record type for future records. The old record type remains, and + zones can iteratively migrate to the updated zone keys. To ensure + that implementations correctly generate an error message when + encountering a ztype that they do not support, current and future + delegation records must always have the CRITICAL flag set. + +9.3. Cryptography + + The following considerations provide background on the design choices + of the ztypes specified in this document. When specifying new ztypes + as per Section 4, the same considerations apply. + + GNS PKEY zone keys use ECDSA over Ed25519. This is an unconventional + choice, as ECDSA is usually used with other curves. However, + standardized ECDSA curves are problematic for a range of reasons, as + described in the Curve25519 and EdDSA papers [RFC7748] [ed25519]. + Using EdDSA directly is also not possible, as a hash function is used + on the private key and will destroy the linearity that the key + blinding in GNS depends upon. We are not aware of anyone suggesting + that using Ed25519 instead of another common curve of similar size + would lower the security of ECDSA. GNS uses 256-bit curves; that + way, the encoded (public) keys fit into a single DNS label, which is + good for usability. + + In order to ensure ciphertext indistinguishability, care must be + taken with respect to the IV in the counter block. In our design, + the IV always includes the expiration time of the record block. When + applications store records with relative expiration times, + monotonicity is implicitly ensured because each time a block is + published in storage, its IV is unique, as the expiration time is + calculated dynamically and increases monotonically with the system + time. Still, an implementation MUST ensure that when relative + expiration times are decreased, the expiration time of the next + record block MUST be after the last published block. For records + where an absolute expiration time is used, the implementation MUST + ensure that the expiration time is always increased when the record + data changes. For example, the expiration time on the wire could be + increased by a single microsecond even if the user did not request a + change. In the case of deletion of all resource records under a + label, the implementation MUST keep track of the last absolute + expiration time of the last published resource block. + Implementations MAY define and use a special record type as a + tombstone that preserves the last absolute expiration time but then + MUST take care to not publish a block with such a tombstone record. + When new records are added under this label later, the implementation + MUST ensure that the expiration times are after the last published + block. Finally, in order to ensure monotonically increasing + expiration times, the implementation MUST keep a local record of the + last time obtained from the system clock, so as to construct a + monotonic clock if the system clock jumps backwards. + +9.4. Abuse Mitigation + + GNS names are UTF-8 strings. Consequently, GNS faces issues with + respect to name spoofing similar to those for DNS with respect to + internationalized domain names. In DNS, attackers can register + similar-sounding or similar-looking names (see above) in order to + execute phishing attacks. GNS zone administrators must take into + account this attack vector and incorporate rules in order to mitigate + it. + + Further, DNS can be used to combat illegal content on the Internet by + having the respective domains seized by authorities. However, the + same mechanisms can also be abused in order to impose state + censorship. Avoiding that possibility is one of the motivations + behind GNS. In GNS, TLDs are not enumerable. By design, the Start + Zone of the resolver is defined locally, and hence such a seizure is + difficult and ineffective in GNS. + +9.5. Zone Management + + In GNS, zone administrators need to manage and protect their zone + keys. Once a private zone key is lost, it cannot be recovered, and + the zone revocation message cannot be computed anymore. Revocation + messages can be precalculated if revocation is required in cases + where a private zone key is lost. Zone administrators, and for GNS + this includes end users, are required to responsibly and diligently + protect their cryptographic keys. GNS supports signing records in + advance ("offline") in order to support processes (such as air gaps) + that aim to protect private keys. + + Similarly, users are required to manage their local Start Zone + configuration. In order to ensure the integrity and availability of + names, users must ensure that their local Start Zone information is + not compromised or outdated. It can be expected that the processing + of zone revocations and an initial Start Zone are provided with a GNS + implementation ("drop shipping"). Shipping an initial Start Zone + configuration effectively establishes a root zone. Extension and + customization of the zone are at the full discretion of the user. + + While implementations following this specification will be + interoperable, if two implementations connect to different remote + storage entities, they are mutually unreachable. This can lead to a + state where a record exists in the global namespace for a particular + name, but the implementation is not communicating with the remote + storage entity that contains the respective block and is hence unable + to resolve it. This situation is similar to a split-horizon DNS + configuration. The remote storage entity used will most likely + depend on the specific application context using GNS resolution. For + example, one application is the resolution of hidden services within + the Tor network [TorRendSpec], which would suggest using Tor routers + for remote storage. Implementations of "aggregated" remote storage + entities are conceivable but are expected to be the exception. + +9.6. DHTs as Remote Storage + + This document does not specify the properties of the underlying + remote storage, which is required by any GNS implementation. It is + important to note that the properties of the underlying remote + storage are directly inherited by the GNS implementation. This + includes both security and other non-functional properties such as + scalability and performance. Implementers should take great care + when selecting or implementing a DHT for use as remote storage in a + GNS implementation. DHTs with reasonable security and performance + properties exist [R5N]. It should also be taken into consideration + that GNS implementations that build upon different DHT overlays are + unlikely to be mutually reachable. + +9.7. Revocations + + Zone administrators are advised to pregenerate zone revocations and + to securely store the revocation information if the zone key is lost, + compromised, or replaced in the future. Precalculated revocations + can cease to be valid due to expirations or protocol changes such as + epoch adjustments. Consequently, implementers and users must take + precautions in order to manage revocations accordingly. + + Revocation payloads do not include a "new" key for key replacement. + Inclusion of such a key would have two major disadvantages: + + 1. If a revocation is published after a private key was compromised, + allowing key replacement would be dangerous: if an adversary took + over the private key, the adversary could then broadcast a + revocation with a key replacement. For the replacement, the + compromised owner would have no chance to issue a revocation. + Thus, allowing a revocation message to replace a private key + makes dealing with key compromise situations worse. + + 2. Sometimes, key revocations are used with the objective of + changing cryptosystems. Migration to another cryptosystem by + replacing keys via a revocation message would only be secure as + long as both cryptosystems are still secure against forgery. + Such a planned, non-emergency migration to another cryptosystem + should be done by running zones for both cipher systems in + parallel for a while. The migration would conclude by revoking + the legacy zone key only when it is deemed no longer secure and, + hopefully, after most users have migrated to the replacement. + +9.8. Zone Privacy + + GNS does not support authenticated denial of existence of names + within a zone. Record data is published in encrypted form using keys + derived from the zone key and record label. Zone administrators + should carefully consider whether (1) a label and zone key are public + or (2) one or both of these should be used as a shared secret to + restrict access to the corresponding record data. Unlike public zone + keys, low-entropy labels can be guessed by an attacker. If an + attacker knows the public zone key, the use of well-known or + guessable labels effectively threatens the disclosure of the + corresponding records. + + It should be noted that the guessing attack on labels only applies if + the zone key is somehow disclosed to the adversary. GNS itself does + not disclose it during a lookup or when resource records are + published (as only the blinded zone keys are used on the network). + However, zone keys do become public during revocation. + + It is thus RECOMMENDED to use a label with sufficient entropy to + prevent guessing attacks if any data in a resource record set is + sensitive. + +9.9. Zone Governance + + While DNS is distributed, in practice it relies on centralized, + trusted registrars to provide globally unique names. As awareness of + the central role DNS plays on the Internet increases, various + institutions are using their power (including legal means) to engage + in attacks on the DNS, thus threatening the global availability and + integrity of information on the Internet. While a wider discussion + of this issue is out of scope for this document, analyses and + investigations can be found in recent academic research works, + including [SecureNS]. + + GNS is designed to provide a secure, privacy-enhancing alternative to + the DNS name resolution protocol, especially when censorship or + manipulation is encountered. In particular, it directly addresses + concerns in DNS with respect to query privacy. However, depending on + the governance of the root zone, any deployment will likely suffer + from the issue of a single hierarchy with a centrally controlled root + and the related issue of distribution and management of root servers + in DNS, as raised in Sections 3.12 and 3.10 of [RFC8324], + respectively. In DNS, those issues directly result from the + centralized root zone governance at the Internet Corporation for + Assigned Names and Numbers (ICANN), which allows it to provide + globally unique names. + + In GNS, Start Zones give users local authority over their preferred + root zone governance. It enables users to replace or enhance a + trusted root zone configuration provided by a third party (e.g., the + implementer or a multi-stakeholder governance body like ICANN) with + secure delegation of authority using local petnames while operating + under a very strong adversary model. In combination with zTLDs, this + provides users of GNS with a global, secure, and memorable mapping + without a trusted authority. + + Any GNS implementation MAY provide a default governance model in the + form of an initial Start Zone mapping. + +9.10. Namespace Ambiguity + + Technically, the GNS protocol can be used to resolve names in the + namespace of the global DNS. However, this would require the + respective governance bodies and stakeholders (e.g., the IETF and + ICANN) to standardize the use of GNS for this particular use case. + + This capability implies that GNS names may be indistinguishable from + DNS names in their respective common display format [RFC8499] or + other special-use domain names [RFC6761] if a local Start Zone + configuration maps suffixes from the global DNS to GNS zones. For + applications, which name system should be used in order to resolve a + given name will then be ambiguous. This poses a risk when trying to + resolve a name through DNS when it is actually a GNS name, as + discussed in [RFC8244]. In such a case, the GNS name is likely to be + leaked as part of the DNS resolution. + + In order to prevent disclosure of queried GNS names, it is + RECOMMENDED that GNS-aware applications try to resolve a given name + in GNS before any other method, taking into account potential suffix- + to-zone mappings and zTLDs. Suffix-to-zone mappings are expected to + be configured by the user or local administrator, and as such the + resolution in GNS is in line with user expectations even if the name + could also be resolved through DNS. If no suffix-to-zone mapping for + the name exists and no zTLD is found, resolution MAY continue with + other methods such as DNS. If a suffix-to-zone mapping for the name + exists or the name ends with a zTLD, it MUST be resolved using GNS, + and resolution MUST NOT continue by any other means independent of + the GNS resolution result. + + Mechanisms such as the Name Service Switch (NSS) of UNIX-like + operating systems are an example of how such a resolution process can + be implemented and used. The NSS allows system administrators to + configure hostname resolution precedence and is integrated with the + system resolver implementation. + + For use cases where GNS names may be confused with names of other + name resolution mechanisms (in particular, DNS), the ".gns.alt" + domain SHOULD be used. For use cases like implementing sinkholes to + block malware sites or serving DNS domains via GNS to bypass + censorship, GNS MAY be deliberately used in ways that interfere with + resolution of another name system. + +10. GANA Considerations + +10.1. GNUnet Signature Purposes Registry + + GANA [GANA] has assigned signature purposes in its "GNUnet Signature + Purposes" registry as listed in Table 1. + + +=========+=================+============+==========================+ + | Purpose | Name | References | Comment | + +=========+=================+============+==========================+ + | 3 | GNS_REVOCATION | RFC 9498 | GNS zone key revocation | + +---------+-----------------+------------+--------------------------+ + | 15 | GNS_RECORD_SIGN | RFC 9498 | GNS record set | + | | | | signature | + +---------+-----------------+------------+--------------------------+ + + Table 1: The GANA GNUnet Signature Purposes Registry + +10.2. GNS Record Types Registry + + GANA [GANA] manages the "GNS Record Types" registry. + + Each entry has the following format: + + Name: The name of the record type (case-insensitive ASCII string, + restricted to alphanumeric characters). For zone delegation + records, the assigned number represents the ztype value of the + zone. + + Number: A 32-bit number above 65535. + + Comment: Optionally, brief English text describing the purpose of + the record type (in UTF-8). + + Contact: Optionally, the contact information for a person to contact + for further information. + + References: Optionally, references (such as an RFC) describing the + record type. + + The registration policy for this registry is "First Come First + Served". This policy is modeled on that described in [RFC8126] and + describes the actions taken by GANA: + + * Adding new entries is possible after review by any authorized GANA + contributor, using a first-come-first-served policy for unique + name allocation. Reviewers are responsible for ensuring that the + chosen "Name" is appropriate for the record type. The registry + will define a unique number for the entry. + + * Authorized GANA contributors for review of new entries are + reachable at <gns-registry@gnunet.org>. + + * Any request MUST contain a unique name and a point of contact. + The contact information MAY be added to the registry, with the + consent of the requester. The request MAY optionally also contain + relevant references as well as a descriptive comment, as defined + above. + + GANA has assigned numbers for the record types defined in this + specification in the "GNS Record Types" registry as listed in + Table 2. + + +========+==========+=========+============+====================+ + | Number | Name | Contact | References | Comment | + +========+==========+=========+============+====================+ + | 65536 | PKEY | (*) | RFC 9498 | GNS zone | + | | | | | delegation (PKEY) | + +--------+----------+---------+------------+--------------------+ + | 65537 | NICK | (*) | RFC 9498 | GNS zone nickname | + +--------+----------+---------+------------+--------------------+ + | 65538 | LEHO | (*) | RFC 9498 | GNS legacy | + | | | | | hostname | + +--------+----------+---------+------------+--------------------+ + | 65540 | GNS2DNS | (*) | RFC 9498 | Delegation to DNS | + +--------+----------+---------+------------+--------------------+ + | 65541 | BOX | (*) | RFC 9498 | Box records | + +--------+----------+---------+------------+--------------------+ + | 65551 | REDIRECT | (*) | RFC 9498 | Redirection record | + +--------+----------+---------+------------+--------------------+ + | 65556 | EDKEY | (*) | RFC 9498 | GNS zone | + | | | | | delegation (EDKEY) | + +--------+----------+---------+------------+--------------------+ + | (*): gns-registry@gnunet.org | + +---------------------------------------------------------------+ + + Table 2: The GANA GNS Record Types Registry + +10.3. .alt Subdomains Registry + + GANA [GANA] manages the ".alt Subdomains" registry. This GANA- + operated .alt registry may or may not be taken into account by any + particular implementer, and it is not in any way associated with or + sanctioned by the IETF or ICANN. + + Each entry has the following format: + + Label: The label of the subdomain (in DNS "letters, digits, hyphen" + (LDH) format as defined in Section 2.3.1 of [RFC5890]). + + Description: Optionally, brief English text describing the purpose + of the subdomain (in UTF-8). + + Contact: Optionally, the contact information for a person to contact + for further information. + + References: Optionally, references (such as an RFC) describing the + record type. + + The registration policy for this registry is "First Come First + Served". This policy is modeled on that described in [RFC8126] and + describes the actions taken by GANA: + + * Adding new entries is possible after review by any authorized GANA + contributor, using a first-come-first-served policy for unique + subdomain allocation. Reviewers are responsible for ensuring that + the chosen "Subdomain" is appropriate for the purpose. + + * Authorized GANA contributors for review of new entries are + reachable at <alt-registry@gnunet.org>. + + * Any request MUST contain a unique subdomain and a point of + contact. The contact information MAY be added to the registry, + with the consent of the requester. The request MAY optionally + also contain relevant references as well as a descriptive comment, + as defined above. + + GANA has assigned the subdomain defined in this specification in the + ".alt Subdomains" registry as listed in Table 3. + + +=======+=========+============+============================+ + | Label | Contact | References | Description | + +=======+=========+============+============================+ + | gns | (*) | RFC 9498 | The .alt subdomain for GNS | + +-------+---------+------------+----------------------------+ + | (*): alt-registry@gnunet.org | + +-----------------------------------------------------------+ + + Table 3: The GANA .alt Subdomains Registry + +11. IANA Considerations + + This document has no IANA actions. + +12. Implementation and Deployment Status + + There are two implementations conforming to this specification, + written in C and Go, respectively. The C implementation as part of + GNUnet [GNUnetGNS] represents the original and reference + implementation. The Go implementation [GoGNS] demonstrates how two + implementations of GNS are interoperable if they are built on top of + the same underlying DHT storage. + + Currently, the GNUnet peer-to-peer network [GNUnet] is an active + deployment of GNS on top of its DHT [R5N]. The Go implementation + [GoGNS] uses this deployment by building on top of the GNUnet DHT + services available on any GNUnet peer. It shows how GNS + implementations can attach to this existing deployment and + participate in name resolution as well as zone publication. + + The self-sovereign identity system re:claimID [reclaim] is using GNS + in order to selectively share identity attributes and attestations + with third parties. + + The Ascension tool [Ascension] facilitates the migration of DNS zones + to GNS zones by translating information retrieved from a DNS zone + transfer into a GNS zone. + +13. References + +13.1. Normative References + + [RFC1034] Mockapetris, P., "Domain names - concepts and facilities", + STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, + <https://www.rfc-editor.org/info/rfc1034>. + + [RFC1035] Mockapetris, P., "Domain names - implementation and + specification", STD 13, RFC 1035, DOI 10.17487/RFC1035, + November 1987, <https://www.rfc-editor.org/info/rfc1035>. + + [RFC2782] Gulbrandsen, A., Vixie, P., and L. Esibov, "A DNS RR for + specifying the location of services (DNS SRV)", RFC 2782, + DOI 10.17487/RFC2782, February 2000, + <https://www.rfc-editor.org/info/rfc2782>. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO + 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November + 2003, <https://www.rfc-editor.org/info/rfc3629>. + + [RFC3686] Housley, R., "Using Advanced Encryption Standard (AES) + Counter Mode With IPsec Encapsulating Security Payload + (ESP)", RFC 3686, DOI 10.17487/RFC3686, January 2004, + <https://www.rfc-editor.org/info/rfc3686>. + + [RFC3826] Blumenthal, U., Maino, F., and K. McCloghrie, "The + Advanced Encryption Standard (AES) Cipher Algorithm in the + SNMP User-based Security Model", RFC 3826, + DOI 10.17487/RFC3826, June 2004, + <https://www.rfc-editor.org/info/rfc3826>. + + [RFC5237] Arkko, J. and S. Bradner, "IANA Allocation Guidelines for + the Protocol Field", BCP 37, RFC 5237, + DOI 10.17487/RFC5237, February 2008, + <https://www.rfc-editor.org/info/rfc5237>. + + [RFC5869] Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand + Key Derivation Function (HKDF)", RFC 5869, + DOI 10.17487/RFC5869, May 2010, + <https://www.rfc-editor.org/info/rfc5869>. + + [RFC5890] Klensin, J., "Internationalized Domain Names for + Applications (IDNA): Definitions and Document Framework", + RFC 5890, DOI 10.17487/RFC5890, August 2010, + <https://www.rfc-editor.org/info/rfc5890>. + + [RFC5895] Resnick, P. and P. Hoffman, "Mapping Characters for + Internationalized Domain Names in Applications (IDNA) + 2008", RFC 5895, DOI 10.17487/RFC5895, September 2010, + <https://www.rfc-editor.org/info/rfc5895>. + + [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms + (SHA and SHA-based HMAC and HKDF)", RFC 6234, + DOI 10.17487/RFC6234, May 2011, + <https://www.rfc-editor.org/info/rfc6234>. + + [RFC6895] Eastlake 3rd, D., "Domain Name System (DNS) IANA + Considerations", BCP 42, RFC 6895, DOI 10.17487/RFC6895, + April 2013, <https://www.rfc-editor.org/info/rfc6895>. + + [RFC6979] Pornin, T., "Deterministic Usage of the Digital Signature + Algorithm (DSA) and Elliptic Curve Digital Signature + Algorithm (ECDSA)", RFC 6979, DOI 10.17487/RFC6979, August + 2013, <https://www.rfc-editor.org/info/rfc6979>. + + [RFC7748] Langley, A., Hamburg, M., and S. Turner, "Elliptic Curves + for Security", RFC 7748, DOI 10.17487/RFC7748, January + 2016, <https://www.rfc-editor.org/info/rfc7748>. + + [RFC8032] Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital + Signature Algorithm (EdDSA)", RFC 8032, + DOI 10.17487/RFC8032, January 2017, + <https://www.rfc-editor.org/info/rfc8032>. + + [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for + Writing an IANA Considerations Section in RFCs", BCP 26, + RFC 8126, DOI 10.17487/RFC8126, June 2017, + <https://www.rfc-editor.org/info/rfc8126>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8499] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS + Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499, + January 2019, <https://www.rfc-editor.org/info/rfc8499>. + + [RFC9106] Biryukov, A., Dinu, D., Khovratovich, D., and S. + Josefsson, "Argon2 Memory-Hard Function for Password + Hashing and Proof-of-Work Applications", RFC 9106, + DOI 10.17487/RFC9106, September 2021, + <https://www.rfc-editor.org/info/rfc9106>. + + [GANA] GNUnet e.V., "GNUnet Assigned Numbers Authority (GANA)", + 2023, <https://gana.gnunet.org/>. + + [MODES] Dworkin, M., "Recommendation for Block Cipher Modes of + Operation: Methods and Techniques", NIST Special + Publication 800-38A, DOI 10.6028/NIST.SP.800-38A, December + 2001, <https://doi.org/10.6028/NIST.SP.800-38A>. + + [CrockfordB32] + Crockford, D., "Base 32", March 2019, + <https://www.crockford.com/base32.html>. + + [XSalsa20] Bernstein, D. J., "Extending the Salsa20 nonce", 2011, + <https://cr.yp.to/papers.html#xsalsa>. + + [Unicode-UAX15] + Davis, M., Whistler, K., and M. Dürst, "Unicode Standard + Annex #15: Unicode Normalization Forms", Revision 31, The + Unicode Consortium, Mountain View, September 2009, + <https://www.unicode.org/reports/tr15/tr15-31.html>. + + [Unicode-UTS46] + Davis, M. and M. Suignard, "Unicode Technical Standard + #46: Unicode IDNA Compatibility Processing", Revision 31, + The Unicode Consortium, Mountain View, September 2023, + <https://www.unicode.org/reports/tr46>. + +13.2. Informative References + + [RFC1928] Leech, M., Ganis, M., Lee, Y., Kuris, R., Koblas, D., and + L. Jones, "SOCKS Protocol Version 5", RFC 1928, + DOI 10.17487/RFC1928, March 1996, + <https://www.rfc-editor.org/info/rfc1928>. + + [RFC4033] Arends, R., Austein, R., Larson, M., Massey, D., and S. + Rose, "DNS Security Introduction and Requirements", + RFC 4033, DOI 10.17487/RFC4033, March 2005, + <https://www.rfc-editor.org/info/rfc4033>. + + [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS) + Extensions: Extension Definitions", RFC 6066, + DOI 10.17487/RFC6066, January 2011, + <https://www.rfc-editor.org/info/rfc6066>. + + [RFC7363] Maenpaa, J. and G. Camarillo, "Self-Tuning Distributed + Hash Table (DHT) for REsource LOcation And Discovery + (RELOAD)", RFC 7363, DOI 10.17487/RFC7363, September 2014, + <https://www.rfc-editor.org/info/rfc7363>. + + [RFC8324] Klensin, J., "DNS Privacy, Authorization, Special Uses, + Encoding, Characters, Matching, and Root Structure: Time + for Another Look?", RFC 8324, DOI 10.17487/RFC8324, + February 2018, <https://www.rfc-editor.org/info/rfc8324>. + + [RFC8806] Kumari, W. and P. Hoffman, "Running a Root Server Local to + a Resolver", RFC 8806, DOI 10.17487/RFC8806, June 2020, + <https://www.rfc-editor.org/info/rfc8806>. + + [RFC6761] Cheshire, S. and M. Krochmal, "Special-Use Domain Names", + RFC 6761, DOI 10.17487/RFC6761, February 2013, + <https://www.rfc-editor.org/info/rfc6761>. + + [RFC8244] Lemon, T., Droms, R., and W. Kumari, "Special-Use Domain + Names Problem Statement", RFC 8244, DOI 10.17487/RFC8244, + October 2017, <https://www.rfc-editor.org/info/rfc8244>. + + [RFC9476] Kumari, W. and P. Hoffman, "The .alt Special-Use Top-Level + Domain", RFC 9476, DOI 10.17487/RFC9476, September 2023, + <https://www.rfc-editor.org/info/rfc9476>. + + [TorRendSpec] + Tor Project, "Tor Rendezvous Specification - Version 3", + commit b345ca0, June 2023, + <https://github.com/torproject/torspec/blob/main/rend- + spec-v3.txt>. + + [Tor224] Goulet, D., Kadianakis, G., and N. Mathewson, "Next- + Generation Hidden Services in Tor", Appendix A.2 ("Tor's + key derivation scheme"), November 2013, + <https://gitweb.torproject.org/torspec.git/tree/ + proposals/224-rend-spec-ng.txt#n2135>. + + [SDSI] Rivest, R. L. and B. Lampson, "SDSI - A Simple Distributed + Security Infrastructure", October 1996, + <https://citeseerx.ist.psu.edu/document?repid=rep1&type=pd + f&doi=3837e0206bf73e5e8f0ba6db767a2f714ea7c367>. + + [Kademlia] Maymounkov, P. and D. Mazières, "Kademlia: A Peer-to-peer + Information System Based on the XOR Metric", + DOI 10.1007/3-540-45748-8_5, 2002, + <https://css.csail.mit.edu/6.824/2014/papers/ + kademlia.pdf>. + + [ed25519] Bernstein, D. J., Duif, N., Lange, T., Schwabe, P., and + B-Y. Yang, "High-speed high-security signatures", + DOI 10.1007/s13389-012-0027-1, 2011, + <https://ed25519.cr.yp.to/ed25519-20110926.pdf>. + + [GNS] Wachs, M., Schanzenbach, M., and C. Grothoff, "A + Censorship-Resistant, Privacy-Enhancing and Fully + Decentralized Name System", 13th International Conference + on Cryptology and Network Security (CANS), + DOI 10.13140/2.1.4642.3044, October 2014, + <https://sci-hub.st/10.1007/978-3-319-12280-9_9>. + + [R5N] Evans, N. S. and C. Grothoff, "R5N: Randomized Recursive + Routing for Restricted-Route Networks", 5th International + Conference on Network and System Security (NSS), + DOI 10.1109/ICNSS.2011.6060022, September 2011, + <https://sci-hub.st/10.1109/ICNSS.2011.6060022>. + + [SecureNS] Grothoff, C., Wachs, M., Ermert, M., and J. Appelbaum, + "Toward secure name resolution on the Internet", Computers + and Security, Volume 77, Issue C, pp. 694-708, + DOI 10.1016/j.cose.2018.01.018, August 2018, <https://sci- + hub.st/https://doi.org/10.1016/j.cose.2018.01.018>. + + [GNUnetGNS] + GNUnet e.V., "gnunet.git - GNUnet core repository", 2023, + <https://git.gnunet.org/gnunet.git>. + + [Ascension] + GNUnet e.V., "ascension.git - DNS zones to GNS migrating + using incremental zone transfer (AXFR/IXFR)", 2023, + <https://git.gnunet.org/ascension.git>. + + [GNUnet] GNUnet e.V., "The GNUnet Project (Home Page)", 2023, + <https://gnunet.org>. + + [reclaim] GNUnet e.V., "re:claimID - Self-sovereign, Decentralised + Identity Management and Personal Data Sharing", 2023, + <https://reclaim.gnunet.org>. + + [GoGNS] Fix, B., "gnunet-go (Go GNS)", commit 5c815ba, July 2023, + <https://github.com/bfix/gnunet- + go/tree/master/src/gnunet/service/gns>. + + [nsswitch] GNU Project, "System Databases and Name Service Switch + (Section 29)", + <https://www.gnu.org/software/libc/manual/html_node/Name- + Service-Switch.html>. + +Appendix A. Usage and Migration + + This section outlines a number of specific use cases that may help + readers of this technical specification better understand the + protocol. The considerations below are not meant to be normative for + the GNS protocol in any way. Instead, they are provided in order to + give context and to provide some background on what the intended use + of the protocol is by its designers. Further, this section provides + pointers to migration paths. + +A.1. Zone Dissemination + + In order to become a zone owner, it is sufficient to generate a zone + key and a corresponding secret key using a GNS implementation. At + this point, the zone owner can manage GNS resource records in a local + zone database. The resource records can then be published by a GNS + implementation as defined in Section 6. For other users to resolve + the resource records, the respective zone information must be + disseminated first. The zone owner may decide to make the zone key + and labels known to a selected set of users only or to make this + information available to the general public. + + Sharing zone information directly with specific users not only allows + an implementation to potentially preserve zone and record privacy but + also allows the zone owner and the user to establish strong trust + relationships. For example, a bank may send a customer letter with a + QR code that contains the GNS zone of the bank. This allows the user + to scan the QR code and establish a strong link to the zone of the + bank and with it, for example, the IP address of the online banking + web site. + + Most Internet services likely want to make their zones available to + the general public in the most efficient way possible. First, it is + reasonable to assume that zones that are commanding high levels of + reputation and trust are likely included in the default suffix-to- + zone mappings of implementations. Hence, dissemination of a zone + through delegation under such zones can be a viable path in order to + disseminate a zone publicly. For example, it is conceivable that + organizations such as ICANN or country-code TLD registrars also + manage GNS zones and offer registration or delegation services. + + Following best practices, particularly those related to security and + abuse mitigation, are methods that allow zone owners and aspiring + registrars to gain a good reputation and, eventually, trust. This + includes, of course, diligent protection of private zone key + material. Formalizing such best practices is out of scope for this + specification and should be addressed in a separate document that + takes Section 9 of this document into account. + +A.2. Start Zone Configuration + + A user is expected to install a GNS implementation if it is not + already provided through other means such as the operating system or + the browser. It is likely that the implementation ships with a + default Start Zone configuration. This means that the user is able + to resolve GNS names ending on a zTLD or ending on any suffix-to-name + mapping that is part of the default Start Zone configuration. At + this point, the user may delete or otherwise modify the + implementation's default configuration: + + * Deletion of suffix-to-zone mappings may become necessary if the + zone owner referenced by the mapping has lost the trust of the + user. For example, this could be due to lax registration policies + resulting in phishing activities. Modification and addition of + new mappings are means to heal the namespace perforation that + would occur in the case of a deletion or to simply establish a + strong direct trust relationship. However, this requires the + user's knowledge of the respective zone keys. This information + must be retrieved out of band, as illustrated in Appendix A.1: a + bank may send the user a letter with a QR code that contains the + GNS zone of the bank. The user scans the QR code and adds a new + suffix-to-name mapping using a chosen local name for their bank. + Other examples include scanning zone information off the device of + a friend, from a storefront, or from an advertisement. The level + of trust in the respective zone is contextual and likely varies + from user to user. Trust in a zone provided through a letter from + a bank that may also include a credit card is certainly different + from a zone found on a random advertisement on the street. + However, this trust is immediately tangible to the user and can be + reflected in the local naming as well. + + * Users that are also clients should facilitate the modification of + the Start Zone configuration -- for example, by providing a QR + code reader or other import mechanisms. Implementations are + ideally implemented according to best practices and addressing + applicable points from Section 9. Formalizing such best practices + is out of scope for this specification. + +A.3. Globally Unique Names and the Web + + HTTP virtual hosting and TLS Server Name Indication (SNI) are common + use cases on the Web. HTTP clients supply a DNS name in the HTTP + "Host"-header or as part of the TLS handshake, respectively. This + allows the HTTP server to serve the indicated virtual host with a + matching TLS certificate. The global uniqueness of DNS names is a + prerequisite of those use cases. + + Not all GNS names are globally unique. However, any resource record + in GNS can be represented as a concatenation of a GNS label and the + zTLD of the zone. While not memorable, this globally unique GNS name + can be leveraged in order to facilitate the same use cases. Consider + the GNS name "www.example.gns.alt" entered in a GNS-aware HTTP + client. At first, "www.example.gns.alt" is resolved using GNS, + yielding a record set. Then, the HTTP client determines the virtual + host as follows: + + If there is a LEHO record (Section 5.3.1) containing + "www.example.com" in the record set, then the HTTP client uses this + as the value of the "Host"-header field of the HTTP request: + + GET / HTTP/1.1 + Host: www.example.com + + In the absence of a LEHO record, an additional GNS resolution is + required to check whether "www.example.gns.alt" itself points to a + zone delegation record, which implies that the record set that was + originally resolved is published under the apex label. + + If it does, the unique GNS name is simply the zTLD representation of + the delegated zone: + + GET / HTTP/1.1 + Host: 000G0037FH3QTBCK15Y8BCCNRVWPV17ZC7TSGB1C9ZG2TPGHZVFV1GMG3W + + On the other hand, if there is no zone delegation record for + "www.example.gns.alt", then the unique GNS name is the concatenation + of the leftmost label (e.g., "www") and the zTLD representation of + the zone: + + GET / HTTP/1.1 + Host: www.000G0037FH3QTBCK15Y8BCCNRVWPV17ZC7TSGB1C9ZG2TPGHZVFV1GMG3W + + Note that this second GNS resolution does not require any additional + network operation, as only the local record processing differs as per + the exception mentioned in the last sentence of Section 7.3.4. + + If the HTTP client is a browser, the use of a unique GNS name for + virtual hosting or TLS SNI does not necessarily have to be shown to + the user. For example, the name in the URL bar may remain as + "www.example.gns.alt" even if the used unique name in the "Host"- + header differs. + +A.4. Migration Paths + + DNS resolution is built into a variety of existing software + components -- most significantly, operating systems and HTTP clients. + This section illustrates possible migration paths for both in order + to enable legacy applications to resolve GNS names. + + One way to efficiently facilitate the resolution of GNS names is via + GNS-enabled DNS server implementations. Local DNS queries are + thereby either rerouted or explicitly configured to be resolved by a + "DNS-to-GNS" server that runs locally. This DNS server tries to + interpret any incoming query for a name as a GNS resolution request. + If no Start Zone can be found for the name and it does not end in a + zTLD, the server tries to resolve the name in DNS. Otherwise, the + name is resolved in GNS. In the latter case, the resulting record + set is converted to a DNS answer packet and is returned accordingly. + An implementation of a DNS-to-GNS server can be found in [GNUnet]. + + A similar approach is to use operating system extensions such as the + NSS [nsswitch]. It allows the system administrator to configure + plugins that are used for hostname resolution. A GNS nsswitch plugin + can be used in a fashion similar to that used for the DNS-to-GNS + server. An implementation of a glibc-compatible nsswitch plugin for + GNS can be found in [GNUnet]. + + The methods above are usually also effective for HTTP client + software. However, HTTP clients are commonly used in combination + with TLS. TLS certificate validation, and SNI in particular, require + additional logic in HTTP clients when GNS names are in play + (Appendix A.3). In order to transparently enable this functionality + for migration purposes, a local GNS-aware SOCKS5 proxy [RFC1928] can + be configured to resolve domain names. The SOCKS5 proxy, similar to + the DNS-to-GNS server, is capable of resolving both GNS and DNS + names. In the event of a TLS connection request with a GNS name, the + SOCKS5 proxy can terminate the TLS connection and establish a secure + connection against the requested host. In order to establish a + secure connection, the proxy may use LEHO and TLSA records stored in + the record set under the GNS name. The proxy must provide a locally + trusted certificate for the GNS name to the HTTP client; this usually + requires the generation and configuration of a local trust anchor in + the browser. An implementation of this SOCKS5 proxy can be found in + [GNUnet]. + +Appendix B. Example Flows + +B.1. AAAA Example Resolution + + Local Host | Remote + | Storage + | + | +---------+ + | / /| + | +---------+ | + +-----------+ (1) +----------+ | | | | + | | | | (4,6) | | Record | | + |Application|----------| Resolver |---------------|->| Storage | | + | |<---------| |<--------------|--| |/ + +-----------+ (8) +----------+ (5,7) | +---------+ + A | + | | + (2,3) | | + | | + | | + +---------+ | + / v /| | + +---------+ | | + | | | | + | Start | | | + | Zones | | | + | |/ | + +---------+ | + + Figure 24: Example Resolution of an IPv6 Address + + 1. Look up AAAA record for name: "www.example.gnu.gns.alt". + + 2. Determine Start Zone for "www.example.gnu.gns.alt". + + 3. Start Zone: zkey0 - Remainder: "www.example". + + 4. Calculate q0=SHA512(ZKDF(zkey0, "example")) and initiate GET(q0). + + 5. Retrieve and decrypt RRBLOCK consisting of a single PKEY record + containing zkey1. + + 6. Calculate q1=SHA512(ZKDF(zkey1, "www")) and initiate GET(q1). + + 7. Retrieve RRBLOCK consisting of a single AAAA record containing + the IPv6 address 2001:db8::1. + + 8. Return record set to application. + +B.2. REDIRECT Example Resolution + + Local Host | Remote + | Storage + | + | +---------+ + | / /| + | +---------+ | + +-----------+ (1) +----------+ | | | | + | | | | (4,6,8) | | Record | | + |Application|----------| Resolver |----------------|->| Storage | | + | |<---------| |<---------------|--| |/ + +-----------+ (10) +----------+ (5,7,9) | +---------+ + A | + | | + (2,3) | | + | | + | | + +---------+ | + / v /| | + +---------+ | | + | | | | + | Start | | | + | Zones | | | + | |/ | + +---------+ | + + Figure 25: Example Resolution of an IPv6 Address with Redirect + + 1. Look up AAAA record for name: "www.example.tld.gns.alt". + + 2. Determine Start Zone for "www.example.tld.gns.alt". + + 3. Start Zone: zkey0 - Remainder: "www.example". + + 4. Calculate q0=SHA512(ZKDF(zkey0, "example")) and initiate + GET(q0). + + 5. Retrieve and decrypt RRBLOCK consisting of a single PKEY record + containing zkey1. + + 6. Calculate q1=SHA512(ZKDF(zkey1, "www")) and initiate GET(q1). + + 7. Retrieve and decrypt RRBLOCK consisting of a single REDIRECT + record containing "www2.+". + + 8. Calculate q2=SHA512(ZKDF(zkey1, "www2")) and initiate GET(q2). + + 9. Retrieve and decrypt RRBLOCK consisting of a single AAAA record + containing the IPv6 address 2001:db8::1. + + 10. Return record set to application. + +B.3. GNS2DNS Example Resolution + + Local Host | Remote + | Storage + | + | +---------+ + | / /| + | +---------+ | + +-----------+ (1) +----------+ | | | | + | | | | (4) | | Record | | + |Application|----------| Resolver |------------------|->| Storage | | + | |<---------| |<-----------------|--| |/ + +-----------+ (8) +----------+ (5) | +---------+ + A A | + | | (6,7) | + (2,3) | +----------+ | + | | | + | v | + +---------+ +------------+ | + / v /| | System DNS | | + +---------+ | | Resolver | | + | | | +------------+ | + | Start | | | + | Zones | | | + | |/ | + +---------+ | + + Figure 26: Example Resolution of an IPv6 Address with DNS Handover + + 1. Look up AAAA record for name: "www.example.gnu.gns.alt". + + 2. Determine Start Zone for "www.example.gnu.gns.alt". + + 3. Start Zone: zkey0 - Remainder: "www.example". + + 4. Calculate q0=SHA512(ZKDF(zkey0, "example")) and initiate GET(q0). + + 5. Retrieve and decrypt RRBLOCK consisting of a single GNS2DNS + record containing the name "example.com" and the DNS server IPv4 + address 192.0.2.1. + + 6. Use system resolver to look up a AAAA record for the DNS name + "www.example.com". + + 7. Retrieve a DNS reply consisting of a single AAAA record + containing the IPv6 address 2001:db8::1. + + 8. Return record set to application. + +Appendix C. Base32GNS + + Encoding converts a byte array into a string of symbols. Decoding + converts a string of symbols into a byte array. Decoding fails if + the input string has symbols outside the defined set. + + Table 4 defines the encoding and decoding symbols for a given symbol + value. Each symbol value encodes 5 bits. It can be used to + implement the encoding by reading it as follows: a symbol "A" or "a" + is decoded to a 5-bit value 10 when decoding. A 5-bit block with a + value of 18 is encoded to the character "J" when encoding. If the + bit length of the byte string to encode is not a multiple of 5, it is + padded to the next multiple with zeroes. In order to further + increase tolerance for failures in character recognition, the letter + "U" MUST be decoded to the same value as the letter "V" in Base32GNS. + + +==============+=================+=================+ + | Symbol Value | Decoding Symbol | Encoding Symbol | + +==============+=================+=================+ + | 0 | 0 O o | 0 | + +--------------+-----------------+-----------------+ + | 1 | 1 I i L l | 1 | + +--------------+-----------------+-----------------+ + | 2 | 2 | 2 | + +--------------+-----------------+-----------------+ + | 3 | 3 | 3 | + +--------------+-----------------+-----------------+ + | 4 | 4 | 4 | + +--------------+-----------------+-----------------+ + | 5 | 5 | 5 | + +--------------+-----------------+-----------------+ + | 6 | 6 | 6 | + +--------------+-----------------+-----------------+ + | 7 | 7 | 7 | + +--------------+-----------------+-----------------+ + | 8 | 8 | 8 | + +--------------+-----------------+-----------------+ + | 9 | 9 | 9 | + +--------------+-----------------+-----------------+ + | 10 | A a | A | + +--------------+-----------------+-----------------+ + | 11 | B b | B | + +--------------+-----------------+-----------------+ + | 12 | C c | C | + +--------------+-----------------+-----------------+ + | 13 | D d | D | + +--------------+-----------------+-----------------+ + | 14 | E e | E | + +--------------+-----------------+-----------------+ + | 15 | F f | F | + +--------------+-----------------+-----------------+ + | 16 | G g | G | + +--------------+-----------------+-----------------+ + | 17 | H h | H | + +--------------+-----------------+-----------------+ + | 18 | J j | J | + +--------------+-----------------+-----------------+ + | 19 | K k | K | + +--------------+-----------------+-----------------+ + | 20 | M m | M | + +--------------+-----------------+-----------------+ + | 21 | N n | N | + +--------------+-----------------+-----------------+ + | 22 | P p | P | + +--------------+-----------------+-----------------+ + | 23 | Q q | Q | + +--------------+-----------------+-----------------+ + | 24 | R r | R | + +--------------+-----------------+-----------------+ + | 25 | S s | S | + +--------------+-----------------+-----------------+ + | 26 | T t | T | + +--------------+-----------------+-----------------+ + | 27 | V v U u | V | + +--------------+-----------------+-----------------+ + | 28 | W w | W | + +--------------+-----------------+-----------------+ + | 29 | X x | X | + +--------------+-----------------+-----------------+ + | 30 | Y y | Y | + +--------------+-----------------+-----------------+ + | 31 | Z z | Z | + +--------------+-----------------+-----------------+ + + Table 4: The Base32GNS Alphabet, Including the + Additional Encoding Symbol "U" + +Appendix D. Test Vectors + + The following test vectors can be used by implementations to test for + conformance with this specification. Unless indicated otherwise, the + test vectors are provided as hexadecimal byte arrays. + +D.1. Base32GNS Encoding/Decoding + + The following are test vectors for the Base32GNS encoding used for + zTLDs. The input strings are encoded without the zero terminator. + + Base32GNS-Encode: + Input string: "Hello World" + Output string: "91JPRV3F41BPYWKCCG" + + Input bytes: 474e55204e616d652053797374656d + Output string: "8X75A82EC5PPA82KF5SQ8SBD" + + Base32GNS-Decode: + Input string: "91JPRV3F41BPYWKCCG" + Output string: "Hello World" + + Input string: "91JPRU3F41BPYWKCCG" + Output string: "Hello World" + +D.2. Record Sets + + The test vectors include record sets with a variety of record types + and flags for both PKEY and EDKEY zones. This includes labels with + UTF-8 characters to demonstrate internationalized labels. + + *(1) PKEY zone with ASCII label and one delegation record* + + Zone private key (d, big-endian): + 50 d7 b6 52 a4 ef ea df + f3 73 96 90 97 85 e5 95 + 21 71 a0 21 78 c8 e7 d4 + 50 fa 90 79 25 fa fd 98 + + Zone identifier (ztype|zkey): + 00 01 00 00 67 7c 47 7d + 2d 93 09 7c 85 b1 95 c6 + f9 6d 84 ff 61 f5 98 2c + 2c 4f e0 2d 5a 11 fe df + b0 c2 90 1f + + zTLD: + 000G0037FH3QTBCK15Y8BCCNRVWPV17ZC7TSGB1C9ZG2TPGHZVFV1GMG3W + + Label: + 74 65 73 74 64 65 6c 65 + 67 61 74 69 6f 6e + + Number of records (integer): 1 + + Record #0 := ( + EXPIRATION: 8143584694000000 us + 00 1c ee 8c 10 e2 59 80 + + DATA_SIZE: + 00 20 + + TYPE: + 00 01 00 00 + + FLAGS: 00 01 + + DATA: + 21 e3 b3 0f f9 3b c6 d3 + 5a c8 c6 e0 e1 3a fd ff + 79 4c b7 b4 4b bb c7 48 + d2 59 d0 a0 28 4d be 84 + + ) + + RDATA: + 00 1c ee 8c 10 e2 59 80 + 00 20 00 01 00 01 00 00 + 21 e3 b3 0f f9 3b c6 d3 + 5a c8 c6 e0 e1 3a fd ff + 79 4c b7 b4 4b bb c7 48 + d2 59 d0 a0 28 4d be 84 + + Encryption NONCE|EXPIRATION|BLOCK COUNTER: + e9 0a 00 61 00 1c ee 8c + 10 e2 59 80 00 00 00 01 + + Encryption key (K): + 86 4e 71 38 ea e7 fd 91 + a3 01 36 89 9c 13 2b 23 + ac eb db 2c ef 43 cb 19 + f6 bf 55 b6 7d b9 b3 b3 + + Storage key (q): + 4a dc 67 c5 ec ee 9f 76 + 98 6a bd 71 c2 22 4a 3d + ce 2e 91 70 26 c9 a0 9d + fd 44 ce f3 d2 0f 55 a2 + 73 32 72 5a 6c 8a fb bb + b0 f7 ec 9a f1 cc 42 64 + 12 99 40 6b 04 fd 9b 5b + 57 91 f8 6c 4b 08 d5 f4 + + ZKDF(zkey, label): + 18 2b b6 36 ed a7 9f 79 + 57 11 bc 27 08 ad bb 24 + 2a 60 44 6a d3 c3 08 03 + 12 1d 03 d3 48 b7 ce b6 + + Derived private key (d', big-endian): + 0a 4c 5e 0f 00 63 df ce + db c8 c7 f2 b2 2c 03 0c + 86 28 b2 c2 cb ac 9f a7 + 29 aa e6 1f 89 db 3e 9c + + BDATA: + 0c 1e da 5c c0 94 a1 c7 + a8 88 64 9d 25 fa ee bd + 60 da e6 07 3d 57 d8 ae + 8d 45 5f 4f 13 92 c0 74 + e2 6a c6 69 bd ee c2 34 + 62 b9 62 95 2c c6 e9 eb + + RRBLOCK: + 00 00 00 a0 00 01 00 00 + 18 2b b6 36 ed a7 9f 79 + 57 11 bc 27 08 ad bb 24 + 2a 60 44 6a d3 c3 08 03 + 12 1d 03 d3 48 b7 ce b6 + 0a d1 0b c1 3b 40 3b 5b + 25 61 26 b2 14 5a 6f 60 + c5 14 f9 51 ff a7 66 f7 + a3 fd 4b ac 4a 4e 19 90 + 05 5c b8 7e 8d 1b fd 19 + aa 09 a4 29 f7 29 e9 f5 + c6 ee c2 47 0a ce e2 22 + 07 59 e9 e3 6c 88 6f 35 + 00 1c ee 8c 10 e2 59 80 + 0c 1e da 5c c0 94 a1 c7 + a8 88 64 9d 25 fa ee bd + 60 da e6 07 3d 57 d8 ae + 8d 45 5f 4f 13 92 c0 74 + e2 6a c6 69 bd ee c2 34 + 62 b9 62 95 2c c6 e9 eb + + *(2) PKEY zone with UTF-8 label and three records* + + Zone private key (d, big-endian): + 50 d7 b6 52 a4 ef ea df + f3 73 96 90 97 85 e5 95 + 21 71 a0 21 78 c8 e7 d4 + 50 fa 90 79 25 fa fd 98 + + Zone identifier (ztype|zkey): + 00 01 00 00 67 7c 47 7d + 2d 93 09 7c 85 b1 95 c6 + f9 6d 84 ff 61 f5 98 2c + 2c 4f e0 2d 5a 11 fe df + b0 c2 90 1f + + zTLD: + 000G0037FH3QTBCK15Y8BCCNRVWPV17ZC7TSGB1C9ZG2TPGHZVFV1GMG3W + + Label: + e5 a4 a9 e4 b8 8b e7 84 + a1 e6 95 b5 + + Number of records (integer): 3 + + Record #0 := ( + EXPIRATION: 8143584694000000 us + 00 1c ee 8c 10 e2 59 80 + + DATA_SIZE: + 00 10 + + TYPE: + 00 00 00 1c + + FLAGS: 00 00 + + DATA: + 00 00 00 00 00 00 00 00 + 00 00 00 00 de ad be ef + + ) + + Record #1 := ( + EXPIRATION: 17999736901000000 us + 00 3f f2 aa 54 08 db 40 + + DATA_SIZE: + 00 06 + + TYPE: + 00 01 00 01 + + FLAGS: 00 00 + + DATA: + e6 84 9b e7 a7 b0 + + ) + + Record #2 := ( + EXPIRATION: 11464693629000000 us + 00 28 bb 13 ff 37 19 40 + + DATA_SIZE: + 00 0b + + TYPE: + 00 00 00 10 + + FLAGS: 00 04 + + DATA: + 48 65 6c 6c 6f 20 57 6f + 72 6c 64 + + ) + + RDATA: + 00 1c ee 8c 10 e2 59 80 + 00 10 00 00 00 00 00 1c + 00 00 00 00 00 00 00 00 + 00 00 00 00 de ad be ef + 00 3f f2 aa 54 08 db 40 + 00 06 00 00 00 01 00 01 + e6 84 9b e7 a7 b0 00 28 + bb 13 ff 37 19 40 00 0b + 00 04 00 00 00 10 48 65 + 6c 6c 6f 20 57 6f 72 6c + 64 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + + Encryption NONCE|EXPIRATION|BLOCK COUNTER: + ee 96 33 c1 00 1c ee 8c + 10 e2 59 80 00 00 00 01 + + Encryption key (K): + fb 3a b5 de 23 bd da e1 + 99 7a af 7b 92 c2 d2 71 + 51 40 8b 77 af 7a 41 ac + 79 05 7c 4d f5 38 3d 01 + + Storage key (q): + af f0 ad 6a 44 09 73 68 + 42 9a c4 76 df a1 f3 4b + ee 4c 36 e7 47 6d 07 aa + 64 63 ff 20 91 5b 10 05 + c0 99 1d ef 91 fc 3e 10 + 90 9f 87 02 c0 be 40 43 + 67 78 c7 11 f2 ca 47 d5 + 5c f0 b5 4d 23 5d a9 77 + + ZKDF(zkey, label): + a5 12 96 df 75 7e e2 75 + ca 11 8d 4f 07 fa 7a ae + 55 08 bc f5 12 aa 41 12 + 14 29 d4 a0 de 9d 05 7e + + Derived private key (d', big-endian): + 0a be 56 d6 80 68 ab 40 + e1 44 79 0c de 9a cf 4d + 78 7f 2d 3c 63 b8 53 05 + 74 6e 68 03 32 15 f2 ab + + BDATA: + d8 c2 8d 2f d6 96 7d 1a + b7 22 53 f2 10 98 b8 14 + a4 10 be 1f 59 98 de 03 + f5 8f 7e 7c db 7f 08 a6 + 16 51 be 4d 0b 6f 8a 61 + df 15 30 44 0b d7 47 dc + f0 d7 10 4f 6b 8d 24 c2 + ac 9b c1 3d 9c 6f e8 29 + 05 25 d2 a6 d0 f8 84 42 + 67 a1 57 0e 8e 29 4d c9 + 3a 31 9f cf c0 3e a2 70 + 17 d6 fd a3 47 b4 a7 94 + 97 d7 f6 b1 42 2d 4e dd + 82 1c 19 93 4e 96 c1 aa + 87 76 57 25 d4 94 c7 64 + b1 55 dc 6d 13 26 91 74 + + RRBLOCK: + 00 00 00 f0 00 01 00 00 + a5 12 96 df 75 7e e2 75 + ca 11 8d 4f 07 fa 7a ae + 55 08 bc f5 12 aa 41 12 + 14 29 d4 a0 de 9d 05 7e + 08 5b d6 5f d4 85 10 51 + ba ce 2a 45 2a fc 8a 7e + 4f 6b 2c 1f 74 f0 20 35 + d9 64 1a cd ba a4 66 e0 + 00 ce d6 f2 d2 3b 63 1c + 8e 8a 0b 38 e2 ba e7 9a + 22 ca d8 1d 4c 50 d2 25 + 35 8e bc 17 ac 0f 89 9e + 00 1c ee 8c 10 e2 59 80 + d8 c2 8d 2f d6 96 7d 1a + b7 22 53 f2 10 98 b8 14 + a4 10 be 1f 59 98 de 03 + f5 8f 7e 7c db 7f 08 a6 + 16 51 be 4d 0b 6f 8a 61 + df 15 30 44 0b d7 47 dc + f0 d7 10 4f 6b 8d 24 c2 + ac 9b c1 3d 9c 6f e8 29 + 05 25 d2 a6 d0 f8 84 42 + 67 a1 57 0e 8e 29 4d c9 + 3a 31 9f cf c0 3e a2 70 + 17 d6 fd a3 47 b4 a7 94 + 97 d7 f6 b1 42 2d 4e dd + 82 1c 19 93 4e 96 c1 aa + 87 76 57 25 d4 94 c7 64 + b1 55 dc 6d 13 26 91 74 + + *(3) EDKEY zone with ASCII label and one delegation record* + + Zone private key (d): + 5a f7 02 0e e1 91 60 32 + 88 32 35 2b bc 6a 68 a8 + d7 1a 7c be 1b 92 99 69 + a7 c6 6d 41 5a 0d 8f 65 + + Zone identifier (ztype|zkey): + 00 01 00 14 3c f4 b9 24 + 03 20 22 f0 dc 50 58 14 + 53 b8 5d 93 b0 47 b6 3d + 44 6c 58 45 cb 48 44 5d + db 96 68 8f + + zTLD: + 000G051WYJWJ80S04BRDRM2R2H9VGQCKP13VCFA4DHC4BJT88HEXQ5K8HW + + Label: + 74 65 73 74 64 65 6c 65 + 67 61 74 69 6f 6e + + Number of records (integer): 1 + + Record #0 := ( + EXPIRATION: 8143584694000000 us + 00 1c ee 8c 10 e2 59 80 + + DATA_SIZE: + 00 20 + + TYPE: + 00 01 00 00 + + FLAGS: 00 01 + + DATA: + 21 e3 b3 0f f9 3b c6 d3 + 5a c8 c6 e0 e1 3a fd ff + 79 4c b7 b4 4b bb c7 48 + d2 59 d0 a0 28 4d be 84 + + ) + + RDATA: + 00 1c ee 8c 10 e2 59 80 + 00 20 00 01 00 01 00 00 + 21 e3 b3 0f f9 3b c6 d3 + 5a c8 c6 e0 e1 3a fd ff + 79 4c b7 b4 4b bb c7 48 + d2 59 d0 a0 28 4d be 84 + + Encryption NONCE|EXPIRATION: + 98 13 2e a8 68 59 d3 5c + 88 bf d3 17 fa 99 1b cb + 00 1c ee 8c 10 e2 59 80 + + Encryption key (K): + 85 c4 29 a9 56 7a a6 33 + 41 1a 96 91 e9 09 4c 45 + 28 16 72 be 58 60 34 aa + e4 a2 a2 cc 71 61 59 e2 + + Storage key (q): + ab aa ba c0 e1 24 94 59 + 75 98 83 95 aa c0 24 1e + 55 59 c4 1c 40 74 e2 55 + 7b 9f e6 d1 54 b6 14 fb + cd d4 7f c7 f5 1d 78 6d + c2 e0 b1 ec e7 60 37 c0 + a1 57 8c 38 4e c6 1d 44 + 56 36 a9 4e 88 03 29 e9 + + ZKDF(zkey, label): + 9b f2 33 19 8c 6d 53 bb + db ac 49 5c ab d9 10 49 + a6 84 af 3f 40 51 ba ca + b0 dc f2 1c 8c f2 7a 1a + + nonce := SHA-256(dh[32..63] || h): + 14 f2 c0 6b ed c3 aa 2d + f0 71 13 9c 50 39 34 f3 + 4b fa 63 11 a8 52 f2 11 + f7 3a df 2e 07 61 ec 35 + + Derived private key (d', big-endian): + 3b 1b 29 d4 23 0b 10 a8 + ec 4d a3 c8 6e db 88 ea + cd 54 08 5c 1d db 63 f7 + a9 d7 3f 7c cb 2f c3 98 + + BDATA: + 57 7c c6 c9 5a 14 e7 04 + 09 f2 0b 01 67 e6 36 d0 + 10 80 7c 4f 00 37 2d 69 + 8c 82 6b d9 2b c2 2b d6 + bb 45 e5 27 7c 01 88 1d + 6a 43 60 68 e4 dd f1 c6 + b7 d1 41 6f af a6 69 7c + 25 ed d9 ea e9 91 67 c3 + + RRBLOCK: + 00 00 00 b0 00 01 00 14 + 9b f2 33 19 8c 6d 53 bb + db ac 49 5c ab d9 10 49 + a6 84 af 3f 40 51 ba ca + b0 dc f2 1c 8c f2 7a 1a + 9f 56 a8 86 ea 73 9d 59 + 17 50 8f 9b 75 56 39 f3 + a9 ac fa ed ed ca 7f bf + a7 94 b1 92 e0 8b f9 ed + 4c 7e c8 59 4c 9f 7b 4e + 19 77 4f f8 38 ec 38 7a + 8f 34 23 da ac 44 9f 59 + db 4e 83 94 3f 90 72 00 + 00 1c ee 8c 10 e2 59 80 + 57 7c c6 c9 5a 14 e7 04 + 09 f2 0b 01 67 e6 36 d0 + 10 80 7c 4f 00 37 2d 69 + 8c 82 6b d9 2b c2 2b d6 + bb 45 e5 27 7c 01 88 1d + 6a 43 60 68 e4 dd f1 c6 + b7 d1 41 6f af a6 69 7c + 25 ed d9 ea e9 91 67 c3 + + *(4) EDKEY zone with UTF-8 label and three records* + + Zone private key (d): + 5a f7 02 0e e1 91 60 32 + 88 32 35 2b bc 6a 68 a8 + d7 1a 7c be 1b 92 99 69 + a7 c6 6d 41 5a 0d 8f 65 + + Zone identifier (ztype|zkey): + 00 01 00 14 3c f4 b9 24 + 03 20 22 f0 dc 50 58 14 + 53 b8 5d 93 b0 47 b6 3d + 44 6c 58 45 cb 48 44 5d + db 96 68 8f + + zTLD: + 000G051WYJWJ80S04BRDRM2R2H9VGQCKP13VCFA4DHC4BJT88HEXQ5K8HW + + Label: + e5 a4 a9 e4 b8 8b e7 84 + a1 e6 95 b5 + + Number of records (integer): 3 + + Record #0 := ( + EXPIRATION: 8143584694000000 us + 00 1c ee 8c 10 e2 59 80 + + DATA_SIZE: + 00 10 + + TYPE: + 00 00 00 1c + + FLAGS: 00 00 + + DATA: + 00 00 00 00 00 00 00 00 + 00 00 00 00 de ad be ef + + ) + + Record #1 := ( + EXPIRATION: 17999736901000000 us + 00 3f f2 aa 54 08 db 40 + + DATA_SIZE: + 00 06 + + TYPE: + 00 01 00 01 + + FLAGS: 00 00 + + DATA: + e6 84 9b e7 a7 b0 + + ) + + Record #2 := ( + EXPIRATION: 11464693629000000 us + 00 28 bb 13 ff 37 19 40 + + DATA_SIZE: + 00 0b + + TYPE: + 00 00 00 10 + + FLAGS: 00 04 + + DATA: + 48 65 6c 6c 6f 20 57 6f + 72 6c 64 + + ) + + RDATA: + 00 1c ee 8c 10 e2 59 80 + 00 10 00 00 00 00 00 1c + 00 00 00 00 00 00 00 00 + 00 00 00 00 de ad be ef + 00 3f f2 aa 54 08 db 40 + 00 06 00 00 00 01 00 01 + e6 84 9b e7 a7 b0 00 28 + bb 13 ff 37 19 40 00 0b + 00 04 00 00 00 10 48 65 + 6c 6c 6f 20 57 6f 72 6c + 64 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + + Encryption NONCE|EXPIRATION: + bb 0d 3f 0f bd 22 42 77 + 50 da 5d 69 12 16 e6 c9 + 00 1c ee 8c 10 e2 59 80 + + Encryption key (K): + 3d f8 05 bd 66 87 aa 14 + 20 96 28 c2 44 b1 11 91 + 88 c3 92 56 37 a4 1e 5d + 76 49 6c 29 45 dc 37 7b + + Storage key (q): + ba f8 21 77 ee c0 81 e0 + 74 a7 da 47 ff c6 48 77 + 58 fb 0d f0 1a 6c 7f bb + 52 fc 8a 31 be f0 29 af + 74 aa 0d c1 5a b8 e2 fa + 7a 54 b4 f5 f6 37 f6 15 + 8f a7 f0 3c 3f ce be 78 + d3 f9 d6 40 aa c0 d1 ed + + ZKDF(zkey, label): + 74 f9 00 68 f1 67 69 53 + 52 a8 a6 c2 eb 98 48 98 + c5 3a cc a0 98 04 70 c6 + c8 12 64 cb dd 78 ad 11 + + nonce := SHA-256(dh[32..63] || h): + f8 6a b5 33 8a 74 d7 a1 + d2 77 ea 11 ff 95 cb e8 + 3a cf d3 97 3b b4 ab ca + 0a 1b 60 62 c3 7a b3 9c + + Derived private key (d', big-endian): + 17 c0 68 a6 c3 f7 20 de + 0e 1b 69 ff 3f 53 e0 5d + 3f e5 c5 b0 51 25 7a 89 + a6 3c 1a d3 5a c4 35 58 + + BDATA: + 4e b3 5a 50 d4 0f e1 a4 + 29 c7 f4 b2 67 a0 59 de + 4e 2c 8a 89 a5 ed 53 d3 + d4 92 58 59 d2 94 9f 7f + 30 d8 a2 0c aa 96 f8 81 + 45 05 2d 1c da 04 12 49 + 8f f2 5f f2 81 6e f0 ce + 61 fe 69 9b fa c7 2c 15 + dc 83 0e a9 b0 36 17 1c + cf ca bb dd a8 de 3c 86 + ed e2 95 70 d0 17 4b 82 + 82 09 48 a9 28 b7 f0 0e + fb 40 1c 10 fe 80 bb bb + 02 76 33 1b f7 f5 1b 8d + 74 57 9c 14 14 f2 2d 50 + 1a d2 5a e2 49 f5 bb f2 + a6 c3 72 59 d1 75 e4 40 + b2 94 39 c6 05 19 cb b1 + + RRBLOCK: + 00 00 01 00 00 01 00 14 + 74 f9 00 68 f1 67 69 53 + 52 a8 a6 c2 eb 98 48 98 + c5 3a cc a0 98 04 70 c6 + c8 12 64 cb dd 78 ad 11 + 75 6d 2c 15 7a d2 ea 4f + c0 b1 b9 1c 08 03 79 44 + 61 d3 de f2 0d d1 63 6c + fe dc 03 89 c5 49 d1 43 + 6c c3 5b 4e 1b f8 89 5a + 64 6b d9 a6 f4 6b 83 48 + 1d 9c 0e 91 d4 e1 be bb + 6a 83 52 6f b7 25 2a 06 + 00 1c ee 8c 10 e2 59 80 + 4e b3 5a 50 d4 0f e1 a4 + 29 c7 f4 b2 67 a0 59 de + 4e 2c 8a 89 a5 ed 53 d3 + d4 92 58 59 d2 94 9f 7f + 30 d8 a2 0c aa 96 f8 81 + 45 05 2d 1c da 04 12 49 + 8f f2 5f f2 81 6e f0 ce + 61 fe 69 9b fa c7 2c 15 + dc 83 0e a9 b0 36 17 1c + cf ca bb dd a8 de 3c 86 + ed e2 95 70 d0 17 4b 82 + 82 09 48 a9 28 b7 f0 0e + fb 40 1c 10 fe 80 bb bb + 02 76 33 1b f7 f5 1b 8d + 74 57 9c 14 14 f2 2d 50 + 1a d2 5a e2 49 f5 bb f2 + a6 c3 72 59 d1 75 e4 40 + b2 94 39 c6 05 19 cb b1 + +D.3. Zone Revocation + + The following is an example revocation for a PKEY zone: + + Zone private key (d, big-endian): + 6f ea 32 c0 5a f5 8b fa + 97 95 53 d1 88 60 5f d5 + 7d 8b f9 cc 26 3b 78 d5 + f7 47 8c 07 b9 98 ed 70 + + Zone identifier (ztype|zkey): + 00 01 00 00 2c a2 23 e8 + 79 ec c4 bb de b5 da 17 + 31 92 81 d6 3b 2e 3b 69 + 55 f1 c3 77 5c 80 4a 98 + d5 f8 dd aa + + zTLD: + 000G001CM8HYGYFCRJXXXDET2WRS50EP7CQ3PTANY71QEQ409ACDBY6XN8 + + Difficulty (5 base difficulty + 2 epochs): 7 + + Signed message: + 00 00 00 34 00 00 00 03 + 00 05 ff 1c 56 e4 b2 68 + 00 01 00 00 2c a2 23 e8 + 79 ec c4 bb de b5 da 17 + 31 92 81 d6 3b 2e 3b 69 + 55 f1 c3 77 5c 80 4a 98 + d5 f8 dd aa + + Proof: + 00 05 ff 1c 56 e4 b2 68 + 00 00 39 5d 18 27 c0 00 + 38 0b 54 aa 70 16 ac a2 + 38 0b 54 aa 70 16 ad 62 + 38 0b 54 aa 70 16 af 3e + 38 0b 54 aa 70 16 af 93 + 38 0b 54 aa 70 16 b0 bf + 38 0b 54 aa 70 16 b0 ee + 38 0b 54 aa 70 16 b1 c9 + 38 0b 54 aa 70 16 b1 e5 + 38 0b 54 aa 70 16 b2 78 + 38 0b 54 aa 70 16 b2 b2 + 38 0b 54 aa 70 16 b2 d6 + 38 0b 54 aa 70 16 b2 e4 + 38 0b 54 aa 70 16 b3 2c + 38 0b 54 aa 70 16 b3 5a + 38 0b 54 aa 70 16 b3 9d + 38 0b 54 aa 70 16 b3 c0 + 38 0b 54 aa 70 16 b3 dd + 38 0b 54 aa 70 16 b3 f4 + 38 0b 54 aa 70 16 b4 42 + 38 0b 54 aa 70 16 b4 76 + 38 0b 54 aa 70 16 b4 8c + 38 0b 54 aa 70 16 b4 a4 + 38 0b 54 aa 70 16 b4 c9 + 38 0b 54 aa 70 16 b4 f0 + 38 0b 54 aa 70 16 b4 f7 + 38 0b 54 aa 70 16 b5 79 + 38 0b 54 aa 70 16 b6 34 + 38 0b 54 aa 70 16 b6 8e + 38 0b 54 aa 70 16 b7 b4 + 38 0b 54 aa 70 16 b8 7e + 38 0b 54 aa 70 16 b8 f8 + 38 0b 54 aa 70 16 b9 2a + 00 01 00 00 2c a2 23 e8 + 79 ec c4 bb de b5 da 17 + 31 92 81 d6 3b 2e 3b 69 + 55 f1 c3 77 5c 80 4a 98 + d5 f8 dd aa 08 ca ff de + 3c 6d f1 45 f7 e0 79 81 + 15 37 b2 b0 42 2d 5e 1f + b2 01 97 81 ec a2 61 d1 + f9 d8 ea 81 0a bc 2f 33 + 47 7f 04 e3 64 81 11 be + 71 c2 48 82 1a d6 04 f4 + 94 e7 4d 0b f5 11 d2 c1 + 62 77 2e 81 + + The following is an example revocation for an EDKEY zone: + + Zone private key (d): + 5a f7 02 0e e1 91 60 32 + 88 32 35 2b bc 6a 68 a8 + d7 1a 7c be 1b 92 99 69 + a7 c6 6d 41 5a 0d 8f 65 + + Zone identifier (ztype|zkey): + 00 01 00 14 3c f4 b9 24 + 03 20 22 f0 dc 50 58 14 + 53 b8 5d 93 b0 47 b6 3d + 44 6c 58 45 cb 48 44 5d + db 96 68 8f + + zTLD: + 000G051WYJWJ80S04BRDRM2R2H9VGQCKP13VCFA4DHC4BJT88HEXQ5K8HW + + Difficulty (5 base difficulty + 2 epochs): 7 + + Signed message: + 00 00 00 34 00 00 00 03 + 00 05 ff 1c 57 35 42 bd + 00 01 00 14 3c f4 b9 24 + 03 20 22 f0 dc 50 58 14 + 53 b8 5d 93 b0 47 b6 3d + 44 6c 58 45 cb 48 44 5d + db 96 68 8f + + Proof: + 00 05 ff 1c 57 35 42 bd + 00 00 39 5d 18 27 c0 00 + 58 4c 93 3c b0 99 2a 08 + 58 4c 93 3c b0 99 2d f7 + 58 4c 93 3c b0 99 2e 21 + 58 4c 93 3c b0 99 2e 2a + 58 4c 93 3c b0 99 2e 53 + 58 4c 93 3c b0 99 2e 8e + 58 4c 93 3c b0 99 2f 13 + 58 4c 93 3c b0 99 2f 2d + 58 4c 93 3c b0 99 2f 3c + 58 4c 93 3c b0 99 2f 41 + 58 4c 93 3c b0 99 2f fd + 58 4c 93 3c b0 99 30 33 + 58 4c 93 3c b0 99 30 82 + 58 4c 93 3c b0 99 30 a2 + 58 4c 93 3c b0 99 30 e1 + 58 4c 93 3c b0 99 31 ce + 58 4c 93 3c b0 99 31 de + 58 4c 93 3c b0 99 32 12 + 58 4c 93 3c b0 99 32 4e + 58 4c 93 3c b0 99 32 9f + 58 4c 93 3c b0 99 33 31 + 58 4c 93 3c b0 99 33 87 + 58 4c 93 3c b0 99 33 8c + 58 4c 93 3c b0 99 33 e5 + 58 4c 93 3c b0 99 33 f3 + 58 4c 93 3c b0 99 34 26 + 58 4c 93 3c b0 99 34 30 + 58 4c 93 3c b0 99 34 68 + 58 4c 93 3c b0 99 34 88 + 58 4c 93 3c b0 99 34 8a + 58 4c 93 3c b0 99 35 4c + 58 4c 93 3c b0 99 35 bd + 00 01 00 14 3c f4 b9 24 + 03 20 22 f0 dc 50 58 14 + 53 b8 5d 93 b0 47 b6 3d + 44 6c 58 45 cb 48 44 5d + db 96 68 8f 04 ae 26 f7 + 63 56 5a b7 aa ab 01 71 + 72 4f 3c a8 bc c5 1a 98 + b7 d4 c9 2e a3 3c d9 34 + 4c a8 b6 3e 04 53 3a bf + 1a 3c 05 49 16 b3 68 2c + 5c a8 cb 4d d0 f8 4c 3b + 77 48 7a ac 6e ce 38 48 + 0b a9 d5 00 + +Acknowledgements + + The authors thank all reviewers for their comments. In particular, + we thank D. J. Bernstein, S. Bortzmeyer, A. Farrel, E. Lear, and + R. Salz for their insightful and detailed technical reviews. We + thank J. Yao and J. Klensin for the internationalization reviews. We + thank Dr. J. Appelbaum for suggesting the name "GNU Name System" and + Dr. Richard Stallman for approving its use. We thank T. Lange and + M. Wachs for their earlier contributions to the design and + implementation of GNS. We thank NLnet and NGI DISCOVERY for funding + work on the GNU Name System. + +Authors' Addresses + + Martin Schanzenbach + Fraunhofer AISEC + Lichtenbergstrasse 11 + 85748 Garching + Germany + Email: martin.schanzenbach@aisec.fraunhofer.de + + + Christian Grothoff + Berner Fachhochschule + Hoeheweg 80 + CH-2501 Biel/Bienne + Switzerland + Email: christian.grothoff@bfh.ch + + + Bernd Fix + GNUnet e.V. + Boltzmannstrasse 3 + 85748 Garching + Germany + Email: fix@gnunet.org |