RFC 4819
Secure Shell Public Key Subsystem
Secure Shell Public Key Subsystem ๐
Okay bestie, this is RFC 4819 ๐, a Standards Track doc from the IETF (Network Working Group), dated March 2007. Three people wrote it: J. Galbraith and J. Van Dyke from VanDyke Software, and J. Bright from Silicon Circus ๐. The header doesn't list anything it obsoletes or updates, so it's a fresh start โจ.
Status of This Memo
This is an Internet standards track protocol for the Internet community, and the authors want your discussion and suggestions for improvements ๐ซถ. For the standardization state and status, check the current edition of the "Internet Official Protocol Standards" (STD 1). Distribution of this memo is unlimited ๐.
Copyright Notice
Copyright (C) The IETF Trust (2007) ๐.
Abstract
Okay so Secure Shell has a user authentication mechanism based on public keys, but it doesn't say anything about how keys get distributed ๐ญ. There's no common key management solution in current implementations, which is literally chaos ๐. This document describes a protocol for configuring public keys in an implementation-independent way, so client software can take on that work for you ๐ง.
The Public Key Subsystem gives you a server-independent way to add public keys, remove public keys, and list the current public keys the server knows about ๐. Managing keys is specific and limited to the authenticated user, so nobody else gets to touch your keys ๐ .
A public key can also come with restrictions, including a mandatory command or subsystem ๐.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 3
3. Public Key Subsystem Overview . . . . . . . . . . . . . . . . 3
3.1. Opening the Public Key Subsystem . . . . . . . . . . . . . 4
3.2. Requests and Responses . . . . . . . . . . . . . . . . . . 5
3.3. The Status Message . . . . . . . . . . . . . . . . . . . . 5
3.3.1. Status Codes . . . . . . . . . . . . . . . . . . . . . 5
3.4. The Version Packet . . . . . . . . . . . . . . . . . . . . 6
4. Public Key Subsystem Operations . . . . . . . . . . . . . . . 7
4.1. Adding a Public Key . . . . . . . . . . . . . . . . . . . 7
4.2. Removing a Public Key . . . . . . . . . . . . . . . . . . 10
4.3. Listing Public Keys . . . . . . . . . . . . . . . . . . . 10
4.4. Listing Server Capabilities . . . . . . . . . . . . . . . 10
5. Security Considerations . . . . . . . . . . . . . . . . . . . 11
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 12
6.1. Registrations . . . . . . . . . . . . . . . . . . . . . . 12
6.2. Names . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6.2.1. Conventions for Names . . . . . . . . . . . . . . . . 12
6.2.2. Future Assignments of Names . . . . . . . . . . . . . 13
6.3. Public Key Subsystem Request Names . . . . . . . . . . . . 13
6.4. Public Key Subsystem Response Names . . . . . . . . . . . 13
6.5. Public Key Subsystem Attribute Names . . . . . . . . . . . 13
6.6. Public Key Subsystem Status Codes . . . . . . . . . . . . 14
6.6.1. Conventions . . . . . . . . . . . . . . . . . . . . . 14
6.6.2. Initial Assignments . . . . . . . . . . . . . . . . . 14
6.6.3. Future Assignments . . . . . . . . . . . . . . . . . . 15
7. References . . . . . . . . . . . . . . . . . . . . . . . . . . 15
7.1. Normative References . . . . . . . . . . . . . . . . . . . 15
7.2. Informative References . . . . . . . . . . . . . . . . . . 15
8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 16
1. Introduction โจ
Secure Shell (SSH) is how you do secure remote login and other secure network stuff over an insecure network ๐ง. It has a public key user authentication mechanism, but no key distribution mechanism at all, so it's kinda giving incomplete ๐. The usual move is to log in once with a password and then copy your public key over to the server. The catch is that no two implementations use the same mechanism to set that key up, so it's a mess ๐ญ.
This document describes a subsystem that configures public keys in an implementation-independent way ๐. Client software takes on the setup work so you don't have to. The Public Key Subsystem protocol is built for extreme simplicity in implementation ๐. It is not meant to replace the Public Key Infrastructure for X.509 Certificates (PKIX) ๐ โโ๏ธ.
The Secure Shell Public Key Subsystem runs on top of the Secure Shell transport layer [2] and user authentication protocols [3] ๐ธ. It gives the client a simple way to manage the server's public keys ๐ฆ.
Read the Secure Shell architecture [1] and Secure Shell connection [4] documents before this one, no skipping ๐.
This protocol is used from the Secure Shell Connection Protocol [4] as a subsystem, as described in the section "Starting a Shell or a Command" ๐. The subsystem name is publickey.
You have to be able to authenticate in some way before this protocol works ๐. If password authentication is in use, servers SHOULD provide a configuration option to turn off password authentication once the first public key is added, which is a very responsible move ๐.
2. Terminology ๐
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [5] ๐.
3. Public Key Subsystem Overview ๐
The Public Key Subsystem is the server-independent setup for adding public keys, removing them, and listing the ones the server currently knows about ๐. The subsystem name is publickey.
Public keys that are added, removed, or listed through this protocol belong only to the authenticated user ๐ซถ. Nobody else's keys are in play.
Adding, removing, and listing your keys all happen through request packets sent to the server ๐ฎ. The server sends back response packets that say whether it worked or not, plus any specific response data ๐.
The public key blob format is detailed in Section 6.6, "Public Key Algorithms" of the SSH Transport Protocol document [2] ๐งพ.
3.1. Opening the Public Key Subsystem ๐ช
The Public Key Subsystem starts when a client sends an SSH_MSG_CHANNEL_REQUEST over an existing session's channel โจ.
How a session gets opened is covered in the SSH Connection Protocol document [4], in the section "Opening a Session" ๐.
To open the Public Key Subsystem, the client sends this:
byte SSH_MSG_CHANNEL_REQUEST
uint32 recipient channel
string "subsystem"
boolean want reply
string "publickey"
Client implementations SHOULD reject this request, because it's normally only sent by the client ๐ โโ๏ธ.
If want reply is TRUE, the server MUST respond with SSH_MSG_CHANNEL_SUCCESS if the Public Key Subsystem started successfully ๐. It MUST respond with SSH_MSG_CHANNEL_FAILURE if the server failed to start or doesn't support the Public Key Subsystem ๐.
The server SHOULD respond with SSH_MSG_CHANNEL_FAILURE if the user isn't allowed to access the Public Key Subsystem, for example because they authenticated with a restricted public key ๐.
It is RECOMMENDED that clients request the reply for this request and check it ๐ซถ.
3.2. Requests and Responses ๐ฌ
Every Public Key Subsystem request and response is sent in this form:
uint32 length
string name
... request/response specific data follows
The length field is the length of the name field plus the request/response-specific data. It does not include the length of the length field itself ๐. The client MUST receive acknowledgement of each request before it sends a new request. No speed-running allowed ๐ข.
The version packet and every request and response described in Section 4 are defined by the 'name' field and the data part of the packet ๐งฉ.
3.3. The Status Message ๐ฆ
A request gets acknowledged by sending a status packet. If the request has response data, the status packet goes out after all of that data has been sent ๐ฆ.
string "status"
uint32 status code
string description [7]
string language tag [6]
A status message MUST be sent for any unrecognized packets. The request SHOULD NOT close the subsystem, so it stays open and happy ๐ธ.
3.3.1. Status Codes ๐ข
The status code gives the status in a more machine-readable format (good for localization), and it can be any of these values ๐ง :
SSH_PUBLICKEY_SUCCESS 0
SSH_PUBLICKEY_ACCESS_DENIED 1
SSH_PUBLICKEY_STORAGE_EXCEEDED 2
SSH_PUBLICKEY_VERSION_NOT_SUPPORTED 3
SSH_PUBLICKEY_KEY_NOT_FOUND 4
SSH_PUBLICKEY_KEY_NOT_SUPPORTED 5
SSH_PUBLICKEY_KEY_ALREADY_PRESENT 6
SSH_PUBLICKEY_GENERAL_FAILURE 7
SSH_PUBLICKEY_REQUEST_NOT_SUPPORTED 8
SSH_PUBLICKEY_ATTRIBUTE_NOT_SUPPORTED 9
If a request completes successfully, the server MUST send the status code SSH_PUBLICKEY_SUCCESS โ . The failure codes mean exactly what their names say ๐.
3.4. The Version Packet ๐
Both sides MUST start a connection by sending a version packet that says which version of the protocol they're using ๐.
string "version"
uint32 protocol-version-number
This document describes version 2 of the protocol. Version 1 was used by an early draft of this document. The version number went up after changes to how status packets are handled ๐.
Both sides send the highest version they implement, and the lower of the two version numbers is the one that gets used ๐ค. If either side can't support the lower version, it should close the subsystem and tell the other side by sending an SSH_MSG_CHANNEL_CLOSE message ๐. Before closing the subsystem, a status message with the status SSH_PUBLICKEY_VERSION_NOT_SUPPORTED SHOULD be sent. Normally, status messages are only sent by the server, in response to requests from the client. This is the only time the client sends a status message ๐ซฃ.
Both sides MUST wait to receive this version before continuing ๐. The "version" packet MUST NOT be sent again after this first exchange ๐ซ. The SSH_PUBLICKEY_VERSION_NOT_SUPPORTED status code must not be sent in response to any other request.
Implementations MAY use the first 15 bytes of the version packet as a "magic cookie" so they don't process spurious output from the user's shell (as described in Section 6.5 of [4]) ๐ช. Those bytes will always be:
0x00 0x00 0x00 0x0F 0x00 0x00 0x00 0x07 0x76 0x65 0x72 0x73 0x69 0x6F
0x6E
4. Public Key Subsystem Operations ๐ง
Okay, the Public Key Subsystem currently defines four operations: add, remove, list, and listattributes ๐.
Part 2 picks up with Section 4.1, Adding a Public Key, and it's where things get really good ๐ ๐ฅ.
4.1. Adding a Public Key โจ
okay so when the client wants to add a public key, it sends this bundle ๐
string "add"
string public key algorithm name
string public key blob
boolean overwrite
uint32 attribute-count
string attrib-name
string attrib-value
bool critical
repeated attribute-count times
the server MUST attempt to store the key for that user in the right spot ๐๏ธ so it can be used for later public key authentications. if overwrite is false and the key is already there, the server MUST return SSH_PUBLICKEY_KEY_ALREADY_PRESENT. if it sends that back, the client SHOULD give the user a choice to overwrite the key ๐
. if overwrite is true and the key already exists but can't be overwritten, the server MUST return SSH_PUBLICKEY_ACCESS_DENIED ๐
attribute names follow the same naming scheme as algorithm names in [1] ๐ท๏ธ. if the server doesn't implement a critical attribute, it MUST fail the add with the status code SSH_PUBLICKEY_ATTRIBUTE_NOT_SUPPORTED. and for critical attributes, just storing it is NOT enough ๐ญ. the server has to actually understand and carry out what the attribute is for.
the following attributes are currently defined ๐:
comment
the comment attribute holds user-written text about the key ๐. the server SHOULD make every effort to keep this value and send it back with the key during any later list operation. the server MUST NOT try to interpret or act on the content of the comment in any way. the comment attribute must be written in UTF-8 format [7] ๐ธ.
honestly this one is so useful, because the user can identify the key without having to compare fingerprints ๐. this attribute SHOULD NOT be critical.
comment-language
if this attribute is specified, it MUST come right after a comment attribute and name the language for that comment [6] ๐. the client MAY give more than one comment, as long as it also gives a different language for each one. the server SHOULD try to store each comment together with its language attribute. this attribute SHOULD NOT be critical.
command-override
command-override sets a command that gets run whenever this key is in use ๐ฌ. the server should run it when it gets an exec or shell request from the client, instead of the command or shell that would normally have run because of that request. if the command string is empty, both exec and shell requests should be denied ๐ซ. if there's no command-override attribute, all exec and shell requests should be allowed (as long as they still pass any other security or authorization checks the server does) โ
. this attribute SHOULD be critical.
subsystem
subsystem is a comma-separated list of subsystems that can be started (using a subsystem request) while this key is in use ๐งฉ. this attribute SHOULD be critical. if the value is empty, no subsystems can be started. if there's no subsystem attribute, there are no limits on which subsystems can be started when someone authenticates with this key.
x11
x11 means X11 forwarding may not be performed while this key is in use ๐ฅ๏ธ. the attribute-value field SHOULD be empty for this attribute. this attribute SHOULD be critical.
shell
shell means session channel shell requests should be denied while this key is in use ๐. the attribute-value field SHOULD be empty for this attribute. this attribute SHOULD be critical.
exec
exec means session channel exec requests should be denied while this key is in use โ. the attribute-value field SHOULD be empty for this attribute. this attribute SHOULD be critical.
agent
agent means session channel auth-agent-req requests should be denied while this key is in use ๐ต๏ธ. the attribute-value field SHOULD be empty for this attribute. this attribute SHOULD be critical.
env
env means session channel env requests should be denied while this key is in use ๐ฟ. the attribute-value field SHOULD be empty for this attribute. this attribute SHOULD be critical.
from
from is a comma-separated list of hosts that the key may be used from ๐ . if a host that isn't on this list tries to use the key for authorization, the authorization attempt MUST be denied ๐. the server SHOULD make a log entry about this. the server MAY offer a method for administrators to stop a host from appearing in this list. the server should use whatever method is appropriate for its platform to identify the host, e.g., for IP-based networks, checking the IP address or doing a reverse DNS lookup ๐. for IP-based networks, it is anticipated that each element of the from parameter will take the form of a specific IP address or hostname ๐.
port-forward
port-forward means no direct-tcpip requests should be accepted, except the ones going to hosts listed in the comma-separated list given as this attribute's value ๐ช. if the value is empty, every direct-tcpip request should be refused while this key is in use. this attribute SHOULD be critical.
reverse-forward
reverse-forward means no tcpip-forward requests should be accepted, except for the port numbers in the comma-separated list given as this attribute's value ๐. if the value is empty, every tcpip-forward request should be refused while this key is in use. this attribute SHOULD be critical.
on top of whatever attributes the client asks for, the server MAY offer a method for administrators to enforce certain attributes compulsorily ๐โจ.
4.2. Removing a Public Key ๐๏ธ
if the client wants to remove a public key, it sends:
string "remove"
string public key algorithm name
string public key blob
the server MUST attempt to remove the public key for the user from the appropriate location, so that the key can't be used for any later authentications ๐ โโ๏ธ.
4.3. Listing Public Keys ๐
if the client wants to see the keys the server knows about, it sends:
string "list"
the server answers with zero or more of these responses:
string "publickey"
string public key algorithm name
string public key blob
uint32 attribute-count
string attrib-name
string attrib-value
repeated attribute-count times
there's no requirement on the order of the responses ๐. some servers might send them in a particular order, but client implementations should not rely on the responses coming in any order, okay? ๐
after the last "publickey" response, a status packet MUST be sent ๐ฌ.
implementations SHOULD support this request ๐.
4.4. Listing Server Capabilities ๐งฐ
if the client wants to know which key attributes the server supports, it sends:
string "listattributes"
the server answers with zero or more of these responses:
string "attribute"
string attribute name
boolean compulsory
the compulsory field says whether this attribute will be forced onto any added keys (no matter whether the client asked for it) because of administrative settings on the server ๐. if the server doesn't support administrative settings like that, it MUST return false in the compulsory field.
here's an example, because this one is kind of a plot twist ๐ญ. say the server has a config file that says the user isn't allowed shell access. the server would return the "shell" attribute with compulsory set to true. then, whatever attributes the user asks for on their key, the server would also apply "shell", which makes it impossible for the user to use a shell ๐.
after the last "attribute" response, a status packet MUST be sent ๐ฌ.
an implementation MAY choose not to support this request ๐คทโโ๏ธ.
5. Security Considerations ๐จ
this protocol assumes it runs over a secure channel and that both endpoints of that channel have been authenticated ๐. so this protocol assumes it's already protected from network-level attacks from the outside.
this protocol gives a way to upload and change client authentication data ๐ค. it's the server implementation's job to enforce whatever access controls are needed to limit what any particular user can do (the user is authenticated outside this protocol, typically using the SSH User Authentication Protocol [3]). the big danger is that users can overwrite an existing key on the server with this protocol while also giving the new key fewer restrictions than the old one had ๐ฑ. servers should take care that clients can't override presets from the server's administrator when this happens. this is very important, bestie ๐ซถ.
this protocol requires the client to assume that the server will correctly implement and observe the attributes applied to keys ๐ค. implementation errors in the server could make clients authorize keys for access they weren't meant to have, or apply fewer restrictions than were intended ๐.
6. IANA Considerations ๐๏ธ
this section covers the conventions for naming the namespaces, the initial state of the registry, and instructions for future assignments ๐.
6.1. Registrations ๐
consistent with Section 4.9.5 of [8], this document makes the following registration:
the subsystem name "publickey" ๐.
6.2. Names ๐ท๏ธ
in the sections that follow, the values for the namespaces are textual ๐ฌ. the conventions and instructions to the IANA for future assignments are in this section. the initial assignments are given in their own sections.
6.2.1. Conventions for Names ๐
all names registered by the IANA in the following sections MUST be printable US-ASCII strings, and they MUST NOT contain the at-sign "@", the comma ",", or any whitespace or control characters (ASCII codes 32 or less) ๐ซ. names are case-sensitive, and they MUST NOT be longer than 64 characters ๐.
there's a provision here for locally extensible names ๐. the IANA will not register and will not control names with an at-sign in them. names with an at-sign will have the format name@domainname (no double quotes), where the part before the at-sign is the name. the format of that part isn't specified. however, these names MUST be printable US-ASCII strings, and they MUST NOT contain the comma character (","), any whitespace, or any control characters (ASCII codes 32 or less). the part after the at-sign MUST be a valid, fully qualified Internet domain name [10] controlled by the person or organization defining the name ๐. names are case-sensitive, and they MUST NOT be longer than 64 characters. each domain decides how it manages its own local namespace ๐ก.
someone noticed these names look like STD 11 [9] email addresses ๐ง. that's purely a coincidence, and it actually has nothing to do with STD 11 [9] ๐. an example of a locally defined name is our-attribute@example.com (no double quotes) ๐.
6.2.2. Future Assignments of Names โจ
okay so if anyone wants to add a brand new Name later, it MUST go through the IETF Consensus process described in [11]. no shortcuts, bestie ๐ซถ
6.3. Public Key Subsystem Request Names ๐จ
here are the starter Request names IANA is handing out, lowkey iconic ๐
Request Name
-------------
version
add
remove
list
listattributes
6.4. Public Key Subsystem Response Names ๐ฌ
and these are the initial Response names ๐
Response Name
--------------
version
status
publickey
attribute
6.5. Public Key Subsystem Attribute Names ๐ท๏ธ
attributes are how you define properties or restrictions on a public key, so they're basically the fine print on each key ๐ง here are the first ones IANA assigned ๐ธ
Attribute Name
---------------
comment
comment-language
command-override
subsystem
x11
shell
exec
agent
env
from
port-forward
reverse-forward
6.6. Public Key Subsystem Status Codes ๐ฆ
the status code is a single byte that tells you how a request went. it's the little traffic light for every request ๐ฆ๐
6.6.1. Conventions ๐
status responses carry codes from 0 to 255, and they're divided up like this. the chunk from 192 to 255 is set aside for local, private extensions, so that's your own playground ๐ง
6.6.2. Initial Assignments ๐
this table is the official list of the starter Public Key Subsystem status code values. the Reference column is left blank here ๐
Status code Value Reference
------------ ----- ---------
SSH_PUBLICKEY_SUCCESS 0
SSH_PUBLICKEY_ACCESS_DENIED 1
SSH_PUBLICKEY_STORAGE_EXCEEDED 2
SSH_PUBLICKEY_VERSION_NOT_SUPPORTED 3
SSH_PUBLICKEY_KEY_NOT_FOUND 4
SSH_PUBLICKEY_KEY_NOT_SUPPORTED 5
SSH_PUBLICKEY_KEY_ALREADY_PRESENT 6
SSH_PUBLICKEY_GENERAL_FAILURE 7
SSH_PUBLICKEY_REQUEST_NOT_SUPPORTED 8
SSH_PUBLICKEY_ATTRIBUTE_NOT_SUPPORTED 9
6.6.3. Future Assignments ๐ฎ
if you want a new status code in the 0 to 191 range, it MUST go through the Standards Action method described in [11]. this is serious business, so no freelancing ๐
IANA doesn't manage the 192 to 255 range at all. that's reserved for private use, so hands off ๐ โโ๏ธโจ
7. References ๐
7.1. Normative References ๐
[1] Ylonen, T. and C. Lonvick, "The Secure Shell (SSH) Protocol
Architecture", RFC 4251, January 2006.
[2] Ylonen, T. and C. Lonvick, "The Secure Shell (SSH) Transport
Layer Protocol", RFC 4253, January 2006.
[3] Ylonen, T. and C. Lonvick, "The Secure Shell (SSH)
Authentication Protocol", RFC 4252, January 2006.
[4] Ylonen, T. and C. Lonvick, "The Secure Shell (SSH) Connection
Protocol", RFC 4254, January 2006.
[5] Bradner, S., "Key words for use in RFCs to Indicate Requirement
Levels", BCP 14, RFC 2119, March 1997.
[6] Phillips, A. and M. Davis, "Tags for Identifying Languages",
BCP 47, RFC 4646, September 2006.
[7] Yergeau, F., "UTF-8, a transformation format of ISO 10646",
STD 63, RFC 3629, November 2003.
7.2. Informative References ๐
[8] Lehtinen, S. and C. Lonvick, "The Secure Shell (SSH) Protocol
Assigned Numbers", RFC 4250, January 2006.
[9] Crocker, D., "Standard for the format of ARPA Internet text
messages", STD 11, RFC 822, August 1982.
[10] Mockapetris, P., "Domain names - concepts and facilities",
STD 13, RFC 1034, November 1987.
[11] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA
Considerations Section in RFCs", BCP 26, RFC 2434,
October 1998.
8. Acknowledgements ๐ซถ
Brent McClure helped write this document, and he's a whole vibe for it ๐
Authors' Addresses ๐บ๏ธ
Joseph Galbraith
VanDyke Software
4848 Tramway Ridge Blvd
Suite 101
Albuquerque, NM 87111
US
Phone: +1 505 332 5700
EMail: galb@vandyke.com
Jeff P. Van Dyke
VanDyke Software
4848 Tramway Ridge Blvd
Suite 101
Albuquerque, NM 87111
US
Phone: +1 505 332 5700
EMail: jpv@vandyke.com
Jon Bright
Silicon Circus
24 Jubilee Road
Chichester, West Sussex PO19 7XB
UK
Phone: +49 172 524 0521
EMail: jon@siliconcircus.com
Full Copyright Statement โ๏ธ
Copyright (C) The IETF Trust (2007).
This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights.
This document and the information contained herein are provided on an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Intellectual Property ๐ชช
The IETF takes no position regarding the validity or scope of any Intellectual Property Rights or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; nor does it represent that it has made any independent effort to identify any such rights. Information on the procedures with respect to rights in RFC documents can be found in BCP 78 and BCP 79.
Copies of IPR disclosures made to the IETF Secretariat and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this specification can be obtained from the IETF on-line IPR repository at http://www.ietf.org/ipr.
The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard. Please address the information to the IETF at ietf-ipr@ietf.org.
Acknowledgement ๐
Funding for the RFC Editor function is currently provided by the Internet Society.
๐ฆ where this page comes from
- ietf: rfc4819 2007-03
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms