diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-11-27 20:54:24 +0100 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-11-27 20:54:24 +0100 |
commit | 4bfd864f10b68b71482b35c818559068ef8d5797 (patch) | |
tree | e3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc2367.txt | |
parent | ea76e11061bda059ae9f9ad130a9895cc85607db (diff) |
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc2367.txt')
-rw-r--r-- | doc/rfc/rfc2367.txt | 3811 |
1 files changed, 3811 insertions, 0 deletions
diff --git a/doc/rfc/rfc2367.txt b/doc/rfc/rfc2367.txt new file mode 100644 index 0000000..032702d --- /dev/null +++ b/doc/rfc/rfc2367.txt @@ -0,0 +1,3811 @@ + + + + + + +Network Working Group D. McDonald +Request for Comments: 2367 C. Metz +Category: Informational B. Phan + July 1998 + + + PF_KEY Key Management API, Version 2 + +Status of this Memo + + This memo provides information for the Internet community. It does + not specify an Internet standard of any kind. Distribution of this + memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1998). All Rights Reserved. + +Abstract + + A generic key management API that can be used not only for IP + Security [Atk95a] [Atk95b] [Atk95c] but also for other network + security services is presented in this document. Version 1 of this + API was implemented inside 4.4-Lite BSD as part of the U. S. Naval + Research Laboratory's freely distributable and usable IPv6 and IPsec + implementation[AMPMC96]. It is documented here for the benefit of + others who might also adopt and use the API, thus providing increased + portability of key management applications (e.g. a manual keying + application, an ISAKMP daemon, a GKMP daemon [HM97a][HM97b], a + Photuris daemon, or a SKIP certificate discovery protocol daemon). + +Table of Contents + + 1 Introduction ............................................. 3 + 1.1 Terminology .............................................. 3 + 1.2 Conceptual Model ......................................... 4 + 1.3 PF_KEY Socket Definition ................................. 8 + 1.4 Overview of PF_KEY Messaging Behavior .................... 8 + 1.5 Common PF_KEY Operations ................................. 9 + 1.6 Differences Between PF_KEY and PF_ROUTE .................. 10 + 1.7 Name Space ............................................... 11 + 1.8 On Manual Keying ..........................................11 + 2 PF_KEY Message Format .................................... 11 + 2.1 Base Message Header Format ............................... 12 + 2.2 Alignment of Headers and Extension Headers ............... 14 + 2.3 Additional Message Fields ................................ 14 + 2.3.1 Association Extension .................................... 15 + 2.3.2 Lifetime Extension ....................................... 16 + + + +McDonald, et. al. Informational [Page 1] + +RFC 2367 PF_KEY Key Management API July 1998 + + + 2.3.3 Address Extension ........................................ 18 + 2.3.4 Key Extension ............................................ 19 + 2.3.5 Identity Extension ....................................... 21 + 2.3.6 Sensitivity Extension .................................... 21 + 2.3.7 Proposal Extension ....................................... 22 + 2.3.8 Supported Algorithms Extension ........................... 25 + 2.3.9 SPI Range Extension ...................................... 26 + 2.4 Illustration of Message Layout ........................... 27 + 3 Symbolic Names ........................................... 30 + 3.1 Message Types ............................................ 31 + 3.1.1 SADB_GETSPI .............................................. 32 + 3.1.2 SADB_UPDATE .............................................. 33 + 3.1.3 SADB_ADD ................................................. 34 + 3.1.4 SADB_DELETE .............................................. 35 + 3.1.5 SADB_GET ................................................. 36 + 3.1.6 SADB_ACQUIRE ............................................. 36 + 3.1.7 SADB_REGISTER ............................................ 38 + 3.1.8 SADB_EXPIRE .............................................. 39 + 3.1.9 SADB_FLUSH ............................................... 40 + 3.1.10 SADB_DUMP ................................................ 40 + 3.2 Security Association Flags ............................... 41 + 3.3 Security Association States .............................. 41 + 3.4 Security Association Types ............................... 41 + 3.5 Algorithm Types .......................................... 42 + 3.6 Extension Header Values .................................. 43 + 3.7 Identity Extension Values ................................ 44 + 3.8 Sensitivity Extension Values ............................. 45 + 3.9 Proposal Extension Values ................................ 45 + 4 Future Directions ........................................ 45 + 5 Examples ................................................. 45 + 5.1 Simple IP Security Example ............................... 46 + 5.2 Proxy IP Security Example ................................ 47 + 5.3 OSPF Security Example .................................... 50 + 5.4 Miscellaneous ............................................ 50 + 6 Security Considerations .................................. 51 + Acknowledgments ............,............................. 52 + References ............................................... 52 + Disclaimer ............................................... 54 + Authors' Addresses ....................................... 54 + A Promiscuous Send/Receive Extension ....................... 55 + B Passive Change Message Extension ......................... 57 + C Key Management Private Data Extension .................... 58 + D Sample Header File ....................................... 59 + E Change Log ............................................... 64 + F Full Copyright Statement ................................. 68 + + + + + + +McDonald, et. al. Informational [Page 2] + +RFC 2367 PF_KEY Key Management API July 1998 + + +1 Introduction + + PF_KEY is a new socket protocol family used by trusted privileged key + management applications to communicate with an operating system's key + management internals (referred to here as the "Key Engine" or the + Security Association Database (SADB)). The Key Engine and its + structures incorporate the required security attributes for a session + and are instances of the "Security Association" (SA) concept + described in [Atk95a]. The names PF_KEY and Key Engine thus refer to + more than cryptographic keys and are retained for consistency with + the traditional phrase, "Key Management". + + PF_KEY is derived in part from the BSD routing socket, PF_ROUTE. + [Skl91] This document describes Version 2 of PF_KEY. Version 1 was + implemented in the first five alpha test versions of the NRL + IPv6+IPsec Software Distribution for 4.4-Lite BSD UNIX and the Cisco + ISAKMP/Oakley key management daemon. Version 2 extends and refines + this interface. Theoretically, the messages defined in this document + could be used in a non-socket context (e.g. between two directly + communicating user-level processes), but this document will not + discuss in detail such possibilities. + + Security policy is deliberately omitted from this interface. PF_KEY + is not a mechanism for tuning systemwide security policy, nor is it + intended to enforce any sort of key management policy. The developers + of PF_KEY believe that it is important to separate security + mechanisms (such as PF_KEY) from security policies. This permits a + single mechanism to more easily support multiple policies. + +1.1 Terminology + + Even though this document is not intended to be an actual Internet + standard, the words that are used to define the significance of + particular features of this interface are usually capitalized. Some + of these words, including MUST, MAY, and SHOULD, are detailed in + [Bra97]. + + - CONFORMANCE and COMPLIANCE + + Conformance to this specification has the same meaning as compliance + to this specification. In either case, the mandatory-to-implement, + or MUST, items MUST be fully implemented as specified here. If any + mandatory item is not implemented as specified here, that + implementation is not conforming and not compliant with this + specification. + + + + + + +McDonald, et. al. Informational [Page 3] + +RFC 2367 PF_KEY Key Management API July 1998 + + + This specification also uses many terms that are commonly used in the + context of network security. Other documents provide more + definitions and background information on these [VK83, HA94, Atk95a]. + Two terms deserve special mention: + + - (Encryption/Authentication) Algorithm + + For PF_KEY purposes, an algorithm, whether encryption or + authentication, is the set of operations performed on a packet to + complete authentication or encryption as indicated by the SA type. A + PF_KEY algorithm MAY consist of more than one cryptographic + algorithm. Another possibility is that the same basic cryptographic + algorithm may be applied with different modes of operation or some + other implementation difference. These differences, henceforth called + _algorithm differentiators_, distinguish between different PF_KEY + algorithms, and options to the same algorithm. Algorithm + differentiators will often cause fundamentally different security + properties. + + For example, both DES and 3DES use the same cryptographic algorithm, + but they are used differently and have different security properties. + The triple-application of DES is considered an algorithm + differentiator. There are therefore separate PF_KEY algorithms for + DES and 3DES. Keyed-MD5 and HMAC-MD5 use the same hash function, but + construct their message authentication codes differently. The use of + HMAC is an algorithm differentiator. DES-ECB and DES-CBC are the + same cryptographic algorithm, but use a different mode. Mode (e.g., + chaining vs. code-book) is an algorithm differentiator. Blowfish with + a 128-bit key, however, is similar to Blowfish with a 384-bit key, + because the algorithm's workings are otherwise the same and therefore + the key length is not an algorithm differentiator. + + In terms of IP Security, a general rule of thumb is that whatever + might be labeled the "encryption" part of an ESP transform is + probably a PF_KEY encryption algorithm. Whatever might be labelled + the "authentication" part of an AH or ESP transform is probably a + PF_KEY authentication algorithm. + +1.2 Conceptual Model + + This section describes the conceptual model of an operating system + that implements the PF_KEY key management application programming + interface. This section is intended to provide background material + useful to understand the rest of this document. Presentation of this + conceptual model does not constrain a PF_KEY implementation to + strictly adhere to the conceptual components discussed in this + subsection. + + + + +McDonald, et. al. Informational [Page 4] + +RFC 2367 PF_KEY Key Management API July 1998 + + + Key management is most commonly implemented in whole or in part at + the application layer. For example, the ISAKMP/Oakley, GKMP, and + Photuris proposals for IPsec key management are all application-layer + protocols. Manual keying is also done at the application layer. + Even parts of the SKIP IP-layer keying proposal can be implemented at + the application layer. Figure 1 shows the relationship between a Key + Management daemon and PF_KEY. Key management daemons use PF_KEY to + communicate with the Key Engine and use PF_INET (or PF_INET6 in the + case of IPv6) to communicate, via the network, with a remote key + management entity. + + The "Key Engine" or "Security Association Database (SADB)" is a + logical entity in the kernel that stores, updates, and deletes + Security Association data for various security protocols. There are + logical interfaces within the kernel (e.g. getassocbyspi(), + getassocbysocket()) that security protocols inside the kernel (e.g. + IP Security, aka IPsec) use to request and obtain Security + Associations. + + In the case of IPsec, if by policy a particular outbound packet needs + processing, then the IPsec implementation requests an appropriate + Security Association from the Key Engine via the kernel-internal + interface. If the Key Engine has an appropriate SA, it allocates the + SA to this session (marking it as used) and returns the SA to the + IPsec implementation for use. If the Key Engine has no such SA but a + key management application has previously indicated (via a PF_KEY + SADB_REGISTER message) that it can obtain such SAs, then the Key + Engine requests that such an SA be created (via a PF_KEY SADB_ACQUIRE + message). When the key management daemon creates a new SA, it places + it into the Key Engine for future use. + + + + + + + + + + + + + + + + + + + + + +McDonald, et. al. Informational [Page 5] + +RFC 2367 PF_KEY Key Management API July 1998 + + + +---------------+ + |Key Mgmt Daemon| + +---------------+ + | | + | | + | | Applications + ======[PF_KEY]====[PF_INET]========================== + | | OS Kernel + +------------+ +-----------------+ + | Key Engine | | TCP/IP, | + | or SADB |---| including IPsec | + +------------+ | | + +-----------------+ + | + +-----------+ + | Network | + | Interface | + +-----------+ + + Figure 1: Relationship of Key Mgmt to PF_KEY + + For performance reasons, some security protocols (e.g. IP Security) + are usually implemented inside the operating system kernel. Other + security protocols (e.g. OSPFv2 Cryptographic Authentication) are + implemented in trusted privileged applications outside the kernel. + Figure 2 shows a trusted, privileged routing daemon using PF_INET to + communicate routing information with a remote routing daemon and + using PF_KEY to request, obtain, and delete Security Associations + used with a routing protocol. + + + + + + + + + + + + + + + + + + + + + + +McDonald, et. al. Informational [Page 6] + +RFC 2367 PF_KEY Key Management API July 1998 + + + +---------------+ + |Routing Daemon| + +---------------+ + | | + | | + | | Applications + ======[PF_KEY]====[PF_INET]========================== + | | OS Kernel + +------------+ +---------+ + | Key Engine | | TCP/IP | + | or SADB |---| | + +------------+ +---------+ + | + +-----------+ + | Network | + | Interface | + +-----------+ + + Figure 2: Relationship of Trusted Application to PF_KEY + + When a trusted privileged application is using the Key Engine but + implements the security protocol within itself, then operation varies + slightly. In this case, the application needing an SA sends a PF_KEY + SADB_ACQUIRE message down to the Key Engine, which then either + returns an error or sends a similar SADB_ACQUIRE message up to one or + more key management applications capable of creating such SAs. As + before, the key management daemon stores the SA into the Key Engine. + Then, the trusted privileged application uses an SADB_GET message to + obtain the SA from the Key Engine. + + In some implementations, policy may be implemented in user-space, + even though the actual cryptographic processing takes place in the + kernel. Such policy communication between the kernel mechanisms and + the user-space policy MAY be implemented by PF_KEY extensions, or + other such mechanism. This document does not specify such + extensions. A PF_KEY implementation specified by the memo does NOT + have to support configuring systemwide policy using PF_KEY. + + Untrusted clients, for example a user's web browser or telnet client, + do not need to use PF_KEY. Mechanisms not specified here are used by + such untrusted client applications to request security services (e.g. + IPsec) from an operating system. For security reasons, only trusted, + privileged applications are permitted to open a PF_KEY socket. + + + + + + + + +McDonald, et. al. Informational [Page 7] + +RFC 2367 PF_KEY Key Management API July 1998 + + +1.3 PF_KEY Socket Definition + + The PF_KEY protocol family (PF_KEY) symbol is defined in + <sys/socket.h> in the same manner that other protocol families are + defined. PF_KEY does not use any socket addresses. Applications + using PF_KEY MUST NOT depend on the availability of a symbol named + AF_KEY, but kernel implementations are encouraged to define that + symbol for completeness. + + The key management socket is created as follows: + + #include <sys/types.h> + #include <sys/socket.h> + #include <net/pfkeyv2.h> + + int s; + s = socket(PF_KEY, SOCK_RAW, PF_KEY_V2); + + The PF_KEY domain currently supports only the SOCK_RAW socket type. + The protocol field MUST be set to PF_KEY_V2, or else EPROTONOSUPPORT + will be returned. Only a trusted, privileged process can create a + PF_KEY socket. On conventional UNIX systems, a privileged process is + a process with an effective userid of zero. On non-MLS proprietary + operating systems, the notion of a "privileged process" is + implementation-defined. On Compartmented Mode Workstations (CMWs) or + other systems that claim to provide Multi-Level Security (MLS), a + process MUST have the "key management privilege" in order to open a + PF_KEY socket[DIA]. MLS systems that don't currently have such a + specific privilege MUST add that special privilege and enforce it + with PF_KEY in order to comply and conform with this specification. + Some systems, most notably some popular personal computers, do not + have the concept of an unprivileged user. These systems SHOULD take + steps to restrict the programs allowed to access the PF_KEY API. + +1.4 Overview of PF_KEY Messaging Behavior + + A process interacts with the key engine by sending and receiving + messages using the PF_KEY socket. Security association information + can be inserted into and retrieved from the kernel's security + association table using a set of predefined messages. In the normal + case, all properly-formed messages sent to the kernel are returned to + all open PF_KEY sockets, including the sender. Improperly formed + messages will result in errors, and an implementation MUST check for + a properly formed message before returning it to the appropriate + listeners. Unlike the routing socket, most errors are sent in reply + messages, not the errno field when write() or send() fails. PF_KEY + message delivery is not guaranteed, especially in cases where kernel + or socket buffers are exhausted and messages are dropped. + + + +McDonald, et. al. Informational [Page 8] + +RFC 2367 PF_KEY Key Management API July 1998 + + + Some messages are generated by the operating system to indicate that + actions need to be taken, and are not necessarily in response to any + message sent down by the user. Such messages are not received by all + PF_KEY sockets, but by sockets which have indicated that kernel- + originated messages are to be received. These messages are special + because of the expected frequency at which they will occur. Also, an + implementation may further wish to restrict return messages from the + kernel, in cases where not all PF_KEY sockets are in the same trust + domain. + + Many of the normal BSD socket calls have undefined behavior on PF_KEY + sockets. These include: bind(), connect(), socketpair(), accept(), + getpeername(), getsockname(), ioctl(), and listen(). + +1.5 Common PF_KEY Operations + + There are two basic ways to add a new Security Association into the + kernel. The simplest is to send a single SADB_ADD message, + containing all of the SA information, from the application into the + kernel's Key Engine. This approach works particularly well with + manual key management, which is required for IPsec, and other + security protocols. + + The second approach to add a new Security Association into the kernel + is for the application to first request a Security Parameters Index + (SPI) value from the kernel using the SADB_GETSPI message and then + send an SADB_UPDATE message with the complete Security Association + data. This second approach works well with key management daemons + when the SPI values need to be known before the entire Security + Association data is known (e.g. so the SPI value can be indicated to + the remote end of the key management session). + + An individual Security Association can be deleted using the + SADB_DELETE message. Categories of SAs or the entire kernel SA table + can be deleted using the SADB_FLUSH message. + + The SADB_GET message is used by a trusted application-layer process + (e.g. routed(8) or gated(8)) to retrieve an SA (e.g. RIP SA or OSPF + SA) from the kernel's Key Engine. + + The kernel or an application-layer can use the SADB_ACQUIRE message + to request that a Security Association be created by some + application-layer key management process that has registered with the + kernel via an SADB_REGISTER message. This ACQUIRE message will have + a sequence number associated with it. This sequence number MUST be + used by followup SADB_GETSPI, SADB_UPDATE, and SADB_ADD messages, in + order to keep track of which request gets its keying material. The + sequence number (described below) is similar to a transaction ID in a + + + +McDonald, et. al. Informational [Page 9] + +RFC 2367 PF_KEY Key Management API July 1998 + + + remote procedure call. + + The SADB_EXPIRE message is sent from the kernel to key management + applications when the "soft lifetime" or "hard lifetime" of a + Security Association has expired. Key management applications should + use receipt of a soft lifetime SADB_EXPIRE message as a hint to + negotiate a replacement SA so the replacement SA will be ready and in + the kernel before it is needed. + + A SADB_DUMP message is also defined, but this is primarily intended + for PF_KEY implementor debugging and is not used in ordinary + operation of PF_KEY. + +1.6 Differences Between PF_KEY and PF_ROUTE + + The following bullets are points of difference between the routing + socket and PF_KEY. Programmers who are used to the routing socket + semantics will find some differences in PF_KEY. + + * PF_KEY message errors are usually returned in PF_KEY messages + instead of causing write() operations to fail and returning the + error number in errno. This means that other listeners on a PF_KEY + socket can be aware that requests from another process failed, + which can be useful for auditing purposes. This also means that + applications that fail to read PF_KEY messages cannot do error + checking. + + An implementation MAY return the errors EINVAL, ENOMEM, and ENOBUFS + by causing write() operations to fail and returning the error + number in errno. This is an optimization for common error cases in + which it does not make sense for any other process to receive the + error. An application MUST NOT depend on such errors being set by + the write() call, but it SHOULD check for such errors, and handle + them in an appropriate manner. + + * The entire message isn't always reflected in the reply. A SADB_ADD + message is an example of this. + + * The PID is not set by the kernel. The process that originates the + message MUST set the sadb_msg_pid to its own PID. If the kernel + ORIGINATES a message, it MUST set the sadb_msg_pid to 0. A reply + to an original message SHOULD have the pid of the original message. + (E.g. the kernel's response to an SADB_ADD SHOULD have its pid set + to the pid value of the original SADB_ADD message.) + + + + + + + +McDonald, et. al. Informational [Page 10] + +RFC 2367 PF_KEY Key Management API July 1998 + + +1.7 Name Space + + All PF_KEYv2 preprocessor symbols and structure definitions are + defined as a result of including the header file <net/pfkeyv2.h>. + There is exactly one exception to this rule: the symbol "PF_KEY" (two + exceptions if "AF_KEY" is also counted), which is defined as a result + of including the header file <sys/socket.h>. All PF_KEYv2 + preprocessor symbols start with the prefix "SADB_" and all structure + names start with "sadb_". There are exactly two exceptions to this + rule: the symbol "PF_KEY_V2" and the symbol "PFKEYV2_REVISION". + + The symbol "PFKEYV2_REVISION" is a date-encoded value not unlike + certain values defined by POSIX and X/Open. The current value for + PFKEYV2_REVISION is 199806L, where 1998 is the year and 06 is the + month. + + Inclusion of the file <net/pfkeyv2.h> MUST NOT define symbols or + structures in the PF_KEYv2 name space that are not described in this + document without the explicit prior permission of the authors. Any + symbols or structures in the PF_KEYv2 name space that are not + described in this document MUST start with "SADB_X_" or "sadb_x_". An + implementation that fails to obey these rules IS NOT COMPLIANT WITH + THIS SPECIFICATION and MUST NOT make any claim to be. These rules + also apply to any files that might be included as a result of + including the file <net/pfkeyv2.h>. This rule provides implementors + with some assurance that they will not encounter namespace-related + surprises. + +1.8 On Manual Keying + + Not unlike the 4.4-Lite BSD PF_ROUTE socket, this interface allows an + application full-reign over the security associations in a kernel + that implements PF_KEY. A PF_KEY implementation MUST have some sort + of manual interface to PF_KEY, which SHOULD allow all of the + functionality of the programmatic interface described here. + +2. PF_KEY Message Format + + PF_KEY messages consist of a base header followed by additional data + fields, some of which may be optional. The format of the additional + data is dependent on the type of message. + + PF_KEY messages currently do not mandate any specific ordering for + non-network multi-octet fields. Unless otherwise specified (e.g. SPI + values), fields MUST be in host-specific byte order. + + + + + + +McDonald, et. al. Informational [Page 11] + +RFC 2367 PF_KEY Key Management API July 1998 + + +2.1 Base Message Header Format + + PF_KEY messages consist of the base message header followed by + security association specific data whose types and lengths are + specified by a generic type-length encoding. + + This base header is shown below, using POSIX types. The fields are + arranged primarily for alignment, and where possible, for reasons of + clarity. + + struct sadb_msg { + uint8_t sadb_msg_version; + uint8_t sadb_msg_type; + uint8_t sadb_msg_errno; + uint8_t sadb_msg_satype; + uint16_t sadb_msg_len; + uint16_t sadb_msg_reserved; + uint32_t sadb_msg_seq; + uint32_t sadb_msg_pid; + }; + /* sizeof(struct sadb_msg) == 16 */ + + sadb_msg_version + The version field of this PF_KEY message. This MUST + be set to PF_KEY_V2. If this is not set to PF_KEY_V2, + the write() call MAY fail and return EINVAL. + Otherwise, the behavior is undetermined, given that + the application might not understand the formatting + of the messages arriving from the kernel. + + sadb_msg_type Identifies the type of message. The valid message + types are described later in this document. + + sadb_msg_errno Should be set to zero by the sender. The responder + stores the error code in this field if an error has + occurred. This includes the case where the responder + is in user space. (e.g. user-space negotiation + fails, an errno can be returned.) + + sadb_msg_satype Indicates the type of security association(s). Valid + Security Association types are declared in the file + <net/pfkeyv2.h>. The current set of Security + Association types is enumerated later in this + document. + + + + + + + +McDonald, et. al. Informational [Page 12] + +RFC 2367 PF_KEY Key Management API July 1998 + + + sadb_msg_len Contains the total length, in 64-bit words, of all + data in the PF_KEY message including the base header + length and additional data after the base header, if + any. This length includes any padding or extra space + that might exist. Unless otherwise stated, all other + length fields are also measured in 64-bit words. + + On user to kernel messages, this field MUST be + verified against the length of the inbound message. + EMSGSIZE MUST be returned if the verification fails. + On kernel to user messages, a size mismatch is most + likely the result of the user not providing a large + enough buffer for the message. In these cases, the + user application SHOULD drop the message, but it MAY + try and extract what information it can out of the + message. + + sadb_msg_reserved + Reserved value. It MUST be zeroed by the sender. All + fields labeled reserved later in the document have + the same semantics as this field. + + sadb_msg_seq Contains the sequence number of this message. This + field, along with sadb_msg_pid, MUST be used to + uniquely identify requests to a process. The sender + is responsible for filling in this field. This + responsibility also includes matching the + sadb_msg_seq of a request (e.g. SADB_ACQUIRE). + + This field is similar to a transaction ID in a + remote procedure call implementation. + + sadb_msg_pid Identifies the process which originated this message, + or which process a message is bound for. For + example, if process id 2112 sends an SADB_UPDATE + message to the kernel, the process MUST set this + field to 2112 and the kernel will set this field + to 2112 in its reply to that SADB_UPDATE + message. This field, along with sadb_msg_seq, can + be used to uniquely identify requests to a + process. + + It is currently assumed that a 32-bit quantity will + hold an operating system's process ID space. + + + + + + + +McDonald, et. al. Informational [Page 13] + +RFC 2367 PF_KEY Key Management API July 1998 + + +2.2 Alignment of Headers and Extension Headers + + The base message header is a multiple of 64 bits and fields after it + in memory will be 64 bit aligned if the base itself is 64 bit + aligned. Some of the subsequent extension headers have 64 bit fields + in them, and as a consequence need to be 64 bit aligned in an + environment where 64 bit quantities need to be 64 bit aligned. + + The basic unit of alignment and length in PF_KEY Version 2 is 64 + bits. Therefore: + + * All extension headers, inclusive of the sadb_ext overlay fields, + MUST be a multiple of 64 bits long. + + * All variable length data MUST be padded appropriately such that + its length in a message is a multiple of 64 bits. + + * All length fields are, unless otherwise specified, in units of + 64 bits. + + * Implementations may safely access quantities of between 8 and 64 + bits directly within a message without risk of alignment faults. + + All PF_KEYv2 structures are packed and already have all intended + padding. Implementations MUST NOT insert any extra fields, including + hidden padding, into any structure in this document. This forbids + implementations from "extending" or "enhancing" existing headers + without changing the extension header type. As a guard against such + insertion of silent padding, each structure in this document is + labeled with its size in bytes. The size of these structures in an + implementation MUST match the size listed. + +2.3 Additional Message Fields + + The additional data following the base header consists of various + length-type-values fields. The first 32-bits are of a constant form: + + struct sadb_ext { + uint16_t sadb_ext_len; + uint16_t sadb_ext_type; + }; + /* sizeof(struct sadb_ext) == 4 */ + + sadb_ext_len Length of the extension header in 64 bit words, + inclusive. + + + + + + +McDonald, et. al. Informational [Page 14] + +RFC 2367 PF_KEY Key Management API July 1998 + + + sadb_ext_type The type of extension header that follows. Values for + this field are detailed later. The value zero is + reserved. + + Types of extension headers include: Association, Lifetime(s), + Address(s), Key(s), Identity(ies), Sensitivity, Proposal, and + Supported. There MUST be only one instance of a extension type in a + message. (e.g. Base, Key, Lifetime, Key is forbidden). An EINVAL + will be returned if there are duplicate extensions within a message. + Implementations MAY enforce ordering of extensions in the order + presented in the EXTENSION HEADER VALUES section. + + If an unknown extension type is encountered, it MUST be ignored. + Applications using extension headers not specified in this document + MUST be prepared to work around other system components not + processing those headers. Likewise, if an application encounters an + unknown extension from the kernel, it must be prepared to work around + it. Also, a kernel that generates extra extension header types MUST + NOT _depend_ on applications also understanding extra extension + header types. + + All extension definitions include these two fields (len and exttype) + because they are instances of a generic extension (not unlike + sockaddr_in and sockaddr_in6 are instances of a generic sockaddr). + The sadb_ext header MUST NOT ever be present in a message without at + least four bytes of extension header data following it, and, + therefore, there is no problem with it being only four bytes long. + + All extensions documented in this section MUST be implemented by a + PF_KEY implementation. + +2.3.1 Association Extension + + The Association extension specifies data specific to a single + security association. The only times this extension is not present is + when control messages (e.g. SADB_FLUSH or SADB_REGISTER) are being + passed and on the SADB_ACQUIRE message. + + struct sadb_sa { + uint16_t sadb_sa_len; + uint16_t sadb_sa_exttype; + uint32_t sadb_sa_spi; + uint8_t sadb_sa_replay; + uint8_t sadb_sa_state; + uint8_t sadb_sa_auth; + uint8_t sadb_sa_encrypt; + uint32_t sadb_sa_flags; + }; + + + +McDonald, et. al. Informational [Page 15] + +RFC 2367 PF_KEY Key Management API July 1998 + + + /* sizeof(struct sadb_sa) == 16 */ + + sadb_sa_spi The Security Parameters Index value for the security + association. Although this is a 32-bit field, some + types of security associations might have an SPI or + key identifier that is less than 32-bits long. In + this case, the smaller value shall be stored in the + least significant bits of this field and the unneeded + bits shall be zero. This field MUST be in network + byte order. + + sadb_sa_replay The size of the replay window, if not zero. If zero, + then no replay window is in use. + + sadb_sa_state The state of the security association. The currently + defined states are described later in this document. + + sadb_sa_auth The authentication algorithm to be used with this + security association. The valid authentication + algorithms are described later in this document. A + value of zero means that no authentication is used + for this security association. + + sadb_sa_encrypt The encryption algorithm to be used with this + security association. The valid encryption algorithms + are described later in this document. A value of zero + means that no encryption is used for this security + association. + + sadb_sa_flags A bitmap of options defined for the security + association. The currently defined flags are + described later in this document. + + The kernel MUST check these values where appropriate. For example, + IPsec AH with no authentication algorithm is probably an error. + + When used with some messages, the values in some fields in this + header should be ignored. + +2.3.2 Lifetime Extension + + The Lifetime extension specifies one or more lifetime variants for + this security association. If no Lifetime extension is present the + association has an infinite lifetime. An association SHOULD have a + lifetime of some sort associated with it. Lifetime variants come in + three varieties, HARD - indicating the hard-limit expiration, SOFT - + indicating the soft-limit expiration, and CURRENT - indicating the + current state of a given security association. The Lifetime + + + +McDonald, et. al. Informational [Page 16] + +RFC 2367 PF_KEY Key Management API July 1998 + + + extension looks like: + + struct sadb_lifetime { + uint16_t sadb_lifetime_len; + uint16_t sadb_lifetime_exttype; + uint32_t sadb_lifetime_allocations; + uint64_t sadb_lifetime_bytes; + uint64_t sadb_lifetime_addtime; + uint64_t sadb_lifetime_usetime; + }; + /* sizeof(struct sadb_lifetime) == 32 */ + + sadb_lifetime_allocations + For CURRENT, the number of different connections, + endpoints, or flows that the association has been + allocated towards. For HARD and SOFT, the number of + these the association may be allocated towards + before it expires. The concept of a connection, + flow, or endpoint is system specific. + + sadb_lifetime_bytes + For CURRENT, how many bytes have been processed + using this security association. For HARD and SOFT, + the number of bytes that may be processed using + this security association before it expires. + + sadb_lifetime_addtime + For CURRENT, the time, in seconds, when the + association was created. For HARD and SOFT, the + number of seconds after the creation of the + association until it expires. + + For such time fields, it is assumed that 64-bits is + sufficiently large to hold the POSIX time_t value. + If this assumption is wrong, this field will have to + be revisited. + + sadb_lifetime_usetime + For CURRENT, the time, in seconds, when association + was first used. For HARD and SOFT, the number of + seconds after the first use of the association until + it expires. + + The semantics of lifetimes are inclusive-OR, first-to-expire. This + means that if values for bytes and time, or multiple times, are + passed in, the first of these values to be reached will cause a + lifetime expiration. + + + + +McDonald, et. al. Informational [Page 17] + +RFC 2367 PF_KEY Key Management API July 1998 + + +2.3.3 Address Extension + + The Address extension specifies one or more addresses that are + associated with a security association. Address extensions for both + source and destination MUST be present when an Association extension + is present. The format of an Address extension is: + + struct sadb_address { + uint16_t sadb_address_len; + uint16_t sadb_address_exttype; + uint8_t sadb_address_proto; + uint8_t sadb_address_prefixlen; + uint16_t sadb_address_reserved; + }; + /* sizeof(struct sadb_address) == 8 */ + + /* followed by some form of struct sockaddr */ + + The sockaddr structure SHOULD conform to the sockaddr structure of + the system implementing PF_KEY. If the system has an sa_len field, so + SHOULD the sockaddrs in the message. If the system has NO sa_len + field, the sockaddrs SHOULD NOT have an sa_len field. All non-address + information in the sockaddrs, such as sin_zero for AF_INET sockaddrs, + and sin6_flowinfo for AF_INET6 sockaddrs, MUST be zeroed out. The + zeroing of ports (e.g. sin_port and sin6_port) MUST be done for all + messages except for originating SADB_ACQUIRE messages, which SHOULD + fill them in with ports from the relevant TCP or UDP session which + generates the ACQUIRE message. If the ports are non-zero, then the + sadb_address_proto field, normally zero, MUST be filled in with the + transport protocol's number. If the sadb_address_prefixlen is non- + zero, then the address has a prefix (often used in KM access control + decisions), with length specified in sadb_address_prefixlen. These + additional fields may be useful to KM applications. + + The SRC and DST addresses for a security association MUST be in the + same protocol family and MUST always be present or absent together in + a message. The PROXY address MAY be in a different protocol family, + and for most security protocols, represents an actual originator of a + packet. (For example, the inner-packets's source address in a + tunnel.) + + The SRC address MUST be a unicast or unspecified (e.g., INADDR_ANY) + address. The DST address can be any valid destination address + (unicast, multicast, or even broadcast). The PROXY address SHOULD be + a unicast address (there are experimental security protocols where + PROXY semantics may be different than described above). + + + + + +McDonald, et. al. Informational [Page 18] + +RFC 2367 PF_KEY Key Management API July 1998 + + +2.3.4 Key Extension + + The Key extension specifies one or more keys that are associated with + a security association. A Key extension will not always be present + with messages, because of security risks. The format of a Key + extension is: + + struct sadb_key { + uint16_t sadb_key_len; + uint16_t sadb_key_exttype; + uint16_t sadb_key_bits; + uint16_t sadb_key_reserved; + }; + /* sizeof(struct sadb_key) == 8 */ + + /* followed by the key data */ + + sadb_key_bits The length of the valid key data, in bits. A value of + zero in sadb_key_bits MUST cause an error. + + The key extension comes in two varieties. The AUTH version is used + with authentication keys (e.g. IPsec AH, OSPF MD5) and the ENCRYPT + version is used with encryption keys (e.g. IPsec ESP). PF_KEY deals + only with fully formed cryptographic keys, not with "raw key + material". For example, when ISAKMP/Oakley is in use, the key + management daemon is always responsible for transforming the result + of the Diffie-Hellman computation into distinct fully formed keys + PRIOR to sending those keys into the kernel via PF_KEY. This rule is + made because PF_KEY is designed to support multiple security + protocols (not just IP Security) and also multiple key management + schemes including manual keying, which does not have the concept of + "raw key material". A clean, protocol-independent interface is + important for portability to different operating systems as well as + for portability to different security protocols. + + If an algorithm defines its key to include parity bits (e.g. DES) + then the key used with PF_KEY MUST also include those parity bits. + For example, this means that a single DES key is always a 64-bit + quantity. + + When a particular security protocol only requires one authentication + and/or one encryption key, the fully formed key is transmitted using + the appropriate key extension. When a particular security protocol + requires more than one key for the same function (e.g. Triple-DES + using 2 or 3 keys, and asymmetric algorithms), then those two fully + formed keys MUST be concatenated together in the order used for + outbound packet processing. In the case of multiple keys, the + algorithm MUST be able to determine the lengths of the individual + + + +McDonald, et. al. Informational [Page 19] + +RFC 2367 PF_KEY Key Management API July 1998 + + + keys based on the information provided. The total key length (when + combined with knowledge of the algorithm in use) usually provides + sufficient information to make this determination. + + Keys are always passed through the PF_KEY interface in the order that + they are used for outbound packet processing. For inbound processing, + the correct order that keys are used might be different from this + canonical concatenation order used with the PF_KEY interface. It is + the responsibility of the implementation to use the keys in the + correct order for both inbound and outbound processing. + + For example, consider a pair of nodes communicating unicast using an + ESP three-key Triple-DES Security Association. Both the outbound SA + on the sender node, and the inbound SA on the receiver node will + contain key-A, followed by key-B, followed by key-C in their + respective ENCRYPT key extensions. The outbound SA will use key-A + first, followed by key-B, then key-C when encrypting. The inbound SA + will use key-C, followed by key-B, then key-A when decrypting. + (NOTE: We are aware that 3DES is actually encrypt-decrypt-encrypt.) + The canonical ordering of key-A, key-B, key-C is used for 3DES, and + should be documented. The order of "encryption" is the canonical + order for this example. [Sch96] + + The key data bits are arranged most-significant to least significant. + For example, a 22-bit key would take up three octets, with the least + significant two bits not containing key material. Five additional + octets would then be used for padding to the next 64-bit boundary. + + While not directly related to PF_KEY, there is a user interface issue + regarding odd-digit hexadecimal representation of keys. Consider the + example of the 16-bit number: + + 0x123 + + That will require two octets of storage. In the absence of other + information, however, unclear whether the value shown is stored as: + + 01 23 OR 12 30 + + It is the opinion of the authors that the former (0x123 == 0x0123) is + the better way to interpret this ambiguity. Extra information (for + example, specifying 0x0123 or 0x1230, or specifying that this is only + a twelve-bit number) would solve this problem. + + + + + + + + +McDonald, et. al. Informational [Page 20] + +RFC 2367 PF_KEY Key Management API July 1998 + + +2.3.5 Identity Extension + + The Identity extension contains endpoint identities. This + information is used by key management to select the identity + certificate that is used in negotiations. This information may also + be provided by a kernel to network security aware applications to + identify the remote entity, possibly for access control purposes. If + this extension is not present, key management MUST assume that the + addresses in the Address extension are the only identities for this + Security Association. The Identity extension looks like: + + struct sadb_ident { + uint16_t sadb_ident_len; + uint16_t sadb_ident_exttype; + uint16_t sadb_ident_type; + uint16_t sadb_ident_reserved; + uint64_t sadb_ident_id; + }; + /* sizeof(struct sadb_ident) == 16 */ + + /* followed by the identity string, if present */ + + sadb_ident_type The type of identity information that follows. + Currently defined identity types are described later + in this document. + + sadb_ident_id An identifier used to aid in the construction of an + identity string if none is present. A POSIX user id + value is one such identifier that will be used in this + field. Use of this field is described later in this + document. + + A C string containing a textual representation of the identity + information optionally follows the sadb_ident extension. The format + of this string is determined by the value in sadb_ident_type, and is + described later in this document. + +2.3.6 Sensitivity Extension + + The Sensitivity extension contains security labeling information for + a security association. If this extension is not present, no + sensitivity-related data can be obtained from this security + association. If this extension is present, then the need for + explicit security labeling on the packet is obviated. + + struct sadb_sens { + uint16_t sadb_sens_len; + uint16_t sadb_sens_exttype; + + + +McDonald, et. al. Informational [Page 21] + +RFC 2367 PF_KEY Key Management API July 1998 + + + uint32_t sadb_sens_dpd; + uint8_t sadb_sens_sens_level; + uint8_t sadb_sens_sens_len; + uint8_t sadb_sens_integ_level; + uint8_t sadb_sens_integ_len; + uint32_t sadb_sens_reserved; + }; + /* sizeof(struct sadb_sens) == 16 */ + + /* followed by: + uint64_t sadb_sens_bitmap[sens_len]; + uint64_t sadb_integ_bitmap[integ_len]; */ + + sadb_sens_dpd Describes the protection domain, which allows + interpretation of the levels and compartment + bitmaps. + sadb_sens_sens_level + The sensitivity level. + sadb_sens_sens_len + The length, in 64 bit words, of the sensitivity + bitmap. + sadb_sens_integ_level + The integrity level. + sadb_sens_integ_len + The length, in 64 bit words, of the integrity + bitmap. + + This sensitivity extension is designed to support the Bell-LaPadula + [BL74] security model used in compartmented-mode or multi-level + secure systems, the Clark-Wilson [CW87] commercial security model, + and/or the Biba integrity model [Biba77]. These formal models can be + used to implement a wide variety of security policies. The definition + of a particular security policy is outside the scope of this + document. Each of the bitmaps MUST be padded to a 64-bit boundary if + they are not implicitly 64-bit aligned. + +2.3.7 Proposal Extension + + The Proposal extension contains a "proposed situation" of algorithm + preferences. It looks like: + + struct sadb_prop { + uint16_t sadb_prop_len; + uint16_t sadb_prop_exttype; + uint8_t sadb_prop_replay; + uint8_t sadb_prop_reserved[3]; + }; + /* sizeof(struct sadb_prop) == 8 */ + + + +McDonald, et. al. Informational [Page 22] + +RFC 2367 PF_KEY Key Management API July 1998 + + + /* followed by: + struct sadb_comb sadb_combs[(sadb_prop_len * + sizeof(uint64_t) - sizeof(struct sadb_prop)) / + sizeof(struct sadb_comb)]; */ + + Following the header is a list of proposed parameter combinations in + preferential order. The values in these fields have the same + definition as the fields those values will move into if the + combination is chosen. + + NOTE: Some algorithms in some security protocols will have + variable IV lengths per algorithm. Variable length IVs + are not supported by PF_KEY v2. If they were, however, + proposed IV lengths would go in the Proposal Extension. + + These combinations look like: + + struct sadb_comb { + uint8_t sadb_comb_auth; + uint8_t sadb_comb_encrypt; + uint16_t sadb_comb_flags; + uint16_t sadb_comb_auth_minbits; + uint16_t sadb_comb_auth_maxbits; + uint16_t sadb_comb_encrypt_minbits; + uint16_t sadb_comb_encrypt_maxbits; + uint32_t sadb_comb_reserved; + uint32_t sadb_comb_soft_allocations; + uint32_t sadb_comb_hard_allocations; + uint64_t sadb_comb_soft_bytes; + uint64_t sadb_comb_hard_bytes; + uint64_t sadb_comb_soft_addtime; + uint64_t sadb_comb_hard_addtime; + uint64_t sadb_comb_soft_usetime; + uint64_t sadb_comb_hard_usetime; + }; + + /* sizeof(struct sadb_comb) == 72 */ + + sadb_comb_auth If this combination is accepted, this will be the + value of sadb_sa_auth. + + sadb_comb_encrypt + If this combination is accepted, this will be the + value of sadb_sa_encrypt. + + + + + + + +McDonald, et. al. Informational [Page 23] + +RFC 2367 PF_KEY Key Management API July 1998 + + + sadb_comb_auth_minbits; + sadb_comb_auth_maxbits; + The minimum and maximum acceptable authentication + key lengths, respectably, in bits. If sadb_comb_auth + is zero, both of these values MUST be zero. If + sadb_comb_auth is nonzero, both of these values MUST + be nonzero. If this combination is accepted, a value + between these (inclusive) will be stored in the + sadb_key_bits field of KEY_AUTH. The minimum MUST + NOT be greater than the maximum. + + sadb_comb_encrypt_minbits; + sadb_comb_encrypt_maxbits; + The minimum and maximum acceptable encryption key + lengths, respectably, in bits. If sadb_comb_encrypt + is zero, both of these values MUST be zero. If + sadb_comb_encrypt is nonzero, both of these values + MUST be nonzero. If this combination is accepted, a + value between these (inclusive) will be stored in + the sadb_key_bits field of KEY_ENCRYPT. The minimum + MUST NOT be greater than the maximum. + + sadb_comb_soft_allocations + sadb_comb_hard_allocations + If this combination is accepted, these are proposed + values of sadb_lifetime_allocations in the SOFT and + HARD lifetimes, respectively. + + sadb_comb_soft_bytes + sadb_comb_hard_bytes + If this combination is accepted, these are proposed + values of sadb_lifetime_bytes in the SOFT and HARD + lifetimes, respectively. + + sadb_comb_soft_addtime + sadb_comb_hard_addtime + If this combination is accepted, these are proposed + values of sadb_lifetime_addtime in the SOFT and HARD + lifetimes, respectively. + + sadb_comb_soft_usetime + sadb_comb_hard_usetime + If this combination is accepted, these are proposed + values of sadb_lifetime_usetime in the SOFT and HARD + lifetimes, respectively. + + + + + + +McDonald, et. al. Informational [Page 24] + +RFC 2367 PF_KEY Key Management API July 1998 + + + Each combination has an authentication and encryption algorithm, + which may be 0, indicating none. A combination's flags are the same + as the flags in the Association extension. The minimum and maximum + key lengths (which are in bits) are derived from possible a priori + policy decisions, along with basic properties of the algorithm. + Lifetime attributes are also included in a combination, as some + algorithms may know something about their lifetimes and can suggest + lifetime limits. + +2.3.8 Supported Algorithms Extension + + The Supported Algorithms extension contains a list of all algorithms + supported by the system. This tells key management what algorithms it + can negotiate. Available authentication algorithms are listed in the + SUPPORTED_AUTH extension and available encryption algorithms are + listed in the SUPPORTED_ENCRYPT extension. The format of these + extensions is: + + struct sadb_supported { + uint16_t sadb_supported_len; + uint16_t sadb_supported_exttype; + uint32_t sadb_supported_reserved; + }; + /* sizeof(struct sadb_supported) == 8 */ + + /* followed by: + struct sadb_alg sadb_algs[(sadb_supported_len * + sizeof(uint64_t) - sizeof(struct sadb_supported)) / + sizeof(struct sadb_alg)]; */ + + This header is followed by one or more algorithm descriptions. An + algorithm description looks like: + + struct sadb_alg { + uint8_t sadb_alg_id; + uint8_t sadb_alg_ivlen; + uint16_t sadb_alg_minbits; + uint16_t sadb_alg_maxbits; + uint16_t sadb_alg_reserved; + }; + /* sizeof(struct sadb_alg) == 8 */ + + sadb_alg_id The algorithm identification value for this + algorithm. This is the value that is stored in + sadb_sa_auth or sadb_sa_encrypt if this algorithm is + selected. + + + + + +McDonald, et. al. Informational [Page 25] + +RFC 2367 PF_KEY Key Management API July 1998 + + + sadb_alg_ivlen The length of the initialization vector to be used + for the algorithm. If an IV is not needed, this + value MUST be set to zero. + + sadb_alg_minbits + The minimum acceptable key length, in bits. A value + of zero is invalid. + + sadb_alg_maxbits + The maximum acceptable key length, in bits. A value + of zero is invalid. The minimum MUST NOT be greater + than the maximum. + +2.3.9 SPI Range Extension + + One PF_KEY message, SADB_GETSPI, might need a range of acceptable SPI + values. This extension performs such a function. + + struct sadb_spirange { + uint16_t sadb_spirange_len; + uint16_t sadb_spirange_exttype; + uint32_t sadb_spirange_min; + uint32_t sadb_spirange_max; + uint32_t sadb_spirange_reserved; + }; + /* sizeof(struct sadb_spirange) == 16 */ + + sadb_spirange_min + The minimum acceptable SPI value. + + sadb_spirange_max + The maximum acceptable SPI value. The maximum MUST + be greater than or equal to the minimum. + + + + + + + + + + + + + + + + + + +McDonald, et. al. Informational [Page 26] + +RFC 2367 PF_KEY Key Management API July 1998 + + +2.4 Illustration of Message Layout + + The following shows how the octets are laid out in a PF_KEY message. + Optional fields are indicated as such. + + The base header is as follows: + + 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 + +---------------+---------------+---------------+---------------+ + | ...version | sadb_msg_type | sadb_msg_errno| ...msg_satype | + +---------------+---------------+---------------+---------------+ + | sadb_msg_len | sadb_msg_reserved | + +---------------+---------------+---------------+---------------+ + | sadb_msg_seq | + +---------------+---------------+---------------+---------------+ + | sadb_msg_pid | + +---------------+---------------+---------------+---------------+ + + The base header may be followed by one or more of the following + extension fields, depending on the values of various base header + fields. The following fields are ordered such that if they appear, + they SHOULD appear in the order presented below. + + An extension field MUST not be repeated. If there is a situation + where an extension MUST be repeated, it should be brought to the + attention of the authors. + + The Association extension + + 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 + +---------------+---------------+---------------+---------------+ + | sadb_sa_len | sadb_sa_exttype | + +---------------+---------------+---------------+---------------+ + | sadb_sa_spi | + +---------------+---------------+---------------+---------------+ + | ...replay | sadb_sa_state | sadb_sa_auth |sadb_sa_encrypt| + +---------------+---------------+---------------+---------------+ + | sadb_sa_flags | + +---------------+---------------+---------------+---------------+ + + The Lifetime extension + + +---------------+---------------+---------------+---------------+ + | sadb_lifetime_len | sadb_lifetime_exttype | + +---------------+---------------+---------------+---------------+ + | sadb_lifetime_allocations | + +---------------+---------------+---------------+---------------+ + + + + +McDonald, et. al. Informational [Page 27] + +RFC 2367 PF_KEY Key Management API July 1998 + + + +---------------+---------------+---------------+---------------+ + | sadb_lifetime_bytes | + | (64 bits) | + +---------------+---------------+---------------+---------------+ + | sadb_lifetime_addtime | + | (64 bits) | + +---------------+---------------+---------------+---------------+ + | sadb_lifetime_usetime | + | (64 bits) | + +---------------+---------------+---------------+---------------+ + + The Address extension + + +---------------+---------------+---------------+---------------+ + | sadb_address_len | sadb_address_exttype | + +---------------+---------------+---------------+---------------+ + | _address_proto| ..._prefixlen | sadb_address_reserved | + +---------------+---------------+---------------+---------------+ + > Some form of 64-bit aligned struct sockaddr goes here. < + +---------------+---------------+---------------+---------------+ + + The Key extension + + +---------------+---------------+---------------+---------------+ + | sadb_key_len | sadb_key_exttype | + +---------------+---------------+---------------+---------------+ + | sadb_key_bits | sadb_key_reserved | + +---------------+---------------+---------------+---------------+ + > A key, padded to 64-bits, most significant bits to least. > + +---------------+---------------+---------------+---------------+ + + The Identity extension + + +---------------+---------------+---------------+---------------+ + | sadb_ident_len | sadb_ident_exttype | + +---------------+---------------+---------------+---------------+ + | sadb_ident_type | sadb_ident_reserved | + +---------------+---------------+---------------+---------------+ + | sadb_ident_id | + | (64 bits) | + +---------------+---------------+---------------+---------------+ + > A null-terminated C-string which MUST be padded out for > + < 64-bit alignment. < + +---------------+---------------+---------------+---------------+ + + + + + + + +McDonald, et. al. Informational [Page 28] + +RFC 2367 PF_KEY Key Management API July 1998 + + + The Sensitivity extension + + +---------------+---------------+---------------+---------------+ + | sadb_sens_len | sadb_sens_exttype | + +---------------+---------------+---------------+---------------+ + | sadb_sens_dpd | + +---------------+---------------+---------------+---------------+ + | ...sens_level | ...sens_len |..._integ_level| ..integ_len | + +---------------+---------------+---------------+---------------+ + | sadb_sens_reserved | + +---------------+---------------+---------------+---------------+ + > The sensitivity bitmap, followed immediately by the < + < integrity bitmap, each is an array of uint64_t. > + +---------------+---------------+---------------+---------------+ + + The Proposal extension + + +---------------+---------------+---------------+---------------+ + | sadb_prop_len | sadb_prop_exttype | + +---------------+---------------+---------------+---------------+ + |...prop_replay | sadb_prop_reserved | + +---------------+---------------+---------------+---------------+ + > One or more combinations, specified as follows... < + +---------------+---------------+---------------+---------------+ + + Combination + +---------------+---------------+---------------+---------------+ + |sadb_comb_auth |sadb_comb_encr | sadb_comb_flags | + +---------------+---------------+---------------+---------------+ + | sadb_comb_auth_minbits | sadb_comb_auth_maxbits | + +---------------+---------------+---------------+---------------+ + | sadb_comb_encrypt_minbits | sadb_comb_encrypt_maxbits | + +---------------+---------------+---------------+---------------+ + | sadb_comb_reserved | + +---------------+---------------+---------------+---------------+ + | sadb_comb_soft_allocations | + +---------------+---------------+---------------+---------------+ + | sadb_comb_hard_allocations | + +---------------+---------------+---------------+---------------+ + | sadb_comb_soft_bytes | + | (64 bits) | + +---------------+---------------+---------------+---------------+ + | sadb_comb_hard_bytes | + | (64 bits) | + +---------------+---------------+---------------+---------------+ + | sadb_comb_soft_addtime | + | (64 bits) | + +---------------+---------------+---------------+---------------+ + + + +McDonald, et. al. Informational [Page 29] + +RFC 2367 PF_KEY Key Management API July 1998 + + + +---------------+---------------+---------------+---------------+ + | sadb_comb_hard_addtime | + | (64 bits) | + +---------------+---------------+---------------+---------------+ + | sadb_comb_soft_usetime | + | (64 bits) | + +---------------+---------------+---------------+---------------+ + | sadb_comb_hard_usetime | + | (64 bits) | + +---------------+---------------+---------------+---------------+ + + The Supported Algorithms extension + + +---------------+---------------+---------------+---------------+ + | sadb_supported_len | sadb_supported_exttype | + +---------------+---------------+---------------+---------------+ + | sadb_supported_reserved | + +---------------+---------------+---------------+---------------+ + + Followed by one or more Algorithm Descriptors + + +---------------+---------------+---------------+---------------+ + | sadb_alg_id | sadb_alg_ivlen| sadb_alg_minbits | + +---------------+---------------+---------------+---------------+ + | sadb_alg_maxbits | sadb_alg_reserved | + +---------------+---------------+---------------+---------------+ + + The SPI Range extension + + +---------------+---------------+---------------+---------------+ + | sadb_spirange_len | sadb_spirange_exttype | + +---------------+---------------+---------------+---------------+ + | sadb_spirange_min | + +---------------+---------------+---------------+---------------+ + | sadb_spirange_max | + +---------------+---------------+---------------+---------------+ + | sadb_spirange_reserved | + +---------------+---------------+---------------+---------------+ + +3 Symbolic Names + + This section defines various symbols used with PF_KEY and the + semantics associated with each symbol. Applications MUST use the + symbolic names in order to be portable. The numeric definitions + shown are for illustrative purposes, unless explicitly stated + otherwise. The numeric definition MAY vary on other systems. The + symbolic name MUST be kept the same for all conforming + implementations. + + + +McDonald, et. al. Informational [Page 30] + +RFC 2367 PF_KEY Key Management API July 1998 + + +3.1 Message Types + + The following message types are used with PF_KEY. These are defined + in the file <net/pfkeyv2.h>. + + #define SADB_RESERVED 0 + #define SADB_GETSPI 1 + #define SADB_UPDATE 2 + #define SADB_ADD 3 + #define SADB_DELETE 4 + #define SADB_GET 5 + #define SADB_ACQUIRE 6 + #define SADB_REGISTER 7 + #define SADB_EXPIRE 8 + #define SADB_FLUSH 9 + + #define SADB_DUMP 10 /* not used normally */ + + #define SADB_MAX 10 + + Each message has a behavior. A behavior is defined as where the + initial message travels (e.g. user to kernel), and what subsequent + actions are expected to take place. Contents of messages are + illustrated as: + + <base, REQUIRED EXTENSION, REQ., (OPTIONAL EXT.,) (OPT)> + + The SA extension is sometimes used only for its SPI field. If all + other fields MUST be ignored, this is represented by "SA(*)". + + The lifetime extensions are represented with one to three letters + after the word "lifetime," representing (H)ARD, (S)OFT, and + (C)URRENT. + + The address extensions are represented with one to three letters + after the word "address," representing (S)RC, (D)ST, (P)ROXY. + + NOTE: Some security association types do not use a source + address for SA identification, where others do. This may + cause EEXIST errors for some SA types where others do not + report collisions. It is expected that application + authors know enough about the underlying security + association types to understand these differences. + + The key extensions are represented with one or two letters after the + word "key," representing (A)UTH and (E)NCRYPT. + + + + + +McDonald, et. al. Informational [Page 31] + +RFC 2367 PF_KEY Key Management API July 1998 + + + The identity extensions are represented with one or two letters after + the word "identity," representing (S)RC and (D)ST. + + In the case of an error, only the base header is returned. + + Note that any standard error could be returned for any message. + + Typically, they will be either one of the errors specifically listed + in the description for a message or one of the following: + + EINVAL Various message improprieties, including SPI ranges + that are malformed. + ENOMEM Needed memory was not available. + ENOBUFS Needed memory was not available. + EMSGSIZ The message exceeds the maximum length allowed. + +3.1.1 SADB_GETSPI + + The SADB_GETSPI message allows a process to obtain a unique SPI value + for given security association type, source address, and destination + address. This message followed by an SADB_UPDATE is one way to + create a security association (SADB_ADD is the other method). The + process specifies the type in the base header, the source and + destination address in address extension. If the SADB_GETSPI message + is in response to a kernel-generated SADB_ACQUIRE, the sadb_msg_seq + MUST be the same as the SADB_ACQUIRE message. The application may + also specify the SPI. This is done by having the kernel select + within a range of SPI values by using the SPI range extension. To + specify a single SPI value to be verified, the application sets the + high and low values to be equal. Permitting range specification is + important because the kernel can allocate an SPI value based on what + it knows about SPI values already in use. The kernel returns the + same message with the allocated SPI value stored in the spi field of + an association extension. The allocate SPI (and destination address) + refer to a LARVAL security association. An SADB_UPDATE message can + later be used to add an entry with the requested SPI value. + + It is recommended that associations that are created with SADB_GETSPI + SHOULD be automatically deleted within a fixed amount of time if they + are not updated by an SADB_UPDATE message. This allows SA storage + not to get cluttered with larval associations. + + The message behavior of the SADB_GETSPI message is: + + Send an SADB_GETSPI message from a user process to the kernel. + + <base, address, SPI range> + + + + +McDonald, et. al. Informational [Page 32] + +RFC 2367 PF_KEY Key Management API July 1998 + + + The kernel returns the SADB_GETSPI message to all listening + processes. + + <base, SA(*), address(SD)> + + Errors: + + EEXIST Requested SPI or SPI range is not available or already + used. + +3.1.2 SADB_UPDATE Message + + The SADB_UPDATE message allows a process to update the information in + an existing Security Association. Since SADB_GETSPI does not allow + setting of certain parameters, this message is needed to fully form + the SADB_SASTATE_LARVAL security association created with + SADB_GETSPI. The format of the update message is a base header, + followed by an association header and possibly by several extension + headers. The kernel searches for the security association with the + same type, spi, source address and destination address specified in + the message and updates the Security Association information using + the content of the SADB_UPDATE message. + + The kernel MAY disallow SADB_UPDATE to succeed unless the message is + issued from the same socket that created the security association. + Such enforcement significantly reduces the chance of accidental + changes to an in-use security association. Malicious trusted parties + could still issue an SADB_FLUSH or SADB_DELETE message, but deletion + of associations is more easily detected and less likely to occur + accidentally than an erroneous SADB_UPDATE. The counter argument to + supporting this behavior involves the case where a user-space key + management application fails and is restarted. The new instance of + the application will not have the same socket as the creator of the + security association. + + The kernel MUST sanity check all significant values submitted in an + SADB_UPDATE message before changing the SA in its database and MUST + return EINVAL if any of the values are invalid. Examples of checks + that should be performed are DES key parity bits, key length + checking, checks for keys known to be weak for the specified + algorithm, and checks for flags or parameters known to be + incompatible with the specified algorithm. + + Only SADB_SASTATE_MATURE SAs may be submitted in an SADB_UPDATE + message. If the original SA is an SADB_SASTATE_LARVAL SA, then any + value in the SA may be changed except for the source address, + destination address, and SPI. If the original SA is an + SADB_SASTATE_DEAD SA, any attempt to perform an SADB_UPDATE on the SA + + + +McDonald, et. al. Informational [Page 33] + +RFC 2367 PF_KEY Key Management API July 1998 + + + MUST return EINVAL. It is not valid for established keying or + algorithm information to change without the SPI changing, which would + require creation of a new SA rather than a change to an existing SA. + Once keying and algorithm information is negotiated, address and + identity information is fixed for the SA. Therefore, if the original + SA is an SADB_SASTATE_MATURE or DYING SA, only the sadb_sa_state + field in the SA header and lifetimes (hard, soft, and current) may be + changed and any attempt to change other values MUST result in an + error return of EINVAL. + + The message behavior of the SADB_UPDATE message is: + + Send an SADB_UPDATE message from a user process to the kernel. + + <base, SA, (lifetime(HSC),) address(SD), (address(P),) + key(AE), (identity(SD),) (sensitivity)> + + The kernel returns the SADB_UPDATE message to all listening + processes. + + <base, SA, (lifetime(HSC),) address(SD), (address(P),) + (identity(SD),) (sensitivity)> + + + The keying material is not returned on the message from the kernel to + listening sockets because listeners might not have the privileges to + see such keying material. + + Errors: + ESRCH The security association to be updated was not found. + EINVAL In addition to other possible causes, this error is + returned if sanity checking on the SA values (such + as the keys) fails. + EACCES Insufficient privilege to update entry. The socket + issuing the SADB_UPDATE is not creator of the entry + to be updated. + +3.1.3 SADB_ADD + + The SADB_ADD message is nearly identical to the SADB_UPDATE message, + except that it does not require a previous call to SADB_GETSPI. The + SADB_ADD message is used in manual keying applications, and in other + cases where the uniqueness of the SPI is known immediately. + + An SADB_ADD message is also used when negotiation is finished, and + the second of a pair of associations is added. The SPI for this + association was determined by the peer machine. The sadb_msg_seq + + + + +McDonald, et. al. Informational [Page 34] + +RFC 2367 PF_KEY Key Management API July 1998 + + + MUST be set to the value set in a kernel-generated SADB_ACQUIRE so + that both associations in a pair are bound to the same ACQUIRE + request. + + The kernel MUST sanity check all used fields in the SA submitted in + an SADB_ADD message before adding the SA to its database and MUST + return EINVAL if any of the values are invalid. + + Only SADB_SASTATE_MATURE SAs may be submitted in an SADB_ADD message. + SADB_SASTATE_LARVAL SAs are created by SADB_GETSPI and it is not + sensible to add a new SA in the DYING or SADB_SASTATE_DEAD state. + Therefore, the sadb_sa_state field of all submitted SAs MUST be + SADB_SASTATE_MATURE and the kernel MUST return an error if this is + not true. + + The message behavior of the SADB_ADD message is: + + Send an SADB_ADD message from a user process to the kernel. + + <base, SA, (lifetime(HS),) address(SD), (address(P),) + key(AE), (identity(SD),) (sensitivity)> + + The kernel returns the SADB_ADD message to all listening + processes. + + <base, SA, (lifetime(HS),) address(SD), (identity(SD),) + (sensitivity)> + + The keying material is not returned on the message from the kernel to + listening sockets because listeners may not have the privileges to + see such keying material. + + Errors: + + EEXIST The security association that was to be added already + exists. + EINVAL In addition to other possible causes, this error is + returned if sanity checking on the SA values (such + as the keys) fails. + +3.1.4 SADB_DELETE + + The SADB_DELETE message causes the kernel to delete a Security + Association from the key table. The delete message consists of the + base header followed by the association, and the source and + destination sockaddrs in the address extension. The kernel deletes + the security association matching the type, spi, source address, and + destination address in the message. + + + +McDonald, et. al. Informational [Page 35] + +RFC 2367 PF_KEY Key Management API July 1998 + + + The message behavior for SADB_DELETE is as follows: + + Send an SADB_DELETE message from a user process to the kernel. + + <base, SA(*), address(SD)> + + The kernel returns the SADB_DELETE message to all listening + processes. + + <base, SA(*), address(SD)> + +3.1.5 SADB_GET + + The SADB_GET message allows a process to retrieve a copy of a + Security Association from the kernel's key table. The get message + consists of the base header follows by the relevant extension fields. + The Security Association matching the type, spi, source address, and + destination address is returned. + + The message behavior of the SADB_GET message is: + + Send an SADB_GET message from a user process to the kernel. + + <base, SA(*), address(SD)> + + The kernel returns the SADB_GET message to the socket that sent + the SADB_GET message. + + <base, SA, (lifetime(HSC),) address(SD), (address(P),) key(AE), + (identity(SD),) (sensitivity)> + + Errors: + ESRCH The sought security association was not found. + +3.1.6 SADB_ACQUIRE + + The SADB_ACQUIRE message is typically sent only by the kernel to key + socket listeners who have registered their key socket (see + SADB_REGISTER message). SADB_ACQUIRE messages can be sent by + application-level consumers of security associations (such as an + OSPFv2 implementation that uses OSPF security). The SADB_ACQUIRE + message is a base header along with an address extension, possibly an + identity extension, and a proposal extension. The proposed situation + contains a list of desirable algorithms that can be used if the + algorithms in the base header are not available. The values for the + fields in the base header and in the security association data which + follows the base header indicate the properties of the Security + Association that the listening process should attempt to acquire. If + + + +McDonald, et. al. Informational [Page 36] + +RFC 2367 PF_KEY Key Management API July 1998 + + + the message originates from the kernel (i.e. the sadb_msg_pid is 0), + the sadb_msg_seq number MUST be used by a subsequent SADB_GETSPI and + SADB_UPDATE, or subsequent SADB_ADD message to bind a security + association to the request. This avoids the race condition of two + TCP connections between two IP hosts that each require unique + associations, and having one steal another's security association. + The sadb_msg_errno and sadb_msg_state fields should be ignored by the + listening process. + + The SADB_ACQUIRE message is typically triggered by an outbound packet + that needs security but for which there is no applicable Security + Association existing in the key table. If the packet can be + sufficiently protected by more than one algorithm or combination of + options, the SADB_ACQUIRE message MUST order the preference of + possibilities in the Proposal extension. + + There are three messaging behaviors for SADB_ACQUIRE. The first is + where the kernel needs a security association (e.g. for IPsec). + + The kernel sends an SADB_ACQUIRE message to registered sockets. + + <base, address(SD), (address(P)), (identity(SD),) (sensitivity,) + proposal> + + NOTE: The address(SD) extensions MUST have the port fields + filled in with the port numbers of the session requiring + keys if appropriate. + + The second is when, for some reason, key management fails, it can + send an ACQUIRE message with the same sadb_msg_seq as the initial + ACQUIRE with a non-zero errno. + + Send an SADB_ACQUIRE to indicate key management failure. + + <base> + + The third is where an application-layer consumer of security + associations (e.g. an OSPFv2 or RIPv2 daemon) needs a security + association. + + Send an SADB_ACQUIRE message from a user process to the kernel. + + <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) + proposal> + + The kernel returns an SADB_ACQUIRE message to registered + sockets. + + + + +McDonald, et. al. Informational [Page 37] + +RFC 2367 PF_KEY Key Management API July 1998 + + + <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) + proposal> + + The user-level consumer waits for an SADB_UPDATE or SADB_ADD + message for its particular type, and then can use that + association by using SADB_GET messages. + + Errors: + EINVAL Invalid acquire request. + EPROTONOSUPPORT No KM application has registered with the Key + Engine as being able to obtain the requested SA type, so + the requested SA cannot be acquired. + +3.1.7 SADB_REGISTER + + The SADB_REGISTER message allows an application to register its key + socket as able to acquire new security associations for the kernel. + SADB_REGISTER allows a socket to receive SADB_ACQUIRE messages for + the type of security association specified in sadb_msg_satype. The + application specifies the type of security association that it can + acquire for the kernel in the type field of its register message. If + an application can acquire multiple types of security association, it + MUST register each type in a separate message. Only the base header + is needed for the register message. Key management applications MAY + register for a type not known to the kernel, because the consumer may + be in user-space (e.g. OSPFv2 security). + + The reply of the SADB_REGISTER message contains a supported algorithm + extension. That field contains an array of supported algorithms, one + per octet. This allows key management applications to know what + algorithm are supported by the kernel. + + In an environment where algorithms can be dynamically loaded and + unloaded, an asynchronous SADB_REGISTER reply MAY be generated. The + list of supported algorithms MUST be a complete list, so the + application can make note of omissions or additions. + + The messaging behavior of the SADB_REGISTER message is: + + Send an SADB_REGISTER message from a user process to the kernel. + + <base> + + The kernel returns an SADB_REGISTER message to registered + sockets, with algorithm types supported by the kernel being + indicated in the supported algorithms field. + + + + + +McDonald, et. al. Informational [Page 38] + +RFC 2367 PF_KEY Key Management API July 1998 + + + NOTE: This message may arrive asynchronously due to an + algorithm being loaded or unloaded into a dynamically + linked kernel. + + <base, supported> + +3.1.8 SADB_EXPIRE Message + + The operating system kernel is responsible for tracking SA + expirations for security protocols that are implemented inside the + kernel. If the soft limit or hard limit of a Security Association + has expired for a security protocol implemented inside the kernel, + then the kernel MUST issue an SADB_EXPIRE message to all key socket + listeners. If the soft limit or hard limit of a Security Association + for a user-level security protocol has expired, the user-level + protocol SHOULD issue an SADB_EXPIRE message. + + The base header will contain the security association information + followed by the source sockaddr, destination sockaddr, (and, if + present, internal sockaddr,) (and, if present, one or both + compartment bitmaps). + + The lifetime extension of an SADB_EXPIRE message is important to + indicate which lifetime expired. If a HARD lifetime extension is + included, it indicates that the HARD lifetime expired. This means + the association MAY be deleted already from the SADB. If a SOFT + lifetime extension is included, it indicates that the SOFT lifetime + expired. The CURRENT lifetime extension will indicate the current + status, and comparisons to the HARD or SOFT lifetime will indicate + which limit was reached. HARD lifetimes MUST take precedence over + SOFT lifetimes, meaning if the HARD and SOFT lifetimes are the same, + the HARD lifetime will appear on the EXPIRE message. The + pathological case of HARD lifetimes being shorter than SOFT lifetimes + is handled such that the SOFT lifetime will never expire. + + The messaging behavior of the SADB_EXPIRE message is: + + The kernel sends an SADB_EXPIRE message to all listeners when + the soft limit of a security association has been expired. + + <base, SA, lifetime(C and one of HS), address(SD)> + + Note that the SADB_EXPIRE message is ONLY sent by the kernel to the + KMd. It is a one-way informational message that does not have a + reply. + + + + + + +McDonald, et. al. Informational [Page 39] + +RFC 2367 PF_KEY Key Management API July 1998 + + +3.1.9 SADB_FLUSH + + The SADB_FLUSH message causes the kernel to delete all entries in its + key table for a certain sadb_msg_satype. Only the base header is + required for a flush message. If sadb_msg_satype is filled in with a + specific value, only associations of that type are deleted. If it is + filled in with SADB_SATYPE_UNSPEC, ALL associations are deleted. + + The messaging behavior for SADB_FLUSH is: + + Send an SADB_FLUSH message from a user process to the kernel. + + <base> + + The kernel will return an SADB_FLUSH message to all listening + sockets. + + <base> + + The reply message happens only after the actual flushing + of security associations has been attempted. + +3.1.10 SADB_DUMP + + The SADB_DUMP message causes the kernel to dump the operating + system's entire Key Table to the requesting key socket. As in + SADB_FLUSH, if a sadb_msg_satype value is in the message, only + associations of that type will be dumped. If SADB_SATYPE_UNSPEC is + specified, all associations will be dumped. Each Security Association + is returned in its own SADB_DUMP message. A SADB_DUMP message with a + sadb_seq field of zero indicates the end of the dump transaction. The + dump message is used for debugging purposes only and is not intended + for production use. + + Support for the dump message MAY be discontinued in future versions + of PF_KEY. Key management applications MUST NOT depend on this + message for basic operation. + + The messaging behavior for SADB_DUMP is: + + Send an SADB_DUMP message from a user process to the kernel. + + <base> + + Several SADB_DUMP messages will return from the kernel to the + sending socket. + + + + + +McDonald, et. al. Informational [Page 40] + +RFC 2367 PF_KEY Key Management API July 1998 + + + <base, SA, (lifetime (HSC),) address(SD), (address(P),) + key(AE), (identity(SD),) (sensitivity)> + +3.2 Security Association Flags + + The Security Association's flags are a bitmask field. These flags + also appear in a combination that is part of a PROPOSAL extension. + The related symbolic definitions below should be used in order that + applications will be portable: + + #define SADB_SAFLAGS_PFS 1 /* perfect forward secrecy */ + + The SADB_SAFLAGS_PFS flag indicates to key management that this + association should have perfect forward secrecy in its key. (In + other words, any given session key cannot be determined by + cryptanalysis of previous session keys or some master key.) + +3.3 Security Association States + + The security association state field is an integer that describes the + states of a security association. They are: + + #define SADB_SASTATE_LARVAL 0 + #define SADB_SASTATE_MATURE 1 + #define SADB_SASTATE_DYING 2 + #define SADB_SASTATE_DEAD 3 + + #define SADB_SASTATE_MAX 3 + + A SADB_SASTATE_LARVAL security association is one that was created by + the SADB_GETSPI message. A SADB_SASTATE_MATURE association is one + that was updated with the SADB_UPDATE message or added with the + SADB_ADD message. A DYING association is one whose soft lifetime has + expired. A SADB_SASTATE_DEAD association is one whose hard lifetime + has expired, but hasn't been reaped by system garbage collection. If + a consumer of security associations has to extend an association + beyond its normal lifetime (e.g. OSPF Security) it MUST only set the + soft lifetime for an association. + +3.4 Security Association Types + + This defines the type of Security Association in this message. The + symbolic names are always the same, even on different + implementations. Applications SHOULD use the symbolic name in order + to have maximum portability across different implementations. These + are defined in the file <net/pfkeyv2.h>. + + + + + +McDonald, et. al. Informational [Page 41] + +RFC 2367 PF_KEY Key Management API July 1998 + + + #define SADB_SATYPE_UNSPEC 0 + + #define SADB_SATYPE_AH 2 /* RFC-1826 */ + #define SADB_SATYPE_ESP 3 /* RFC-1827 */ + + #define SADB_SATYPE_RSVP 5 /* RSVP Authentication */ + #define SADB_SATYPE_OSPFV2 6 /* OSPFv2 Authentication */ + #define SADB_SATYPE_RIPV2 7 /* RIPv2 Authentication */ + #define SADB_SATYPE_MIP 8 /* Mobile IP Auth. */ + + #define SADB_SATYPE_MAX 8 + + SADB_SATYPE_UNSPEC is defined for completeness and means no specific + type of security association. This type is never used with PF_KEY + SAs. + + SADB_SATYPE_AH is for the IP Authentication Header [Atk95b]. + + SADB_SATYPE_ESP is for the IP Encapsulating Security Payload + [Atk95c]. + + SADB_SATYPE_RSVP is for the RSVP Integrity Object. + + SADB_SATYPE_OSPFV2 is for OSPFv2 Cryptographic authentication + [Moy98]. + + SADB_SATYPE_RIPV2 is for RIPv2 Cryptographic authentication [BA97]. + + SADB_SATYPE_MIP is for Mobile IP's authentication extensions [Per97]. + + SADB_SATYPE_MAX is always set to the highest valid numeric value. + +3.5 Algorithm Types + + The algorithm type is interpreted in the context of the Security + Association type defined above. The numeric value might vary between + implementations, but the symbolic name MUST NOT vary between + implementations. Applications should use the symbolic name in order + to have maximum portability to various implementations. + + Some of the algorithm types defined below might not be standardized + or might be deprecated in the future. To obtain an assignment for a + symbolic name, contact the authors. + + The symbols below are defined in <net/pfkeyv2.h>. + + + + + + +McDonald, et. al. Informational [Page 42] + +RFC 2367 PF_KEY Key Management API July 1998 + + + /* Authentication algorithms */ + #define SADB_AALG_NONE 0 + #define SADB_AALG_MD5HMAC 2 + #define SADB_AALG_SHA1HMAC 3 + #define SADB_AALG_MAX 3 + + /* Encryption algorithms */ + #define SADB_EALG_NONE 0 + #define SADB_EALG_DESCBC 2 + #define SADB_EALG_3DESCBC 3 + #define SADB_EALG_NULL 11 + #define SADB_EALG_MAX 11 + + The algorithm for SADB_AALG_MD5_HMAC is defined in [MG98a]. The + algorithm for SADB_AALG_SHA1HMAC is defined in [MG98b]. The + algorithm for SADB_EALG_DESCBC is defined in [MD98]. SADB_EALG_NULL + is the NULL encryption algorithm, defined in [GK98]. The + SADB_EALG_NONE value is not to be used in any security association + except those which have no possible encryption algorithm in them + (e.g. IPsec AH). + +3.6 Extension Header Values + + To briefly recap the extension header values: + + #define SADB_EXT_RESERVED 0 + #define SADB_EXT_SA 1 + #define SADB_EXT_LIFETIME_CURRENT 2 + #define SADB_EXT_LIFETIME_HARD 3 + #define SADB_EXT_LIFETIME_SOFT 4 + #define SADB_EXT_ADDRESS_SRC 5 + #define SADB_EXT_ADDRESS_DST 6 + #define SADB_EXT_ADDRESS_PROXY 7 + #define SADB_EXT_KEY_AUTH 8 + #define SADB_EXT_KEY_ENCRYPT 9 + #define SADB_EXT_IDENTITY_SRC 10 + #define SADB_EXT_IDENTITY_DST 11 + #define SADB_EXT_SENSITIVITY 12 + #define SADB_EXT_PROPOSAL 13 + #define SADB_EXT_SUPPORTED_AUTH 14 + #define SADB_EXT_SUPPORTED_ENCRYPT 15 + #define SADB_EXT_SPIRANGE 16 + + #define SADB_EXT_MAX 16 + + + + + + + +McDonald, et. al. Informational [Page 43] + +RFC 2367 PF_KEY Key Management API July 1998 + + +3.7 Identity Extension Values + + Each identity can have a certain type. + + #define SADB_IDENTTYPE_RESERVED 0 + #define SADB_IDENTTYPE_PREFIX 1 + #define SADB_IDENTTYPE_FQDN 2 + #define SADB_IDENTTYPE_USERFQDN 3 + + #define SADB_IDENTTYPE_MAX 3 + + The PREFIX identity string consists of a network address followed by a + forward slash and a prefix length. The network address is in a + printable numeric form appropriate for the protocol family. The + prefix length is a decimal number greater than or equal to zero and + less than the number of bits in the network address. It indicates the + number of bits in the network address that are significant; all bits + in the network address that are not significant MUST be set to zero. + Note that implementations MUST parse the contents of the printable + address into a binary form for comparison purposes because multiple + printable strings are valid representations of the same address in + many protocol families (for example, some allow leading zeros and some + have letters that are case insensitive). Examples of PREFIX identities + are "199.33.248.64/27" and "3ffe::1/128". If the source or destination + identity is a PREFIX identity, the source or destination address for + the SA (respectively) MUST be within that prefix. The sadb_ident_id + field is zeroed for these identity types. + + The FQDN identity string contains a fully qualified domain name. An + example FQDN identity is "ministry-of-truth.inner.net". The + sadb_ident_id field is zeroed for these identity types. + + The UserFQDN identity consists of a text string in the format commonly + used for Internet-standard electronic mail. The syntax is the text + username, followed by the "@" character, followed in turn by the + appropriate fully qualified domain name. This identity specifies both + a username and an associated FQDN. There is no requirement that this + string specify a mailbox valid for SMTP or other electronic mail + use. This identity is useful with protocols supporting user-oriented + keying. It is a convenient identity form because the DNS Security + extensions can be used to distribute signed public key values by + associating KEY and SIG records with an appropriate MB DNS record. An + example UserFQDN identity is "julia@ministry-of-love.inner.net". The + sadb_ident_id field is used to contain a POSIX user id in the absence + of an identity string itself so that a user-level application can use + the getpwuid{,_r}() routine to obtain a textual user login id. If a + string is present, it SHOULD match the numeric value in the + sadb_ident_id field. If it does not match, the string SHOULD override + + + +McDonald, et. al. Informational [Page 44] + +RFC 2367 PF_KEY Key Management API July 1998 + + + the numeric value. + +3.8 Sensitivity Extension Values + + The only field currently defined in the sensitivity extension is the + sadb_sens_dpd, which represents the data protection domain. The other + data in the sensitivity extension is based off the sadb_sens_dpd + value. + + The DP/DOI is defined to be the same as the "Labeled Domain Identifier + Value" of the IP Security DOI specification [Pip98]. As noted in that + specification, values in the range 0x80000000 to 0xffffffff + (inclusive) are reserved for private use and values in the range + 0x00000001 through 0x7fffffff are assigned by IANA. The all-zeros + DP/DOI value is permanently reserved to mean that "no DP/DOI is in + use". + +3.9 Proposal Extension Values + + These are already mentioned in the Algorithm Types and Security + Association Flags sections. + +4 Future Directions + + While the current specification for the Sensitivity and Integrity + Labels is believed to be general enough, if a case should arise that + can't work with the current specification then this might cause a + change in a future version of PF_KEY. + + Similarly, PF_KEY might need extensions to work with other kinds of + Security Associations in future. It is strongly desirable for such + extensions to be made in a backwards-compatible manner should they be + needed. + + When more experience is gained with certificate management, it is + possible that the IDENTITY extension will have to be revisited to + allow a finer grained selection of certificate identities. + +5. Examples + + The following examples illustrate how PF_KEY is used. The first + example is an IP Security example, where the consumer of the security + associations is inside an operating system kernel. The second example + is an OSPF Security example, which illustrates a user-level consumer + of security associations. The third example covers things not + mentioned by the first two examples. A real system may closely + conform to one of these examples, or take parts of them. These + examples are purely illustrative, and are not intended to mandate a + + + +McDonald, et. al. Informational [Page 45] + +RFC 2367 PF_KEY Key Management API July 1998 + + + particular implementation method. + +5.1 Simple IP Security Example + + +---------------+ +-------------+ + |Key Mgmt Daemon| | Application | + +---------------+ +-------------+ + | | / + | | / + | | | Applications + ======[PF_KEY]====[PF_INET]========================== + | | | OS Kernel + +------------+ +-----------------+ + | Key Engine | | TCP/IP, | + | or SADB |---| including IPsec | + +------------+ | | + +-----------------+ + + When the Key Management daemon (KMd) begins. It must tell PF_KEY + that it is willing to accept message for the two IPsec services, AH + and ESP. It does this by sending down two SADB_REGISTER messages. + + KMd->Kernel: SADB_REGISTER for ESP + Kernel->Registered: SADB_REGISTER for ESP, Supported Algorithms + KMd->Kernel: SADB_REGISTER for AH + Kernel->Registered: SADB_REGISTER for AH, Supported Algorithms + + Each REGISTER message will cause a reply to go to all PF_KEY sockets + registered for ESP and AH respectively (including the requester). + + Assume that no security associations currently exist for IPsec to + use. Consider when a network application begins transmitting data + (e.g. a TCP SYN). Because of policy, or the application's request, + the kernel IPsec module needs an AH security association for this + data. Since there is not one present, the following message is + generated: + + Kernel->Registered: SADB_ACQUIRE for AH, addrs, ID, sens, + proposals + + The KMd reads the ACQUIRE message, especially the sadb_msg_seq + number. Before it begins the negotiation, it sends down an + SADB_GETSPI message with the sadb_msg_seq number equal to the one + received in the ACQUIRE. The kernel returns the results of the + GETSPI to all listening sockets. + + KMd->Kernel: SADB_GETSPI for AH, addr, SPI range + Kernel->All: SADB_GETSPI for AH, assoc, addrs + + + +McDonald, et. al. Informational [Page 46] + +RFC 2367 PF_KEY Key Management API July 1998 + + + The KMd may perform a second GETSPI operation if it needs both + directions of IPsec SPI values. Now that the KMd has an SPI for at + least one of the security associations, it begins negotiation. After + deriving keying material, and negotiating other parameters, it sends + down one (or more) SADB_UPDATE messages with the same value in + sadb_msg_seq. + + If a KMd has any error at all during its negotiation, it can send + down: + + KMd->Kernel: SADB_ACQUIRE for AH, assoc (with an error) + Kernel->All: SADB_ACQUIRE for AH, assoc (same error) + + but if it succeeds, it can instead: + + KMd->Kernel: SADB_UPDATE for AH, assoc, addrs, keys, + <etc.> + Kernel->All: SADB_UPDATE for AH, assoc, addrs, <etc.> + + The results of the UPDATE (minus the actual keys) are sent to all + listening sockets. If only one SPI value was determined locally, the + other SPI (since IPsec SAs are unidirectional) must be added with an + SADB_ADD message. + + KMd->Kernel: SADB_ADD for AH, assoc, addrs, keys, <etc.> + Kernel->All: SADB_ADD for AH, assoc, addrs, <etc.> + + If one of the extensions passed down was a Lifetime extension, it is + possible at some point an SADB_EXPIRE message will arrive when one of + the lifetimes has expired. + + Kernel->All: SADB_EXPIRE for AH, assoc, addrs, + Hard or Soft, Current, <etc.> + + The KMd can use this as a clue to begin negotiation, or, if it has + some say in policy, send an SADB_UPDATE down with a lifetime + extension. + +5.2 Proxy IP Security Example + + Many people are interested in using IP Security in a "proxy" or + "firewall" configuration in which an intermediate system provides + security services for "inside" hosts. In these environments, the + intermediate systems can use PF_KEY to communicate with key + management applications almost exactly as they would if they were the + actual endpoints. The messaging behavior of PF_KEY in these cases is + exactly the same as the previous example, but the address information + is slightly different. + + + +McDonald, et. al. Informational [Page 47] + +RFC 2367 PF_KEY Key Management API July 1998 + + + Consider this case: + + A ========= B --------- C + + Key: + A "outside" host that implements IPsec + B "firewall" that implements IPsec + C "inside" host that does not implement IPsec + + === IP_{A<->B} ESP [ IP_{A<->C} ULP ] + --- IP_{A<->C} ULP + + A is a single system that wishes to communicate with the "inside" + system C. B is a "firewall" between C and the outside world that + will do ESP and tunneling on C's behalf. A discovers that it needs + to send traffic to C via B through methods not described here (Use of + the DNS' KX record might be one method for discovering this). + + For packets that flow from left to right, A and B need an IPsec + Security Association with: + + SA type of ESP tunnel-mode + Source Identity that dominates A (e.g. A's address) + Destination Identity that dominates B (e.g. B's address) + Source Address of A + Destination Address of B + + For packets to flow from right to left, A and B need an IPsec + Security Association with: + + SA type of ESP tunnel-mode + Source Identity that dominates C + Destination Identity that dominates A + Source Address of B + Destination Address of A + Proxy Address of C + + For this second SA (for packets flowing from C towards A), node A + MUST verify that the inner source address is dominated by the Source + Identity for the SA used with those packets. If node A does not do + this, an adversary could forge packets with an arbitrary Source + Identity and defeat the packet origin protections provided by IPsec. + + Now consider a slightly more complex case: + + A_1 --| |-- D_1 + |--- B ====== C ---| + A_2 --| |-- D_2 + + + +McDonald, et. al. Informational [Page 48] + +RFC 2367 PF_KEY Key Management API July 1998 + + + Key: + A_n "inside" host on net 1 that does not do IPsec. + B "firewall" for net 1 that supports IPsec. + C "firewall" for net 2 that supports IPsec. + D_n "inside" host on net 2 that does not do IPsec. + === IP_{B<->C} ESP [ IP_{A<->C} ULP ] + --- IP_{A<->C} ULP + + For A_1 to send a packet to D_1, B and C need an SA with: + + SA Type of ESP + Source Identity that dominates A_1 + Destination Identity that dominates C + Source Address of B + Destination Address of C + Proxy Address of A_1 + + For D_1 to send a packet to A_1, C and B need an SA with: + SA Type of ESP Tunnel-mode + Source Identity that dominates D_1 + Destination Identity that dominates B + Source Address of C + Destination Address of B + Proxy Address of D_1 + + Note that A_2 and D_2 could be substituted for A_1 and D_1 + (respectively) here; the association of an SA with a particular pair + of ends or group of those pairs is a policy decision on B and/or C + and not necessarily a function of key management. The same check of + the Source Identity against the inner source IP address MUST also be + performed in this case for the same reason. + + For a more detailed discussion of the use of IP Security in complex + cases, please see [Atk97]. + + NOTE: The notion of identity domination might be unfamiliar. Let H + represent some node. Let Hn represent H's fully qualified domain + name. Let Ha represent the IP address of H. Let Hs represent the IP + subnet containing Ha. Let Hd represent a fully qualified domain + name that is a parent of the fully qualified domain name of H. Let + M be a UserFQDN identity that whose right-hand part is Hn or Ha. + + Any of M, Hn, Ha, Hs, and Hd is considered to dominate H in the + example above. Hs dominates any node having an IP address within + the IP address range represented by Hs. Hd dominates any node + having a fully qualified domain name within underneath Hd. + + + + + +McDonald, et. al. Informational [Page 49] + +RFC 2367 PF_KEY Key Management API July 1998 + + +5.3 OSPF Security Example + + +---------------+ +-------------+ + |Key Mgmt Daemon| | OSPF daemon | + +---------------+ +-------------+ + | | / / | + | /------|----+ / | + | / | +---+ | Applications + ======[PF_KEY]====[PF_INET]===========[PF_ROUTE]================ + | | | | OS Kernel + +------------+ +-----------------+ +---------+ + | Key Engine | | TCP/IP, | | Routing | + | or SADB |---| including IPsec |--| Table | + +------------+ | | +---------+ + +-----------------+ + + As in the previous examples, the KMd registers itself with the Key + Engine via PF_KEY. Even though the consumer of the security + associations is in user-space, the PF_KEY and Key Engine + implementation knows enough to store SAs and to relay messages. + + When the OSPF daemon needs to communicate securely with its peers, it + would perform an SADB_GET message and retrieve the appropriate + association: + + OSPFd->Kernel: SADB_GET of OSPF, assoc, addrs + Kernel->OSPFd: SADB_GET of OSPF, assoc, addrs, keys, <etc.> + + If this GET fails, the OSPFd may need to acquire a new security + association. This interaction is as follows: + + OSPFd->Kernel: SADB_ACQUIRE of OSPF, addrs, <ID, sens,> + proposal + Kernel->Registered: SADB_ACQUIRE of OSPF, <same as sent message> + + The KMd sees this and performs actions similar to the previous + example. One difference, however, is that when the UPDATE message + comes back, the OSPFd will then perform a GET of the updated SA to + retrieve all of its parameters. + +5.4 Miscellaneous + + Some messages work well only in system maintenance programs, for + debugging, or for auditing. In a system panic situation, such as a + detected compromise, an SADB_FLUSH message should be issued for a + particular SA type, or for ALL SA types. + + + + + +McDonald, et. al. Informational [Page 50] + +RFC 2367 PF_KEY Key Management API July 1998 + + + Program->Kernel: SADB_FLUSH for ALL + <Kernel then flushes all internal SAs> + Kernel->All: SADB_FLUSH for ALL + + Some SAs may need to be explicitly deleted, either by a KMd, or by a + system maintenance program. + + Program->Kernel: SADB_DELETE for AH, association, addrs + Kernel->All: SADB_DELETE for AH, association, addrs + + Common usage of the SADB_DUMP message is discouraged. For debugging + purposes, however, it can be quite useful. The output of a DUMP + message should be read quickly, in order to avoid socket buffer + overflows. + + Program->Kernel: SADB_DUMP for ESP + Kernel->Program: SADB_DUMP for ESP, association, <all fields> + Kernel->Program: SADB_DUMP for ESP, association, <all fields> + Kernel->Program: SADB_DUMP for ESP, association, <all fields> + <ad nauseam...> + +6 Security Considerations + + This memo discusses a method for creating, reading, modifying, and + deleting Security Associations from an operating system. Only + trusted, privileged users and processes should be able to perform any + of these operations. It is unclear whether this mechanism provides + any security when used with operating systems not having the concept + of a trusted, privileged user. + + If an unprivileged user is able to perform any of these operations, + then the operating system cannot actually provide the related + security services. If an adversary knows the keys and algorithms in + use, then cryptography cannot provide any form of protection. + + This mechanism is not a panacea, but it does provide an important + operating system component that can be useful in creating a secure + internetwork. + + Users need to understand that the quality of the security provided by + an implementation of this specification depends completely upon the + overall security of the operating system, the correctness of the + PF_KEY implementation, and upon the security and correctness of the + applications that connect to PF_KEY. It is appropriate to use high + assurance development techniques when implementing PF_KEY and the + related security association components of the operating system. + + + + + +McDonald, et. al. Informational [Page 51] + +RFC 2367 PF_KEY Key Management API July 1998 + + +Acknowledgments + + The authors of this document are listed primarily in alphabetical + order. Randall Atkinson and Ron Lee provided useful feedback on + earlier versions of this document. + + At one time or other, all of the authors worked at the Center for + High Assurance Computer Systems at the U.S. Naval Research + Laboratory. This work was sponsored by the Information Security + Program Office (PMW-161), U.S. Space and Naval Warfare Systems + Command (SPAWAR) and the Computing Systems Technology Office, Defense + Advanced Research Projects Agency (DARPA/CSTO). We really appreciate + their sponsorship of our efforts and their continued support of + PF_KEY development. Without that support, PF_KEY would not exist. + + The "CONFORMANCE and COMPLIANCE" wording was taken from [MSST98]. + + Finally, the authors would like to thank those who sent in comments + and questions on the various iterations of this document. This + specification and implementations of it are discussed on the PF_KEY + mailing list. If you would like to be added to this list, send a note + to <pf_key-request@inner.net>. + +References + + [AMPMC96] Randall J. Atkinson, Daniel L. McDonald, Bao G. Phan, Craig + W. Metz, and Kenneth C. Chin, "Implementation of IPv6 in 4.4-Lite + BSD", Proceedings of the 1996 USENIX Conference, San Diego, CA, + January 1996, USENIX Association. + + [Atk95a] Atkinson, R., "IP Security Architecture", RFC 1825, August + 1995. + + [Atk95b] Atkinson, R., "IP Authentication Header", RFC 1826, August + 1995. + + [Atk95c] Atkinson, R., "IP Encapsulating Security Payload", RFC 1827, + August 1995. + + [Atk97] Atkinson, R., "Key Exchange Delegation Record for the Domain + Name System", RFC 2230, October 1997. + + [BA97] Baker, F., and R. Atkinson, "RIP-2 MD5 Authentication", RFC + 2082, January 1997. + + [Biba77] K. J. Biba, "Integrity Considerations for Secure Computer + Systems", MTR-3153, The MITRE Corporation, June 1975; ESD-TR-76-372, + April 1977. + + + +McDonald, et. al. Informational [Page 52] + +RFC 2367 PF_KEY Key Management API July 1998 + + + [BL74] D. Elliot Bell and Leonard J. LaPadula, "Secure Computer + Systems: Unified Exposition and Multics Interpretation", MTR 2997, + The MITRE Corporation, April 1974. (AD/A 020 445) + + [Bra97] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [CW87] D. D. Clark and D. R. Wilson, "A Comparison of Commercial and + Military Computer Security Policies", Proceedings of the 1987 + Symposium on Security and Privacy, pp. 184-195, IEEE Computer + Society, Washington, D.C., 1987. + + [DIA] US Defense Intelligence Agency (DIA), "Compartmented Mode + Workstation Specification", Technical Report DDS-2600-6243-87. + + [GK98] Glenn, R., and S. Kent, "The NULL Encryption Algorithm and Its + Use with IPsec", Work in Progress. + + [HM97a] Harney, H., and C. Muckenhirn, "Group Key Management Protocol + (GKMP) Specification", RFC 2093, July 1997. + + [HM97b] Harney, H., and C. Muckenhirn, "Group Key Management Protocol + (GKMP) Architecture", RFC 2094, July 1997. + + [MD98] Madsen, C., and N. Doraswamy, "The ESP DES-CBC Cipher + Algorithm With Explicit IV", Work in Progress. + + [MG98a] Madsen, C., and R. Glenn, "The Use of HMAC-MD5-96 within ESP + and AH", Work in Progress. + + [MG98b] Madsen, C., and R. Glenn, "The Use of HMAC-SHA-1-96 within + ESP and AH", Work in Progress. + + [MSST98] Maughan, D., Schertler, M., Schneider, M., and J. Turner, + "Internet Security Association and Key Management Protocol (ISAKMP)", + Work in Progress. + + [Moy98] Moy, J., "OSPF Version 2", STD 54, RFC 2328, April 1998. + + [Per97] Perkins, C., "IP Mobility Support", RFC 2002, October 1996. + + [Pip98] Piper, D., "The Internet IP Security Domain of Interpretation + for ISAKMP", Work in Progress. + + [Sch96] Bruce Schneier, Applied Cryptography, p. 360, John Wiley & + Sons, Inc., 1996. + + + + + +McDonald, et. al. Informational [Page 53] + +RFC 2367 PF_KEY Key Management API July 1998 + + + [Skl91] Keith Sklower, "A Tree-based Packet Routing Table for + Berkeley UNIX", Proceedings of the Winter 1991 USENIX Conference, + Dallas, TX, USENIX Association. 1991. pp. 93-103. + +Disclaimer + + The views and specification here are those of the editors and are not + necessarily those of their employers. The employers have not passed + judgment on the merits, if any, of this work. The editors and their + employers specifically disclaim responsibility for any problems + arising from correct or incorrect implementation or use of this + specification. + +Authors' Addresses + + Daniel L. McDonald + Sun Microsystems, Inc. + 901 San Antonio Road, MS UMPK17-202 + Palo Alto, CA 94303 + + Phone: +1 650 786 6815 + EMail: danmcd@eng.sun.com + + + Craig Metz + (for Code 5544) + U.S. Naval Research Laboratory + 4555 Overlook Ave. SW + Washington, DC 20375 + + Phone: (DSN) 754-8590 + EMail: cmetz@inner.net + + + Bao G. Phan + U. S. Naval Research Laboratory + + EMail: phan@itd.nrl.navy.mil + + + + + + + + + + + + + +McDonald, et. al. Informational [Page 54] + +RFC 2367 PF_KEY Key Management API July 1998 + + +Appendix A: Promiscuous Send/Receive Message Type + + A kernel supporting PF_KEY MAY implement the following extension for + development and debugging purposes. If it does, it MUST implement the + extension as specified here. An implementation MAY require an + application to have additional privileges to perform promiscuous send + and/or receive operations. + + The SADB_X_PROMISC message allows an application to send and receive + messages in a "promiscuous mode." There are two forms of this + message: control and data. The control form consists of only a + message header. This message is used to toggle the promiscuous- + receive function. A value of one in the sadb_msg_satype field enables + promiscuous message reception for this socket, while a value of zero + in that field disables it. + + The second form of this message is the data form. This is used to + send or receive messages in their raw form. Messages in the data form + consist of a message header followed by an entire new message. There + will be two message headers in a row: one for the SADB_X_PROMISC + message, and one for the payload message. + + Data messages sent from the application are sent to either the PF_KEY + socket of a single process identified by a nonzero sadb_msg_seq or to + all PF_KEY sockets if sadb_msg_seq is zero. These messages are sent + without any processing of their contents by the PF_KEY interface + (including sanity checking). This promiscuous-send capability allows + an application to send messages as if it were the kernel. This also + allows it to send erroneous messages. + + If the promiscuous-receive function has been enabled, a copy of any + message sent via PF_KEY by another application or by the kernel is + sent to the promiscuous application. This is done before any + processing of the message's contents by the PF_KEY interface (again, + including sanity checking). This promiscuous-receive capability + allows an application to receive all messages sent by other parties + using PF_KEY. + + The messaging behavior of the SADB_X_PROMISC message is: + + Send a control-form SADB_X_PROMISC message from a user process + to the kernel. + + <base> + + The kernel returns the SADB_X_PROMISC message to all listening + processes. + + + + +McDonald, et. al. Informational [Page 55] + +RFC 2367 PF_KEY Key Management API July 1998 + + + <base> + + Send a data-form SADB_X_PROMISC message from a user process to + the kernel. + + <base, base(, others)> + + The kernel sends the encapsulated message to the target + process(s). + + <base(, others)> + + If promiscuous-receive is enabled, the kernel will encapsulate + and send copies of all messages sent via the PF_KEY interface. + + <base, base(, others)> + + Errors: + EPERM Additional privileges are required to perform the + requested operations. + ESRCH (Data form, sending) The target process in sadb_msg_seq + does not exist or does not have an open PF_KEY Version 2 + socket. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +McDonald, et. al. Informational [Page 56] + +RFC 2367 PF_KEY Key Management API July 1998 + + +Appendix B: Passive Change Message Type + + The SADB_X_PCHANGE message is a passive-side (aka. the "listener" or + "receiver") counterpart to the SADB_ACQUIRE message. It is useful + for when key management applications wish to more effectively handle + incoming key management requests for passive-side sessions that + deviate from systemwide default security services. If a passive + session requests that only certain levels of security service be + allowed, the SADB_X_PCHANGE message expresses this change to any + registered PF_KEY sockets. Unlike SADB_ACQUIRE, this message is + purely informational, and demands no other PF_KEY interaction. + + The SADB_X_PCHANGE message is typically triggered by either a change + in an endpoint's requested security services, or when an endpoint + that made a special request disappears. In the former case, an + SADB_X_PCHANGE looks like an SADB_ACQUIRE, complete with an + sadb_proposal extension indicating the preferred algorithms, + lifetimes, and other attributes. When a passive session either + disappears, or reverts to a default behavior, an SADB_X_PCHANGE will + be issued with _no_ sadb_proposal extension, indicating that the + exception to systemwide default behavior has disappeared. + + There are two messaging behaviors for SADB_X_PCHANGE. The first is + the kernel-originated case: + + The kernel sends an SADB_X_PCHANGE message to registered + sockets. + + <base, address(SD), (identity(SD),) (sensitivity,) (proposal)> + + NOTE: The address(SD) extensions MUST have the port fields + filled in with the port numbers of the session + requiring keys if appropriate. + + The second is for a user-level consumer of SAs. + + Send an SADB_X_PCHANGE message from a user process to the + kernel. + + <base, address(SD), (identity(SD),) (sensitivity,) (proposal)> + + The kernel returns an SADB_X_PCHANGE message to registered + sockets. + + <base, address(SD), (identity(SD),) (sensitivity,) (proposal)> + + + + + + +McDonald, et. al. Informational [Page 57] + +RFC 2367 PF_KEY Key Management API July 1998 + + +Appendix C: Key Management Private Data Extension + + The Key Management Private Data extension is attached to either an + SADB_ADD or an SADB_UPDATE message. It attaches a single piece of + arbitrary data to a security association. It may be useful for key + managment applications that could use an SADB_DUMP or SADB_GET + message to obtain additional state if it needs to restart or recover + after a crash. The format of this extension is: + + #define SADB_X_EXT_KMPRIVATE 17 + + struct sadb_x_kmprivate { + uint16_t sadb_x_kmprivate_len; + uint16_t sadb_x_kmprivate_exttype; + uint32_t sadb_x_kmprivate_reserved; + }; + /* sizeof(struct sadb_x_kmprivate) == 8 */ + + /* followed by arbitrary data */ + + + The data following the sadb_x_kmprivate extension can be anything. + It will be stored with the actual security association in the kernel. + Like all data, it must be padded to an eight byte boundary. + + + + + + + + + + + + + + + + + + + + + + + + + + + +McDonald, et. al. Informational [Page 58] + +RFC 2367 PF_KEY Key Management API July 1998 + + +Appendix D: Sample Header File + + /* + This file defines structures and symbols for the PF_KEY Version 2 + key management interface. It was written at the U.S. Naval Research + Laboratory. This file is in the public domain. The authors ask that + you leave this credit intact on any copies of this file. + */ + #ifndef __PFKEY_V2_H + #define __PFKEY_V2_H 1 + + #define PF_KEY_V2 2 + #define PFKEYV2_REVISION 199806L + + #define SADB_RESERVED 0 + #define SADB_GETSPI 1 + #define SADB_UPDATE 2 + #define SADB_ADD 3 + #define SADB_DELETE 4 + #define SADB_GET 5 + #define SADB_ACQUIRE 6 + #define SADB_REGISTER 7 + #define SADB_EXPIRE 8 + #define SADB_FLUSH 9 + #define SADB_DUMP 10 + #define SADB_X_PROMISC 11 + #define SADB_X_PCHANGE 12 + #define SADB_MAX 12 + + struct sadb_msg { + uint8_t sadb_msg_version; + uint8_t sadb_msg_type; + uint8_t sadb_msg_errno; + uint8_t sadb_msg_satype; + uint16_t sadb_msg_len; + uint16_t sadb_msg_reserved; + uint32_t sadb_msg_seq; + uint32_t sadb_msg_pid; + }; + + struct sadb_ext { + uint16_t sadb_ext_len; + uint16_t sadb_ext_type; + }; + + struct sadb_sa { + uint16_t sadb_sa_len; + uint16_t sadb_sa_exttype; + + + +McDonald, et. al. Informational [Page 59] + +RFC 2367 PF_KEY Key Management API July 1998 + + + uint32_t sadb_sa_spi; + uint8_t sadb_sa_replay; + uint8_t sadb_sa_state; + uint8_t sadb_sa_auth; + uint8_t sadb_sa_encrypt; + uint32_t sadb_sa_flags; + }; + + struct sadb_lifetime { + uint16_t sadb_lifetime_len; + uint16_t sadb_lifetime_exttype; + uint32_t sadb_lifetime_allocations; + uint64_t sadb_lifetime_bytes; + uint64_t sadb_lifetime_addtime; + uint64_t sadb_lifetime_usetime; + }; + + struct sadb_address { + uint16_t sadb_address_len; + uint16_t sadb_address_exttype; + uint8_t sadb_address_proto; + uint8_t sadb_address_prefixlen; + uint16_t sadb_address_reserved; + }; + + struct sadb_key { + uint16_t sadb_key_len; + uint16_t sadb_key_exttype; + uint16_t sadb_key_bits; + uint16_t sadb_key_reserved; + }; + + struct sadb_ident { + uint16_t sadb_ident_len; + uint16_t sadb_ident_exttype; + uint16_t sadb_ident_type; + uint16_t sadb_ident_reserved; + uint64_t sadb_ident_id; + }; + + struct sadb_sens { + uint16_t sadb_sens_len; + uint16_t sadb_sens_exttype; + uint32_t sadb_sens_dpd; + uint8_t sadb_sens_sens_level; + uint8_t sadb_sens_sens_len; + uint8_t sadb_sens_integ_level; + uint8_t sadb_sens_integ_len; + + + +McDonald, et. al. Informational [Page 60] + +RFC 2367 PF_KEY Key Management API July 1998 + + + uint32_t sadb_sens_reserved; + }; + + struct sadb_prop { + uint16_t sadb_prop_len; + uint16_t sadb_prop_exttype; + uint8_t sadb_prop_replay; + uint8_t sadb_prop_reserved[3]; + }; + + struct sadb_comb { + uint8_t sadb_comb_auth; + uint8_t sadb_comb_encrypt; + uint16_t sadb_comb_flags; + uint16_t sadb_comb_auth_minbits; + uint16_t sadb_comb_auth_maxbits; + uint16_t sadb_comb_encrypt_minbits; + uint16_t sadb_comb_encrypt_maxbits; + uint32_t sadb_comb_reserved; + uint32_t sadb_comb_soft_allocations; + uint32_t sadb_comb_hard_allocations; + uint64_t sadb_comb_soft_bytes; + uint64_t sadb_comb_hard_bytes; + uint64_t sadb_comb_soft_addtime; + uint64_t sadb_comb_hard_addtime; + uint64_t sadb_comb_soft_usetime; + uint64_t sadb_comb_hard_usetime; + }; + + struct sadb_supported { + uint16_t sadb_supported_len; + uint16_t sadb_supported_exttype; + uint32_t sadb_supported_reserved; + }; + + struct sadb_alg { + uint8_t sadb_alg_id; + uint8_t sadb_alg_ivlen; + uint16_t sadb_alg_minbits; + uint16_t sadb_alg_maxbits; + uint16_t sadb_alg_reserved; + }; + + struct sadb_spirange { + uint16_t sadb_spirange_len; + uint16_t sadb_spirange_exttype; + uint32_t sadb_spirange_min; + uint32_t sadb_spirange_max; + + + +McDonald, et. al. Informational [Page 61] + +RFC 2367 PF_KEY Key Management API July 1998 + + + uint32_t sadb_spirange_reserved; + }; + + struct sadb_x_kmprivate { + uint16_t sadb_x_kmprivate_len; + uint16_t sadb_x_kmprivate_exttype; + uint32_t sadb_x_kmprivate_reserved; + }; + + #define SADB_EXT_RESERVED 0 + #define SADB_EXT_SA 1 + #define SADB_EXT_LIFETIME_CURRENT 2 + #define SADB_EXT_LIFETIME_HARD 3 + #define SADB_EXT_LIFETIME_SOFT 4 + #define SADB_EXT_ADDRESS_SRC 5 + #define SADB_EXT_ADDRESS_DST 6 + #define SADB_EXT_ADDRESS_PROXY 7 + #define SADB_EXT_KEY_AUTH 8 + #define SADB_EXT_KEY_ENCRYPT 9 + #define SADB_EXT_IDENTITY_SRC 10 + #define SADB_EXT_IDENTITY_DST 11 + #define SADB_EXT_SENSITIVITY 12 + #define SADB_EXT_PROPOSAL 13 + #define SADB_EXT_SUPPORTED_AUTH 14 + #define SADB_EXT_SUPPORTED_ENCRYPT 15 + #define SADB_EXT_SPIRANGE 16 + #define SADB_X_EXT_KMPRIVATE 17 + #define SADB_EXT_MAX 17 + #define SADB_SATYPE_UNSPEC 0 + #define SADB_SATYPE_AH 2 + #define SADB_SATYPE_ESP 3 + #define SADB_SATYPE_RSVP 5 + #define SADB_SATYPE_OSPFV2 6 + #define SADB_SATYPE_RIPV2 7 + #define SADB_SATYPE_MIP 8 + #define SADB_SATYPE_MAX 8 + + #define SADB_SASTATE_LARVAL 0 + #define SADB_SASTATE_MATURE 1 + #define SADB_SASTATE_DYING 2 + #define SADB_SASTATE_DEAD 3 + #define SADB_SASTATE_MAX 3 + + #define SADB_SAFLAGS_PFS 1 + + #define SADB_AALG_NONE 0 + #define SADB_AALG_MD5HMAC 2 + #define SADB_AALG_SHA1HMAC 3 + + + +McDonald, et. al. Informational [Page 62] + +RFC 2367 PF_KEY Key Management API July 1998 + + + #define SADB_AALG_MAX 3 + + #define SADB_EALG_NONE 0 + #define SADB_EALG_DESCBC 2 + #define SADB_EALG_3DESCBC 3 + #define SADB_EALG_NULL 11 + #define SADB_EALG_MAX 11 + + #define SADB_IDENTTYPE_RESERVED 0 + #define SADB_IDENTTYPE_PREFIX 1 + #define SADB_IDENTTYPE_FQDN 2 + #define SADB_IDENTTYPE_USERFQDN 3 + #define SADB_IDENTTYPE_MAX 3 + + #define SADB_KEY_FLAGS_MAX 0 + #endif /* __PFKEY_V2_H */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +McDonald, et. al. Informational [Page 63] + +RFC 2367 PF_KEY Key Management API July 1998 + + +Appendix E: Change Log + + The following changes were made between 05 and 06: + + * Last change before becoming an informational RFC. Removed all + Internet-Draft references. Also standardized citation strings. + Now cite RFC 2119 for MUST, etc. + + * New appendix on optional KM private data extension. + + * Fixed example to indicate the ACQUIRE messages with errno mean + KM failure. + + * Added SADB_EALG_NULL. + + * Clarified proxy examples to match definition of PROXY address being + the inner packet's source address. (Basically a sign-flip. The + example still shows how to protect against policy vulnerabilities + in tunnel endpoints.) + + * Loosened definition of a destination address to include broadcast. + + * Recommended that LARVAL security associations have implicit short + lifetimes. + + The following changes were made between 04 and 05: + + * New appendix on Passive Change message. + + * New sadb_address_prefixlen field. + + * Small clarifications on sadb_ident_id usage. + + * New PFKEYV2_REVISION value. + + * Small clarification on what a PROXY address is. + + * Corrected sadb_spirange_{min,max} language. + + * In ADD messages that are in response to an ACQUIRE, the + sadb_msg_seq MUST be the same as that of the originating ACQUIRE. + + * Corrected ACQUIRE message behavior, ACQUIRE message SHOULD send up + PROXY addresses when it needs them. + + * Clarification on SADB_EXPIRE and user-level security protocols. + + The following changes were made between 03 and 04: + + + +McDonald, et. al. Informational [Page 64] + +RFC 2367 PF_KEY Key Management API July 1998 + + + * Stronger language about manual keying. + + * PFKEYV2_REVISION, ala POSIX. + + * Put in language about sockaddr ports in ACQUIRE messages. + + * Mention of asymmetric algorithms. + + * New sadb_ident_id field for easier construction of USER_FQDN + identity strings. + + * Caveat about source addresses not always used for collision + detection. (e.g. IPsec) + + The following changes were made between 02 and 03: + + + * Formatting changes. + + * Many editorial cleanups, rewordings, clarifications. + + * Restrictions that prevent many strange and invalid cases. + + * Added definitions section. + + * Removed connection identity type (this will reappear when it is + more clear what it should look like). + + * Removed 5.2.1 (Why involve the kernel?). + + * Removed INBOUND, OUTBOUND, and FORWARD flags; they can be computed + from src, dst, and proxy and you had to anyway for sanity checking. + + * Removed REPLAY flag; sadb_sa_replay==0 means the same thing. + + * Renamed bit lengths to "bits" to avoid potential confusion. + + * Explicitly listed lengths for structures. + + * Reworked identities to always use a string format. + + * Removed requirements for support of shutdown() and SO_USELOOPBACK. + + * 64 bit alignment and 64 bit lengths instead of 32 bit. + + * time_t replaced with uint64 in lifetimes. + + + + + +McDonald, et. al. Informational [Page 65] + +RFC 2367 PF_KEY Key Management API July 1998 + + + * Inserted Appendix A (SADB_X_PROMISC) and Appendix B (SAMPLE HEADER + FILE). + + * Explicit error if PF_KEY_V2 not set at socket() call. + + * More text on SO_USELOOPBACK. + + * Made fields names and symbol names more consistent. + + * Explicit error if PF_KEY_V2 is not in sadb_msg_version field. + + * Bytes lifetime field now a 64-bit quantity. + + * Explicit len/exttype wording. + + * Flattening out of extensions (LIFETIME_HARD, LIFETIME_SOFT, etc.) + + * UI example (0x123 == 0x1230 or 0x0123). + + * Cleaned up and fixed some message behavior examples. + + The following changes were made between 01 and 02: + + * Mentioned that people COULD use these same messages between user + progs. (Also mentioned why you still might want to use the actual + socket.) + + * Various wordsmithing changes. + + * Took out netkey/ directory, and make net/pfkeyv2.h + + * Inserted PF_KEY_V2 proto argument per C. Metz. + + * Mentioned other socket calls and how their PF_KEY behavior is + undefined. + + * SADB_EXPIRE now communicates both hard and soft lifetime expires. + + * New "association" extension, even smaller base header. + + * Lifetime extension improvements. + + * Length now first in extensions. + + * Errors can be sent from kernel to user, also. + + * Examples section inserted. + + + + +McDonald, et. al. Informational [Page 66] + +RFC 2367 PF_KEY Key Management API July 1998 + + + * Some bitfield cleanups, including STATE and SA_OPTIONS cleanup. + + * Key splitting now only across auth algorithm and encryption + algorithm. Thanks for B. Sommerfeld for clues here. + + The following changes were made between 00 and 01: + + * Added this change log. + + * Simplified TLV header syntax. + + * Splitting of algorithms. This may be controversial, but it allows + PF_KEY to be used for more than just IPsec. It also allows some + kinds of policies to be placed in the KMd easier. + + * Added solid definitions and formats for certificate identities, + multiple keys, etc. + + * Specified how keys are to be layed out (most-to-least bits). + + * Changed sequence number semantics to be like an RPC transaction ID + number. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +McDonald, et. al. Informational [Page 67] + +RFC 2367 PF_KEY Key Management API July 1998 + + +F. Full Copyright Statement + + Copyright (C) The Internet Society (1998). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS 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. + + + + + + + + + + + + + + + + + + + + + + + + +McDonald, et. al. Informational [Page 68] + |