diff options
Diffstat (limited to 'doc/protocol/draft-benaloh-pct-01.txt')
-rw-r--r-- | doc/protocol/draft-benaloh-pct-01.txt | 2649 |
1 files changed, 0 insertions, 2649 deletions
diff --git a/doc/protocol/draft-benaloh-pct-01.txt b/doc/protocol/draft-benaloh-pct-01.txt deleted file mode 100644 index f9e61ba096..0000000000 --- a/doc/protocol/draft-benaloh-pct-01.txt +++ /dev/null @@ -1,2649 +0,0 @@ - -Internet Draft Daniel Simon - Microsoft Corp. - April 1996 - - The Private Communication Technology Protocol - <draft-benaloh-pct-01.txt> - -1. Status of this Memo - -This document is an Internet-Draft. Internet-Drafts are working -documents of the Internet Engineering Task Force (IETF), its areas, -and its working groups. Note that other groups may also distribute -working documents as Internet-Drafts. - -Internet-Drafts are draft documents valid for a maximum of six months -and may be updated, replaced, or obsoleted by other documents at any -time. It is inappropriate to use Internet-Drafts as reference -material or to cite them other than as "work in progress". - -To learn the current status of any Internet-Draft, please check the -"1id-abstracts.txt" listing contained in the Internet-Drafts Shadow -Directories on ds.internic.net (US East Coast), nic.nordu.net -(Europe), ftp.isi.edu (US West Coast), or munnari.oz.au (Pacific Rim). - -This Internet-Draft expires 10 October 1996. - - -2. Abstract - -This document specifies Version 2 of the Private Communication -Technology (PCT) protocol, a security protocol that provides privacy -over the Internet. The protocol is intended to prevent eavesdropping -on connection-based communications in client/server applications, -with at least one of the two always being authenticated, and each -having the option of requiring authentication of the other. PCT is -somewhat similar to SSL ([1]); however, PCT version 1 corrects -or improves on several weaknesses of SSL, and version 2 also adds a -number of new features. PCT version 2 is fully compatible with PCT -version 1. - - -3. Introduction - -The Private Communication Technology (PCT) Protocol is designed to -provide privacy between two communicating applications (a client and a -server), and to authenticate at least one of the two (typically the -server) to the other. The PCT Protocol is application -protocol-independent. A "higher level" application protocol (e.g. -HTTP, FTP, TELNET, etc.) can layer on top of the PCT Protocol -transparently. - -In the PCT protocol, all data is transmitted in the form of -variable-length records, each of which has a record header. These -records are used to transmit both PCT protocol messages (including -handshake, error, and key management messages) and application data -messages. Exchanges of records between a client and server are -grouped into "connections", which are in turn grouped into "sessions". -Every PCT connection belongs to some particular session. - -Every PCT protocol connection begins with a handshake phase, during -which a sequence of handshake messages (comprising the PCT Handshake -Protocol) are exchanged, which negotiate a (symmetric) session key -for the connection, as well as performing the requested -authentications based on certified asymmetric public (signature or -key exchange) keys (or on previously shared private "password" keys). -Once transmission of application protocol data messages begins in a -connection, all data (including error and key management messages) is -encrypted using encryption keys derived from a "master key" exchanged -during some handshake phase of the connection's session, as well as -from the handshake messages that began the connection. In addition -to encryption and authentication, the PCT protocol verifies the -integrity of messages using a hash function-based message -authentication code (MAC). - -PCT assumes a reliable transport protocol (e.g. TCP) for PCT record -transmission and reception during the handshake phase (and -afterwards as well in version 1); however, use of datagram records -in version 2 makes it possible for individual records to be sent -independently (as "datagrams"), with neither order nor eventual -delivery guaranteed. - -It should be noted that the PCT protocol does not specify any details -about verification of identities or certificates with respect to -account administrators, certification authorities, revocation lists, -and so on. Rather, it is assumed that protocol implementations have -access to a "black box" which is capable of ruling on the validity of -received identities and certificates in a manner satisfactory to the -implementation's user. Such a ruling may, for instance, involve -remote consultation with a trusted service, or even with the actual -user through a text or graphic interface. - -The PCT protocol's compatibility with, and differences from, SSL -([1]) are outlined in the specification of PCT version 1 ([2]). -PCT version 2 is fully compatible with PCT version 1, in that an -implementation of version 1 is a valid (though less feature-rich) -implementation of version 2. If either the client or server (or -both) identifies itself during the handshake phase as using PCT -version 1, then the session conforms to the PCT version 1 -specification, and features introduced in version 2 are not available. -PCT version 1 compatibility details are given in section 8. - -PCT version 2 is different from PCT version 1 in the following -respects: - -- PCT version 2 has a revised record format which allows handshake - records, error records and data records, as well as "key management" - and "datagram" records (two new record types) to be explicitly - recognized and distinguished from each other based on header - information. Record headers can also indicate continuations of - previous records, allowing protocol messages of any type to span - multiple records, just as user data already does in PCT version 1. - Finally, encapsulating user data in a new "data message" format - allows the invocation (using assigned data message types) of - intermediate processing, such as compression/decompression, - -- PCT version 2 "datagram" records are independently decryptable, - allowing encrypted data to be sent securely across unreliable - transports, where neither delivery nor correct order are - guaranteed. - -- PCT version 2 "key management" records allow encryption and/or - message authentication keys to be temporarily changed within a - session, to support the transport of pre-encrypted data. - -- PCT version 2 adds a "closing connection" key management message to - ensure that connections aren't prematurely closed by someone - unauthorized to do so. - -- PCT version 2 message authentication is altered to include record - headers. - -- The handshake phase of PCT version 2 allows a wider, more symmetrical - variety of authentication options: either client or server or both - may be authenticated, each by means of either a key exchange or - signature public key and certificate. - -- PCT version 2 allows a new "private" authentication type, in which - authentication is based on a previously shared identity-associated - private key, rather than a certified public key. - - -4. PCT Record Protocol Specification - -4.1 Notation - -The following notation is used in this specification to represent -data field formats in various protocol messages: - -char MSG_EXAMPLE -char FIELD1 -char FIELD2 -char THING_LENGTH[2] -char ANOTHER_THING_LENGTH[4] -char THING_DATA[([0] << 8)|[1]] -char ANOTHER_THING_DATA[([0]<<24)|([1]<<16)|([2]<<8)|[3]] -... - -The order is presented top to bottom, with the topmost field being -transmitted first. The "FIELD1" and "FIELD2" fields are each one -byte long; the "THING_LENGTH" and "ANOTHER_THING_LENGTH" fields have -lengths of two and four bytes, respectively, as indicated by the -numbers in square brackets following the field labels. Their bytes -are indexed by their offset from the beginning of the field, starting -with THING_LENGTH[0] and ANOTHER_THING_LENGTH[0], which are the -first bytes transmitted in their respective fields. - -In the "THING_DATA" and "ANOTHER_THING_DATA" entries, the values in -square brackets indicate byte offset indices in THING_LENGTH and -ANOTHER_THING_LENGTH, respectively. As presented above, the notation -refers to combining the bytes of the LENGTH field in order to form an -unsigned integer, with the bytes arranged in decreasing order of -significance. This integer defines the number of bytes of data in -the corresponding DATA field. For example, if THING_LENGTH[0] were -one and THING_LENGTH[1] were four then the THING_DATA array would be -exactly 260 bytes long. And if the values of the four bytes of -ANOTHER_THING_LENGTH were zero, one, two and four, respectively, then -ANOTHER_THING_DATA would be exactly 66,052 bytes long. This -shorthand form is used throughout the specification; occasionally, a -"THING_DATA" field is referred to as "THING", with the word "DATA" -omitted. - -Individual bits within a data field are denoted as follows: - -LEAST_SIGNIFICANT_BIT := 0x0001 -NEXT_LEAST_SIG_BIT := 0x0002 -THIRD_LEAST_SIG_BIT := 0x0004 -... - -These bit identifiers correspond to the least, second-least and -third-least significant bits (in that order) in a two-byte data -field. The associated hexadecimal values consist of all zero bits -except for the identified bit. - -Computations involving a hash function (sometimes iterated) are -denoted as follows: - -COMPUTATION_RESULT_i = Hash( "ASCII string hash input 1"^i, -HASH_INPUT_2, HASH_INPUT_3^i, Hash( "ASCII string hash input 4", -HASH_INPUT_5, i ) ) - -The values in quotation marks are treated as (sequences of) ASCII -characters; "x"^i (or VARIABLE^i) denotes i copies of the string -"x" (or variable VARIABLE, respectively) concatenated together. The -parameters are input into the hash function in the order presented; -the variable i, wherever it appears as an input value, is input as a -single-byte unsigned integer. If any input has a length which is not -an integral number of bytes, then (fewer than eight) zero bits are -appended to its last byte to produce an input which is an integral -number of bytes. The value of COMPUTATION_RESULT is obtained by -concatenating the COMPUTATION_RESULT_i values in order, for values of -i in a specified range. (If no subscript i is present in the -specified formula, then the implied range includes only the value 1.) -If the resulting value requires truncation, then the truncation is -performed by removing bits from the end to obtain a string of the -required length. - -In the case of elements of specifically named records or messages, -the names of record or message elements have prefixes that identify -the messages in which they appear. These prefixes are sometimes -omitted in the text when the containing messages are obvious, or -when the same elements have more than one possible prefix. - - -4.2 PCT Record Format - -4.2.1 Record header format - -A PCT record consists of a four-byte header followed by a -variable-length body. The maximum length of the body is 32763 -bytes. - -The PCT record header formats differ in versions 1 and 2. The -version 2 record header will be described in this section; its -compatibility with the version 1 header (which is described fully -in [2]) is explained in section 8. - -The PCT version 2 record header has the following structure: - -char RH_RECORD_LENGTH[2] -char RH_RECORD_TYPE[2] - -RECORD_LENGTH is an unsigned integer representing the length of the -(cleartext) data following the length field in the record header -(including the RH_RECORD_TYPE field and the subsequent record body). -The first (most significant) bit of the first (most significant) -byte of this field is set to one, for backward compatibility reasons -(see section 9); this bit must be reset to zero to obtain the -correct unsigned integer value. Note that if encryption expands the -length of the data, the length of the (fully or partially encrypted) -record body plus RH_RECORD_TYPE field will not match the value in -RECORD_LENGTH; the effect of each cipher on data length is described -in section 6.1.5. - -RECORD_TYPE is a two-byte field indicating the type of contents in the -record, and in particular, how the record should be processed. PCT -version 2 defines a number of record type values for specific record -types; other record types are used to identify PCT version 1 (or -SSL version 2 or 3) connections, for appropriate processing. These -are RT_VERSION_1_CH, RT_VERSION_1_SH, RT_SSL_VERSION_2_CH, -RT_SSL_VERSION_2_SH and RT_SSL_VERSION_3, respectively. (Note that -type RT_SSL_VERSION_3 is defined only on the first, or most -significant, byte; the second, or least significant byte can have -any value.) The normal PCT version 2 record types are RT_HANDSHAKE, -RT_DATAGRAM, RT_KEY_MGMT, RT_ERROR, and RT_USER_DATA; their -associated record data formats are described in section 4.3. All -other defined record types are reserved, and must never be used. -One of them, RT_CD_RESERVED, is also explicitly defined to preclude -use in future versions. - - -4.3 PCT Record Body Formats - -4.3.1 Handshake Record Body Format - -PCT version 2 Handshake records (those with RECORD_TYPE -RT_HANDSHAKE) have a very simple body format: - -char HS_MSG_TYPE[2] -char HS_RECORD_FLAGS[2] -char HS_HANDSHAKE_DATA[RH_RECORD_LENGTH - 6] - -The possible HS_MSG_TYPE values are HS_CLIENT_HELLO, -HS_SERVER_HELLO, HS_CLIENT_MASTER_KEY, HS_SERVER_VERIFY, and -HS_CLIENT_VERIFY. HS_RECORD_FLAGS is a two-byte field containing -informational flags about the handshake record. The only two flags -defined in PCT version 2 are the last (least significant) two bits -of HS_RECORD_FLAGS: - -HS_FLAG_TO_BE_CONTD := 0x0001 -HS_FLAG_CONTINUATION := 0x0002 - -The last (least significant) bit, HS_FLAG_TO_BE_CONTD, indicates -when set that the next record received of the same type is to be -considered a continuation of the current one. The -second-least-significant bit, HS_FLAG_CONTINUATION, indicates when -set that the record is to be considered a continuation of the -previous record received of the same type. (For PCT version 1 -compatibility reasons, a CLIENT_HELLO message must not be continued -over more than one handshake record.) The remaining flag bits are -reserved, and must be set to zero. - -The HS_HANDSHAKE_DATA field contains data from a PCT handshake -message; the structure of these messages is described in section -5.2. Note that a single handshake message may stretch across more -than one handshake record; in that case the appropriate flags are set -in the record header. (A restriction on how a handshake message is -fragmented among records is given in section 5.2.) - -4.3.2 Datagram Records - -A datagram record is an independently decryptable data record; its -enclosed data message can be decrypted, and its MAC checked, -regardless of whether previous records were delivered in order (or -at all). Datagrams can hence be used if the underlying transport -does not guarantee in-order delivery of records; for example, it -makes possible the transmission of "out-of-band" data for rapid -delivery in a TCP connection. - -The format of PCT version 2 datagram records is as follows: - -char DG_ENCRYPTED_KEY_LENGTH[2] -char DG_ENCRYPTED_KEY_DATA[([0] << 8)|[1]] -char DG_ENCRYPTED_DATA[ENCRYPTED_LENGTH] -char DG_MAC_DATA[MAC_LENGTH] - -The DG_ENCRYPTED_KEY_DATA field contains the key information necessary -to perform decryption and MAC verification of the datagram record; its -contents are described in section 6.1.3. The DG_ENCRYPTED_DATA field -contains an encryption of ACTUAL_DATA (consisting of the ACTUAL_LENGTH -bytes of the datagram's enclosed data message). The DG_MAC_DATA field -contains the "Message Authentication Code" (MAC); its contents are -described in section 7.3. Note that ACTUAL_LENGTH can be calculated -directly as RECORD_LENGTH - ENCRYPTED_KEY_LENGTH - MAC_LENGTH - 4. The -length of the encrypted datagram record body plus RH_RECORD_TYPE field -may be greater than RECORD_LENGTH, as a result of expansion during -encryption; see section 6.1.5. - - -4.3.3 Other Record Types - -The bodies of PCT version 2 key management, error and user data -records (those with RECORD_TYPE RT_KEY_MGMT, RT_ERROR and -RT_USER_DATA, respectively) contain encrypted data, in the following -data format: - -char DT_ENCRYPTED_DATA[ENCRYPTED_LENGTH] -char DT_MAC_DATA[MAC_LENGTH] - -The ENCRYPTED_DATA field contains an encryption of ACTUAL_DATA -(consisting of the ACTUAL_LENGTH bytes of the enclosed data message). -The MAC_DATA field contains the "Message Authentication Code" (MAC); -its contents are described in section 7.3. ACTUAL_LENGTH can be -calculated directly as RECORD_LENGTH - MAC_LENGTH - 2. - - -4.4 Key Management Messages - -Key management messages have the following format: - -char KM_KEY_MGMT_TYPE[2] -char KM_NEW_HASH_TYPE[2] -char KM_NEW_CIPHER_TYPE[4] -char KM_WRITE_KEY_LENGTH[2] -char KM_WRITE_KEY_DATA[([0] << 8)|[1]] - -There are four possible values of KM_KEY_MGMT_TYPE: -KM_TYPE_FIXED_KEY (setting up the transmission of pre-encrypted data), -KM_TYPE_RESUME_KEY (used to end transmission of pre-encrypted data), -KM_TYPE_REDO_HANDSHAKE (triggering a new run of the handshake -protocol), and KM_TYPE_CLOSE_CONN (preceding the closure of a -connection). - -4.4.1 Preencrypted data - -A KM_KEY_MGMT_TYPE value of KM_TYPE_FIXED_KEY indicates that the key -management message contains a fixed encryption key with which -subsequent data records will be encrypted until further notice. -Using this type of key management message, a client or server can -send data that has been pre-encrypted and stored in encrypted form. -Note that pre-encrypted data can be pre-MAC'd as well. (See section -7.3.) Note also that a key management message of this type must not -be sent unless both client and server have indicated support for the -pre-encrypted data feature during the handshake phase associated with -this connection; see sections 5.2.1 and 5.2.2. - -In a message of type KM_TYPE_FIXED_KEY, KM_NEW_CIPHER_TYPE contains a -cipher type code, and KM_NEW_HASH_TYPE contains a hash function type -code (see sections 6.2 and 6.3, respectively). These types must be -supported by the receiver of this message, as indicated in during the -handshake phase for this connection. (See sections 5.2.1 and 5.2.2.) -The fixed encryption key (WRITE_KEY) is sent in the field -KM_WRITE_KEY_DATA. - -Note that the encryption and MAC calculation used for the key -management message itself, and for subsequent non-data records, are -not altered. However, subsequent data records in the same direction -are encrypted using the WRITE_KEY sent in the KM_WRITE_KEY_DATA -field, until a key management message of type KM_TYPE_FIXED_KEY or -KM_TYPE_RESUME_KEY is sent and received, or until the connection -closes. (Note that pre-encrypted data is not "nested"; a -KM_TYPE_FIXED_KEY message is treated as a KM_TYPE_RESUME_KEY message -immediately followed by a KM_TYPE_FIXED_KEY message.) - -4.4.2 Restoring original key - -A key management message of type KM_TYPE_RESUME_KEY restores the value -of the encryption key used for data records transmitted in the same -direction to the value originally negotiated during the handshake -phase of the current connection. This key is used until the -connection closes, or until a key management message of type -KM_TYPE_FIXED_KEY or KM_TYPE_REDO_HANDSHAKE is received. - -In this message, the KM_CIPHER_TYPE and KM_HASH_TYPE messages are set -to their original values negotiated during the handshake phase for -the current connection. (See section 5.2.2.) The remaining data -fields are empty, and their length is zero. - - -4.4.3 Closing connection - -If both client and server indicated support for the "closing -connection" feature during the handshake phase of the current -connection (see sections 5.2.1 and 5.2.2), then the connection is -"closure-monitored", and closure of a connection is handled in a -special way. Whenever a client or server is about to close a -closure-monitored connection without an error, at any point following -the completion of the handshake phase of the protocol, an exchange of -key management messages of type KM_TYPE_CLOSE_CONN is initiated -first. In both messages, the KM_NEW_CIPHER_TYPE and KM_NEW_HASH_TYPE -fields contain the current cipher and hash types, respectively, and -the remaining data fields are empty, with length zero. The sender of -one of these messages simply waits for a message of the same type to -be received in reply, then closes the connection; a receiver of such -a message who has not yet sent one replies with a message of the same -type, then closes the connection. A closure-monitored connection -closed without an error before receipt of a message of this type -results in a CONN_BROKEN error (see section 4.6). - - -4.4.4 Redo handshake - -If both client and server indicated support for the "redo handshake" -feature during the handshake phase of the current connection (see -sections 5.2.1 and 5.2.2), then the connection is "redo-enabled", and -either the client or the server may request, at any time after the -handshake phase has been completed for a connection, that another -handshake phase be performed for that connection. For example, -either party may request another handshake phase instead of closing -the connection in order to avoid allowing a sequence number to "wrap" -beyond 0xFFFFFFFF (see section 7.3). In addition, it is recommended -that implementations enforce limits on the duration of both -connections and sessions, with respect to the total number of bytes -sent, the number of records sent, the actual time elapsed since the -beginning of the connection or session, and, in the case of sessions, -the number of reconnections made. These limits serve to ensure that -keys are not used more or longer than it is safe to do so; hence the -limits may depend on the type and strength of cipher, key exchange and -authentication used, and may, at the implementer's discretion, include -indications from the application as to the sensitivity of the data -being transmitted or received. They may be enforced using closure of -the connection or (in a redo-enabled connection) "redo handshake" key -management messages. - -To request a new handshake phase for the current connection, the -sender (client or server) sends a key management message of type -KM_TYPE_REDO_HANDSHAKE. The KM_NEW_CIPHER_TYPE and KM_NEW_HASH_TYPE -fields contain the current cipher and hash types, respectively, and -the remaining data fields are empty, with length zero. - -There are several cases to consider to ensure that messages are -dealt with in the correct order. The following rules ensure that the -first messages in the redone handshake are always immediately preceded -by a "redo handshake" key management message. - -If the client initiates the "redo handshake", it sends the "redo -handshake" message immediately followed by a normal CLIENT_HELLO -handshake message; the server, on receiving the "redo handshake" -message, may be in one of two states. If the last message it sent -was a "redo handshake" message, then it simply waits for the -CLIENT_HELLO message; otherwise, it sends a "redo handshake" message -in response, and then waits for the CLIENT_HELLO message. - -If the server initiates the "redo handshake", then the server sends -the "redo handshake" message and simply waits for a "Redo Handshake" -message in response; this "redo handshake" message should be -immediately followed by a normal CLIENT_HELLO handshake message. The -client, on receiving the server's "redo handshake" message, may be in -one of two states. If the last two messages it sent were a "redo -handshake" message followed by a CLIENT_HELLO message, then it simply -waits for a SERVER_HELLO handshake message; otherwise, it sends a -"redo handshake" message in response, followed by a CLIENT_HELLO -message, and then waits for a SERVER_HELLO message. - -In all cases, the sender of the "redo handshake" message continues to -process incoming messages, but may not send any non-handshake messages -until the new handshake completes. If the connection is -closure-monitored (see section 4.4.3), then the sending of an -unprovoked "closing connection" key management message between the -sending of a "redo handshake" message and the completion of the -subsequent handshake is not permitted. However, in such connections -the sender of a "redo handshake" message must be prepared to receive a -"closing connection" message instead of a "redo handshake" message; in -this case the sender responds with a "closing connection" message and -closes the connection. - -The handshake phase that follows a "redo handshake" message exchange -is a normal one in most respects; the client may request the -reconnection of an old session or request that a new session be -initiated, and the server, on receiving a reconnection request, can -accept the reconnection or demand that a new session be initiated -instead. If a new session is being established, then both client and -server must request the same type of authentication requested in the -previous session; if one or the other was not authenticated in the -previous session, then requesting authentication from the -non-authenticated party in the new handshake phase is permitted. Both -parties must verify that the specifications negotiated previously in -the session (cipher type, key exchange type, certificate type and -certifier, hash function type, signature types, and so on), as well as -any certificates exchanged, are identical to those found in the new -handshake phase (with the exception of new types and certificates for -an authentication performed in this handshake, but not in the previous -one). A mismatch results in a SPECS_MISMATCH or BAD_CERTIFICATE -error (see section 4.6.) This ensures that the security properties -of the communication channel do not change for the worse. - - -4.5 Data messages - -Data messages contain user data to be delivered back to the -application using PCT. Each data record or datagram record contains -exactly one data message (corresponding to the ACTUAL_DATA field -in the description of these records), and data messages are never -continued across multiple messages. - -PCT version 2 Data messages have the following format: - -char DM_MESSAGE_TYPE[2] -char DM_MESSAGE_DATA[MESSAGE_LENGTH] - -The only defined MESSAGE_TYPE in PCT version 2 is DM_TYPE_USER_DATA; -the data in messages of this type is presented directly to the -application. However, implementations of PCT can assign types to -other values to indicate types of preprocessing, such as particular -compression/decompression algorithms, to be performed before passing -the data in MESSAGE_DATA to the application. Such implementations -should allow messages to be nested in the obvious way, with each -preprocessing step yielding another data message of the correct -format, and the last step yielding a data message of type -DM_TYPE_USER_DATA. The permissible message types for a particular -connection are negotiated during the handshake phase; see sections -5.2.1 and 5.2.2. An unrecognized message type results in an -ILLEGAL_MESSAGE error (see section 4.6). - -For message type DM_TYPE_USER_DATA, the DM_MESSAGE_DATA field -contains user data to be passed to the application. For other -message types, DM_MESSAGE_DATA contains data which, after the -preprocessing determined by the message type, yields another data -message. MESSAGE_LENGTH (for the data message directly contained in -the data or datagram record) is calculated as ACTUAL_LENGTH - 2, or -RECORD_LENGTH - ENCRYPTED_KEY_LENGTH - MAC_LENGTH - 6 if the message -is contained in a datagram record and RECORD_LENGTH - MAC_LENGTH - 4 -if it is contained in a data record. - -4.6 Error messages - -Error handling in the PCT protocol is very simple. When an error is -detected before a connection is closed, the detecting party sends a -message to the other party indicating the error so that both parties -will know about it, and then closes the connection. In the case of -closure-monitored connections (see section 4.4.3), the error message -replaces the "closing connection" key management message. Receiving -an error message also causes the receiving party to close the -connection. (No "closing connection" message is ever sent in reply to -an error message before closure.) - -Servers and clients should not make any further use of any keys, -challenges, connection identifiers, or session identifiers associated -with a connection aborted due to an error. It is recommended that -implementations perform some kind of alert or logging function when -errors are generated to facilitate monitoring of various types of -attack on the system. - -Error messages have the following format: - -char ER_ERROR_TYPE[2] -char ER_ERROR_INFO_LENGTH[2] -char ER_ERROR_INFO_DATA[([0] << 8)|[1]] - -The ERROR_INFO_LENGTH field is zero except in the case of the -SPECS_MISMATCH error message, which has a two-byte ERROR_INFO_DATA -field. Note that when an error message is sent before the end of -the handshake phase of the protocol, the record containing it is left -unencrypted, and its MAC is omitted. - -The following errors are defined in PCT version 2: - -PCT_ERR_BAD_CERTIFICATE - -This error occurs when the client or server receives a handshake -message in which a key-exchange public key certificate is invalid, -either because one or more of the signatures in the certificate is -invalid, or because the identity or attributes on the certificate -are in some way incorrect. - -PCT_ERR_CLIENT_AUTH_FAILED - -This error occurs when the server receives a CLIENT_MASTER_KEY or -CLENT_VERIFY message from the client in which the client's -authentication response is incorrect. The certificate may be -invalid, the signature may be invalid, or the contents of the signed -response may be incorrect. - -PCT_ERR_CONN_BROKEN - -This error occurs when a closure-monitored connection (see section -4.4.3) is closed without an error message or a "closing connection" -key management message having been received. Since this error only -occurs after a connection has been closed, no error message is sent. - -PCT_ERR_ILLEGAL_MESSAGE - -This error occurs under a number of circumstances. For example, it -occurs when an unrecognized handshake message is encountered, or when -the value of CH_OFFSET is to large for its CLIENT_HELLO message. - -PCT_ERR_INTEGRITY_CHECK_FAILED - -This error occurs when either the client or the server receives a -record in which the MAC_DATA is incorrect. It is also recommended -that such a record be treated as if had not been received, in order -to ensure that applications do not receive and process invalid data -before learning that it has failed its integrity check. - -PCT_ERR_SERVER_AUTH_FAILED - -This error occurs when the client receives a SERVER_HELLO or -SERVER_VERIFY message in which the authentication response is -incorrect. - -PCT_ERR_SPECS_MISMATCH - -This error occurs when a server cannot find a cipher, hash function, -certificate type, or key exchange algorithm it supports in the lists -supplied by the client in the CLIENT_HELLO message. This error may -also occur as a result of a mismatch in cipher specifications or -client authentication requests between the initial specifications and -those that resulted from a redo handshake sequence. - -The error message for this error includes a two-byte informational -field, with eight flags defined as follows: - -SPECS_MISMATCH_CIPHER = 0x0001 -SPECS_MISMATCH_HASH = 0x0002 -SPECS_MISMATCH_EXCH = 0x0004 -SPECS_MISMATCH_SIG = 0x0008 -SPECS_MISMATCH_CERT = 0x0010 -SPECS_MISMATCH_CERTIFIER = 0x0020 -SPECS_MISMATCH_COMBINATION = 0x0040 - -Each flag is set if and only if the corresponding list resulted in -a mismatch. For example, if and only if the SPECS_MISMATCH error -message is being sent because server failed to find a certificate -type it supports in the list supplied by the client in the -CH_CERT_LIST_DATA field, then the SPECS_MISMATCH_CERT flag in -the error message would be non-zero. The SPECS_MISMATCH_COMBINATION -flag indicates that while there were matches found in each -individual category, all available certificates were incompatible -with all the type entries in at least one of the relevant lists -(CH_CERT_LIST_DATA, CH_CERTIFIER_LIST_DATA, CH_EXCH_LIST_DATA and -CH_SIG_LIST_DATA). - - -5. PCT Handshake Phase - -5.1 PCT handshake protocol overview - -5.1.1 PCT handshake protocol introduction - -The PCT Handshake Protocol (version 2) is performed during the -handshake phase at the start of every connection, and is used to -negotiate security enhancements (authentication, symmetric -encryption, and message integrity) to data sent during the rest of -the connection. - -The version 2 PCT Handshake Protocol consists of five messages, sent -respectively by the client, then server, then client, then server, -then client, in that order. (Moreover, under certain circumstances, -some or all of the last three messages are omitted.) The messages -are named, in order, CLIENT_HELLO, SERVER_HELLO, CLIENT_MASTER_KEY, -SERVER_VERIFY, and CLIENT_VERIFY. - -The general contents of these messages depend upon two criteria: -how/if a "master key" for the session is to be exchanged, and how/if -each of the client and server are to be authenticated. At least one -of the two must be authenticated by some means; authentication of -either--or both--may be based on either a key exchange, a digital -signature, or (for one of the two) a previously shared "password" -key, or, in the case of a connection in the same session as a -previous one, on a "master key" shared previously in the session. - -The first criterion is determined by the client and server together: -first, the CLIENT_HELLO message may contain a request to "reconnect" -using a previously shared master key from a particular session (in -which case no new key exchange is necessary). The SERVER_HELLO -message will either confirm a requested continuation of the session -through the new connection, or require that a new session be -initiated, with a new key exchange. PCT version 2 supports -RSA {TM} -based key exchange (see [14], [3]), Diffie-Hellman key -exchange (see [4], [15]) and FORTEZZA KEA token key exchange. The -chosen key exchange is used by client and server in the case of a new -session to obtain a new shared master key. This master key is used to -derive keys for encryption and message integrity (or "message -authentication") for the connection and for other connections -associated with the same session. Note that key exchanges have an -implicit associated direction, with a master key being, in effect, -sent from one party to the other (literally in the case of RSA key -exchange, and more metaphorically in the case of -Diffie-Hellman/FORTEZZA KEA key exchange). Hence a direction must -also be chosen for the exchange. In fact, the parties may agree to -perform two key exchanges, one in each direction; in that case, the -master key for the session is computed using both of the sent keys. -In this document, the term "encrypted master key" refers either to an -RSA-encrypted master key, or to the second (typically uncertified) -Diffie-Hellman/FORTEZZA KEA public value sent in a Diffie-Hellman or -FORTEZZA KEA key exchange. The key exchange is said to be directed -towards the receiver of this encrypted master key. - -The second criterion is determined in a similar fashion: if the -connection is the first of a new session, then the client may request -authentication of the server by key exchange, or by digital signature, -or by private password, or by any one of a specified subset of these -options. The client also offers the server a choice among the client -authentication options (from among these choices) available. The -server, in turn, selects a preferred authentication method if a choice -is offered, and may make a similar request from among the client -authentication options offered. All these authentications are "linked" -to the key exchange performed during the handshake, so that not only -the identity of the authenticated party, but also that party's -association to the handshake's key exchange as performed, is verified. - -If no key exchange is performed, then both client and server are -authenticated using the shared master key for the reconnected session, -rather than any of the methods described above. - -In addition to key exchange and authentication, the handshake protocol -performs two other tasks: negotiation of cryptographic parameters, -and handshake verification. The first is accomplished by the -CLIENT_HELLO and SERVER_HELLO messages. The CLIENT_HELLO includes a -list of codes for acceptable types of symmetric cipher and -cryptographic hash function for use during the session, as well as -key exchange and signature algorithms, certificate types and -certifiers, and authentication methods acceptable for use during the -handshake protocol. The server responds in the SERVER_HELLO message -with its choices from among these lists of acceptable types. The -second task is performed during the first authentication; it is based -on a cryptographic hash of all the handshake message data passed up to -that point. Verification of this authenticated hash value by its -receiver assures that the handshake was not tampered with in transit. - - -5.1.2 PCT handshake authentication - -The four types of authentication permissible in PCT version 2 are -key-exchange, digital signature, private password, and reconnection. -Each follows a particular protocol flow, which is essentially -independent of which party is being authenticated (except regarding -the assignment of roles to the client and server). In each case, -client and server both issue random challenges (in the CLIENT_HELLO -and SERVER_HELLO messages, respectively); these challenges, and -all information exchanged up to and including the completion of -the key exchange(s), are incorporated into an authentication -response by the party being authenticated (the "responder", as -opposed to the "challenger", to whom the response is sent). Hence -the authentication response cannot be sent until the sending of both -challenges, as well as the key exchange(s), have been completed -(although it may appear in the last message which contributes to one -of these). - -In key-exchange-based authentication, the responder sends a certified -public key, which the authenticating party (the "challenger") uses to -send a master key. In the case of Diffie-Hellman/FORTEZZA KEA key -exchange, the challenger's value is normally randomly chosen, whereas -the responder's is fixed and certified; the master key computed by -the challenger can also be derived using the responder's private key -and the challenger's sent value. In the case of RSA key exchange, the -master key is randomly chosen at the time of the key exchange by the -challenger and encrypted using the responder's certified public key. -The responder then combines the received master key (which may first -be combined with another sent master key, in the case of two-way key -exchange) with all handshake message data sent so far, including both -challenges and all of the key exchange data, to compute a response. -This response is in the form of a keyed hash, which is verified by the -challenger to confirm that the responder could derive the master key -correctly, and therefore holds the correct private key. (A keyed hash -is simply the application of a cryptographic hash function to a key -and some other input data; the assumed properties of the hash function -make the function result for any other data input infeasible to -compute for anyone not possessing the key.) - -A key-exchange-based authentication therefore has the following -message flow: - -Challenger Responder ----------- --------- - -Challenger's Responder's -Challenge Challenge - - [Certified public - key-exchange key] - -Random encrypted -master key/public -Diffie-Hellman value - - Keyed hash response - - -The challenges always appear in the CLIENT_HELLO and SERVER_HELLO -messages. The certified key may not need to be sent, if the -responder already possesses it (perhaps from a previous session). - -In signature-based authentication, the responder simply sends a -certified digital signature public key, accompanied by a digital -signature, using the associated private key, of a cryptographic hash -of all handshake messages up to the one being sent. (Note that this -value is therefore derived from the completed key exchange, as well -as both challenges). The challenger verifies the signature using -the responder's certified public key. A signature-based -authentication has the following message flow: - -Challenger Responder ----------- --------- - -Challenger's Responder's -Challenge Challenge - - Key Exchange(s) - - Certified public - signature key, - signature response - -Again, the challenge messages always appear in the CLIENT_HELLO and -SERVER_HELLO messages. The public key certificate may not be -necessary, but is sent regardless, since it can accompany the -digital signature in the same message, and therefore has no cost in -extra messages. A certificate-identifying code may be used in its -place if understood by both parties; see section 6.4. - -Password-based authentication is similar to signature-based -authentication; the exchanged master key is combined with the -shared password and all the handshake message data sent so far, -including the identity of the responder, the exchanged master key -and both challenges, to produce a keyed hash response which is sent -by the responder and verified by the challenger. - -A special case of this authentication is a doubly-certified -Diffie-Hellman key exchange, in which one party is authenticated by -certified Diffie-Hellman key-exchange public key, and the challenger's -sent value is not random but rather another certified Diffie-Hellman -public key. In this case, the challenger's identity is represented -by the certificate for the public value sent, and the exchanged -master key received by the responder is also treated simultaneously -as the challenger's password. (If both parties are to be -authenticated by certified Diffie-Hellman key exchange, then each -sends a randomly chosen public value to the other, and the final -master key is obtained by combining the two keys exchanged.) - -It is recommended that shared private keys used for password-based -authentication be machine-generated and cryptographically random in -the same sense as the master key (see section 6.1.3). However, -because the distribution of password-style shared private keys is -outside the scope of this protocol, and is therefore vulnerable to -possible insecure implementations, the following constraints on -password-based authentication are imposed: - -1. Only one of the client and server, not both, may be -authenticated using password-based authentication. - -2. Password-based authentication may only be used if the other party -is also authenticated, using either key exchange- or signature-based -authentication. - -3. If the other party is authenticated using signature-based -authentication, then the password-based authentication response must -be sent only after the other party's authentication response has been -sent and verified. - -These constraints protect poorly chosen password-style shared private -keys from off-line brute force attacks. However, even a well-chosen -shared private key is vulnerable if not kept strictly confidential -by both parties sharing it. Implementations must therefore ensure -this confidentiality. Poorly-chosen or poorly-guarded passwords are -of course still vulnerable to other attacks. - -A password-based authentication has the following message flow: - -Challenger Responder ----------- --------- - -Challenger's Responder's -Challenge Challenge - - Key Exchange(s) - - responder's identity/ - certified D-H public - value, keyed hash response - - -Finally, in the case of authentication based on a master key exchanged -earlier in the session, the response is computed from both challenges, -the shared master key, and the session identifier. (The client's -response is in fact implicit; by computing a correct MAC for its first -data message, the client demonstrates its possession of the session's -master key.) This authentication has the following flow: - -Challenger Responder ----------- --------- - -Challenger's Responder's -Challenge Challenge - - keyed hash response - - -5.1.3 Handshake key exchange - -In the full handshake protocol, authentications are interleaved with -at least one key exchange (and with each other, if both client and -server are being authenticated). The interleaving is designed to -compress the authentications and key exchange(s) into as few -messages as possible. For example, a client has the option of -sending an encrypted public key and/or (possibly certified) -key-exchange public key in the CLIENT_HELLO message, along with its -challenge. The latter allows the client to "receive" a -client-directed key exchange, while the former initiates a -server-directed key exchange. However, the client may not have the -server's key-exchange public key, and may not anticipate a request for -a client-directed key exchange; hence, sending of the encrypted master -key and/or client key-exchange certificate may be postponed to the -CLIENT_MASTER_KEY message. - -In general, each possible key exchange has a "regular" and "quick" -flow. A client-directed key exchange may occur beginning in the -CLIENT_MASTER_KEY message, when the client sends a (possibly -certified) key-exchange public key, then continues in the -SERVER_VERIFY message with the server sending an encrypted master -key. In the quick version, the client may (or may not) send the -(certified) public key in the CLIENT_HELLO message, and the server, -upon receiving it (or having received it at some time in the past) -sends an encrypted master key in the SERVER_HELLO message. Similarly, -normal server-directed key exchange begins in the SERVER_HELLO message -with a (possibly certified) key-exchange public key, and continues -with an encrypted master key in the following CLIENT_MASTER_KEY -message. In the quick version, the client, having received the -server's public key previously, sends an encrypted master key -immediately, in the CLIENT_HELLO message. - -5.1.4 PCT Handshake Protocol flow - -The contents of PCT version 2 handshake protocol can be summarized as -follows: - -The CLIENT_HELLO message contains a random authentication challenge -to the server and a request for the type and level of cryptography, -certification, authentication and (if necessary) digital signature -to be used for the session, if it is to be a new one. If the client -is attempting to continue an old session, then it also supplies that -session's identifier. The client can also send a "quick -certificate", in anticipation of a client authentication request from -the server, and even a "quick master key", if the client already has -a satisfactory server's key-exchange public key. - -If the server accepts the old session identifier, then the -SERVER_HELLO message contains a response to the client's challenge, -and a random connection identifier which doubles as a random challenge -to the client. The handshake is then finished (although an -authentication of the client is implicit in the MAC included with the -client's first data message). - -In the case of a new session, the SERVER_HELLO message contains a -random connection identifier; this identifier doubles as an -authentication challenge to the client if the server desires client -authentication. The server also responds with its choices for type -and level of cryptography, certification, authentication and (if -necessary) digital signature (from among those offered by the -client). In addition, the server sends a certificate for the type of -authentication requested by the client (if any), and sends a "quick -master key" and/or "quick response" in response to the client's -"quick certificate" and/or "quick master key", respectively, if -appropriate. In the latter case, the response may require an -accompanying digital signature public-key certificate or "identity -indicator" (directing the client to the correct shared password), -and the handshake protocol completes at this point if no client -authentication is required. - -The CLIENT_MASTER_KEY message sent by the client (assuming that it -is necessary) includes a (possibly certified) key-exchange public key, -if requested by the server. It also contains an encrypted master key, -if the server sent a key-exchange public key, and an authentication -response (accompanied by an identity indicator or digital signature -public key certificate, if appropriate) if client authentication by -signature or password was requested, and the key exchange has been -completed. If the server's authentication response has also been -received (or was not required), then the handshake protocol completes -at this point. - -The SERVER_VERIFY message sent next by the server, if necessary, -contains an encrypted master key sent to the client, if requested, -and/or an authentication response (possibly accompanied by a digital -signature public key certificate or identity indicator) to the -encrypted master key sent in the previous message. Unless the former -requires an authentication response, the protocol completes at this -point. - -Finally, the CLIENT_VERIFY message, if needed, contains the client's -authentication response to the key exchange completed by the -encrypted master key sent in the SERVER_VERIFY message. - -Usually the client or server can safely begin sending data records -on the underlying transport immediately following its own last -handshake message, without waiting for a response even if one is -expected. In most instances, therefore, PCT adds only a single -round-trip to the connection's setup cost. Sometimes the cost is -even less; for instance, a server can begin sending data immediately -after sending the SERVER_HELLO message if the client initiated a -quick server-directed key exchange and only server authentication -is required, or if a successful reconnection of an established -session has occurred (note that in this case the client cannot send -data until receiving the SERVER_HELLO message containing the server's -challenge). - - -5.2 PCT Handshake messages - -PCT version 2 Handshake messages are sent in handshake records, whose -format is described in section 4.3.1. These records are sent in the -clear (unencrypted), although some of the key-exchange-related fields -involve (public-key) encryption. A single handshake message may span -across more than one handshake record; however, only data fields -associated with four-byte length fields may do so. These fields are -always the last ones in a message; the remaining ones (including all -length fields) must be contained within the first handshake record -used for the handshake message. (Note that for PCT version 1 -compatibility reasions, the CLIENT_HELLO message has no such fields.) - -5.2.1 CLIENT_HELLO - -char CH_SESSION_ID_DATA[30] -char CH_CHALLENGE_DATA[30] -char CH_CLIENT_VERSION[2] -char CH_OFFSET[2] -char CH_CIPHER_LIST_LENGTH[2] -char CH_HASH_LIST_LENGTH[2] -char CH_CERT_LIST_LENGTH[2] -char CH_EXCH_LIST_LENGTH[2] -char CH_KEY_ARG_LENGTH[2] -char CH_MSG_LIST_LENGTH[2] -char CH_SIG_LIST_LENGTH[2] -char CH_CERTIFIER_LIST_LENGTH[2] -char CH_QUICK_PUBLIC_VALUE_LENGTH[2] -char CH_QUICK_SERVER_PUBLIC_VALUE_LENGTH[2] -char CH_QUICK_ENCRYPTED_KEY_LENGTH[2] -char CH_AUTH_OPTIONS[2] -char CH_CIPHER_LIST_DATA[([0] << 8)|[1]] -char CH_HASH_LIST_DATA[([0] << 8)|[1]] -char CH_CERT_LIST_DATA[([0] << 8)|[1]] -char CH_EXCH_LIST_DATA[([0] << 8)|[1]] -char CH_KEY_ARG_DATA[([0] << 8)|[1]] -char CH_MSG_LIST_DATA[([0] << 8)|[1]] -char CH_SIG_LIST_DATA[([0] << 8)|[1]] -char CH_CERTIFIER_LIST_DATA[([0] << 8)|[1]] -char CH_QUICK_PUBLIC_VALUE_DATA[([1] << 8)|[1]] -char CH_QUICK_SERVER_PUBLIC_VALUE_DATA[([0] << 8)|[1]] -char CH_QUICK_ENCRYPTED_KEY_DATA[([0] << 8)|[1]] - -When a client first connects to a server it is required to send the -CLIENT_HELLO message. The server is expecting this message from the -client as its first message. It is an ILLEGAL_MESSAGE error for a -client to send anything else as its first message. The CLIENT_HELLO -message begins with two fixed-length fields followed by a two-byte -version number and an offset to the variable length data. The -version number field CH_CLIENT_VERSION is always set to -PCT_VERSION_V2 in PCT version 2. The CH_OFFSET field contains the -number of bytes used by the various fields (length fields plus the -AUTH_OPTIONS field) that follow the offset field and precede the -variable-length fields. For PCT version 2, this offset value is -always PCT_CH_OFFSET_V2, i.e., 24. However, inclusion of this field -will allow future versions to be compatible with version 2, even if -the number of these fields changes, just as inclusion of this field -helps make PCT version 2 CLIENT_HELLO messages understandable to PCT -version 1 servers. - -The CH_CHALLENGE_DATA field is a string of 30 bytes of random bits, to -be used as authentication challenge data from the client. The -CHALLENGE_DATA should be cryptographically random, in the same sense -as the MASTER_KEY (see section 6.1.3). If the client finds a -session identifier in its cache for the server, then that -session-identifier data is sent in the field CH_SESSION_ID_DATA. -Otherwise, the special PCT_SESSION_ID_NONE value is used. In either -case, the client specifies in CIPHER_LIST_DATA, HASH_LIST_DATA, -EXCH_LIST_DATA and SIG_LIST_DATA its preferred choices of symmetric -cipher, key lengths, hash function, asymmetric key exchange algorithm -and digital signature algorithm. However, if a session identifier is -sent, then these choices are only relevant in the case where the -server cannot recognize the session identifier, and a new session -must therefore be initiated. If the server recognizes the session, -then these fields are ignored by the server. Similarly, if the -client requires server authentication in the event of a new session -initiation, then the CERT_LIST_DATA and CERTIFIER_LIST_DATA lists -contain the client's preferred choices of certificate type and -certifier; otherwise, these lists are empty, and their length is -zero. Finally, the MSG_LIST_DATA list contains a list of data -message types (other than the DM_TYPE_USER_DATA) supported by the -client; if the client supplies a session identifier and the server -recognizes it, then this list is ignored, and the list negotiated -previously in the session is used instead. - -The AUTH_OPTIONS field contains the values of twelve flags that -determine the flow of the remainder of the protocol if a new session -is being initiated. The flags are associated with the twelve -low-order bits of the AUTH_OPTIONS field, and are named, in order -(from least to most significant bit), as follows: - -CH_DEMAND_KEY_EXCH_SEND := 0x0001 -CH_DEMAND_AUTH_KEY_EXCH := 0x0002 -CH_DEMAND_AUTH_SIG := 0x0004 -CH_DEMAND_AUTH_PASSWORD := 0x0008 -CH_OFFER_KEY_EXCH_RECEIVE := 0x0010 -CH_OFFER_AUTH_KEY_EXCH := 0x0020 -CH_OFFER_AUTH_SIG := 0x0040 -CH_OFFER_AUTH_PASSWORD := 0x0080 -CH_REQUEST_RECONNECT := 0x0100 -CH_REQUEST_CLOSURE_MON := 0x0200 -CH_REQUEST_REDO_ENABLE := 0x0400 -CH_OFFER_CERTIFIER_TRYOUT := 0x0800 - -If the CH_DEMAND_KEY_EXCH_SEND flag is set to one, then the client -requires that the server accept an encrypted master key from the -client as part of the key exchange. If the CH_OFFER_KEY_EXCH_RECEIVE -flag is set to one, then the client is willing to receive an encrypted -master key from the server as part of the key exchange. If both flags -are set, then both conditions hold; the client requires that the -server receive a key exchange, and will also accept one, at the -server's option. In the case of uncertified Diffie-Hellman/FORTEZZA -KEA key exchange, the flags simply refer to the "receiver" sending the -public value first, followed by the "sender"; in other cases, the -holder of the private key associated with the RSA public key or -certified Diffie-Hellman/FORTEZZA KEA public value is always the -"receiver". (Doubly certified Diffie-Hellman/FORTEZZA KEA key -exchange is discussed in section 5.1.2.) Note that both client and -server are assumed willing to be the (possibly sole) sender of an -encrypted master key; hence, even if the CH_DEMAND_KEY_EXCH_SEND flag -is set to zero, and the CH_OFFER_KEY_EXCH_RECEIVE flag is set to one, -the client has neither ruled out being the sender, nor demanded to be -the receiver, of an encrypted master key. - -The six AUTH flags refer to types of authentication: the client -requires the server to authenticate by one of the means for which the -associated CH_DEMAND_AUTH flag is set to one, and offers to -authenticate itself, at the server's option, by any of the means for -which the associated CH_OFFER_AUTH flag is set to one. (The -abbreviations "KEY_EXCH", "SIG" and "PASSWORD" stand for -key-exchange-based, digital signature-based and shared password-based -authentication, respectively.) The settings of the flags must be -consistent with at least one key exchange and one authentication -occurring; i.e., at least one of the six authentication flags and at -least one of the two key exchange flags must be set to one. Moreover, -the constraints on password-based authentication must be obeyed. (See -sections 5.1.2 and 7.2.) - -The CH_REQUEST_RECONNECT flag indicates, when set to one, that the -client is requesting that the current connection be part of an -existing session; in this case, the CH_SESSION_ID field must contain -that session's identifier. The CH_REQUEST_CLOSURE_MON flag -indicates, when set to one, that the client wishes the current session -to be closure-monitored (see section 4.4.3). The -CH_REQUEST_REDO_ENABLE flag indicates, when set to one, that the -client wishes the current session to be redo-enabled (see section -4.4.4). Finally, the CH_OFFER_CERTIFIER_TRYOUT flag indicates, when -set to one, that the list of acceptable certifiers in -CH_CERTIFIER_LIST is not exhaustive (see below). - -The CIPHER_LIST_DATA field contains a list of possible symmetric -ciphers supported by the client, in order of (the client's) -preference. Each element in the list is a four-byte field, of which -the first two bytes contain a code representing a cipher type, the -third byte contains the encryption key length in bits (0-255), and the -fourth byte contains the MAC key length in bits, minus 64 (values -0-255, representing lengths 64-319; this encoding enforces the -requirement that the MAC key length be at least 64 bits). The entire -list's length in bytes (four times the number of elements) is placed -in CIPHER_LIST_LENGTH. - -The HASH_LIST_DATA field contains a list of possible hash functions -supported by the client, in order of (the client's) preference. The -server will choose one of these to be used for computing MACs and -deriving keys. Each element in the list is a two-byte field -containing a code representing a hash function choice. The entire -length of the list (twice the number of elements) is placed in -HASH_LIST_LENGTH. - -The CERT_LIST_DATA field contains a list of possible certificate -formats supported by the client, in order of (the client's) -preference. Each element in the list is a two-byte field containing a -code representing a certificate format. The entire length of the list -(twice the number of elements) is placed in CERT_LIST_LENGTH. - -The EXCH_LIST_DATA field contains a list of possible asymmetric key -exchange algorithms supported by the client, in order of (the -client's) preference. Each element in the list is a two-byte field -containing a code representing a key exchange algorithm type. The -entire length of the list (twice the number of elements) is placed -in EXCH_LIST_LENGTH. - -The KEY_ARG_DATA field contains an initialization vector to be used in -a reconnected session when the cipher type is a block cipher (see -section 6.1.5). If a new session is being requested (i.e., if the -CH_REQUEST_RECONNECT flag is set to zero), then KEY_ARG_LENGTH must -be zero. - -The MSG_LIST_DATA field contains a list of data message types (other -than DM_TYPE_USER_DATA) supported by the client. Each element in the -list is a two-byte field containing a code representing a data message -type. The entire length of the list (twice the number of elements) is -placed in MSG_LIST_LENGTH. - -The SIG_LIST_DATA field contains a list of possible signature -algorithms supported by the client, in order of (the client's) -preference. Each element in the list is a two-byte field containing -a code representing a signature algorithm type. The entire length -of the list (twice the number of elements) is placed in -SIG_LIST_LENGTH. - -The CERTIFIER_LIST_DATA field contains a list of identifiers of -possible certificate sources recognized by the client, in order of -(the client's) preference. Each element in the list is a -zero-delimited string. The entire length of the list is placed in -CERTIFIER_LIST_LENGTH. A client may indicate, by setting the -CH_OFFER_CERTIFIER_TRYOUT flag to one, that the certifier list does -not imply rejection of all other certifiers; for example, the client -may provide an abbreviated (or even empty) certifier list to avoid -constructing an exhaustive list of accepted certifiers, or may lack -a naming convention for certifiers known to be compatible with that -of the server. The client may still in that case reject a -certificate offered by the server. - -The CH_QUICK_PUBLIC_VALUE_DATA field may, at the client's option, -contain a (possibly certified) key-exchange public key. If the -field is non-empty, then the CH_OFFER_KEY_EXCH_RECEIVE flag must -be set to one. If the CH_OFFER_AUTH_KEY_EXCH flag is also set to -one, then the CH_QUICK_PUBLIC_VALUE_DATA field, if non-empty, -contains a certificate (including key-exchange public key); otherwise -the field, if non-empty, contains an uncertified key exchange public -value. The exact format of this field is described in section -6.1.2. If the client expects the server to demand client -authentication by key exchange, then this public key/certificate may -expedite the expected key exchange/authentication; however, the server -may still indicate in the subsequent SERVER_HELLO message that a -public key or certificate of another type (or from a different -certifier) is required. - -The CH_QUICK_SERVER_PUBLIC_VALUE_DATA and CH_QUICK_ENCRYPTED_KEY_DATA -fields may, at the client's option, contain, respectively, the public -value from a key-exchange public key certificate attributed to the -server, and an encrypted master key (or Diffie-Hellman/FORTEZZA KEA -public value) decryptable by the holder of the private key associated -with the certified key-exchange public key. The format of these -fields is described in section 6.1.2. If the client already -possesses a certified key-exchange public key belonging to the server, -then use of these fields will expedite the resulting key exchange. -However, in unusual circumstances, the server may still "disavow" the -key exchange--that is, refuse to receive it, and offer only some -other key exchange type, direction or certificate. (For example, the -public key used by the client may be incorrect or out-of-date.) Note -that if these fields are used by the client, then the -CH_REQUEST_KEY_EXCH_SEND flag must be set to one. - -The server, on receiving a CLIENT_HELLO message, checks the version -number and the offset field to determine where the variable-length -data fields start. (The OFFSET value should be at least -PCT_CH_OFFSET_V2 for versions 2 and higher.) The server then checks -whether the CH_REQUEST_RECONNECT flag is set to one, and if so, -whether it recognizes the SESSION_ID. In that case, the server -responds with a SERVER_HELLO message with the SH_ACCEPT_RECONNECT -flag set, and the appropriate values (see below) in the RESPONSE and -CONNECTION_ID fields. - -Otherwise, it examines the CIPHER_LIST and HASH_LIST lists in the -CLIENT_HELLO message to select a cipher and hash function. The -server also examines the AUTH_OPTIONS flags and CERT_LIST, -CERTIFIER_LIST, SIG_LIST and EXCH_LIST lists to select a key -exchange type and direction(s) and an authentication combination for -itself (including authentication type, certificate type and -certifier) which is acceptable to both the client and the server, if -one or more of the CH_DEMAND_AUTH flags were set. Finally, the -server examines the same lists to choose a sublist from each with -which it is compatible, if it requires client authentication as well. -If such selections are possible, then the server sends a SERVER_HELLO -message to the client as described below; otherwise, the server -detects a SPECS_MISMATCH error. The server also examines the quick -key-exchange public value (if sent) for compatibility, and/or -decrypts the quick encrypted master key, if possible. - - -5.2.2 SERVER_HELLO - -char SH_SERVER_VERSION[2] -char SH_AUTH_OPTIONS[2] -char SH_CIPHER_SPECS_DATA[4] -char SH_HASH_SPECS_DATA[2] -char SH_EXCH_SPECS_DATA[2] -char SH_CONNECTION_ID_DATA[30] -char SH_SESSION_ID_DATA[30] -char SH_ALT_CIPHER_LIST_LENGTH[2] -char SH_ALT_HASH_LIST_LENGTH[2] -char SH_MSG_LIST_LENGTH[2] -char SH_EXCH_LIST_LENGTH[2] -char SH_CERT_LIST_LENGTH[2] -char SH_SIG_LIST_LENGTH[2] -char SH_QUICK_ENCRYPTED_KEY_LENGTH[2] -char SH_RESPONSE_LENGTH[2] -char SH_CERTIFIER_LIST_LENGTH[4] -char SH_PUBLIC_VALUE_LENGTH[4] -char SH_SIG_CERT_LENGTH[4] -char SH_ALT_CIPHER_LIST_DATA[([0] << 8)|[1]] -char SH_ALT_HASH_LIST_DATA[([0] << 8)|[1]] -char SH_MSG_LIST_DATA[([0] << 8)|[1]] -char SH_EXCH_LIST_DATA[([0] << 8)|[1]] -char SH_CERT_LIST_DATA[([0] << 8)|[1]] -char SH_SIG_LIST_DATA[([0] << 8)|[1]] -char SH_QUICK_ENCRYPTED_KEY_DATA[([0] << 8)|[1]] -char SH_RESPONSE_DATA[([0] << 8)|[1]] -char SH_CERTIFIER_LIST_DATA[([0] << 24)|([1] << 16)|([2] << 8)|[3]] -char SH_PUBLIC_VALUE_DATA[([0] << 24)|([1] << 16)|([2] << 8)|[3]] -char SH_SIG_CERT_DATA[([0] << 24)|([1] << 16)|([2] << 8)|[3]] - -The server sends this message after receiving the client's -CLIENT_HELLO message. The PCT version number in SH_SERVER_VERSION -is always the maximum protocol version that the server supports; the -remainder of the SERVER_HELLO message and all subsequent messages -will conform to the format specified by the protocol version -corresponding to the minimum of the client and server protocol -version numbers, as indicated by the CH_CLIENT_VERSION and -SH_SERVER_VERSION fields. Unless there is an error, the server always -returns a random value 30 bytes in length in the CONNECTION_ID field. -This value doubles as challenge data if the server requests client -authentication, and should therefore be random in the same sense as -the challenge data in the CLIENT_HELLO message. - -The SH_AUTH_OPTIONS field contains twelve flags, associated with the -twelve low-order bits of the SH_AUTH_OPTIONS field; they are named, -in order (from least to most significant bit), as follows: - -SH_ACCEDE_KEY_EXCH_RECEIVE := 0x0001 -SH_ACCEDE_AUTH_KEY_EXCH := 0x0002 -SH_ACCEDE_AUTH_SIG := 0x0004 -SH_ACCEDE_AUTH_PASSWORD := 0x0008 -SH_ACCEPT_KEY_EXCH_SEND := 0x0010 -SH_ACCEPT_AUTH_KEY_EXCH := 0x0020 -SH_ACCEPT_AUTH_SIG := 0x0040 -SH_ACCEPT_AUTH_PASSWORD := 0x0080 -SH_ACCEPT_RECONNECT := 0x0100 -SH_ACCEPT_CLOSURE_MON := 0x0200 -SH_ACCEPT_REDO_ENABLE := 0x0400 -SH_OFFER_CERTIFIER_TRYOUT := 0x0800 - -The SH_ACCEPT_CLOSURE_MON flag is set to one if and only if the -CH_REQUEST_CLOSURE_MON flag is set to one, and the server also -prefers the current connection to be closure-monitored (see section -4.4.3). The SH_ACCEPT_REDO_ENABLE flag is set to one if and only if -the CH_REQUEST_REDO_ENABLE flag is set to one, and the server also -prefers the current connection to be redo-enabled (see section 4.4.4). - -If the server recognizes the contents of the CH_SESSION_ID_DATA -field of the CLIENT_HELLO message as session identifier for a session -for which the master key is still available to the server, then the -SH_ACCEPT_RECONNECT flag in the SH_AUTH_OPTIONS field is set to one. -Also, the SH_SESSION_ID_DATA field echoes the CH_SESSION_ID_DATA -field. Moreover, the server sets the CIPHER_SPECS_DATA and -HASH_SPECS_DATA fields to the values stored along with the session -identifier. There are two subcases: (1) If the SH_EXCH_SPECS_DATA -value does not refer to a TOKEN type (see section 6.1), then the -CLIENT_MAC, SERVER_MAC, CLIENT_WRITE, and SERVER_WRITE keys are -rederived using the MASTER_KEY from the old session, as well as the -CONNECTION_ID and CH_CHALLENGE values from the SERVER_HELLO and -CLIENT_HELLO messages, respectively, for this connection. (2) If the -SH_EXCH_SPECS_DATA refers to a TOKEN type, then the keys from the -ongoing session continue to be used. In order to obtain fresh key -material or reset the sequence number, TOKEN implementations must use -the redo handshake mechanism (KM_REDO_HANDSHAKE key management -message), or else not request (or not accept) reconnections of an -established session. When this mechanism is used with a TOKEN -exchange type, the client must set the CH_REQUEST_RECONNECT flag to -one and send PCT_SESSION_ID_NONE in the CH_SESSION_ID_DATA field of -the subsequent CLIENT_HELLO message. (See section 4.4.4.) - -In the case of a reconnection, all the remaining data fields are -empty except for SH_RESPONSE_DATA, whose contents are described in -section 7.2. Also, all of the flags in SH_AUTH_OPTIONS are set to -zero except SH_ACCEPT_RECONNECT and possibly SH_ACCEPT_CLOSURE_MON -and/or SH_ACCEPT_REDO_ENABLE. - -If the server does not recognize the session identifier provided by -the client (or if the CH_REQUEST_RECONNECT flag was set to zero), -then the server sets the SH_ACCEPT_RECONNECT flag to zero in the -SH_AUTH_OPTIONS field. A unique session identifier (which must not -equal PCT_SESSION_ID_NONE) is also placed in the SH_SESSION_ID_DATA -field; this value need not be cryptographically random, but values -should not be used repeatedly (a continually increasing counter, for -instance, would be sufficient). The server then selects any choice -with which it is compatible, from each of the CH_CIPHER_LIST, -CH_HASH_LIST and CH_EXCH_LIST lists supplied in the CLIENT_HELLO -message. (These values are returned to the client in the -SH_CIPHER_SPECS_DATA, SH_HASH_SPECS_DATA and SH_EXCH_SPECS_DATA -fields, respectively.) If no cipher type (respectively, hash type, -key exchange type) from the CH_CIPHER_LIST (respectively, -CH_HASH_LIST, CH_EXCH_LIST) is acceptable to the server, then a -SPECS_MISMATCH error occurs. - -Alternate cipher and hash types from CH_CIPHER_LIST and CH_HASH_LIST, -respectively, with which the server is compatible may be placed in the -SH_ALT_CIPHER_LIST and SH_ALT_HASH_LIST lists (whose formats are -identical to those of CH_CIPHER_LIST and CH_HASH_LIST, respectively); -these lists can then be used by the client in determining whether -pre-encrypted, pre-MAC'd data will be understandable to the server. -(Filling these lists is optional for the server; an empty list simply -means that the client has no assurance that the server supports any -cipher or hash type other than the one selected for the session.) -Finally, the SH_MSG_LIST list contains a list of those data message -types from CH_MSG_LIST which the server also supports; the format of -the two message type lists is identical. - -The server also examines the CH_AUTH_OPTIONS flags to select server -authentication and key exchange options acceptable to both (as -indicated by the CH_AUTH_OPTIONS flags and the server's own -requirements/compatibilities), and to offer a set of acceptable -client authentication options. In particular, these must include a -server authentication type if any of the CH_DEMAND_AUTH flags is set -to one, at least one client authentication type if client -authentication is required by the server, and a key exchange -direction (or two) acceptable to both client and server, as indicated -by the CH_DEMAND_KEY_EXCH_SEND and CH_OFFER_KEY_EXCH_RECEIVE flags -and the server's own requirements. (The restrictions on -password-based authentication must also be obeyed; see section 5.1.2.) -If no such set of types is available that is acceptable to both client -and server, then a SPECS_MISMATCH error occurs. If at least one such -set of types is found, then the server sets the associated flags in -SH_AUTH_OPTIONS (at most one SH_ACCEDE_AUTH flag and at least one -SH_ACCEDE/ACCEPT_KEY_EXCH flag); these determine the type of server -authentication to be performed, if any, and the direction of the key -exchange(s), as well as the set of client authentication options -acceptable to the server. The type of the key exchange(s) (they must -both be of the same type, if there are two) is selected by the server, -and indicated by the code in the SH_EXCH_SPECS field. - -If the server requires client authentication, then the server also -selects those choices from the CH_SIG_LIST, CH_CERT_LIST and -CH_CERTIFIER_LIST lists that are also acceptable -CH_OFFER_CERTIFIER_TRYOUT is set to one). These server-selected -lists are placed in the SH_SIG_LIST_DATA, SH_CERT_LIST_DATA and -SH_CERTIFIER_LIST_DATA fields, respectively; their format is -identical to those of the corresponding fields in the CLIENT_HELLO -message. If the server does not require client authentication, then -the SH_SIG_LIST, SH_CERT_LIST and SH_CERTIFIER_LIST fields are -empty, and their length is zero. The server may also, like the -client, demand certificate-based authentication but set the -SH_OFFER_CERTIFIER_TRYOUT flag to one. In this case, the server -simply reserves the right to reject certificates from unacceptable -certifiers, and its list of acceptable ones is not assumed -exhaustive. - -If the SH_ACCEDE_KEY_EXCH_RECEIVE flag is set to one and the -CH_QUICK_SERVER_CERT field is either empty or contains an -incorrect public value, then the SH_PUBLIC_VALUE_DATA field contains -a (possibly certified) key-exchange public key of a type compatible -with the chosen key exchange type specified in the -SH_EXCH_SPECS_DATA field. If, moreover, the -SH_ACCEDE_AUTH_KEY_EXCH flag is set to one, then the key-exchange -public key is contained in a certificate whose type and certifier -are found in the CH_CERT_LIST and CH_CERTIFIER_LIST lists, -respectively (if CH_CERTIFIER_LIST is non-empty). Otherwise, the -public key is uncertified. The format of the SH_PUBLIC_VALUE_DATA -field is described in section 6.1.2. If the -SH_ACCEDE_KEY_EXCH_RECEIVE flag is set to zero, then the -SH_PUBLIC_VALUE_DATA field is empty, and its length is zero. - -If the client sent an acceptable key-exchange public key certificate -in the CH_QUICK_PUBLIC_VALUE field of the CLIENT_HELLO message, then -the server responds with an RSA-encrypted master key (or randomly -chosen Diffie-Hellman/FORTEZZA KEA public value) in the -SH_QUICK_ENCRYPTED_KEY field of the SERVER_HELLO message. (The -format of this field is described in section 6.1.2.) - -If the client sent an acceptable certified server key-exchange -public key and encrypted master key in the CH_QUICK_SERVER_CERT and -CH_QUICK_ENCRYPTED_KEY fields of the CLIENT_HELLO message, and if the -SH_ACCEPT_KEY_EXCH_SEND flag in the SH_AUTH_OPTIONS field is set to -zero, then the key exchange is completed, and the server must place an -authentication response, constructed as described in section 7.2, in -SH_RESPONSE_DATA if one of the CH_DEMAND_AUTH flags is set to one. If -the SH_ACCEDE_AUTH_SIG flag is set to one, then the SH_SIG_CERT_DATA -field contains a certified digital signature public key acceptable to -the client (as indicated by the CH_SIG_LIST, CH_CERT_LIST and -CH_CERTIFIER_LIST lists), in the format of a PUBLIC_VALUE field of -type PV_CERTIFICATE (see section 6.1.2). If the -SH_ACCEDE_AUTH_PASSWORD flag is set to one, then an identity indicator -(such as an account identifier or, in the case of doubly certified -Diffie-Hellman key exchange, a certificate for the Diffie-Hellman -public value supplied by the server in the key exchange) is placed in -the SH_SIG_CERT_DATA field. Otherwise the SH_SIG_CERT_DATA field is -empty, and its length is zero. - -When the client receives a SERVER_HELLO message, it checks whether the -server has accepted a reconnection of an old session or is -establishing a new session. If the session is an old one, then the -client establishes the new CLIENT_WRITE_KEY, SERVER_WRITE_KEY, -CLIENT_MAC_KEY and SERVER_MAC_KEY according to the cipher-specific -rules described in section 6.1.4. The client then checks the -contents of the RESPONSE_DATA field in the SERVER_HELLO message for -correctness. If the response exactly matches the value calculated by -the client (following the procedures in sections 7.1 and 7.2), then -the handshake is finished, and the client proceeds to the -CLIENT_MASTER_KEY messsage, if necessary, or else begins sending -data; otherwise, a SERVER_AUTH_FAILED error occurs. - -If a new session is being initiated, the client records the chosen -cipher, hash, key exchange and signature types, and the lists of -alternate cipher and hash types and supported data message types. -If certificate-based client authentication is required the client -checks the list of certificate types and certifiers to see if it has -a satisfactory certificate; lack of one results in a SPECS_MISMATCH -error. If an acceptable quick encrypted master key was sent, the -client decrypts the master key for use in obtaining a MAC_KEY and -WRITE_KEY for each transmission direction as described in section -6.1.4. Finally, if a non-empty RESPONSE_DATA field was included, then -the client checks it for correctness. If it exactly matches the -value calculated by the client (following the procedures in sections -7.1 and 7.2), then the client proceeds to the CLIENT_MASTER_KEY -handshake message (or, if the handshake is completed, begins sending -data); otherwise, a SERVER_AUTH_FAILED error occurs. - - -5.2.3 CLIENT_MASTER_KEY - -char CMK_ENCRYPTED_KEY_LENGTH[2] -char CMK_RESPONSE_LENGTH[2] -char CMK_SIG_CERT_LENGTH[4] -char CMK_PUBLIC_VALUE_LENGTH[4] -char CMK_ENCRYPTED_KEY_DATA[([0] << 8)|[1]] -char CMK_RESPONSE_DATA[([0] << 8)|[1]] -char CMK_SIG_CERT_DATA[([0] << 24)|([1] << 16)|([2] << 8)|[3]] -char CMK_PUBLIC_VALUE_DATA[([0] << 24)|([1] << 16)|([2] << 8)|[3]] - -The client sends this message after receiving the SERVER_HELLO message -from the server if not all the key exchanges and authentications (as -indicated by the SH_AUTH_OPTIONS field) have yet been completed. - -If SH_ACCEPT_AUTH_SIG is set to one, and no other client -authentication option is both acceptable to the server and preferred -by the client, then CMK_SIG_CERT_DATA contains a certified digital -signature public key acceptable to the server (as indicated by the -(SH_CERT_LIST, SH_CERTIFIER_LIST and SH_SIG_LIST lists), in the form -of a PUBLIC_VALUE field of type PV_CERTIFICATE (see section 6.1.2). -If SH_ACCEPT_AUTH_PASSWORD is set to one, then CMK_SIG_CERT_DATA -contains an identity indicator (such as an account identifier, or, in -the case of doubly certified Diffie-Hellman key exchange, a -certificate for the Diffie-Hellman public value supplied by the -server in the key exchange). Otherwise the CMK_SIG_CERT_DATA field -is empty, and its length is zero. - -If SH_ACCEPT_KEY_EXCH_SEND is set to one, and an acceptable -encrypted master key has not already been sent in the -SH_QUICK_ENCRYPTED_KEY field of the SERVER_HELLO message, then -CMK_PUBLIC_VALUE_DATA contains an RSA key exchange public key or -Diffie-Hellman/FORTEZZA KEA public value. If -SH_ACCEPT_AUTH_KEY_EXCH is set to one, and no other client -authentication option is both acceptable to the server and preferred -by the client, then this public value is contained in a certificate -acceptable to the server (as indicated by the SH_EXCH_SPECS_DATA -field and the SH_CERT_LIST and SH_CERTIFIER_LIST lists); otherwise, -the value is uncertified. If the SH_ACCEPT_KEY_EXCH_SEND flag is set -to zero, or if an acceptable encrypted master key was sent in the -SERVER_HELLO message, then CMK_PUBLIC_VALUE_DATA is empty. - -If SH_ACCEDE_KEY_EXCH_RECEIVE is set to one, and if -SH_PUBLIC_VALUE_DATA was not empty (indicating that the contents of -the CH_QUICK_ENCRYPTED_KEY field in the CLIENT_HELLO message were -either absent or not acceptable), then CMK_ENCRYPTED_KEY contains an -RSA-encrypted master key (or randomly chosen Diffie-Hellman/FORTEZZA -KEA public value); see section 6.1.2. If SH_ACCEDE_KEY_EXCH_RECEIVE -is set to one, or if SH_PUBLIC_VALUE_DATA is empty, then -CMK_ENCRYPTED_KEY is empty, with length zero. - -If all key exchanges are completed by the sending of the -CLIENT_MASTER_KEY message, and if one of the SH_ACCEPT_AUTH flags is -set to one, then the contents of the CMK_RESPONSE field are as -described in section 7.2; otherwise, this field is empty, and its -length is zero. - -Upon receiving a CLIENT_MASTER_KEY message, the server verifies the -certificates and/or authentication response, if they are required; -errors in any of these result in a BAD_CERTIFICATE or -CLIENT_AUTH_FAILED error, respectively. If an encrypted master key -was sent, the server decrypts the master key for use in obtaining a -MAC_KEY and WRITE_KEY for each transmission direction as described in -section 6.1.4. The server then proceeds to the SERVER_VERIFY -message, if necessary, or else begins transmitting data. - - -5.2.4 SERVER_VERIFY - -char SV_ENCRYPTED_KEY_LENGTH[2] -char SV_RESPONSE_LENGTH[2] -char SV_SIG_CERT_LENGTH[4] -char SV_ENCRYPTED_KEY_DATA[([0] << 8)|[1]] -char SV_RESPONSE_DATA[([0] << 8)|[1]] -char SV_SIG_CERT_DATA[([0] << 24)|([1] << 16)|([2] << 8)|[3]] - -The server sends this message upon receiving a valid CLIENT_MASTER_KEY -message from the client, if not all key exchanges and authentications -have been completed. - -If SH_SIG_CERT_DATA was empty, and either SH_ACCEDE_AUTH_SIG or -SH_ACCEDE_AUTH_PASSWORD is set to one, then the SV_SIG_CERT_DATA -field must not be empty. If SH_ACCEDE_AUTH_SIG is set to one, -then SV_SIG_CERT_DATA must contains a certified digital signature -public key acceptable to the client (as indicated by the -(CH_SIG_LIST, CH_CERT_LIST and CH_CERTIFIER_LIST lists), in the form -of a PUBLIC_VALUE field of type PV_CERTIFICATE (see section 6.1.2). -If SH_ACCEPT_AUTH_PASSWORD is set to one, then SV_SIG_CERT_DATA -contains an identity indicator (such as an account identifier, or, in -the case of doubly certified Diffie-Hellman key exchange, a -certificate for the Diffie-Hellman public value supplied by the -server in the key exchange). Otherwise the SV_SIG_CERT_DATA field is -empty, and its length is zero. - -If SH_ACCEPT_KEY_EXCH_SEND is set to one, and if -CMK_PUBLIC_VALUE_DATA was not empty (indicating that the contents of -the SH_QUICK_ENCRYPTED_KEY field in the SERVER_HELLO message were -either absent or not acceptable), then SV_ENCRYPTED_KEY contains an -RSA-encrypted master key (or randomly chosen Diffie-Hellman/FORTEZZA -KEA public value). The format of this field is described in section -6.1.2. If SH_ACCEPT_KEY_EXCH_SEND is set to one, or if -CMK_PUBLIC_VALUE is empty, then SV_ENCRYPTED_KEY is empty, with -length zero. - -If one of the SH_ACCEPT_AUTH flags is set to one, then the contents -of the SV_RESPONSE field are as described in section 7.2; otherwise, -this field is empty, and its length is zero. - -Upon receiving the SERVER_VERIFY message, the client verifies the -certificates and/or authentication response, if they are required; -errors in any of these result in a BAD_CERTIFICATE or -SERVER_AUTH_FAILED error, respectively. If an encrypted master key -was sent, the client decrypts the master key for use in obtaining a -MAC_KEY and WRITE_KEY for each transmission direction as described -in section 6.1.4. The client then proceeds to the CLIENT_VERIFY -message, if necessary, or else begins transmitting data. - - -5.2.5 CLIENT_VERIFY - -char CV_RESPONSE_LENGTH[2] -char CV_SIG_CERT_LENGTH[4] -char CV_RESPONSE_DATA[([0] << 8)|[1]] -char CV_SIG_CERT_DATA[([0] << 24)|([1] << 16)|([2] << 8)|[3]] - -The client sends this message upon receiving a valid SERVER_VERIFY -message from the client, if client authentication has not been -completed. This message is never necessary unless -SH_ACCEPT_KEY_EXCH_SEND was set to one. - -If either SH_ACCEDE_AUTH_SIG or SH_ACCEDE_AUTH_PASSWORD is set to one, -then the CV_SIG_CERT_DATA field must not be empty. If -SH_ACCEDE_AUTH_SIG is set to one, then CV_SIG_CERT_DATA must contain -a certified digital signature public key acceptable to the server (as -indicated by the (SH_SIG_LIST, SH_CERT_LIST and SH_CERTIFIER_LIST -lists), in the form of a PUBLIC_VALUE field of type PV_CERTIFICATE -(see section 6.1.2). If SH_ACCEPT_AUTH_PASSWORD is set to one, then -CV_SIG_CERT_DATA contains an identity indicator (such as an account -identifier, or, in the case of doubly certified Diffie-Hellman key -exchange, a certificate for the Diffie-Hellman public value supplied -by the server in the key exchange). Otherwise the CV_SIG_CERT_DATA -field is empty, and its length is zero. The contents of the -CV_RESPONSE field are as described in section 7.2. - -Upon receiving the CLIENT_VERIFY message, the server verifies the -certificate, if required, and the authentication response; errors in -either of these result in a BAD_CERTIFICATE or CLIENT_AUTH_FAILED -error, respectively. The server may then begin transmitting data. - - -6. Algorithm and Certificate Types - -6.1 Key exchange algorithms - -6.1.1 Key exchange algorithm types - -PCT version 2 permits the following key exchange types: - -PCT_EXCH_RSA_PKCS1 -PCT_EXCH_RSA_PKCS1_TOKEN_DES -PCT_EXCH_RSA_PKCS1_TOKEN_DES3 -PCT_EXCH_RSA_PKCS1_TOKEN_RC2 -PCT_EXCH_RSA_PKCS1_TOKEN_RC4 -PCT_EXCH_DH_PKCS3 -PCT_EXCH_DH_PKCS3_TOKEN_DES -PCT_EXCH_DH_PKCS3_TOKEN_DES3 -PCT_EXCH_FORTEZZA_TOKEN - -Note that the token-based key exchange types (those types whose -labels contain the word TOKEN) specify cipher as well (including, -implicitly, the FORTEZZA KEA key exchange type); if one of these is -chosen, then its choice of cipher overrides whatever choice of -cipher appears in the SH_CIPHER_SPECS_DATA field of the SERVER_HELLO -message. - -These key exchanges may use the (QUICK_)PUBLIC_VALUE field in any -handshake message, as well as the (QUICK_)ENCRYPTED_KEY field in the -subsequent handshake message. The (first) public value sent is said -to be sent by (or previously obtained from) the "receiver", and the -second value by the "sender". If the sender is the client, then the -key exchange is said to be "server-directed"; if the sender is the -server, then it is said to be "client-directed". - - -6.1.2 Key exchange field formats - -The format of the (QUICK_)PUBLIC_VALUE field in any handshake -message in which it appears is as follows: - -char PV_PUBLIC_VALUE_TYPE[2] -char PV_USER_INFO_LENGTH[4] -char PV_PARAMETER_1_LENGTH[2] -char PV_PARAMETER_2_LENGTH[2] -char PV_USER_INFO_DATA[([0] << 24)|([1] << 16)|([2] << 8)|[3]] -char PV_PARAMETER_1_DATA[([0] << 8)|[1]] -char PV_PARAMETER_2_DATA[([0] << 8)|[1]] - -There are five permissible values for PUBLIC_VALUE_TYPE. If -PV_TYPE_CERTIFICATE is specified, then a certificate of a type -acceptable to the key exchange sender (as indicated by the -CH_CERT_LIST in the CLIENT_HELLO message, or the SH_CERT_LIST list, -in the SERVER_HELLO message, as appropriate) appears in the -PV_USER_INFO field, and both PV_PARAMETER fields are empty, with -length zero. (The PV_PARAMETER_1_LENGTH field contains the -two-byte certificate type code identifying the type of the -certificate sent; this field is not, however, interpreted as the -length of the PV_PARAMETER_1_LENGTH field, which is still empty; -see section 6.4.) If PV_TYPE_PKCS_TOKEN is specified, then the -PV_USER_INFO field contains a PKCS-format public key of the type -(RSA or Diffie-Hellman) indicated by the SH_EXCH_SPECS field in the -SERVER_HELLO message. If PV_TYPE_KEA is specified, then the -PV_USER_INFO field contains a KEA public value exactly as generated -by the FORTEZZA token, and both PV_PARAMETER fields are empty, with -length zero. If PV_TYPE_EPHEMERAL_RSA is specified, then -PV_USER_INFO contains the RSA modulus from the RSA public value -being sent; PV_PARAMETER_1 contains the associated RSA exponent; and -PV_PARAMETER_2 is empty, with length zero. If PV_TYPE_EPHEMERAL_DH -is specified, then PV_USER_INFO contains the actual Diffie-Hellman -public value; PV_PARAMETER_1 contains the generator used to -construct it; and PV_PARAMETER_2 contains the prime modulus used to -construct it. For both EPHEMERAL public value types, the values in -all fields are represented with the most significant byte first, and -in descending order, with the least significant byte last. - -The (QUICK_)ENCRYPTED_KEY_DATA field in any handshake message in -which it appears has the following format: - -char EK_ENCRYPTED_KEY_1_LENGTH[2] -char EK_ENCRYPTED_KEY_2_LENGTH[2] -char EK_ENCRYPTED_KEY_3_LENGTH[2] -char EK_KEY_ARG_LENGTH[2] -char EK_ENCRYPTED_KEY_1_DATA[([0] << 8)|[1]] -char EK_ENCRYPTED_KEY_2_DATA[([0] << 8)|[1]] -char EK_ENCRYPTED_KEY_3_DATA[([0] << 8)|[1]] -char EK_KEY_ARG_DATA[([0] << 8)|[1]] - -Details of the use of these subfields is described below. - - -6.1.3 Master key exchange - -For the PCT_EXCH_RSA_PKCS1 key exchange type, a MASTER_KEY value is -generated by the sender, which should be random in the following -strong sense: attackers must not be able to predict any of the bits in -the MASTER_KEY. It is recommended that the bits used be either truly -random and uniformly generated (using some random physical process) or -else generated using a cryptographically secure pseudorandom number -generator, which was in turn seeded with a truly random and uniformly -generated seed. This MASTER_KEY value is encrypted using the -receiver's (possibly certified) public encryption key, as obtained -from the (QUICK_)PUBLIC_VALUE_DATA field of some handshake message -(or possibly some time earlier, if the key is certified). The -encryption must follow the RSA PKCS#1 standard format (see [3]), -block type 2. This encryption is sent to the server in the -EK_ENCRYPTED_KEY_1_DATA subfield in the (QUICK_)ENCRYPTED_KEY_DATA -field of the handshake message following the one containing the public -value used (or the sender's first handshake message, if the public -key was obtained at an earlier time). The encrypted key is decrypted -by the receiver to obtain the MASTER_KEY. If two key exchanges of -this type are performed (one in each direction), then the MASTER_KEY -value is simply the concatenation of the two values, in the order in -which they were sent. Use of the ENCRYPTED_KEY_2_DATA subfield is -described in section 6.1.5; the ENCRYPTED_KEY_3_DATA subfield is left -empty, with length zero. - -For the PCT_EXCH_DH_PKCS3 key exchange type, a random private value x -(generated in the same way as the MASTER_KEY above) and corresponding -public value y are generated by the sender following RSA PKCS#3 -standard format (see [4]). The value y is then sent to the receiver -in the EK_ENCRYPTED_KEY_1_DATA subfield of the -(QUICK_)ENCRYPTED_KEY_DATA field of some handshake message. The -sender's private value x, along with the (possibly certified) public -value y' included in the (QUICK_)PUBLIC_VALUE_DATA field of the -previous handshake message (or possibly obtained earlier), is used to -generate the MASTER_KEY. The receiver uses its private value, x', -along with the y value sent by the sender, to obtain the same -MASTER_KEY value. If two key exchanges of this type are performed -(one in each direction), then the MASTER_KEY is simply the -concatenation of the two values, in the order in which they were sent. -Use of the ENCRYPTED_KEY_2_DATA subfield is described in section -6.1.5; the ENCRYPTED_KEY_3_DATA subfield is left empty, with length -zero. - -For the various TOKEN key exchange types, an encrypted -CLIENT_WRITE_KEY is contained in the ENCRYPTED_KEY_1_DATA subfield, -and an encrypted SERVER_WRITE_KEY is contained in the -ENCRYPTED_KEY_2_DATA subfield of the (QUICK_)ENCRYPTED_KEY field. -The format of the data is defined by the token implementation. For -example, in the case of FORTEZZA tokens, the ENCRYPTED_KEY_1_DATA -subfield (like the (QUICK_)PUBLIC_VALUE field sent before it, or -obtained earlier), contains a KEA public value generated by the token -for key exchange. The result is a CLIENT_WRITE_KEY shared by sender -and receiver, which is used, along with the initialization vector in -the accompanying EK_KEY_ARG_DATA field, if needed (see section -6.1.5), to encrypt the SERVER_WRITE_KEY sent in the -ENCRYPTED_KEY_2_DATA subfield. In all token types, this shared -encryption key is used to encrypt a 128-bit MASTER_KEY value for -MAC_KEY derivation (as described below). This MASTER_KEY is sent in -the EK_ENCYRYPTED_KEY_3_DATA field of the ENCRYPTED_KEY_DATA subfield -accompanying the encryption key material, and uses the initialization -vector in the accompanying EK_KEY_ARG_DATA field, if needed (see -section 6.1.5). - -The length of the MASTER_KEY depends on the key exchange type, and on -how many key exchanges were performed. It is 128 bits if one RSA -key exchange was performed, and 256 bits if two exchanges were -performed and the results concatenated. For Diffie-Hellman key -exchange, it is the length of the receiver's public value if one key -exchange was performed, and the sum of the lengths of each receiver's -public value if two key exchanges were performed. For token-based -key exchange types, the MASTER_KEY (which is only relevant for MAC -derivation) is 128 bits long. - - -6.1.4 Key derivation - -The CLIENT_WRITE_KEY_SEED and SERVER_WRITE_KEY_SEED are used (for -non-token key exchange types) to compute the CLIENT_WRITE_KEY and -SERVER_WRITE_KEY, respectively. They are computed as follows: - -CLIENT_WRITE_KEY_SEED_i = Hash( i, "cw", MASTER_KEY, "cw"^i, -SH_CONNECTION_ID_DATA, "cw"^i, SH_SESSION_ID_DATA,"cw"^i, -CH_CHALLENGE_DATA, "cw"^i ) - -SERVER_WRITE_KEY_SEED_i = Hash( i, "svw", MASTER_KEY, "svw"^i, -SH_CONNECTION_ID_DATA, "svw"^i, CH_CHALLENGE_DATA, "svw"^i ) - -The function "Hash" is the one determined by the value of -SH_HASH_SPECS_DATA (see section 5.2.2). The value of i ranges from -1 to m, where m is the negotiated encryption key length (the value in -the third byte of the SH_CIPHER_SPECS_DATA field) divided by the hash -output length, in bits, rounded up to the nearest integer. This -resulting string is then truncated if necessary to produce a string -of the correct length. - -When a token key exchange type is used, no WRITE_KEY_SEED values are -computed, and the client and server WRITE_KEY values are defined by -the specific key exchange method for the token. For example, the -encryption keys exchanged in the KEA key exchange process described -in section 6.1.3 become the CLIENT_WRITE_KEY and SERVER_WRITE_KEY for -the session. - -The CLIENT_MAC_KEY_SEED and SERVER_MAC_KEY_SEED are always computed -as follows: - -CLIENT_MAC_KEY_SEED_i = Hash( i, MASTER_KEY, "cmac"^i, -SH_CONNECTION_ID_DATA, "cmac"^i, SH_SESSION_ID_DATA, "cmac"^i, -CH_CHALLENGE_DATA, "cmac"^i ) - -SERVER_MAC_KEY_SEED_i = Hash( i, MASTER_KEY, "svmac"^i, -SH_CONNECTION_ID_DATA, "svmac"^i, CH_CHALLENGE_DATA, "svmac"^i ) - -The function "Hash" is the one determined by the value of -SH_HASH_SPECS_DATA (see section 5.2.2). The value of i ranges from -1 through m, where m is the negotiated MAC key length (64 plus the -value in the fourth byte of the SH_CIPHER_SPECS_DATA field) divided -by the hash output length, in bits, rounded up to the nearest integer. -The resulting string is then truncated if necessary to produce a -string (CLIENT_MAC_KEY_SEED or SERVER_MAC_KEY_SEED) of the correct -MAC_KEY length. This string is then padded, by repeatedly appending -the byte PCT_MAC_KEY_PAD_BYTE , until it is the standard key length -for the hash function used in MAC computation (each hash function has -an associated standard MAC key length; see section 6.3). This final -result is the MAC_KEY (CLIENT_MAC_KEY or SERVER_MAC_KEY). - -Note that tokens which are capable of deriving keys using "keyed -hashes", as described above, are free to use the PCT_EXCH_RSA_PKCS1 -or PCT_EXCH_DH_PKCS3 key exchange type to exchange the MASTER_KEY, -and then to derive the rest of the keys normally. The TOKEN key -exchange types are for tokens that cannot do such keyed-hash key -derivation, and can only use an exchanged key for bulk encryption -(of, for example, the MASTER_KEY value used for MAC_KEY derivation). -Such tokens can exchange multiple keys by using an initially -exchanged encryption key to encrypt other keys, as described above. - -Key derivation for datagram records is somewhat different from normal -key derivation. In a datagram record, the necessary key information -is contained in the DG_ENCRYPTED_KEY field at the beginning of a -datagram record. Its ENCRYPTED_KEY_1_DATA subfield contains a -16-byte random value, which should be cryptographically random in the -same sense as the MASTER_KEY (see section 6.1.3). This value is used -to generate the new WRITE_KEY (in the case of non-token key exchange -types) and the MAC_KEY for the datagram. These are generated by -computing a temporary MASTER_KEY as follows: - -TEMP_MASTER_KEY_i = Hash( i, MASTER_KEY, "tmk"^i, -ENCRYPTED_KEY_1_DATA ) - -The function "Hash" is the one determined by the value of -SH_HASH_SPECS_DATA in the most recent SERVER_HELLO handshake message -for this connection (see section 5.2.2). The value of i ranges from -1 through m, where m is 128 divided by the hash output length, in -bits, rounded up to the nearest integer. The resulting concatenated -string is then truncated if necessary to produce a 128-bit string. -The new WRITE_KEYs (in the case of non-token key exchange types) and -new MAC_KEYs are then computed normally, except that MASTER_KEY is -replaced with TEMP_MASTER_KEY. - -If the current keys were generated using a token-type key exchange, -then the DG_ENCRYPTED_KEY_2_DATA subfield contains the key information -necessary to decrypt the datagram, encrypted in a manner that the -token can decrypt. (Note that the token type must support this type -of context-independent encryption of keys; otherwise, this type of key -management message is not permitted.) For example, when FORTEZZA -tokens are used, the DG_ENCRYPTED_KEY_2_DATA subfield contains the -WRITE_KEY encrypted, as a key, using the current WRITE_KEY. - -The DG_KEY_ARG_DATA subfield contains an arbitrary initialization -vector, whose use is also explained in section 6.1.5, if a block -cipher is being used; otherwise, the field is empty, and its length is -zero. - -6.1.5 Key expansion and cipher use - -Every cipher has an associated standard key length (see section 6.2). -When a non-token key exchange type has been used, and encryption keys -of standard length for the specified cipher have been specified in -the SH_CIPHER_SPECS field, then the values of CLIENT_WRITE_KEY and -SERVER_WRITE_KEY are simply CLIENT_WRITE_KEY_SEED and -SERVER_WRITE_KEY_SEED, respectively, and the ENCRYPTED_KEY_2_DATA -subfield accompanying the encrypted master key(s) is empty. -Otherwise, the EK_ENCRYPTED_KEY_2_DATA subfield(s) accompanying the -encrypted master key(s) in the key exchange(s) contain(s) random -"salt" for encryption key derivation. (The salt should be -cryptographically random in the same sense as the MASTER_KEY; see -section 6.1.3.) If only one key exchange occurred, then the salt data -used (which we will call CLEAR_KEY_DATA) is just the value in the -ENCRYPTED_KEY_2_DATA subfield accompanying the encrypted master key; -if two key exchanges are used, then both EK_ENCRYPTED_KEY_2_DATA -fields accompanying the encrypted master keys contain this random -data, and CLEAR_KEY_DATA is their concatenation, in the order in which -they were sent. When a key length is specified which is less than the -standard key length for the specified cipher, then keys of the -specified length are derived normally as described in section 6.1.4, -and then "expanded" to derive standard-length keys. The expansion -proceeds as follows: - -1. Assign to d the result of dividing the standard key length for -the cipher, in bits, by the output length of the hash function, in -bits, rounded up to the nearest integer. - -2. Divide CLEAR_KEY_DATA sequentially into d equal subsegments. -(Note that the length of the CLEAR_KEY_DATA field must therefore be a -multiple of d bytes, and that no two of its d equal parts, when so -divided, may be identical.) Denote these subsegments CLEAR_KEY_DATA_1 -through CLEAR_KEY_DATA_d. - -3. Compute the d hash values - -WRITE_KEY_i := Hash( i, "sl"^i, WRITE_KEY_SEED, "sl"^i, -CLEAR_KEY_DATA_i ). - -The function "Hash" is the one determined by the value of -SH_HASH_SPECS_DATA. The WRITE_KEY_SEED is the encryption key seed -value (CLIENT_WRITE_KEY_SEED or SERVER_WRITE_KEY_SEED) being expanded -to standard length. - -4. Concatenate WRITE_KEY_1 through WRITE_LENGTH_KEY_d, and then -truncate as necessary to produce the WRITE_KEY which is actually used -for encryption. - -The EK_KEY_ARG_DATA subfield accompanying the (last) encrypted master -key contains a random eight-byte value to be used as an initialization -vector (IV) for the first encrypted message when a block cipher (any -cipher except RC4) is used. The IV for the first block encrypted in -any subsequent encrypted message is simply the last encrypted block -of the previous message. The EK_KEY_ARG_DATA subfield is empty when -cipher type PCT_CIPHER_RC4 (or key exchange type -PCT_EXCH_RSA_PKCS1_TOKEN_RC4) is used. - -The use of a block cipher also may cause the data length to increase -during encryption, because the ciphertext produced by block ciphers -must always be an integer multiple of the cipher's block size. Hence -when a block cipher is used, the length of the (fully or partially) -encrypted record must be computed from the RH_RECORD_LENGTH value in -the record header. ENCRYPTED_LENGTH, the length of the encrypted -portion of a record, is computed as the smallest multiple of the -cipher's block size that is at least ACTUAL_LENGTH, where -ACTUAL_LENGTH, the length of the encrypted data before encryption, is -computed as RH_RECORD_LENGTH minus the lengths of the unencrypted -portions of the record body (RH_RECORD_LENGTH - MAC_LENGTH - -DG_ENCRYPTED_KEY_LENGTH - 4 in the case of a datagram record, and -RH_RECORD_LENGTH - MAC_LENGTH - 2 in the case of other encrypted record -types). If a block cipher is not used for encryption, then the length -of the encrypted data is unchanged by encryption, and the length of the -record body is therefore simply RH_RECORD_LENGTH. Otherwise, the -length of the entire encrypted record body is ENCRYPTED_LENGTH + -DG_MAC_LENGTH + DG_ENCRYPTED_KEY_LENGTH + 2 in the case of datagram -records, and ENCRYPTED_LENGTH + MAC_LENGTH for other encrypted -record types. - - -6.2 Cipher Types - -PCT version 2 permits the following cipher types to be specified: - -PCT_CIPHER_DES -PCT_CIPHER_IDEA -PCT_CIPHER_RC2 -PCT_CIPHER_RC4 -PCT_CIPHER_DES_112 -PCT_CIPHER_DES_168 - -Each of these types is denoted by a two-byte code, and is followed in -CIPHER_SPECS_DATA fields by two one-byte length specifications, as -described in section 5.2.1. An encryption length specification of -zero associated with any cipher denotes the choice of no encryption; a -key exchange is performed in such cases solely to share keys for MAC -computation. - -PCT_CIPHER_DES denotes DES (see [5]). Its standard key length is 56 -bits. PCT_CIPHER_DES_112 and PCT_CIPHER_DES_168 denote ciphers in -which the input is first encrypted under DES with a first key, then -"decrypted" under DES with a second key, then encrypted under DES with -a third key. For PCT_CIPHER_DES_112, the first and third keys are -identical, and correspond to the initial 56 bits of the 112-bit -WRITE_KEY. The second key corresponds to the final 56 bits of the -WRITE_KEY. For PCT_CIPHER_DES_168, the three keys are distinct, and -correspond to the first, second, and third 56-bit subsegments of the -WRITE_KEY. All three of these DES-based cipher types have 64-bit data -blocks and are used with cipher block chaining (CBC). - -The standard key lengths for PCT_CIPHER_DES_112 and PCT_CIPHER_DES_168 -are 112 bits and 168 bits, respectively. If a key length less than -the standard length is specified for one of these ciphers (or for -PCT_CIPHER_DES), then the WRITE_KEY_SEED is calculated, then expanded -to the standard length as described above. - -Note that before use, each 56-bit DES key must be "adjusted" to add -eight parity bits to form an eight-byte DES key (see [5]). Similarly, -if the specified WRITE_KEY length is less than its corresponding -standard length, then each WRITE_KEY_SEED is expanded to the standard -length using CLEAR_KEY_DATA as described above, to produce one, two, -or three keys of 56 bits each, which are then each "adjusted" by -adding parity bits to form an eight-byte key. - -PCT_CIPHER_IDEA denotes the IDEA block cipher (see [6]), with 64-bit -data blocks and cipher block chaining. This cipher has a standard key -length of 128 bits. - -PCT_CIPHER_RC2 denotes the RC2 block cipher, with 64-bit blocks and -cipher block chaining. Like IDEA, this cipher has a standard key -length of 128 bits. - -PCT_CIPHER_RC4 denotes the RC4 stream cipher. Like the IDEA and RC2 -block ciphers, this cipher has a standard key length of 128 bits. - -6.3 Hash Types - -PCT version 2 permits the following hash function types to be -specified: - -PCT_HASH_MD5 -PCT_HASH_MD5_TRUNC_64 -PCT_HASH_SHA -PCT_HASH_SHA_TRUNC_80 - -The "truncated" hash types (PCT_HASH_MD5_TRUNC_64 and -PCT_HASH_SHA_TRUNC_80) are identical to their non-truncated versions -(PCT_HASH_MD5 and PCT_HASH_SHA, respectively), with the following -exception: when used in the second ("outer") iteration of a MAC -or authentication response, their output is truncated to half its -normal length. (Hence the resulting MAC or authentication response -is also only half the normal length of the hash function's output.) - -PCT_HASH_MD5 denotes the MD5 hash function (see [7]), with 128-bit -output. (Hence PCT_HASH_MD5_TRUNC_64 has 64-bit output in the cases -described above.) PCT_HASH_SHA denotes the Secure Hash Algorithm -(see [8]), with 160-bit output. (Hence PCT_HASH_SHA_TRUNC_80 has -80-bit output in the cases described above.) The standard MAC key length -for all of the above hash functions is 512 bits. - - -6.4 Certificate Types - -PCT version 2 permits the following certificate types to be specified: - -PCT_CERT_X509 -PCT_CERT_PKCS7 -PCT_CERT_PRIVATE - -THese types apply equally to the client's and server's certificates. -PCT_CERT_X509 denotes a CCITT X.509 standard-conformant certificate -(see [10]). PCT_CERT_PKCS7 denotes an RSA PKCS#7 standard-conformant -certificate (see [11]). PCT_CERT_PRIVATE denotes a private format -understood by both the client and server; for instance, it may refer -to an account identifier using which a certificate lookup can be -performed on some agreed-upon certificate database. - - -6.5 Signature Types - -PCT version 2 permits the following signature key types to be -specified: - -PCT_SIG_RSA_MD5 -PCT_SIG_RSA_SHA -PCT_SIG_DSA_SHA - -PCT_SIG_RSA_MD5 denotes the signature scheme consisting of hashing -the data to be signed using the MD5 hash algorithm, and then -performing an RSA private-key signature function (the inverse of RSA -encryption) on the result. The signature must conform to RSA PKCS#1, -block type 1 (see [3]). PCT_SIG_RSA_SHA denotes the same signature -scheme with SHA substituted for MD5. PCT_SIG_DSA_SHA denotes the -signature scheme consisting of hashing the data to be signed using -the SHA hash algorithm, then computing a signature of the resulting -value using the Digital Signature Algorithm (DSA; see [12]). - -7. Response and verification formats - -7.1 Prelude verification - -In order to guard against alteration of handshake messages before the -master key has been exchanged (and MACs therefore made possible), a -"prelude verification" is incorporated into every authentication -response. Basically, the prelude verification is a cryptographic hash -of all handshake messages up to and including the one in which the -first authentication response is included (with the response field -itself omitted). - -Whichever message contains it, the prelude verification value is -computed as: - -VERIFY_PRELUDE_DATA = Hash( "vpd", CLIENT_HELLO, SERVER_HELLO , -CLIENT_MASTER_KEY, SERVER_VERIFY, CLIENT_VERIFY ) ). - -For the purposes of this computation, the handshake messages are -assumed to contain their associated message headers (i.e., their -HS_MSG_TYPE and HS_RECORD_FLAGS fields) and record headers. Also, the -message in which the first non-empty RESPONSE_DATA field is sent is -assumed for this computation not to include its RESPONSE_DATA field -(although its correct length is included), and subsequent messages in -the handshake are assumed to be empty, zero-length values. - -The hash function used is the one specified in SH_HASH_SPECS_DATA. -Note that the client and server need only keep a "running hash" of all -the values passed in each handshake message as they appear, -terminating at the appropriate point to compute the value of -VERIFY_PRELUDE_DATA. - - -7.2 Authentication responses - -The format of an authentication response depends on the type of -authentication required. Because each type of authentication -response may be sent in one of several possible handshake messages -(and by either party), the formats are described separately -here, and apply wherever the authentication response (RESPONSE_DATA) -field is non-empty. - -In the case of key exchange-based authentication, the contents of the -RESPONSE_DATA field are computed as follows: - -RESPONSE_DATA = Hash( MAC_KEY, Hash( "ke", VERIFY_PRELUDE_DATA ) ). - -In the case of digital signature-based authentication, the contents -of the RESPONSE_DATA field are computed as follows: - -RESPONSE_DATA = Signature( VERIFY_PRELUDE_DATA ). - -In the case of private "password"-based authentication, the contents -of the RESPONSE_DATA field are computed as follows: - -RESPONSE_DATA = Hash( MAC_KEY, Hash( "ppw", IDENTITY, PASSWORD, -VERIFY_PRELUDE_DATA ) ). - -Finally, in the case of authentication of a reconnection of a -previously established session, the contents of the RESPONSE_DATA -field are computed as follows: - -RESPONSE_DATA = Hash( MAC_KEY, Hash( "recon", VERIFY_PRELUDE_DATA ) ). - -The computation of the VERIFY_PRELUDE_DATA value is described in -section 7.1. The MAC_KEY is the CLIENT_MAC_KEY if the field is in -the CLIENT_MASTER_KEY or CLIENT_VERIFY message, and SERVER_MAC_KEY if -the field is in the SERVER_HELLO or SERVER_VERIFY message. (The -origin of these MAC keys is described in section 6.1.4.) -The hash function choice used is determined by the -SH_HASH_SPECS_DATA field in this SERVER_HELLO message. - -When a digital signature is used, the signature algorithm is -determined by the type of signature public key found in the -certificate passed in the SIG_CERT_DATA field accompanying the -RESPONSE_DATA field. (Note that the signature algorithm may itself -require that a hash function be applied to the data being signed, -apart from the one used to compute the value in VERIFY_PRELUDE_DATA.) - -When a private password is used, IDENTITY is the identity of the -client or server being authenticated (the contents of the -SIG_CERT_DATA field accompanying the response), and PASSWORD is the -shared private key used in the authentication. (Note that the same -shared password can in principle be used to authenticate either the -client to the server or vice versa, although not both simultaneously.) -In the case of a doubly certified Diffie-Hellman key exchange, the -password is simply the response sender's MAC key generated as a result -of the key exchange; it is considered equivalent to a password because -it does not change from connection to connection or from session to -session. - - -7.3 Message Authentication Codes - -All PCT version 2 records which are encrypted also include a message -authentication code (MAC). This value allows the receiver to verify -that the record containing it has originated with the correct party, -and has not been inserted or tampered with by someone else in -transit. - -The basic PCT MAC is in the form of a keyed hash of the encrypted -data; that is, a MAC function based on a cryptographic hash function -is computed on the encrypted data and the sender's MAC key. (The -derivation of MAC keys is described in section 6.1.) The -cryptographic hash function used is determined by the code contained -in the SH_HASH_SPECS_DATA field in the most recent SERVER_HELLO -message sent during a successful handshake phase this session. A -list of cryptographic hash functions permitted in PCT version 2, and -their associated codes and output lengths, is given in section 6.3. -The MAC is placed in the MAC_DATA field of the record in which it is -found; its length (MAC_LENGTH) is the output length of the hash -function used. - -The MAC value is computed differently for datagram records and for -other records. In datagram records, the MAC is computed as follows: - -DG_MAC_DATA = Hash( MAC_KEY, Hash( RECORD_HEADER_DATA, -DG_ENCRYPTED_KEY_LENGTH, DG_ENCRYPTED_KEY_DATA, DG_ENCRYPTED_DATA ) ) - -If the client is sending the record, then the MAC_KEY is the -CLIENT_MAC_KEY; if the server is sending the record, then the MAC_KEY -is the SERVER_MAC_KEY. (The derivation of these keys is described -in section 6.1.) RECORD_HEADER_DATA contains the four-byte contents -of the datagram record's record header, as described in section 4.2.1. - -For other records containing MACs, the MAC is computed as follows: - -DT_MAC_DATA = Hash( MAC_KEY, Hash( DATA_TYPE, RECORD_HEADER_DATA, -DT_ENCRYPTED_DATA, SEQUENCE_NUMBER ) ) - -If the client is sending the record, then the MAC_KEY is the -CLIENT_MAC_KEY; if the server is sending the record, then the MAC_KEY -is the SERVER_MAC_KEY. (The details of the derivation of these keys -are given in section 6.1.4.) The value of DATA_TYPE is either the -empty string, or the four-byte ASCII string "pecd" if the record -contains pre-encrypted data (see section 4.4.1). RECORD_HEADER_DATA -contains the four-byte contents of the record header described in -section 4.2.1. - -SEQUENCE_NUMBER is the value (represented in network byte order, or -"big endian" order) of a counter which is incremented by both the -sender and the receiver. For each transmission direction, a pair -of counters is kept (one by the sender, one by the receiver). -Before the first (handshake) record is sent or received in a PCT -connection all sequence number counters are initialized to zero -(except in the case of a restarting connection with a token-based -exchange type, in which case the entire cipher state is preserved; -see section 5.2.2). The sender's sender-to-receiver sequence -number is incremented after every record sent, and the receiver's -sender-to-receiver sequence number is incremented after every record -received. (Note that this increment occurs regardless of whether or -not a record is, or has, a continuation record.) Sequence number -counters are 32-bit unsigned quantities, and may not increment past -0xFFFFFFFF. (See section 4.4.4.) - -MACs for pre-encrypted data can be (mostly) precomputed as well. -The inner invocation of the hash function in the computation of -DT_MAC_DATA contains information that will be known at encryption -time, assuming non-datagram transmission and receiver support for -the hash function chosen by the sender for MAC calculation. Hence, -the output of this inner invocation of the hash function can be -stored along with the pre-encrypted data, and the MAC calculated -efficiently at transmission time using the normal MAC_KEY, the -pre-calculated hash value, and the hash function used in the -pre-calculation. A separate sequence number is used for MACs in -pre-encrypted data records until a KM_TYPE_RESUME_KEY message or -another KM_TYPE_FIXED_KEY message is sent and received. This -sequence number begins at zero for the first data record sent and -received after the KM_TYPE_FIXED_KEY message, and is incremented for -each data record sent. Replays of non-pre-encrypted data as -pre-encrypted data are prevented by the DATA_TYPE value "pecd", which -cannot correspond to a record header prefix, in the MAC computation. - -In addition to the special sequence number for pre-encrypted data, -the normal sequence number for the same transmission direction -continues to increment normally as pre-encrypted data messages are -sent and received. This original sequence number is returned to use, -thus incremented, when the next key management message of type -KM_TYPE_RESUME_KEY or KM_TYPE_FIXED_KEY is sent and received. - -The receiver of an encrypted record containing a MAC uses the -appropriate MAC_KEY and the received value of ENCRYPTED_DATA to -compute the correct value of MAC_DATA. The computed MAC_DATA must -agree bit for bit with the transmitted MAC_DATA. If the two are not -identical, then an INTEGRITY_CHECK_FAILED error occurs, and it is -recommended that the record be treated as though it had not been -received. (See section 4.6.) - - -8. Constants - -Following is a list of constant values used in the PCT protocol -version 1. - -8.1 Record and message type codes - -These codes are each placed in the record or message type fields of -PCT records and messages. - -RT_HANDSHAKE := 0x0301 -RT_KEY_MGMT := 0x0302 -RT_DATAGRAM := 0x0303 -RT_ERROR := 0x0304 -RT_USER_DATA := 0x0305 -RT_PCT_VERSION_1_CH := 0x0180 -RT_PCT_VERSION_1_SH := 0x0280 -RT_SSL_VERSION_2_CH := 0x0100 -RT_SSL_VERSION_3_CH := 0x00** -RT_CD_RESERVED := 0x6364 -RT_KR_RESERVED := 0x6B72 -RT_ESCROW := 0x0310 - -HS_CLIENT_HELLO := 0x0000 -HS_SERVER_HELLO := 0x0001 -HS_CLIENT_MASTER_KEY := 0x0002 -HS_SERVER_VERIFY := 0x0003 -HS_CLIENT_VERIFY := 0x0004 - -KM_TYPE_FIXED_KEY := 0x0001 -KM_TYPE_RESUME_KEY := 0x0002 -KM_TYPE_REDO_HANDSHAKE := 0x0003 -KM_TYPE_CLOSE_CONN := 0x0004 - -DM_TYPE_USER_DATA := 0x0000 - -PV_TYPE_CERTIFICATE := 0x0001 -PV_TYPE_PKCS_TOKEN := 0x0002 -PV_TYPE_KEA := 0x0003 -PV_TYPE_EPHEMERAL_RSA := 0x0004 -PV_TYPE_EPHEMERAL_DH := 0x0005 - -EW_TYPE_MASTER_KEY := 0x0001 -EW_TYPE_WRITE_KEYS := 0x0002 - -8.2 Specification Type Codes - -These are codes used to specify types of cipher, key exchange, hash -function, certificate, and digital signature in the protocol. - -PCT_EXCH_RSA_PKCS1 := 0x0001 -PCT_EXCH_RSA_PKCS1_TOKEN_DES := 0x0002 -PCT_EXCH_RSA_PKCS1_TOKEN_DES3 := 0x0003 -PCT_EXCH_RSA_PKCS1_TOKEN_RC2 := 0x0004 -PCT_EXCH_RSA_PKCS1_TOKEN_RC4 := 0x0005 -PCT_EXCH_DH_PKCS3 := 0x0006 -PCT_EXCH_DH_PKCS3_TOKEN_DES := 0x0007 -PCT_EXCH_DH_PKCS3_TOKEN_DES3 := 0x0008 -PCT_EXCH_FORTEZZA_TOKEN := 0x0009 - -PCT_CIPHER_DES := 0x0001 -PCT_CIPHER_IDEA := 0x0002 -PCT_CIPHER_RC2 := 0x0003 -PCT_CIPHER_RC4 := 0x0004 -PCT_CIPHER_DES_112 := 0x0005 -PCT_CIPHER_DES_168 := 0x0006 - -PCT_HASH_MD5 := 0x0001 -PCT_HASH_MD5_TRUNC_64 := 0x0002 -PCT_HASH_SHA := 0x0003 -PCT_HASH_SHA_TRUNC_80 := 0x0004 -PCT_HASH_DES_DM := 0x0005 - -PCT_CERT_NONE := 0x0000 -PCT_CERT_X509 := 0x0001 -PCT_CERT_PKCS7 := 0x0002 -PCT_CERT_PRIVATE := 0x0003 - -PCT_SIG_NONE := 0x0000 -PCT_SIG_RSA_MD5 := 0x0001 -PCT_SIG_RSA_SHA := 0x0002 -PCT_SIG_DSA_SHA := 0x0003 - -8.3 Error Codes - -These codes are used to identify errors, when they occur, in error -messages. - -PCT_ERR_BAD_CERTIFICATE := 0x0001 -PCT_ERR_CLIENT_AUTH_FAILED := 0x0002 -PCT_ERR_ILLEGAL_MESSAGE := 0x0003 -PCT_ERR_INTEGRITY_CHECK_FAILED := 0x0004 -PCT_ERR_SERVER_AUTH_FAILED := 0x0005 -PCT_ERR_SPECS_MISMATCH := 0x0006 -PCT_ERR_CONN_BROKEN := 0x0007 - -8.4 Miscellaneous Codes - -These include PCT version 1 escape type codes, version numbers, -and assorted constants associated with the PCT protocol. - -PCT_VERSION_V2 := 0x0002 - -PCT_SESSION_ID_NONE := 0x00 (32 bytes of zeros) -PCT_MAC_KEY_PAD_BYTE := 0x36 - -PCT_ET_OOB_DATA := 0x01 -PCT_ET_REDO_CONN := 0x02 - -PCT_CH_OFFSET_V1 := 0x000A -PCT_CH_OFFSET_V2 := 0x0018 - -PCT_MAX_RECORD_LENGTH_2_BYTE_HEADER := 32767 -PCT_MAX_RECORD_LENGTH_3_BYTE_HEADER := 16383 -PCT_MAX_RECORD_LENGTH_V2 := 32763 - - -9. PCT version 1 compatibility - -PCT version 1 is a subset of PCT version 2; however, because of -differing formats, connections are identified as either using version -1 or version 2. The identification occurs during the handshake phase; -a value of RT_PCT_VERSION_1_CH in the RH_RECORD_TYPE field of a -record header indicates a PCT version 1 CLIENT_HELLO message, and a -value of RT_PCT_VERSION_1_SH in the RH_RECORD_TYPE field of a -record header indicates a PCT version 1 SERVER_HELLO message. If -the former is the first record received in a connection, it signals -to the receiver that it is expected to be a server in a PCT version -1 connection. The client and server then follow the PCT version 1 -protocol for the remainder of the connection. If the latter is the -response received to a PCT version 2 CLIENT_HELLO message, it signals -to the receiver that it is expected to be a client in a PCT version 1 -type connection. The client and server then follow the PCT version -1 protocol for the remainder of the connection. The PCT version 1 -protocol is specified in [2]. - -Note that a PCT version 1 server implementation that correctly uses -the CH_OFFSET field to determine the location of the data fields in -the CLIENT_HELLO message can successfully interpret a PCT version 2 -CLIENT_HELLO message, and reply with a PCT version 1 SERVER_HELLO -message. However, reconnections in a continued session must maintain -the same version as the first connection for the session. - -Note also that a PCT version 1 record header may have a three-byte -record length field; this format can always be recognized by a first -(most significant) bit of zero in the RH_RECORD_LENGTH field. - - -10. Security Considerations - -This entire document is about security. - - -References - -[1] K. Hickman and T. Elgamal. The SSL Protocol. Internet-draft, -June 1995. - -[2] J. Benaloh, B. Lampson, D. Simon, T. Spies and B. Yee. The -PCT Protocol. Internet Draft, October 1995. - -[3] RSA Laboratories, "PKCS #1: RSA Encryption Standard", Version -1.5, November 1993. - -[4] RSA Laboratories, "PKCS #3: "Diffie-Hellman Key-Agreement -Standard", Version 1.4, November 1993. - -[5] NBS FIPS PUB 46, "Data Encryption Standard", National Bureau of -Standards, US Department of Commerce, Jan. 1977. - -[6] X. Lai, "On the Design and Security of Block Ciphers", ETH Series -in Information Processing, v. 1, Konstanz: Hartung-Gorre Verlag, 1992. - -[7] R. Rivest, RFC 1321: "The MD5 Message Digest Algorithm", April -1992. - -[8] NIST FIPS PUB 180-1, "Secure Hash Standard", National Institute -of Standards and Technology, US Department of Commerce, Apr. 1995. - -[9] ISO/IEC 9797, "Data Cryptographic Techniques--Data Integrity -Mechanism Using a Cryptographic Check Function Employing a Block -Cipher Algorithm", 1989. - -[10] CCITT. Recommendation X.509: "The Directory - Authentication -Framework". 1988. - -[11] RSA Laboratories, "PKCS #7: Cryptographic Message Syntax -Standard", Version 1.5, November 1993. - -[12] NIST FIPS PUB 186, "Digital Signature Standard", National -Institute of Standards and Technology, US Department of Commerce, May -1994. - -[13] B. Schneier, "Applied Cryptography: Protocols, Algorithms, and -Source Code in C", John Wiley & Sons, Inc., 1994. - -[14] R.L. Rivest, A. Shamir, L. Adelman, "A Method for Obtaining -Digital Signatures and Public Key Cryptosystems", MIT Laboratory for -Computer Science and Department of Mathematics, S.L. Graham, -R.L. Rivest ed. Communications of the ACM, February 1978 (Vol 21, -No. 2) pp. 120-126. - -[15] W. Diffie and M.E. Hellman, "New directions in Cryptography", -IEEE Transactions on Information Theory, November 1976 (Vol. IT-22, -No. 6) pp. 644-654. - - -Appendix A: Escrow Support - -To facilitate the escrow of keys used in PCT connections (across -firewalls, for instance), we describe here a protocol which can be -used to encapsulate PCT records, passing the encryption keys for -the connection to a third party. The protocol involves a distinct -escrow record type (RT_ESCROW). An escrow record header has the -normal format, although all flags must always be set to zero. The -record itself has the following format: - -char EW_ESCROW_TYPE[2] -char EW_KEY_ID[16] -char EW_KEY_1_LENGTH[2] -char EW_KEY_2_LENGTH[2] -char EW_KEY_1_DATA[([0] << 8)|[1]] -char EW_KEY_2_DATA[([0] << 8)|[1]] -char EW_ENCLOSED_RECORD_DATA[DATA_LENGTH] - -The two defined escrow record types are EW_TYPE_MASTER_KEY and -EW_TYPE_WRITE_KEYS. In the first type, EW_KEY_1_DATA contains the -MASTER_KEY for this session, and EW_KEY_2_DATA is empty, with length -zero. In the second type, EW_KEY_1_DATA contains the sender's -WRITE_KEY, and EW_KEY_2_DATA contains the non-sender's WRITE_KEY. -These keys are encrypted using a key and format determined by the -EW_KEY_ID field, which contains a 16-byte identifier for the key -used in the encryption. The format of the encryption, and the key -distribution method used, are left to the implementation's discretion. -(For example, a PCT connection between sender and escrower can be used -to exchange a symmetric key and associated identifier; alternatively, -a fixed key-exchange RSA public key can be designated as the escrow -key to be used.) ENCLOSED_RECORD_DATA holds a normal PCT record, -whose length can be calculated from the escrow record's header and the -lengths of the other fields in the escrow record. (Note that the -normal length limit for an escrow record thus imposes a -shorter-than-normal limit on the size of the encapsulated record.) - -In a normal connection, the first record sent after all key exchanges -in the handshake have completed might be encapsulated in an escrow -record; the key(s) so escrowed would be in effect until the next -escrow encapsulation. For example, in a connection between a client -and server each operating "behind" a firewall, the client and server -would each encapsulate their last handshake message (or first data -message) in an escrow record, and pass it to the firewall. Each -firewall would receive the encapsulated record, decrypt the -escrowed key(s), then pass the enclosed record through itself -unaltered. Thereafter, each firewall would be able to read all -messages passing in each direction, until a change of key occurred -(prompted by, say, a key management message, which would presumably -have to be enclosed in another escrow record). - -The type of escrow used depends on the level of trust between client -or server and escrower. If a master key is escrowed, then the -escrower is capable of not only decrypting but also altering messages, -recalculating MACs accordingly. On the other hand, if only the -encryption keys are escrowed, then the escrower is incapable not -only of altering messages, but also of verifying MACs (to determine, -for instance, if the correct encryption key was supplied). -Furthermore, since the shared master key is used to derive independent -keys for datagram messages, escrow of only encryption keys makes -incoming datagram traffic unreadable to the escrower. - - - -Patent Statement - -This version of the PCT protocol relies on the use of patented public -key encryption technology for authentication and encryption. The -Internet Standards Process as defined in RFC 1310 requires a written -statement from the Patent holder that a license will be made -available to applicants under reasonable terms and conditions prior -to approving a specification as a Proposed, Draft or Internet -Standard. - -See existing RFCs, including RFC 1170, that discuss known public key -cryptography patents and licensing terms and conditions. - -The Internet Society, Internet Architecture Board, Internet -Engineering Steering Group and the Corporation for National Research -Initiatives take no position on the validity or scope of the patents -and patent applications, nor on the appropriateness of the terms of -the assurance. The Internet Society and other groups mentioned above -have not made any determination as to any other intellectual property -rights which may apply to the practice of this standard. Any further -consideration of these matters is the user's own responsibility. - -Author's Address - -Daniel R. Simon -Microsoft Corp. -One Microsoft Way -Redmond WA 98052 -USA - -pct@microsoft.com - -This Internet-Draft expires 10 October 1996. - - |