| < draft-ietf-tls-rfc4346-bis-06.txt | draft-ietf-tls-rfc4346-bis-07.txt > | |||
|---|---|---|---|---|
| INTERNET-DRAFT Tim Dierks | INTERNET-DRAFT Tim Dierks | |||
| Obsoletes (if approved): RFC 3268, 4346, 4366 Independent | Obsoletes (if approved): RFC 3268, 4346, 4366 Independent | |||
| Intended status: Proposed Standard Eric Rescorla | Intended status: Proposed Standard Eric Rescorla | |||
| Network Resonance, Inc. | Network Resonance, Inc. | |||
| <draft-ietf-tls-rfc4346-bis-06.txt> October 2007 (Expires April 2008) | <draft-ietf-tls-rfc4346-bis-07.txt> November 2007 (Expires May 2008) | |||
| The Transport Layer Security (TLS) Protocol | The Transport Layer Security (TLS) Protocol | |||
| Version 1.2 | Version 1.2 | |||
| Status of this Memo | Status of this Memo | |||
| By submitting this Internet-Draft, each author represents that any | By submitting this Internet-Draft, each author represents that any | |||
| applicable patent or other IPR claims of which he or she is aware | applicable patent or other IPR claims of which he or she is aware | |||
| have been or will be disclosed, and any of which he or she becomes | have been or will be disclosed, and any of which he or she becomes | |||
| aware will be disclosed, in accordance with Section 6 of BCP 79. | aware will be disclosed, in accordance with Section 6 of BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF), its areas, and its working groups. Note that | Task Force (IETF), its areas, and its working groups. Note that | |||
| other groups may also distribute working documents as Internet- | other groups may also distribute working documents as Internet- | |||
| Drafts. | Drafts. | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 1, line 37 ¶ | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| The list of current Internet-Drafts can be accessed at | The list of current Internet-Drafts can be accessed at | |||
| http://www.ietf.org/ietf/1id-abstracts.txt. | http://www.ietf.org/ietf/1id-abstracts.txt. | |||
| The list of Internet-Draft Shadow Directories can be accessed at | The list of Internet-Draft Shadow Directories can be accessed at | |||
| http://www.ietf.org/shadow.html. | http://www.ietf.org/shadow.html. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (C) The IETF Trust (2007). | Copyright (C) The IETF Trust (2007). | |||
| Abstract | Abstract | |||
| This document specifies Version 1.2 of the Transport Layer Security | This document specifies Version 1.2 of the Transport Layer Security | |||
| (TLS) protocol. The TLS protocol provides communications security | (TLS) protocol. The TLS protocol provides communications security | |||
| over the Internet. The protocol allows client/server applications to | over the Internet. The protocol allows client/server applications to | |||
| communicate in a way that is designed to prevent eavesdropping, | communicate in a way that is designed to prevent eavesdropping, | |||
| tampering, or message forgery. | tampering, or message forgery. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction 3 | 1. Introduction 4 | |||
| 1.1 Requirements Terminology 5 | 1.1. Requirements Terminology 5 | |||
| 1.2 Major Differences from TLS 1.1 5 | 1.2. Major Differences from TLS 1.1 5 | |||
| 2. Goals 6 | 2. Goals 6 | |||
| 3. Goals of This Document 6 | 3. Goals of This Document 6 | |||
| 4. Presentation Language 7 | 4. Presentation Language 7 | |||
| 4.1. Basic Block Size 7 | 4.1. Basic Block Size 7 | |||
| 4.2. Miscellaneous 7 | 4.2. Miscellaneous 7 | |||
| 4.3. Vectors 7 | 4.3. Vectors 8 | |||
| 4.4. Numbers 8 | 4.4. Numbers 9 | |||
| 4.5. Enumerateds 9 | 4.5. Enumerateds 9 | |||
| 4.6. Constructed Types 10 | 4.6. Constructed Types 10 | |||
| 4.6.1. Variants 10 | 4.6.1. Variants 10 | |||
| 4.7. Cryptographic Attributes 11 | 4.7. Cryptographic Attributes 11 | |||
| 4.8. Constants 13 | 4.8. Constants 13 | |||
| 5. HMAC and the Pseudorandom Function 13 | 5. HMAC and the Pseudorandom Function 13 | |||
| 6. The TLS Record Protocol 14 | 6. The TLS Record Protocol 14 | |||
| 6.1. Connection States 15 | 6.1. Connection States 15 | |||
| 6.2. Record layer 17 | 6.2. Record layer 18 | |||
| 6.2.1. Fragmentation 17 | 6.2.1. Fragmentation 18 | |||
| 6.2.2. Record Compression and Decompression 19 | 6.2.2. Record Compression and Decompression 19 | |||
| 6.2.3. Record Payload Protection 19 | 6.2.3. Record Payload Protection 20 | |||
| 6.2.3.1. Null or Standard Stream Cipher 20 | 6.2.3.1. Null or Standard Stream Cipher 21 | |||
| 6.2.3.2. CBC Block Cipher 21 | 6.2.3.2. CBC Block Cipher 21 | |||
| 6.2.3.3. AEAD ciphers 23 | 6.2.3.3. AEAD ciphers 23 | |||
| 6.3. Key Calculation 24 | 6.3. Key Calculation 24 | |||
| 7. The TLS Handshaking Protocols 25 | 7. The TLS Handshaking Protocols 25 | |||
| 7.1. Change Cipher Spec Protocol 25 | 7.1. Change Cipher Spec Protocol 26 | |||
| 7.2. Alert Protocol 26 | 7.2. Alert Protocol 27 | |||
| 7.2.1. Closure Alerts 27 | 7.2.1. Closure Alerts 28 | |||
| 7.2.2. Error Alerts 28 | 7.2.2. Error Alerts 29 | |||
| 7.3. Handshake Protocol Overview 31 | 7.3. Handshake Protocol Overview 32 | |||
| 7.4. Handshake Protocol 34 | 7.4. Handshake Protocol 35 | |||
| 7.4.1. Hello Messages 35 | 7.4.1. Hello Messages 36 | |||
| 7.4.1.1. Hello Request 36 | 7.4.1.1. Hello Request 36 | |||
| 7.4.1.2. Client Hello 36 | 7.4.1.2. Client Hello 37 | |||
| 7.4.1.3. Server Hello 39 | 7.4.1.3. Server Hello 40 | |||
| 7.4.1.4 Hello Extensions 41 | 7.4.1.4 Hello Extensions 42 | |||
| 7.4.1.4.1 Signature Hash Algorithms 42 | 7.4.1.4.1 Signature Algorithms 43 | |||
| 7.4.2. Server Certificate 43 | 7.4.2. Server Certificate 44 | |||
| 7.4.3. Server Key Exchange Message 46 | 7.4.3. Server Key Exchange Message 47 | |||
| 7.4.4. Certificate Request 49 | 7.4.4. Certificate Request 49 | |||
| 7.4.5 Server hello done 50 | 7.4.5 Server hello done 51 | |||
| 7.4.6. Client Certificate 51 | 7.4.6. Client Certificate 52 | |||
| 7.4.7. Client Key Exchange Message 52 | 7.4.7. Client Key Exchange Message 53 | |||
| 7.4.7.1. RSA Encrypted Premaster Secret Message 53 | 7.4.7.1. RSA Encrypted Premaster Secret Message 54 | |||
| 7.4.7.2. Client Diffie-Hellman Public Value 55 | 7.4.7.2. Client Diffie-Hellman Public Value 56 | |||
| 7.4.8. Certificate verify 56 | 7.4.8. Certificate verify 57 | |||
| 7.4.9. Finished 57 | 7.4.9. Finished 58 | |||
| 8. Cryptographic Computations 58 | 8. Cryptographic Computations 59 | |||
| 8.1. Computing the Master Secret 58 | 8.1. Computing the Master Secret 60 | |||
| 8.1.1. RSA 59 | 8.1.1. RSA 60 | |||
| 8.1.2. Diffie-Hellman 59 | 8.1.2. Diffie-Hellman 60 | |||
| 9. Mandatory Cipher Suites 59 | 9. Mandatory Cipher Suites 60 | |||
| 10. Application Data Protocol 59 | 10. Application Data Protocol 60 | |||
| 11. Security Considerations 59 | 11. Security Considerations 60 | |||
| 12. IANA Considerations 59 | 12. IANA Considerations 61 | |||
| A. Protocol Constant Values 62 | A. Protocol Constant Values 63 | |||
| A.1. Record Layer 62 | A.1. Record Layer 63 | |||
| A.2. Change Cipher Specs Message 63 | A.2. Change Cipher Specs Message 64 | |||
| A.3. Alert Messages 63 | A.3. Alert Messages 64 | |||
| A.4. Handshake Protocol 65 | A.4. Handshake Protocol 65 | |||
| A.4.1. Hello Messages 65 | A.4.1. Hello Messages 65 | |||
| A.4.2. Server Authentication and Key Exchange Messages 67 | A.4.2. Server Authentication and Key Exchange Messages 67 | |||
| A.4.3. Client Authentication and Key Exchange Messages 68 | A.4.3. Client Authentication and Key Exchange Messages 68 | |||
| A.4.4. Handshake Finalization Message 68 | A.4.4. Handshake Finalization Message 69 | |||
| A.5. The CipherSuite 69 | A.5. The CipherSuite 69 | |||
| A.6. The Security Parameters 71 | A.6. The Security Parameters 72 | |||
| B. Glossary 73 | B. Glossary 73 | |||
| C. CipherSuite Definitions 77 | C. CipherSuite Definitions 77 | |||
| D. Implementation Notes 79 | D. Implementation Notes 79 | |||
| D.1 Random Number Generation and Seeding 79 | D.1 Random Number Generation and Seeding 79 | |||
| D.2 Certificates and Authentication 79 | D.2 Certificates and Authentication 79 | |||
| D.3 CipherSuites 79 | D.3 CipherSuites 79 | |||
| D.4 Implementation Pitfalls 79 | D.4 Implementation Pitfalls 79 | |||
| E. Backward Compatibility 82 | E. Backward Compatibility 82 | |||
| E.1 Compatibility with TLS 1.0/1.1 and SSL 3.0 82 | E.1 Compatibility with TLS 1.0/1.1 and SSL 3.0 82 | |||
| E.2 Compatibility with SSL 2.0 83 | E.2 Compatibility with SSL 2.0 83 | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 3, line 50 ¶ | |||
| F.1.1.1. Anonymous Key Exchange 86 | F.1.1.1. Anonymous Key Exchange 86 | |||
| F.1.1.2. RSA Key Exchange and Authentication 87 | F.1.1.2. RSA Key Exchange and Authentication 87 | |||
| F.1.1.3. Diffie-Hellman Key Exchange with Authentication 87 | F.1.1.3. Diffie-Hellman Key Exchange with Authentication 87 | |||
| F.1.2. Version Rollback Attacks 88 | F.1.2. Version Rollback Attacks 88 | |||
| F.1.3. Detecting Attacks Against the Handshake Protocol 89 | F.1.3. Detecting Attacks Against the Handshake Protocol 89 | |||
| F.1.4. Resuming Sessions 89 | F.1.4. Resuming Sessions 89 | |||
| F.2. Protecting Application Data 89 | F.2. Protecting Application Data 89 | |||
| F.3. Explicit IVs 90 | F.3. Explicit IVs 90 | |||
| F.4. Security of Composite Cipher Modes 90 | F.4. Security of Composite Cipher Modes 90 | |||
| F.5 Denial of Service 91 | F.5 Denial of Service 91 | |||
| F.6 Final Notes 92 | F.6 Final Notes 91 | |||
| 1. Introduction | 1. Introduction | |||
| The primary goal of the TLS Protocol is to provide privacy and data | The primary goal of the TLS Protocol is to provide privacy and data | |||
| integrity between two communicating applications. The protocol is | integrity between two communicating applications. The protocol is | |||
| composed of two layers: the TLS Record Protocol and the TLS Handshake | composed of two layers: the TLS Record Protocol and the TLS Handshake | |||
| Protocol. At the lowest level, layered on top of some reliable | Protocol. At the lowest level, layered on top of some reliable | |||
| transport protocol (e.g., TCP[TCP]), is the TLS Record Protocol. The | transport protocol (e.g., TCP[TCP]), is the TLS Record Protocol. The | |||
| TLS Record Protocol provides connection security that has two basic | TLS Record Protocol provides connection security that has two basic | |||
| properties: | properties: | |||
| - The connection is private. Symmetric cryptography is used for | - The connection is private. Symmetric cryptography is used for | |||
| data encryption (e.g., DES [DES], RC4 [SCH] etc.). The keys for | data encryption (e.g., DES [DES], RC4 [SCH] etc.). The keys for | |||
| this symmetric encryption are generated uniquely for each | this symmetric encryption are generated uniquely for each | |||
| connection and are based on a secret negotiated by another | connection and are based on a secret negotiated by another | |||
| protocol (such as the TLS Handshake Protocol). The Record | protocol (such as the TLS Handshake Protocol). The Record Protocol | |||
| Protocol can also be used without encryption. | can also be used without encryption. | |||
| - The connection is reliable. Message transport includes a message | - The connection is reliable. Message transport includes a message | |||
| integrity check using a keyed MAC. Secure hash functions (e.g., | integrity check using a keyed MAC. Secure hash functions (e.g., | |||
| SHA, MD5, etc.) are used for MAC computations. The Record | SHA, MD5, etc.) are used for MAC computations. The Record Protocol | |||
| Protocol can operate without a MAC, but is generally only used in | can operate without a MAC, but is generally only used in this mode | |||
| this mode while another protocol is using the Record Protocol as | while another protocol is using the Record Protocol as a transport | |||
| a transport for negotiating security parameters. | for negotiating security parameters. | |||
| The TLS Record Protocol is used for encapsulation of various higher- | The TLS Record Protocol is used for encapsulation of various higher- | |||
| level protocols. One such encapsulated protocol, the TLS Handshake | level protocols. One such encapsulated protocol, the TLS Handshake | |||
| Protocol, allows the server and client to authenticate each other and | Protocol, allows the server and client to authenticate each other and | |||
| to negotiate an encryption algorithm and cryptographic keys before | to negotiate an encryption algorithm and cryptographic keys before | |||
| the application protocol transmits or receives its first byte of | the application protocol transmits or receives its first byte of | |||
| data. The TLS Handshake Protocol provides connection security that | data. The TLS Handshake Protocol provides connection security that | |||
| has three basic properties: | has three basic properties: | |||
| - The peer's identity can be authenticated using asymmetric, or | - The peer's identity can be authenticated using asymmetric, or | |||
| public key, cryptography (e.g., RSA [RSA], DSS [DSS], etc.). This | public key, cryptography (e.g., RSA [RSA], DSS [DSS], etc.). This | |||
| authentication can be made optional, but is generally required | authentication can be made optional, but is generally required for | |||
| for at least one of the peers. | at least one of the peers. | |||
| - The negotiation of a shared secret is secure: the negotiated | - The negotiation of a shared secret is secure: the negotiated | |||
| secret is unavailable to eavesdroppers, and for any authenticated | secret is unavailable to eavesdroppers, and for any authenticated | |||
| connection the secret cannot be obtained, even by an attacker who | connection the secret cannot be obtained, even by an attacker who | |||
| can place himself in the middle of the connection. | can place himself in the middle of the connection. | |||
| - The negotiation is reliable: no attacker can modify the | - The negotiation is reliable: no attacker can modify the | |||
| negotiation communication without being detected by the parties | negotiation communication without being detected by the parties to | |||
| to the communication. | the communication. | |||
| One advantage of TLS is that it is application protocol independent. | One advantage of TLS is that it is application protocol independent. | |||
| Higher-level protocols can layer on top of the TLS Protocol | Higher-level protocols can layer on top of the TLS Protocol | |||
| transparently. The TLS standard, however, does not specify how | transparently. The TLS standard, however, does not specify how | |||
| protocols add security with TLS; the decisions on how to initiate TLS | protocols add security with TLS; the decisions on how to initiate TLS | |||
| handshaking and how to interpret the authentication certificates | handshaking and how to interpret the authentication certificates | |||
| exchanged are left to the judgment of the designers and implementors | exchanged are left to the judgment of the designers and implementors | |||
| of protocols that run on top of TLS. | of protocols that run on top of TLS. | |||
| 1.1 Requirements Terminology | 1.1. Requirements Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
| document are to be interpreted as described in RFC 2119 [REQ]. | document are to be interpreted as described in RFC 2119 [REQ]. | |||
| 1.2 Major Differences from TLS 1.1 | 1.2. Major Differences from TLS 1.1 | |||
| This document is a revision of the TLS 1.1 [TLS1.1] protocol which | This document is a revision of the TLS 1.1 [TLS1.1] protocol which | |||
| contains improved flexibility, particularly for negotiation of | contains improved flexibility, particularly for negotiation of | |||
| cryptographic algorithms. The major changes are: | cryptographic algorithms. The major changes are: | |||
| - Merged in TLS Extensions definition and AES Cipher Suites from | - The MD5/SHA-1 combination in the PRF has been replaced with cipher | |||
| external documents [TLSEXT] and [TLSAES]. | suite specified PRFs. All cipher suites in this document use | |||
| P_SHA256. | ||||
| - Replacement of MD5/SHA-1 combination in the PRF. Addition | ||||
| of cipher-suite specified PRFs. | ||||
| - Replacement of MD5/SHA-1 combination in the digitally-signed | - The MD5/SHA-1 combination in the digitally-signed element has been | |||
| element. | replaced with a single hash. | |||
| - Substantial cleanup to the clients and servers ability to | - Substantial cleanup to the clients and servers ability to specify | |||
| specify which digest and signature algorithms they will | which hash and signature algorithms they will accept. Note that | |||
| accept. Note that this also relaxes some of the constraints | this also relaxes some of the constraints on signature and hash | |||
| on signature and digest algorithms from previous versions of | algorithms from previous versions of TLS. | |||
| TLS. | ||||
| - Addition of support for authenticated encryption with additional | - Addition of support for authenticated encryption with additional | |||
| data modes. | data modes. | |||
| - Tightened up a number of requirements. | - TLS Extensions definition and AES Cipher Suites were merged in | |||
| from external [TLSEXT] and [TLSAES]. | ||||
| - Added some guidance that DH groups should be checked for size. | - Tighter checking of EncryptedPreMasterSecret version numbers. | |||
| - Cleaned up description of Bleichenbacher/Klima attack defenses. | - Tightened up a number of requirements. | |||
| - Tighter checking of EncryptedPreMasterSecret version numbers. | - Verify_data length now depends on the cipher suite (default is | |||
| still 12). | ||||
| - Stronger language about when alerts MUST be sent. | - Cleaned up description of Bleichenbacher/Klima attack defenses. | |||
| - Added an Implementation Pitfalls sections | - Alerts MUST now be sent in many cases. | |||
| - After a certificate_request, if no certificates are available, | ||||
| clients now MUST send an empty certificate list. | ||||
| - Harmonized the requirement to send an empty certificate list | - TLS_RSA_WITH_AES_128_CBC_SHA is now the mandatory to implement | |||
| after certificate_request even when no certs are available. | cipher suite. | |||
| - Made the verify_data length depend on the cipher suite. | - IDEE and DES are now deprecated. | |||
| - TLS_RSA_WITH_AES_128_CBC_SHA is now the mandatory to implement | - Support for the SSLv2 backward-compatible hello is now a MAY, not | |||
| cipher suite. | a SHOULD. This will probably become a SHOULD NOT in the future. | |||
| - The usual clarifications and editorial work. | - Added an Implementation Pitfalls sections | |||
| - The usual clarifications and editorial work. | ||||
| 2. Goals | 2. Goals | |||
| The goals of TLS Protocol, in order of their priority, are as | The goals of TLS Protocol, in order of their priority, are as | |||
| follows: | follows: | |||
| 1. Cryptographic security: TLS should be used to establish a secure | 1. Cryptographic security: TLS should be used to establish a secure | |||
| connection between two parties. | connection between two parties. | |||
| 2. Interoperability: Independent programmers should be able to | 2. Interoperability: Independent programmers should be able to | |||
| develop applications utilizing TLS that can successfully exchange | develop applications utilizing TLS that can successfully exchange | |||
| cryptographic parameters without knowledge of one another's code. | cryptographic parameters without knowledge of one another's code. | |||
| 3. Extensibility: TLS seeks to provide a framework into which new | 3. Extensibility: TLS seeks to provide a framework into which new | |||
| public key and bulk encryption methods can be incorporated as | public key and bulk encryption methods can be incorporated as | |||
| necessary. This will also accomplish two sub-goals: preventing | necessary. This will also accomplish two sub-goals: preventing the | |||
| the need to create a new protocol (and risking the introduction | need to create a new protocol (and risking the introduction of | |||
| of possible new weaknesses) and avoiding the need to implement an | possible new weaknesses) and avoiding the need to implement an | |||
| entire new security library. | entire new security library. | |||
| 4. Relative efficiency: Cryptographic operations tend to be highly | 4. Relative efficiency: Cryptographic operations tend to be highly | |||
| CPU intensive, particularly public key operations. For this | CPU intensive, particularly public key operations. For this | |||
| reason, the TLS protocol has incorporated an optional session | reason, the TLS protocol has incorporated an optional session | |||
| caching scheme to reduce the number of connections that need to | caching scheme to reduce the number of connections that need to be | |||
| be established from scratch. Additionally, care has been taken to | established from scratch. Additionally, care has been taken to | |||
| reduce network activity. | reduce network activity. | |||
| 3. Goals of This Document | 3. Goals of This Document | |||
| This document and the TLS protocol itself are based on the SSL 3.0 | This document and the TLS protocol itself are based on the SSL 3.0 | |||
| Protocol Specification as published by Netscape. The differences | Protocol Specification as published by Netscape. The differences | |||
| between this protocol and SSL 3.0 are not dramatic, but they are | between this protocol and SSL 3.0 are not dramatic, but they are | |||
| significant enough that the various versions of TLS and SSL 3.0 do | significant enough that the various versions of TLS and SSL 3.0 do | |||
| not interoperate (although each protocol incorporates a mechanism by | not interoperate (although each protocol incorporates a mechanism by | |||
| which an implementation can back down to prior versions). This | which an implementation can back down to prior versions). This | |||
| document is intended primarily for readers who will be implementing | document is intended primarily for readers who will be implementing | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 7, line 34 ¶ | |||
| no general application beyond that particular goal. | no general application beyond that particular goal. | |||
| 4.1. Basic Block Size | 4.1. Basic Block Size | |||
| The representation of all data items is explicitly specified. The | The representation of all data items is explicitly specified. The | |||
| basic data block size is one byte (i.e., 8 bits). Multiple byte data | basic data block size is one byte (i.e., 8 bits). Multiple byte data | |||
| items are concatenations of bytes, from left to right, from top to | items are concatenations of bytes, from left to right, from top to | |||
| bottom. From the bytestream, a multi-byte item (a numeric in the | bottom. From the bytestream, a multi-byte item (a numeric in the | |||
| example) is formed (using C notation) by: | example) is formed (using C notation) by: | |||
| value = (byte[0] << 8*(n-1)) | (byte[1] << 8*(n-2)) | | value = (byte[0] << 8*(n-1)) | (byte[1] << 8*(n-2)) | | |||
| ... | byte[n-1]; | ... | byte[n-1]; | |||
| This byte ordering for multi-byte values is the commonplace network | This byte ordering for multi-byte values is the commonplace network | |||
| byte order or big endian format. | byte order or big endian format. | |||
| 4.2. Miscellaneous | 4.2. Miscellaneous | |||
| Comments begin with "/*" and end with "*/". | Comments begin with "/*" and end with "*/". | |||
| Optional components are denoted by enclosing them in "[[ ]]" double | Optional components are denoted by enclosing them in "[[ ]]" double | |||
| brackets. | brackets. | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 8, line 13 ¶ | |||
| opaque. | opaque. | |||
| 4.3. Vectors | 4.3. Vectors | |||
| A vector (single dimensioned array) is a stream of homogeneous data | A vector (single dimensioned array) is a stream of homogeneous data | |||
| elements. The size of the vector may be specified at documentation | elements. The size of the vector may be specified at documentation | |||
| time or left unspecified until runtime. In either case, the length | time or left unspecified until runtime. In either case, the length | |||
| declares the number of bytes, not the number of elements, in the | declares the number of bytes, not the number of elements, in the | |||
| vector. The syntax for specifying a new type, T', that is a fixed- | vector. The syntax for specifying a new type, T', that is a fixed- | |||
| length vector of type T is | length vector of type T is | |||
| T T'[n]; | ||||
| T T'[n]; | ||||
| Here, T' occupies n bytes in the data stream, where n is a multiple | Here, T' occupies n bytes in the data stream, where n is a multiple | |||
| of the size of T. The length of the vector is not included in the | of the size of T. The length of the vector is not included in the | |||
| encoded stream. | encoded stream. | |||
| In the following example, Datum is defined to be three consecutive | In the following example, Datum is defined to be three consecutive | |||
| bytes that the protocol does not interpret, while Data is three | bytes that the protocol does not interpret, while Data is three | |||
| consecutive Datum, consuming a total of nine bytes. | consecutive Datum, consuming a total of nine bytes. | |||
| opaque Datum[3]; /* three uninterpreted bytes */ | opaque Datum[3]; /* three uninterpreted bytes */ | |||
| Datum Data[9]; /* 3 consecutive 3 byte vectors */ | Datum Data[9]; /* 3 consecutive 3 byte vectors */ | |||
| Variable-length vectors are defined by specifying a subrange of legal | Variable-length vectors are defined by specifying a subrange of legal | |||
| lengths, inclusively, using the notation <floor..ceiling>. When | lengths, inclusively, using the notation <floor..ceiling>. When | |||
| these are encoded, the actual length precedes the vector's contents | these are encoded, the actual length precedes the vector's contents | |||
| in the byte stream. The length will be in the form of a number | in the byte stream. The length will be in the form of a number | |||
| consuming as many bytes as required to hold the vector's specified | consuming as many bytes as required to hold the vector's specified | |||
| maximum (ceiling) length. A variable-length vector with an actual | maximum (ceiling) length. A variable-length vector with an actual | |||
| length field of zero is referred to as an empty vector. | length field of zero is referred to as an empty vector. | |||
| T T'<floor..ceiling>; | T T'<floor..ceiling>; | |||
| In the following example, mandatory is a vector that must contain | In the following example, mandatory is a vector that must contain | |||
| between 300 and 400 bytes of type opaque. It can never be empty. The | between 300 and 400 bytes of type opaque. It can never be empty. The | |||
| actual length field consumes two bytes, a uint16, sufficient to | actual length field consumes two bytes, a uint16, sufficient to | |||
| represent the value 400 (see Section 4.4). On the other hand, longer | represent the value 400 (see Section 4.4). On the other hand, longer | |||
| can represent up to 800 bytes of data, or 400 uint16 elements, and it | can represent up to 800 bytes of data, or 400 uint16 elements, and it | |||
| may be empty. Its encoding will include a two-byte actual length | may be empty. Its encoding will include a two-byte actual length | |||
| field prepended to the vector. The length of an encoded vector must | field prepended to the vector. The length of an encoded vector must | |||
| be an even multiple of the length of a single element (for example, a | be an even multiple of the length of a single element (for example, a | |||
| 17-byte vector of uint16 would be illegal). | 17-byte vector of uint16 would be illegal). | |||
| opaque mandatory<300..400>; | opaque mandatory<300..400>; | |||
| /* length field is 2 bytes, cannot be empty */ | /* length field is 2 bytes, cannot be empty */ | |||
| uint16 longer<0..800>; | uint16 longer<0..800>; | |||
| /* zero to 400 16-bit unsigned integers */ | /* zero to 400 16-bit unsigned integers */ | |||
| 4.4. Numbers | 4.4. Numbers | |||
| The basic numeric data type is an unsigned byte (uint8). All larger | The basic numeric data type is an unsigned byte (uint8). All larger | |||
| numeric data types are formed from fixed-length series of bytes | numeric data types are formed from fixed-length series of bytes | |||
| concatenated as described in Section 4.1 and are also unsigned. The | concatenated as described in Section 4.1 and are also unsigned. The | |||
| following numeric types are predefined. | following numeric types are predefined. | |||
| uint8 uint16[2]; | uint8 uint16[2]; | |||
| uint8 uint24[3]; | uint8 uint24[3]; | |||
| uint8 uint32[4]; | uint8 uint32[4]; | |||
| uint8 uint64[8]; | uint8 uint64[8]; | |||
| All values, here and elsewhere in the specification, are stored in | All values, here and elsewhere in the specification, are stored in | |||
| "network" or "big-endian" order; the uint32 represented by the hex | "network" or "big-endian" order; the uint32 represented by the hex | |||
| bytes 01 02 03 04 is equivalent to the decimal value 16909060. | bytes 01 02 03 04 is equivalent to the decimal value 16909060. | |||
| Note that in some cases (e.g., DH parameters) it is necessary to | Note that in some cases (e.g., DH parameters) it is necessary to | |||
| represent integers as opaque vectors. In such cases, they are | represent integers as opaque vectors. In such cases, they are | |||
| represented as unsigned integers (i.e., leading zero octets are not | represented as unsigned integers (i.e., leading zero octets are not | |||
| required even if the most significant bit is set). | required even if the most significant bit is set). | |||
| 4.5. Enumerateds | 4.5. Enumerateds | |||
| An additional sparse data type is available called enum. A field of | An additional sparse data type is available called enum. A field of | |||
| type enum can only assume the values declared in the definition. | type enum can only assume the values declared in the definition. | |||
| Each definition is a different type. Only enumerateds of the same | Each definition is a different type. Only enumerateds of the same | |||
| type may be assigned or compared. Every element of an enumerated must | type may be assigned or compared. Every element of an enumerated must | |||
| be assigned a value, as demonstrated in the following example. Since | be assigned a value, as demonstrated in the following example. Since | |||
| the elements of the enumerated are not ordered, they can be assigned | the elements of the enumerated are not ordered, they can be assigned | |||
| any unique value, in any order. | any unique value, in any order. | |||
| enum { e1(v1), e2(v2), ... , en(vn) [[, (n)]] } Te; | enum { e1(v1), e2(v2), ... , en(vn) [[, (n)]] } Te; | |||
| Enumerateds occupy as much space in the byte stream as would its | Enumerateds occupy as much space in the byte stream as would its | |||
| maximal defined ordinal value. The following definition would cause | maximal defined ordinal value. The following definition would cause | |||
| one byte to be used to carry fields of type Color. | one byte to be used to carry fields of type Color. | |||
| enum { red(3), blue(5), white(7) } Color; | enum { red(3), blue(5), white(7) } Color; | |||
| One may optionally specify a value without its associated tag to | One may optionally specify a value without its associated tag to | |||
| force the width definition without defining a superfluous element. | force the width definition without defining a superfluous element. | |||
| In the following example, Taste will consume two bytes in the data | In the following example, Taste will consume two bytes in the data | |||
| stream but can only assume the values 1, 2, or 4. | stream but can only assume the values 1, 2, or 4. | |||
| enum { sweet(1), sour(2), bitter(4), (32000) } Taste; | enum { sweet(1), sour(2), bitter(4), (32000) } Taste; | |||
| The names of the elements of an enumeration are scoped within the | The names of the elements of an enumeration are scoped within the | |||
| defined type. In the first example, a fully qualified reference to | defined type. In the first example, a fully qualified reference to | |||
| the second element of the enumeration would be Color.blue. Such | the second element of the enumeration would be Color.blue. Such | |||
| qualification is not required if the target of the assignment is well | qualification is not required if the target of the assignment is well | |||
| specified. | specified. | |||
| Color color = Color.blue; /* overspecified, legal */ | Color color = Color.blue; /* overspecified, legal */ | |||
| Color color = blue; /* correct, type implicit */ | Color color = blue; /* correct, type implicit */ | |||
| For enumerateds that are never converted to external representation, | For enumerateds that are never converted to external representation, | |||
| the numerical information may be omitted. | the numerical information may be omitted. | |||
| enum { low, medium, high } Amount; | enum { low, medium, high } Amount; | |||
| 4.6. Constructed Types | 4.6. Constructed Types | |||
| Structure types may be constructed from primitive types for | Structure types may be constructed from primitive types for | |||
| convenience. Each specification declares a new, unique type. The | convenience. Each specification declares a new, unique type. The | |||
| syntax for definition is much like that of C. | syntax for definition is much like that of C. | |||
| struct { | struct { | |||
| T1 f1; | T1 f1; | |||
| T2 f2; | T2 f2; | |||
| ... | ... | |||
| Tn fn; | Tn fn; | |||
| } [[T]]; | } [[T]]; | |||
| The fields within a structure may be qualified using the type's name, | The fields within a structure may be qualified using the type's name, | |||
| with a syntax much like that available for enumerateds. For example, | with a syntax much like that available for enumerateds. For example, | |||
| T.f2 refers to the second field of the previous declaration. | T.f2 refers to the second field of the previous declaration. | |||
| Structure definitions may be embedded. | Structure definitions may be embedded. | |||
| 4.6.1. Variants | 4.6.1. Variants | |||
| Defined structures may have variants based on some knowledge that is | Defined structures may have variants based on some knowledge that is | |||
| available within the environment. The selector must be an enumerated | available within the environment. The selector must be an enumerated | |||
| type that defines the possible variants the structure defines. There | type that defines the possible variants the structure defines. There | |||
| must be a case arm for every element of the enumeration declared in | must be a case arm for every element of the enumeration declared in | |||
| the select. The body of the variant structure may be given a label | the select. The body of the variant structure may be given a label | |||
| for reference. The mechanism by which the variant is selected at | for reference. The mechanism by which the variant is selected at | |||
| runtime is not prescribed by the presentation language. | runtime is not prescribed by the presentation language. | |||
| struct { | struct { | |||
| T1 f1; | T1 f1; | |||
| T2 f2; | T2 f2; | |||
| .... | .... | |||
| Tn fn; | Tn fn; | |||
| select (E) { | select (E) { | |||
| case e1: Te1; | case e1: Te1; | |||
| case e2: Te2; | case e2: Te2; | |||
| .... | .... | |||
| case en: Ten; | case en: Ten; | |||
| } [[fv]]; | } [[fv]]; | |||
| } [[Tv]]; | } [[Tv]]; | |||
| For example: | For example: | |||
| enum { apple, orange } VariantTag; | enum { apple, orange } VariantTag; | |||
| struct { | struct { | |||
| uint16 number; | uint16 number; | |||
| opaque string<0..10>; /* variable length */ | opaque string<0..10>; /* variable length */ | |||
| } V1; | } V1; | |||
| struct { | struct { | |||
| uint32 number; | uint32 number; | |||
| opaque string[10]; /* fixed length */ | opaque string[10]; /* fixed length */ | |||
| } V2; | } V2; | |||
| struct { | struct { | |||
| select (VariantTag) { /* value of selector is implicit */ | select (VariantTag) { /* value of selector is implicit */ | |||
| case apple: V1; /* VariantBody, tag = apple */ | case apple: V1; /* VariantBody, tag = apple */ | |||
| case orange: V2; /* VariantBody, tag = orange */ | case orange: V2; /* VariantBody, tag = orange */ | |||
| } variant_body; /* optional label on variant */ | } variant_body; /* optional label on variant */ | |||
| } VariantRecord; | } VariantRecord; | |||
| Variant structures may be qualified (narrowed) by specifying a value | Variant structures may be qualified (narrowed) by specifying a value | |||
| for the selector prior to the type. For example, an | for the selector prior to the type. For example, an | |||
| orange VariantRecord | orange VariantRecord | |||
| is a narrowed type of a VariantRecord containing a variant_body of | is a narrowed type of a VariantRecord containing a variant_body of | |||
| type V2. | type V2. | |||
| 4.7. Cryptographic Attributes | 4.7. Cryptographic Attributes | |||
| The five cryptographic operations digital signing, stream cipher | The five cryptographic operations digital signing, stream cipher | |||
| encryption, block cipher encryption, authenticated encryption with | encryption, block cipher encryption, authenticated encryption with | |||
| additional data (AEAD) encryption and public key encryption are | additional data (AEAD) encryption and public key encryption are | |||
| designated digitally-signed, stream-ciphered, block-ciphered, aead- | designated digitally-signed, stream-ciphered, block-ciphered, aead- | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 12, line 7 ¶ | |||
| Cryptographic keys are implied by the current session state (see | Cryptographic keys are implied by the current session state (see | |||
| Section 6.1). | Section 6.1). | |||
| In digital signing, one-way hash functions are used as input for a | In digital signing, one-way hash functions are used as input for a | |||
| signing algorithm. A digitally-signed element is encoded as an opaque | signing algorithm. A digitally-signed element is encoded as an opaque | |||
| vector <0..2^16-1>, where the length is specified by the signing | vector <0..2^16-1>, where the length is specified by the signing | |||
| algorithm and key. | algorithm and key. | |||
| In RSA signing, the opaque vector contains the signature generated | In RSA signing, the opaque vector contains the signature generated | |||
| using the RSASSA-PKCS1-v1_5 signature scheme defined in [PKCS1]. As | using the RSASSA-PKCS1-v1_5 signature scheme defined in [PKCS1]. As | |||
| discussed in [PKCS1], the DigestInfo MUST be DER encoded and for | discussed in [PKCS1], the DigestInfo MUST be DER encoded and for hash | |||
| digest algorithms without parameters (which include SHA-1) the | algorithms without parameters (which include SHA-1) the | |||
| DigestInfo.AlgorithmIdentifier.parameters field MUST be NULL but | DigestInfo.AlgorithmIdentifier.parameters field MUST be NULL but | |||
| implementations MUST accept both without parameters and with NULL | implementations MUST accept both without parameters and with NULL | |||
| parameters. Note that earlier versions of TLS used a different RSA | parameters. Note that earlier versions of TLS used a different RSA | |||
| signature scheme which did not include a DigestInfo encoding. | signature scheme which did not include a DigestInfo encoding. | |||
| In DSS, the 20 bytes of the SHA-1 hash are run directly through the | In DSS, the 20 bytes of the SHA-1 hash are run directly through the | |||
| Digital Signing Algorithm with no additional hashing. This produces | Digital Signing Algorithm with no additional hashing. This produces | |||
| two values, r and s. The DSS signature is an opaque vector, as above, | two values, r and s. The DSS signature is an opaque vector, as above, | |||
| the contents of which are the DER encoding of: | the contents of which are the DER encoding of: | |||
| Dss-Sig-Value ::= SEQUENCE { | Dss-Sig-Value ::= SEQUENCE { | |||
| r INTEGER, | r INTEGER, | |||
| s INTEGER | s INTEGER | |||
| } | } | |||
| Note: In current terminology, DSA refers to the Digital Signature | Note: In current terminology, DSA refers to the Digital Signature | |||
| Algorithm and DSS refers to the NIST standard. For historical | Algorithm and DSS refers to the NIST standard. For historical | |||
| reasons, this document uses DSS and DSA interchangeably | reasons, this document uses DSS and DSA interchangeably | |||
| to refer to the DSA algorithm, as was done in SSLv3. | to refer to the DSA algorithm, as was done in SSLv3. | |||
| In stream cipher encryption, the plaintext is exclusive-ORed with an | In stream cipher encryption, the plaintext is exclusive-ORed with an | |||
| identical amount of output generated from a cryptographically secure | identical amount of output generated from a cryptographically secure | |||
| keyed pseudorandom number generator. | keyed pseudorandom number generator. | |||
| In block cipher encryption, every block of plaintext encrypts to a | In block cipher encryption, every block of plaintext encrypts to a | |||
| block of ciphertext. All block cipher encryption is done in CBC | block of ciphertext. All block cipher encryption is done in CBC | |||
| (Cipher Block Chaining) mode, and all items that are block-ciphered | (Cipher Block Chaining) mode, and all items that are block-ciphered | |||
| will be an exact multiple of the cipher block length. | will be an exact multiple of the cipher block length. | |||
| In AEAD encryption, the plaintext is simultaneously encrypted and | In AEAD encryption, the plaintext is simultaneously encrypted and | |||
| integrity protected. The input may be of any length and the output is | integrity protected. The input may be of any length and aead-ciphered | |||
| generally larger than the input in order to accomodate the integrity | output is generally larger than the input in order to accomodate the | |||
| check value. | integrity check value. | |||
| In public key encryption, a public key algorithm is used to encrypt | In public key encryption, a public key algorithm is used to encrypt | |||
| data in such a way that it can be decrypted only with the matching | data in such a way that it can be decrypted only with the matching | |||
| private key. A public-key-encrypted element is encoded as an opaque | private key. A public-key-encrypted element is encoded as an opaque | |||
| vector <0..2^16-1>, where the length is specified by the encryption | vector <0..2^16-1>, where the length is specified by the encryption | |||
| algorithm and key. | algorithm and key. | |||
| RSA encryption is done using the RSAES-PKCS1-v1_5 encryption scheme | RSA encryption is done using the RSAES-PKCS1-v1_5 encryption scheme | |||
| defined in [PKCS1]. | defined in [PKCS1]. | |||
| In the following example | In the following example | |||
| stream-ciphered struct { | stream-ciphered struct { | |||
| uint8 field1; | uint8 field1; | |||
| uint8 field2; | uint8 field2; | |||
| digitally-signed opaque hash[20]; | digitally-signed opaque hash[20]; | |||
| } UserType; | } UserType; | |||
| the contents of hash are used as input for the signing algorithm, and | the contents of hash are used as input for the signing algorithm, and | |||
| then the entire structure is encrypted with a stream cipher. The | then the entire structure is encrypted with a stream cipher. The | |||
| length of this structure, in bytes, would be equal to two bytes for | length of this structure, in bytes, would be equal to two bytes for | |||
| field1 and field2, plus two bytes for the length of the signature, | field1 and field2, plus two bytes for the length of the signature, | |||
| plus the length of the output of the signing algorithm. This is known | plus the length of the output of the signing algorithm. This is known | |||
| because the algorithm and key used for the signing are known prior to | because the algorithm and key used for the signing are known prior to | |||
| encoding or decoding this structure. | encoding or decoding this structure. | |||
| 4.8. Constants | 4.8. Constants | |||
| Typed constants can be defined for purposes of specification by | Typed constants can be defined for purposes of specification by | |||
| declaring a symbol of the desired type and assigning values to it. | declaring a symbol of the desired type and assigning values to it. | |||
| Under-specified types (opaque, variable length vectors, and | Under-specified types (opaque, variable length vectors, and | |||
| structures that contain opaque) cannot be assigned values. No fields | structures that contain opaque) cannot be assigned values. No fields | |||
| of a multi-element structure or vector may be elided. | of a multi-element structure or vector may be elided. | |||
| For example: | For example: | |||
| struct { | struct { | |||
| uint8 f1; | uint8 f1; | |||
| uint8 f2; | uint8 f2; | |||
| } Example1; | } Example1; | |||
| Example1 ex1 = {1, 4}; /* assigns f1 = 1, f2 = 4 */ | Example1 ex1 = {1, 4}; /* assigns f1 = 1, f2 = 4 */ | |||
| 5. HMAC and the Pseudorandom Function | 5. HMAC and the Pseudorandom Function | |||
| The TLS record layer uses a keyed Message Authentication Code (MAC) | The TLS record layer uses a keyed Message Authentication Code (MAC) | |||
| to protect message integrity. The cipher suites defined in this | to protect message integrity. The cipher suites defined in this | |||
| document use a construction known as HMAC, described in [HMAC], which | document use a construction known as HMAC, described in [HMAC], which | |||
| is based on a hash function. Other cipher suites MAY define their own | is based on a hash function. Other cipher suites MAY define their own | |||
| MAC constructions, if needed. | MAC constructions, if needed. | |||
| In addition, a construction is required to do expansion of secrets | In addition, a construction is required to do expansion of secrets | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 14, line 14 ¶ | |||
| SHA-256 hash function is used for all cipher suites defined in this | SHA-256 hash function is used for all cipher suites defined in this | |||
| document and in TLS documents published prior to this document when | document and in TLS documents published prior to this document when | |||
| TLS 1.2 is negotiated. New cipher suites MUST explicitly specify a | TLS 1.2 is negotiated. New cipher suites MUST explicitly specify a | |||
| PRF and in general SHOULD use the TLS PRF with SHA-256 or a stronger | PRF and in general SHOULD use the TLS PRF with SHA-256 or a stronger | |||
| standard hash function. | standard hash function. | |||
| First, we define a data expansion function, P_hash(secret, data) that | First, we define a data expansion function, P_hash(secret, data) that | |||
| uses a single hash function to expand a secret and seed into an | uses a single hash function to expand a secret and seed into an | |||
| arbitrary quantity of output: | arbitrary quantity of output: | |||
| P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) + | P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) + | |||
| HMAC_hash(secret, A(2) + seed) + | HMAC_hash(secret, A(2) + seed) + | |||
| HMAC_hash(secret, A(3) + seed) + ... | HMAC_hash(secret, A(3) + seed) + ... | |||
| Where + indicates concatenation. | Where + indicates concatenation. | |||
| A() is defined as: | A() is defined as: | |||
| A(0) = seed | ||||
| A(i) = HMAC_hash(secret, A(i-1)) | A(0) = seed | |||
| A(i) = HMAC_hash(secret, A(i-1)) | ||||
| P_hash can be iterated as many times as is necessary to produce the | P_hash can be iterated as many times as is necessary to produce the | |||
| required quantity of data. For example, if P_SHA-1 is being used to | required quantity of data. For example, if P_SHA-1 is being used to | |||
| create 64 bytes of data, it will have to be iterated 4 times (through | create 64 bytes of data, it will have to be iterated 4 times (through | |||
| A(4)), creating 80 bytes of output data; the last 16 bytes of the | A(4)), creating 80 bytes of output data; the last 16 bytes of the | |||
| final iteration will then be discarded, leaving 64 bytes of output | final iteration will then be discarded, leaving 64 bytes of output | |||
| data. | data. | |||
| TLS's PRF is created by applying P_hash to the secret as: | TLS's PRF is created by applying P_hash to the secret as: | |||
| PRF(secret, label, seed) = P_<hash>(secret, label + seed) | PRF(secret, label, seed) = P_<hash>(secret, label + seed) | |||
| The label is an ASCII string. It should be included in the exact form | The label is an ASCII string. It should be included in the exact form | |||
| it is given without a length byte or trailing null character. For | it is given without a length byte or trailing null character. For | |||
| example, the label "slithy toves" would be processed by hashing the | example, the label "slithy toves" would be processed by hashing the | |||
| following bytes: | following bytes: | |||
| 73 6C 69 74 68 79 20 74 6F 76 65 73 | 73 6C 69 74 68 79 20 74 6F 76 65 73 | |||
| 6. The TLS Record Protocol | 6. The TLS Record Protocol | |||
| The TLS Record Protocol is a layered protocol. At each layer, | The TLS Record Protocol is a layered protocol. At each layer, | |||
| messages may include fields for length, description, and content. | messages may include fields for length, description, and content. | |||
| The Record Protocol takes messages to be transmitted, fragments the | The Record Protocol takes messages to be transmitted, fragments the | |||
| data into manageable blocks, optionally compresses the data, applies | data into manageable blocks, optionally compresses the data, applies | |||
| a MAC, encrypts, and transmits the result. Received data is | a MAC, encrypts, and transmits the result. Received data is | |||
| decrypted, verified, decompressed, reassembled, and then delivered to | decrypted, verified, decompressed, reassembled, and then delivered to | |||
| higher-level clients. | higher-level clients. | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 15, line 29 ¶ | |||
| deal with all possible attacks against it. Note that because the | deal with all possible attacks against it. Note that because the | |||
| type and length of a record are not protected by encryption, care | type and length of a record are not protected by encryption, care | |||
| SHOULD be taken to minimize the value of traffic analysis of these | SHOULD be taken to minimize the value of traffic analysis of these | |||
| values. | values. | |||
| 6.1. Connection States | 6.1. Connection States | |||
| A TLS connection state is the operating environment of the TLS Record | A TLS connection state is the operating environment of the TLS Record | |||
| Protocol. It specifies a compression algorithm, an encryption | Protocol. It specifies a compression algorithm, an encryption | |||
| algorithm, and a MAC algorithm. In addition, the parameters for these | algorithm, and a MAC algorithm. In addition, the parameters for these | |||
| algorithms are known: the MAC secret and the bulk encryption keys for | algorithms are known: the MAC key and the bulk encryption keys for | |||
| the connection in both the read and the write directions. Logically, | the connection in both the read and the write directions. Logically, | |||
| there are always four connection states outstanding: the current read | there are always four connection states outstanding: the current read | |||
| and write states, and the pending read and write states. All records | and write states, and the pending read and write states. All records | |||
| are processed under the current read and write states. The security | are processed under the current read and write states. The security | |||
| parameters for the pending states can be set by the TLS Handshake | parameters for the pending states can be set by the TLS Handshake | |||
| Protocol, and the Change Cipher Spec can selectively make either of | Protocol, and the Change Cipher Spec can selectively make either of | |||
| the pending states current, in which case the appropriate current | the pending states current, in which case the appropriate current | |||
| state is disposed of and replaced with the pending state; the pending | state is disposed of and replaced with the pending state; the pending | |||
| state is then reinitialized to an empty state. It is illegal to make | state is then reinitialized to an empty state. It is illegal to make | |||
| a state that has not been initialized with security parameters a | a state that has not been initialized with security parameters a | |||
| current state. The initial current state always specifies that no | current state. The initial current state always specifies that no | |||
| encryption, compression, or MAC will be used. | encryption, compression, or MAC will be used. | |||
| The security parameters for a TLS Connection read and write state are | The security parameters for a TLS Connection read and write state are | |||
| set by providing the following values: | set by providing the following values: | |||
| connection end | connection end | |||
| Whether this entity is considered the "client" or the "server" in | Whether this entity is considered the "client" or the "server" in | |||
| this connection. | this connection. | |||
| PRF algorithm | ||||
| An algorithm used to generate keys from the master secret (see | ||||
| Sections 5 and 6.3). | ||||
| bulk encryption algorithm | bulk encryption algorithm | |||
| An algorithm to be used for bulk encryption. This specification | An algorithm to be used for bulk encryption. This specification | |||
| includes the key size of this algorithm, how much of that key is | includes the key size of this algorithm, whether it is a block, | |||
| secret, whether it is a block, stream, or AEAD cipher, and the | stream, or AEAD cipher, the block size of the cipher (if | |||
| block size and fixed initialization vector size of the cipher (if | appropriate), and the lengths of explicit and implicit | |||
| appropriate). | initialization vectors (or nonces). | |||
| MAC algorithm | MAC algorithm | |||
| An algorithm to be used for message authentication. This | An algorithm to be used for message authentication. This | |||
| specification includes the size of the value returned by the MAC | specification includes the size of the value returned by the MAC | |||
| algorithm. | algorithm. | |||
| compression algorithm | compression algorithm | |||
| An algorithm to be used for data compression. This specification | An algorithm to be used for data compression. This specification | |||
| must include all information the algorithm requires to do | must include all information the algorithm requires to do | |||
| compression. | compression. | |||
| master secret | master secret | |||
| A 48-byte secret shared between the two peers in the connection. | A 48-byte secret shared between the two peers in the connection. | |||
| client random | client random | |||
| A 32-byte value provided by the client. | A 32-byte value provided by the client. | |||
| server random | server random | |||
| A 32-byte value provided by the server. | A 32-byte value provided by the server. | |||
| These parameters are defined in the presentation language as: | These parameters are defined in the presentation language as: | |||
| enum { server, client } ConnectionEnd; | enum { server, client } ConnectionEnd; | |||
| enum { null, rc4, rc2, des, 3des, idea, aes } | enum { tls_prf_sha256 } PRFAlgorithm; | |||
| BulkCipherAlgorithm; | ||||
| enum { stream, block, aead } CipherType; | enum { null, rc4, 3des, aes } | |||
| BulkCipherAlgorithm; | ||||
| enum { null, hmac_md5, hmac_sha, hmac_sha256, hmac_sha384, | enum { stream, block, aead } CipherType; | |||
| hmac_sha512} MACAlgorithm; | ||||
| /* The use of "sha" above is historical and denotes SHA-1 */ | enum { null, hmac_md5, hmac_sha, hmac_sha256, hmac_sha384, | |||
| hmac_sha512} MACAlgorithm; | ||||
| enum { null(0), (255) } CompressionMethod; | /* The use of "sha" above is historical and denotes SHA-1 */ | |||
| /* The algorithms specified in CompressionMethod, | enum { null(0), (255) } CompressionMethod; | |||
| BulkCipherAlgorithm, and MACAlgorithm may be added to. */ | /* The algorithms specified in CompressionMethod, | |||
| BulkCipherAlgorithm, and MACAlgorithm may be added to. */ | ||||
| struct { | struct { | |||
| ConnectionEnd entity; | ConnectionEnd entity; | |||
| BulkCipherAlgorithm bulk_cipher_algorithm; | PRFAlgorithm prf_algorithm; | |||
| CipherType cipher_type; | BulkCipherAlgorithm bulk_cipher_algorithm; | |||
| uint8 enc_key_length; | CipherType cipher_type; | |||
| uint8 block_length; | uint8 enc_key_length; | |||
| uint8 fixed_iv_length; | uint8 block_length; | |||
| uint8 record_iv_length; | uint8 fixed_iv_length; | |||
| MACAlgorithm mac_algorithm; | uint8 record_iv_length; | |||
| uint8 mac_length; | MACAlgorithm mac_algorithm; | |||
| uint8 mac_key_length; | uint8 mac_length; | |||
| uint8 verify_data_length; | uint8 mac_key_length; | |||
| CompressionMethod compression_algorithm; | CompressionMethod compression_algorithm; | |||
| opaque master_secret[48]; | opaque master_secret[48]; | |||
| opaque client_random[32]; | opaque client_random[32]; | |||
| opaque server_random[32]; | opaque server_random[32]; | |||
| } SecurityParameters; | } SecurityParameters; | |||
| The record layer will use the security parameters to generate the | The record layer will use the security parameters to generate the | |||
| following six items: | following six items (some of which are not required by all ciphers, | |||
| and are thus empty): | ||||
| client write MAC secret | client write MAC key | |||
| server write MAC secret | server write MAC key | |||
| client write key | client write encryption key | |||
| server write key | server write encryption key | |||
| client write IV | client write IV | |||
| server write IV | server write IV | |||
| The client write parameters are used by the server when receiving and | The client write parameters are used by the server when receiving and | |||
| processing records and vice-versa. The algorithm used for generating | processing records and vice-versa. The algorithm used for generating | |||
| these items from the security parameters is described in Section 6.3. | these items from the security parameters is described in Section 6.3. | |||
| Once the security parameters have been set and the keys have been | Once the security parameters have been set and the keys have been | |||
| generated, the connection states can be instantiated by making them | generated, the connection states can be instantiated by making them | |||
| the current states. These current states MUST be updated for each | the current states. These current states MUST be updated for each | |||
| record processed. Each connection state includes the following | record processed. Each connection state includes the following | |||
| elements: | elements: | |||
| compression state | compression state | |||
| The current state of the compression algorithm. | The current state of the compression algorithm. | |||
| cipher state | cipher state | |||
| The current state of the encryption algorithm. This will consist | The current state of the encryption algorithm. This will consist | |||
| of the scheduled key for that connection. For stream ciphers, | of the scheduled key for that connection. For stream ciphers, this | |||
| this will also contain whatever state information is necessary to | will also contain whatever state information is necessary to allow | |||
| allow the stream to continue to encrypt or decrypt data. | the stream to continue to encrypt or decrypt data. | |||
| MAC secret | MAC key | |||
| The MAC secret for this connection, as generated above. | The MAC key for this connection, as generated above. | |||
| sequence number | sequence number | |||
| Each connection state contains a sequence number, which is | Each connection state contains a sequence number, which is | |||
| maintained separately for read and write states. The sequence | maintained separately for read and write states. The sequence | |||
| number MUST be set to zero whenever a connection state is made | number MUST be set to zero whenever a connection state is made the | |||
| the active state. Sequence numbers are of type uint64 and may not | active state. Sequence numbers are of type uint64 and may not | |||
| exceed 2^64-1. Sequence numbers do not wrap. If a TLS | exceed 2^64-1. Sequence numbers do not wrap. If a TLS | |||
| implementation would need to wrap a sequence number, it must | implementation would need to wrap a sequence number, it must | |||
| renegotiate instead. A sequence number is incremented after each | renegotiate instead. A sequence number is incremented after each | |||
| record: specifically, the first record transmitted under a | record: specifically, the first record transmitted under a | |||
| particular connection state MUST use sequence number 0. | particular connection state MUST use sequence number 0. | |||
| 6.2. Record layer | 6.2. Record layer | |||
| The TLS Record Layer receives uninterpreted data from higher layers | The TLS Record Layer receives uninterpreted data from higher layers | |||
| in non-empty blocks of arbitrary size. | in non-empty blocks of arbitrary size. | |||
| 6.2.1. Fragmentation | 6.2.1. Fragmentation | |||
| The record layer fragments information blocks into TLSPlaintext | The record layer fragments information blocks into TLSPlaintext | |||
| records carrying data in chunks of 2^14 bytes or less. Client message | records carrying data in chunks of 2^14 bytes or less. Client message | |||
| boundaries are not preserved in the record layer (i.e., multiple | boundaries are not preserved in the record layer (i.e., multiple | |||
| client messages of the same ContentType MAY be coalesced into a | client messages of the same ContentType MAY be coalesced into a | |||
| single TLSPlaintext record, or a single message MAY be fragmented | single TLSPlaintext record, or a single message MAY be fragmented | |||
| across several records). | across several records). | |||
| struct { | struct { | |||
| uint8 major, minor; | uint8 major, minor; | |||
| } ProtocolVersion; | } ProtocolVersion; | |||
| enum { | enum { | |||
| change_cipher_spec(20), alert(21), handshake(22), | change_cipher_spec(20), alert(21), handshake(22), | |||
| application_data(23), (255) | application_data(23), (255) | |||
| } ContentType; | } ContentType; | |||
| struct { | struct { | |||
| ContentType type; | ContentType type; | |||
| ProtocolVersion version; | ProtocolVersion version; | |||
| uint16 length; | uint16 length; | |||
| opaque fragment[TLSPlaintext.length]; | opaque fragment[TLSPlaintext.length]; | |||
| } TLSPlaintext; | } TLSPlaintext; | |||
| type | type | |||
| The higher-level protocol used to process the enclosed fragment. | The higher-level protocol used to process the enclosed fragment. | |||
| version | version | |||
| The version of the protocol being employed. This document | The version of the protocol being employed. This document | |||
| describes TLS Version 1.2, which uses the version { 3, 3 }. The | describes TLS Version 1.2, which uses the version { 3, 3 }. The | |||
| version value 3.3 is historical, deriving from the use of 3.1 for | version value 3.3 is historical, deriving from the use of 3.1 for | |||
| TLS 1.0. (See Appendix A.1). Note that a client that supports | TLS 1.0. (See Appendix A.1). Note that a client that supports | |||
| multiple versions of TLS may not know what version will be | multiple versions of TLS may not know what version will be | |||
| employed before it receives ServerHello. See Appendix E for | employed before it receives ServerHello. See Appendix E for | |||
| discussion about what record layer version number should be | discussion about what record layer version number should be | |||
| employed for ClientHello. | employed for ClientHello. | |||
| length | length | |||
| The length (in bytes) of the following TLSPlaintext.fragment. | The length (in bytes) of the following TLSPlaintext.fragment. The | |||
| The length MUST NOT exceed 2^14. | length MUST NOT exceed 2^14. | |||
| fragment | fragment | |||
| The application data. This data is transparent and treated as an | The application data. This data is transparent and treated as an | |||
| independent block to be dealt with by the higher-level protocol | independent block to be dealt with by the higher-level protocol | |||
| specified by the type field. | specified by the type field. | |||
| Implementations MUST NOT send zero-length fragments of Handshake, | Implementations MUST NOT send zero-length fragments of Handshake, | |||
| Alert, or Change Cipher Spec content types. Zero-length fragments | Alert, or Change Cipher Spec content types. Zero-length fragments of | |||
| of Application data MAY be sent as they are potentially useful as | Application data MAY be sent as they are potentially useful as a | |||
| a traffic analysis countermeasure. | traffic analysis countermeasure. | |||
| Note: Data of different TLS Record layer content types MAY be | Note: Data of different TLS Record layer content types MAY be | |||
| interleaved. Application data is generally of lower precedence | interleaved. Application data is generally of lower precedence for | |||
| for transmission than other content types. However, records MUST | transmission than other content types. However, records MUST be | |||
| be delivered to the network in the same order as they are | delivered to the network in the same order as they are protected by | |||
| protected by the record layer. Recipients MUST receive and | the record layer. Recipients MUST receive and process interleaved | |||
| process interleaved application layer traffic during handshakes | application layer traffic during handshakes subsequent to the first | |||
| subsequent to the first one on a connection. | one on a connection. | |||
| 6.2.2. Record Compression and Decompression | 6.2.2. Record Compression and Decompression | |||
| All records are compressed using the compression algorithm defined in | All records are compressed using the compression algorithm defined in | |||
| the current session state. There is always an active compression | the current session state. There is always an active compression | |||
| algorithm; however, initially it is defined as | algorithm; however, initially it is defined as | |||
| CompressionMethod.null. The compression algorithm translates a | CompressionMethod.null. The compression algorithm translates a | |||
| TLSPlaintext structure into a TLSCompressed structure. Compression | TLSPlaintext structure into a TLSCompressed structure. Compression | |||
| functions are initialized with default state information whenever a | functions are initialized with default state information whenever a | |||
| connection state is made active. | connection state is made active. | |||
| Compression must be lossless and may not increase the content length | Compression must be lossless and may not increase the content length | |||
| by more than 1024 bytes. If the decompression function encounters a | by more than 1024 bytes. If the decompression function encounters a | |||
| TLSCompressed.fragment that would decompress to a length in excess of | TLSCompressed.fragment that would decompress to a length in excess of | |||
| 2^14 bytes, it MUST report a fatal decompression failure error. | 2^14 bytes, it MUST report a fatal decompression failure error. | |||
| struct { | struct { | |||
| ContentType type; /* same as TLSPlaintext.type */ | ContentType type; /* same as TLSPlaintext.type */ | |||
| ProtocolVersion version;/* same as TLSPlaintext.version */ | ProtocolVersion version;/* same as TLSPlaintext.version */ | |||
| uint16 length; | uint16 length; | |||
| opaque fragment[TLSCompressed.length]; | opaque fragment[TLSCompressed.length]; | |||
| } TLSCompressed; | } TLSCompressed; | |||
| length | length | |||
| The length (in bytes) of the following TLSCompressed.fragment. | The length (in bytes) of the following TLSCompressed.fragment. | |||
| The length MUST NOT exceed 2^14 + 1024. | The length MUST NOT exceed 2^14 + 1024. | |||
| fragment | fragment | |||
| The compressed form of TLSPlaintext.fragment. | The compressed form of TLSPlaintext.fragment. | |||
| Note: A CompressionMethod.null operation is an identity operation; no | Note: A CompressionMethod.null operation is an identity operation; no | |||
| fields are altered. | fields are altered. | |||
| Implementation note: | Implementation note: Decompression functions are responsible for | |||
| Decompression functions are responsible for ensuring that | ensuring that messages cannot cause internal buffer overflows. | |||
| messages cannot cause internal buffer overflows. | ||||
| 6.2.3. Record Payload Protection | 6.2.3. Record Payload Protection | |||
| The encryption and MAC functions translate a TLSCompressed structure | The encryption and MAC functions translate a TLSCompressed structure | |||
| into a TLSCiphertext. The decryption functions reverse the process. | into a TLSCiphertext. The decryption functions reverse the process. | |||
| The MAC of the record also includes a sequence number so that | The MAC of the record also includes a sequence number so that | |||
| missing, extra, or repeated messages are detectable. | missing, extra, or repeated messages are detectable. | |||
| struct { | struct { | |||
| ContentType type; | ContentType type; | |||
| ProtocolVersion version; | ProtocolVersion version; | |||
| uint16 length; | uint16 length; | |||
| select (SecurityParameters.cipher_type) { | select (SecurityParameters.cipher_type) { | |||
| case stream: GenericStreamCipher; | case stream: GenericStreamCipher; | |||
| case block: GenericBlockCipher; | case block: GenericBlockCipher; | |||
| case aead: GenericAEADCipher; | case aead: GenericAEADCipher; | |||
| } fragment; | } fragment; | |||
| } TLSCiphertext; | } TLSCiphertext; | |||
| type | type | |||
| The type field is identical to TLSCompressed.type. | The type field is identical to TLSCompressed.type. | |||
| version | version | |||
| The version field is identical to TLSCompressed.version. | The version field is identical to TLSCompressed.version. | |||
| length | length | |||
| The length (in bytes) of the following TLSCiphertext.fragment. | The length (in bytes) of the following TLSCiphertext.fragment. | |||
| The length MUST NOT exceed 2^14 + 2048. | The length MUST NOT exceed 2^14 + 2048. | |||
| fragment | fragment | |||
| The encrypted form of TLSCompressed.fragment, with the MAC. | The encrypted form of TLSCompressed.fragment, with the MAC. | |||
| 6.2.3.1. Null or Standard Stream Cipher | 6.2.3.1. Null or Standard Stream Cipher | |||
| Stream ciphers (including BulkCipherAlgorithm.null, see Appendix A.6) | Stream ciphers (including BulkCipherAlgorithm.null, see Appendix A.6) | |||
| convert TLSCompressed.fragment structures to and from stream | convert TLSCompressed.fragment structures to and from stream | |||
| TLSCiphertext.fragment structures. | TLSCiphertext.fragment structures. | |||
| stream-ciphered struct { | stream-ciphered struct { | |||
| opaque content[TLSCompressed.length]; | opaque content[TLSCompressed.length]; | |||
| opaque MAC[SecurityParameters.mac_length]; | opaque MAC[SecurityParameters.mac_length]; | |||
| } GenericStreamCipher; | } GenericStreamCipher; | |||
| The MAC is generated as: | The MAC is generated as: | |||
| MAC(MAC_write_secret, seq_num + TLSCompressed.type + | MAC(MAC_write_secret, seq_num + | |||
| TLSCompressed.version + TLSCompressed.length + | TLSCompressed.type + | |||
| TLSCompressed.fragment); | TLSCompressed.version + | |||
| TLSCompressed.length + | ||||
| TLSCompressed.fragment); | ||||
| where "+" denotes concatenation. | where "+" denotes concatenation. | |||
| seq_num | seq_num | |||
| The sequence number for this record. | The sequence number for this record. | |||
| MAC | MAC | |||
| The MAC algorithm specified by SecurityParameters.mac_algorithm. | The MAC algorithm specified by SecurityParameters.mac_algorithm. | |||
| Note that the MAC is computed before encryption. The stream cipher | Note that the MAC is computed before encryption. The stream cipher | |||
| encrypts the entire block, including the MAC. For stream ciphers that | encrypts the entire block, including the MAC. For stream ciphers that | |||
| do not use a synchronization vector (such as RC4), the stream cipher | do not use a synchronization vector (such as RC4), the stream cipher | |||
| state from the end of one record is simply used on the subsequent | state from the end of one record is simply used on the subsequent | |||
| packet. If the CipherSuite is TLS_NULL_WITH_NULL_NULL, encryption | packet. If the CipherSuite is TLS_NULL_WITH_NULL_NULL, encryption | |||
| consists of the identity operation (i.e., the data is not encrypted, | consists of the identity operation (i.e., the data is not encrypted, | |||
| and the MAC size is zero, implying that no MAC is used). | and the MAC size is zero, implying that no MAC is used). | |||
| TLSCiphertext.length is TLSCompressed.length plus | TLSCiphertext.length is TLSCompressed.length plus | |||
| SecurityParameters.mac_length. | SecurityParameters.mac_length. | |||
| 6.2.3.2. CBC Block Cipher | 6.2.3.2. CBC Block Cipher | |||
| For block ciphers (such as RC2, DES, or AES), the encryption and MAC | For block ciphers (such as 3DES, or AES), the encryption and MAC | |||
| functions convert TLSCompressed.fragment structures to and from block | functions convert TLSCompressed.fragment structures to and from block | |||
| TLSCiphertext.fragment structures. | TLSCiphertext.fragment structures. | |||
| struct { | struct { | |||
| opaque IV[SecurityParameters.record_iv_length]; | opaque IV[SecurityParameters.record_iv_length]; | |||
| block-ciphered struct { | block-ciphered struct { | |||
| opaque content[TLSCompressed.length]; | opaque content[TLSCompressed.length]; | |||
| opaque MAC[SecurityParameters.mac_length]; | opaque MAC[SecurityParameters.mac_length]; | |||
| uint8 padding[GenericBlockCipher.padding_length]; | uint8 padding[GenericBlockCipher.padding_length]; | |||
| uint8 padding_length; | uint8 padding_length; | |||
| }; | }; | |||
| } GenericBlockCipher; | } GenericBlockCipher; | |||
| The MAC is generated as described in Section 6.2.3.1. | The MAC is generated as described in Section 6.2.3.1. | |||
| IV | IV | |||
| The Initialization Vector (IV) SHOULD be chosen at random, and | The Initialization Vector (IV) SHOULD be chosen at random, and | |||
| MUST be unpredictable. Note that in versions of TLS prior to 1.1, | MUST be unpredictable. Note that in versions of TLS prior to 1.1, | |||
| there was no IV field, and the last ciphertext block of the | there was no IV field, and the last ciphertext block of the | |||
| previous record (the "CBC residue") was used as the IV. This was | previous record (the "CBC residue") was used as the IV. This was | |||
| changed to prevent the attacks described in [CBCATT]. For block | changed to prevent the attacks described in [CBCATT]. For block | |||
| ciphers, the IV length is of length | ciphers, the IV length is of length | |||
| SecurityParameters.record_iv_length which is equal to the | SecurityParameters.record_iv_length which is equal to the | |||
| SecurityParameters.block_size. | SecurityParameters.block_size. | |||
| padding | padding | |||
| Padding that is added to force the length of the plaintext to be | Padding that is added to force the length of the plaintext to be | |||
| an integral multiple of the block cipher's block length. The | an integral multiple of the block cipher's block length. The | |||
| padding MAY be any length up to 255 bytes, as long as it results | padding MAY be any length up to 255 bytes, as long as it results | |||
| in the TLSCiphertext.length being an integral multiple of the | in the TLSCiphertext.length being an integral multiple of the | |||
| block length. Lengths longer than necessary might be desirable to | block length. Lengths longer than necessary might be desirable to | |||
| frustrate attacks on a protocol that are based on analysis of the | frustrate attacks on a protocol that are based on analysis of the | |||
| lengths of exchanged messages. Each uint8 in the padding data | lengths of exchanged messages. Each uint8 in the padding data | |||
| vector MUST be filled with the padding length value. The receiver | vector MUST be filled with the padding length value. The receiver | |||
| MUST check this padding and MUST use the bad_record_mac alert to | MUST check this padding and MUST use the bad_record_mac alert to | |||
| indicate padding errors. | indicate padding errors. | |||
| padding_length | padding_length | |||
| The padding length MUST be such that the total size of the | The padding length MUST be such that the total size of the | |||
| GenericBlockCipher structure is a multiple of the cipher's block | GenericBlockCipher structure is a multiple of the cipher's block | |||
| length. Legal values range from zero to 255, inclusive. This | length. Legal values range from zero to 255, inclusive. This | |||
| length specifies the length of the padding field exclusive of the | length specifies the length of the padding field exclusive of the | |||
| padding_length field itself. | padding_length field itself. | |||
| The encrypted data length (TLSCiphertext.length) is one more than the | The encrypted data length (TLSCiphertext.length) is one more than the | |||
| sum of SecurityParameters.block_length, TLSCompressed.length, | sum of SecurityParameters.block_length, TLSCompressed.length, | |||
| SecurityParameters.mac_length, and padding_length. | SecurityParameters.mac_length, and padding_length. | |||
| Example: If the block length is 8 bytes, the content length | Example: If the block length is 8 bytes, the content length | |||
| (TLSCompressed.length) is 61 bytes, and the MAC length is 20 | (TLSCompressed.length) is 61 bytes, and the MAC length is 20 bytes, | |||
| bytes, then the length before padding is 82 bytes (this does | then the length before padding is 82 bytes (this does not include the | |||
| not include the IV. Thus, the padding length modulo 8 must be | IV. Thus, the padding length modulo 8 must be equal to 6 in order to | |||
| equal to 6 in order to make the total length an even multiple | make the total length an even multiple of 8 bytes (the block length). | |||
| of 8 bytes (the block length). The padding length can be 6, | The padding length can be 6, 14, 22, and so on, through 254. If the | |||
| 14, 22, and so on, through 254. If the padding length were the | padding length were the minimum necessary, 6, the padding would be 6 | |||
| minimum necessary, 6, the padding would be 6 bytes, each | bytes, each containing the value 6. Thus, the last 8 octets of the | |||
| containing the value 6. Thus, the last 8 octets of the | GenericBlockCipher before block encryption would be xx 06 06 06 06 06 | |||
| GenericBlockCipher before block encryption would be xx 06 06 | 06 06, where xx is the last octet of the MAC. | |||
| 06 06 06 06 06, where xx is the last octet of the MAC. | ||||
| Note: With block ciphers in CBC mode (Cipher Block Chaining), | Note: With block ciphers in CBC mode (Cipher Block Chaining), it is | |||
| it is critical that the entire plaintext of the record be known | critical that the entire plaintext of the record be known before any | |||
| before any ciphertext is transmitted. Otherwise, it is possible | ciphertext is transmitted. Otherwise, it is possible for the attacker | |||
| for the attacker to mount the attack described in [CBCATT]. | to mount the attack described in [CBCATT]. | |||
| Implementation Note: Canvel et al. [CBCTIME] have demonstrated a timing | Implementation Note: Canvel et al. [CBCTIME] have demonstrated a | |||
| attack on CBC padding based on the time required to compute the | timing attack on CBC padding based on the time required to compute | |||
| MAC. In order to defend against this attack, implementations MUST | the MAC. In order to defend against this attack, implementations MUST | |||
| ensure that record processing time is essentially the same | ensure that record processing time is essentially the same whether or | |||
| whether or not the padding is correct. In general, the best way | not the padding is correct. In general, the best way to do this is | |||
| to do this is to compute the MAC even if the padding is | to compute the MAC even if the padding is incorrect, and only then | |||
| incorrect, and only then reject the packet. For instance, if the | reject the packet. For instance, if the pad appears to be incorrect, | |||
| pad appears to be incorrect, the implementation might assume a | the implementation might assume a zero-length pad and then compute | |||
| zero-length pad and then compute the MAC. This leaves a small | the MAC. This leaves a small timing channel, since MAC performance | |||
| timing channel, since MAC performance depends to some extent on | depends to some extent on the size of the data fragment, but it is | |||
| the size of the data fragment, but it is not believed to be large | not believed to be large enough to be exploitable, due to the large | |||
| enough to be exploitable, due to the large block size of existing | block size of existing MACs and the small size of the timing signal. | |||
| MACs and the small size of the timing signal. | ||||
| 6.2.3.3. AEAD ciphers | 6.2.3.3. AEAD ciphers | |||
| For AEAD [AEAD] ciphers (such as [CCM] or [GCM]) the AEAD function | For AEAD [AEAD] ciphers (such as [CCM] or [GCM]) the AEAD function | |||
| converts TLSCompressed.fragment structures to and from AEAD | converts TLSCompressed.fragment structures to and from AEAD | |||
| TLSCiphertext.fragment structures. | TLSCiphertext.fragment structures. | |||
| struct { | struct { | |||
| opaque nonce_explicit[SecurityParameters.record_iv_length]; | opaque nonce_explicit[SecurityParameters.record_iv_length]; | |||
| aead-ciphered struct { | aead-ciphered struct { | |||
| opaque content[TLSCompressed.length]; | opaque content[TLSCompressed.length]; | |||
| }; | }; | |||
| } GenericAEADCipher; | } GenericAEADCipher; | |||
| AEAD ciphers take as input a single key, a nonce, a plaintext, and | AEAD ciphers take as input a single key, a nonce, a plaintext, and | |||
| "additional data" to be included in the authentication check, as | "additional data" to be included in the authentication check, as | |||
| described in Section 2.1 of [AEAD]. The key is either the | described in Section 2.1 of [AEAD]. The key is either the | |||
| client_write_key or the server_write_key. No MAC key is used. | client_write_key or the server_write_key. No MAC key is used. | |||
| Each AEAD cipher suite has to specify how the nonce supplied to the | Each AEAD cipher suite MUST specify how the nonce supplied to the | |||
| AEAD operation is constructed, and what is the length of the | AEAD operation is constructed, and what is the length of the | |||
| GenericAEADCipher.nonce_explicit part. In many cases, it is | GenericAEADCipher.nonce_explicit part. In many cases, it is | |||
| appropriate to use the partially implicit nonce technique described | appropriate to use the partially implicit nonce technique described | |||
| in Section 3.2.1 of [AEAD]; in this case, the implicit part SHOULD be | in Section 3.2.1 of [AEAD]; with record_iv_length being the length of | |||
| derived from key_block as client_write_iv and server_write_iv (as | the explicit part. In this case, the implicit part SHOULD be derived | |||
| described in Section 6.3), and the explicit part is included in | from key_block as client_write_iv and server_write_iv (as described | |||
| in Section 6.3), and the explicit part is included in | ||||
| GenericAEAEDCipher.nonce_explicit. | GenericAEAEDCipher.nonce_explicit. | |||
| The plaintext is the TLSCompressed.fragment. | The plaintext is the TLSCompressed.fragment. | |||
| The additional authenticated data, which we denote as | The additional authenticated data, which we denote as | |||
| additional_data, is defined as follows: | additional_data, is defined as follows: | |||
| additional_data = seq_num + TLSCompressed.type + | additional_data = seq_num + TLSCompressed.type + | |||
| TLSCompressed.version + TLSCompressed.length; | TLSCompressed.version + TLSCompressed.length; | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 24, line 27 ¶ | |||
| Where "+" denotes concatenation. | Where "+" denotes concatenation. | |||
| The aead_output consists of the ciphertext output by the AEAD | The aead_output consists of the ciphertext output by the AEAD | |||
| encryption operation. The length will generally be larger than | encryption operation. The length will generally be larger than | |||
| TLSCompressed.length, but by an amount that varies with the AEAD | TLSCompressed.length, but by an amount that varies with the AEAD | |||
| cipher. Since the ciphers might incorporate padding, the amount of | cipher. Since the ciphers might incorporate padding, the amount of | |||
| overhead could vary with different TLSCompressed.length values. Each | overhead could vary with different TLSCompressed.length values. Each | |||
| AEAD cipher MUST NOT produce an expansion of greater than 1024 bytes. | AEAD cipher MUST NOT produce an expansion of greater than 1024 bytes. | |||
| Symbolically, | Symbolically, | |||
| AEADEncrypted = AEAD-Encrypt(key, IV, plaintext, | AEADEncrypted = AEAD-Encrypt(key, IV, plaintext, | |||
| additional_data) | additional_data) | |||
| In order to decrypt and verify, the cipher takes as input the key, | In order to decrypt and verify, the cipher takes as input the key, | |||
| IV, the "additional_data", and the AEADEncrypted value. The output is | IV, the "additional_data", and the AEADEncrypted value. The output is | |||
| either the plaintext or an error indicating that the decryption | either the plaintext or an error indicating that the decryption | |||
| failed. There is no separate integrity check. I.e., | failed. There is no separate integrity check. I.e., | |||
| TLSCompressed.fragment = AEAD-Decrypt(write_key, IV, AEADEncrypted, | TLSCompressed.fragment = AEAD-Decrypt(write_key, IV, | |||
| additional_data) | AEADEncrypted, | |||
| additional_data) | ||||
| If the decryption fails, a fatal bad_record_mac alert MUST be | If the decryption fails, a fatal bad_record_mac alert MUST be | |||
| generated. | generated. | |||
| 6.3. Key Calculation | 6.3. Key Calculation | |||
| The Record Protocol requires an algorithm to generate keys, and MAC | The Record Protocol requires an algorithm to generates keys required | |||
| secrets from the security parameters provided by the handshake | by the current connection state (see Appendix A.6) from the security | |||
| protocol. | parameters provided by the handshake protocol. | |||
| The master secret is hashed into a sequence of secure bytes, which | The master secret is expanded into a sequence of secure bytes, which | |||
| are assigned to the MAC secrets and keys required by the current | is then split to a client write MAC key, a server write MAC key, a | |||
| connection state (see Appendix A.6). CipherSpecs require a client | client write encryption key, and a server write encryption key. Each | |||
| write MAC secret, a server write MAC secret, a client write key, and | of these is generated from the byte sequence in that order. Unused | |||
| a server write key, each of which is generated from the master secret | values are empty. Some AEAD ciphers may additionally require a | |||
| in that order. Unused values are empty. | client write IV and a server write IV (see Section 6.2.3.3). | |||
| When keys and MAC secrets are generated, the master secret is used as | When keys and MAC keys are generated, the master secret is used as an | |||
| an entropy source. | entropy source. | |||
| To generate the key material, compute | To generate the key material, compute | |||
| key_block = PRF(SecurityParameters.master_secret, | key_block = PRF(SecurityParameters.master_secret, | |||
| "key expansion", | "key expansion", | |||
| SecurityParameters.server_random + | SecurityParameters.server_random + | |||
| SecurityParameters.client_random); | SecurityParameters.client_random); | |||
| until enough output has been generated. Then the key_block is | until enough output has been generated. Then the key_block is | |||
| partitioned as follows: | partitioned as follows: | |||
| client_write_MAC_secret[SecurityParameters.mac_key_length] | client_write_MAC_key[SecurityParameters.mac_key_length] | |||
| server_write_MAC_secret[SecurityParameters.mac_key_length] | server_write_MAC_key[SecurityParameters.mac_key_length] | |||
| client_write_key[SecurityParameters.enc_key_length] | client_write_key[SecurityParameters.enc_key_length] | |||
| server_write_key[SecurityParameters.enc_key_length] | server_write_key[SecurityParameters.enc_key_length] | |||
| client_write_IV[SecurityParameters.fixed_iv_length] | client_write_IV[SecurityParameters.fixed_iv_length] | |||
| server_write_IV[SecurityParameters.fixed_iv_length] | server_write_IV[SecurityParameters.fixed_iv_length] | |||
| The client_write_IV and server_write_IV are only generated for | The client_write_IV and server_write_IV are only generated for | |||
| implicit nonce techniques as described in Section 3.2.1 of [AEAD]. | implicit nonce techniques as described in Section 3.2.1 of [AEAD]. | |||
| Implementation note: | Implementation note: The currently defined cipher suite which | |||
| The currently defined cipher suite which requires the most | requires the most material is AES_256_CBC_SHA. It requires 2 x 32 | |||
| material is AES_256_CBC_SHA. It requires 2 x 32 byte keys and 2 x | byte keys and 2 x 20 byte MAC keys, for a total 104 bytes of key | |||
| 20 byte MAC secrets, for a total 104 bytes of key material. | material. | |||
| 7. The TLS Handshaking Protocols | 7. The TLS Handshaking Protocols | |||
| TLS has three subprotocols that are used to allow peers to agree | TLS has three subprotocols that are used to allow peers to agree upon | |||
| upon security parameters for the record layer, to authenticate | security parameters for the record layer, to authenticate themselves, | |||
| themselves, to instantiate negotiated security parameters, and to | to instantiate negotiated security parameters, and to report error | |||
| report error conditions to each other. | conditions to each other. | |||
| The Handshake Protocol is responsible for negotiating a session, | The Handshake Protocol is responsible for negotiating a session, | |||
| which consists of the following items: | which consists of the following items: | |||
| session identifier | session identifier | |||
| An arbitrary byte sequence chosen by the server to identify an | An arbitrary byte sequence chosen by the server to identify an | |||
| active or resumable session state. | active or resumable session state. | |||
| peer certificate | peer certificate | |||
| X509v3 [PKIX] certificate of the peer. This element of the | X509v3 [PKIX] certificate of the peer. This element of the state | |||
| state may be null. | may be null. | |||
| compression method | compression method | |||
| The algorithm used to compress data prior to encryption. | The algorithm used to compress data prior to encryption. | |||
| cipher spec | cipher spec | |||
| Specifies the bulk data encryption algorithm (such as null, | Specifies the bulk data encryption algorithm (such as null, DES, | |||
| DES, etc.) and a MAC algorithm (such as MD5 or SHA). It also | etc.) and a MAC algorithm (such as MD5 or SHA). It also defines | |||
| defines cryptographic attributes such as the mac_length. (See | cryptographic attributes such as the mac_length. (See Appendix A.6 | |||
| Appendix A.6 for formal definition.) | for formal definition.) | |||
| master secret | master secret | |||
| 48-byte secret shared between the client and server. | 48-byte secret shared between the client and server. | |||
| is resumable | is resumable | |||
| A flag indicating whether the session can be used to initiate | A flag indicating whether the session can be used to initiate new | |||
| new connections. | connections. | |||
| These items are then used to create security parameters for use by | These items are then used to create security parameters for use by | |||
| the Record Layer when protecting application data. Many connections | the Record Layer when protecting application data. Many connections | |||
| can be instantiated using the same session through the resumption | can be instantiated using the same session through the resumption | |||
| feature of the TLS Handshake Protocol. | feature of the TLS Handshake Protocol. | |||
| 7.1. Change Cipher Spec Protocol | 7.1. Change Cipher Spec Protocol | |||
| The change cipher spec protocol exists to signal transitions in | The change cipher spec protocol exists to signal transitions in | |||
| ciphering strategies. The protocol consists of a single message, | ciphering strategies. The protocol consists of a single message, | |||
| which is encrypted and compressed under the current (not the pending) | which is encrypted and compressed under the current (not the pending) | |||
| connection state. The message consists of a single byte of value 1. | connection state. The message consists of a single byte of value 1. | |||
| struct { | struct { | |||
| enum { change_cipher_spec(1), (255) } type; | enum { change_cipher_spec(1), (255) } type; | |||
| } ChangeCipherSpec; | } ChangeCipherSpec; | |||
| The change cipher spec message is sent by both the client and the | The change cipher spec message is sent by both the client and the | |||
| server to notify the receiving party that subsequent records will be | server to notify the receiving party that subsequent records will be | |||
| protected under the newly negotiated CipherSpec and keys. Reception | protected under the newly negotiated CipherSpec and keys. Reception | |||
| of this message causes the receiver to instruct the Record Layer to | of this message causes the receiver to instruct the Record Layer to | |||
| immediately copy the read pending state into the read current state. | immediately copy the read pending state into the read current state. | |||
| Immediately after sending this message, the sender MUST instruct the | Immediately after sending this message, the sender MUST instruct the | |||
| record layer to make the write pending state the write active state. | record layer to make the write pending state the write active state. | |||
| (See Section 6.1.) The change cipher spec message is sent during the | (See Section 6.1.) The change cipher spec message is sent during the | |||
| handshake after the security parameters have been agreed upon, but | handshake after the security parameters have been agreed upon, but | |||
| before the verifying finished message is sent. | before the verifying finished message is sent. | |||
| Note: If a rehandshake occurs while data is flowing on a connection, | Note: If a rehandshake occurs while data is flowing on a connection, | |||
| the communicating parties may continue to send data using the old | the communicating parties may continue to send data using the old | |||
| CipherSpec. However, once the ChangeCipherSpec has been sent, the new | CipherSpec. However, once the ChangeCipherSpec has been sent, the new | |||
| CipherSpec MUST be used. The first side to send the ChangeCipherSpec | CipherSpec MUST be used. The first side to send the ChangeCipherSpec | |||
| does not know that the other side has finished computing the new | does not know that the other side has finished computing the new | |||
| keying material (e.g., if it has to perform a time consuming public | keying material (e.g., if it has to perform a time consuming public | |||
| key operation). Thus, a small window of time, during which the | key operation). Thus, a small window of time, during which the | |||
| recipient must buffer the data, MAY exist. In practice, with modern | recipient must buffer the data, MAY exist. In practice, with modern | |||
| machines this interval is likely to be fairly short. | machines this interval is likely to be fairly short. | |||
| 7.2. Alert Protocol | 7.2. Alert Protocol | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 27, line 27 ¶ | |||
| One of the content types supported by the TLS Record layer is the | One of the content types supported by the TLS Record layer is the | |||
| alert type. Alert messages convey the severity of the message and a | alert type. Alert messages convey the severity of the message and a | |||
| description of the alert. Alert messages with a level of fatal result | description of the alert. Alert messages with a level of fatal result | |||
| in the immediate termination of the connection. In this case, other | in the immediate termination of the connection. In this case, other | |||
| connections corresponding to the session may continue, but the | connections corresponding to the session may continue, but the | |||
| session identifier MUST be invalidated, preventing the failed session | session identifier MUST be invalidated, preventing the failed session | |||
| from being used to establish new connections. Like other messages, | from being used to establish new connections. Like other messages, | |||
| alert messages are encrypted and compressed, as specified by the | alert messages are encrypted and compressed, as specified by the | |||
| current connection state. | current connection state. | |||
| enum { warning(1), fatal(2), (255) } AlertLevel; | enum { warning(1), fatal(2), (255) } AlertLevel; | |||
| enum { | enum { | |||
| close_notify(0), | close_notify(0), | |||
| unexpected_message(10), | unexpected_message(10), | |||
| bad_record_mac(20), | bad_record_mac(20), | |||
| decryption_failed_RESERVED(21), | decryption_failed_RESERVED(21), | |||
| record_overflow(22), | record_overflow(22), | |||
| decompression_failure(30), | decompression_failure(30), | |||
| handshake_failure(40), | handshake_failure(40), | |||
| no_certificate_RESERVED(41), | no_certificate_RESERVED(41), | |||
| bad_certificate(42), | bad_certificate(42), | |||
| unsupported_certificate(43), | unsupported_certificate(43), | |||
| certificate_revoked(44), | certificate_revoked(44), | |||
| certificate_expired(45), | certificate_expired(45), | |||
| certificate_unknown(46), | certificate_unknown(46), | |||
| illegal_parameter(47), | illegal_parameter(47), | |||
| unknown_ca(48), | unknown_ca(48), | |||
| access_denied(49), | access_denied(49), | |||
| decode_error(50), | decode_error(50), | |||
| decrypt_error(51), | decrypt_error(51), | |||
| export_restriction_RESERVED(60), | export_restriction_RESERVED(60), | |||
| protocol_version(70), | protocol_version(70), | |||
| insufficient_security(71), | insufficient_security(71), | |||
| internal_error(80), | internal_error(80), | |||
| user_canceled(90), | user_canceled(90), | |||
| no_renegotiation(100), | no_renegotiation(100), | |||
| unsupported_extension(110), | unsupported_extension(110), | |||
| (255) | (255) | |||
| } AlertDescription; | } AlertDescription; | |||
| struct { | struct { | |||
| AlertLevel level; | AlertLevel level; | |||
| AlertDescription description; | AlertDescription description; | |||
| } Alert; | } Alert; | |||
| 7.2.1. Closure Alerts | 7.2.1. Closure Alerts | |||
| The client and the server must share knowledge that the connection is | The client and the server must share knowledge that the connection is | |||
| ending in order to avoid a truncation attack. Either party may | ending in order to avoid a truncation attack. Either party may | |||
| initiate the exchange of closing messages. | initiate the exchange of closing messages. | |||
| close_notify | close_notify | |||
| This message notifies the recipient that the sender will not send | This message notifies the recipient that the sender will not send | |||
| any more messages on this connection. Note that as of TLS 1.1, | any more messages on this connection. Note that as of TLS 1.1, | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 28, line 51 ¶ | |||
| close_notify alert before indicating to the application layer that | close_notify alert before indicating to the application layer that | |||
| the TLS connection has ended. If the application protocol will not | the TLS connection has ended. If the application protocol will not | |||
| transfer any additional data, but will only close the underlying | transfer any additional data, but will only close the underlying | |||
| transport connection, then the implementation MAY choose to close the | transport connection, then the implementation MAY choose to close the | |||
| transport without waiting for the responding close_notify. No part of | transport without waiting for the responding close_notify. No part of | |||
| this standard should be taken to dictate the manner in which a usage | this standard should be taken to dictate the manner in which a usage | |||
| profile for TLS manages its data transport, including when | profile for TLS manages its data transport, including when | |||
| connections are opened or closed. | connections are opened or closed. | |||
| Note: It is assumed that closing a connection reliably delivers | Note: It is assumed that closing a connection reliably delivers | |||
| pending data before destroying the transport. | pending data before destroying the transport. | |||
| 7.2.2. Error Alerts | 7.2.2. Error Alerts | |||
| Error handling in the TLS Handshake protocol is very simple. When an | Error handling in the TLS Handshake protocol is very simple. When an | |||
| error is detected, the detecting party sends a message to the other | error is detected, the detecting party sends a message to the other | |||
| party. Upon transmission or receipt of a fatal alert message, both | party. Upon transmission or receipt of a fatal alert message, both | |||
| parties immediately close the connection. Servers and clients MUST | parties immediately close the connection. Servers and clients MUST | |||
| forget any session-identifiers, keys, and secrets associated with a | forget any session-identifiers, keys, and secrets associated with a | |||
| failed connection. Thus, any connection terminated with a fatal alert | failed connection. Thus, any connection terminated with a fatal alert | |||
| MUST NOT be resumed. | MUST NOT be resumed. | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 29, line 31 ¶ | |||
| If an alert with a level of warning is sent and received, generally | If an alert with a level of warning is sent and received, generally | |||
| the connection can continue normally. If the receiving party decides | the connection can continue normally. If the receiving party decides | |||
| not to proceed with the connection (e.g., after having received a | not to proceed with the connection (e.g., after having received a | |||
| no_renegotiation alert that it is not willing to accept), it SHOULD | no_renegotiation alert that it is not willing to accept), it SHOULD | |||
| send a fatal alert to terminate the connection. | send a fatal alert to terminate the connection. | |||
| The following error alerts are defined: | The following error alerts are defined: | |||
| unexpected_message | unexpected_message | |||
| An inappropriate message was received. This alert is always fatal | An inappropriate message was received. This alert is always fatal | |||
| and should never be observed in communication between proper | and should never be observed in communication between proper | |||
| implementations. | implementations. | |||
| bad_record_mac | bad_record_mac | |||
| This alert is returned if a record is received with an incorrect | This alert is returned if a record is received with an incorrect | |||
| MAC. This alert also MUST be returned if an alert is sent because | MAC. This alert also MUST be returned if an alert is sent because | |||
| a TLSCiphertext decrypted in an invalid way: either it wasn't an | a TLSCiphertext decrypted in an invalid way: either it wasn't an | |||
| even multiple of the block length, or its padding values, when | even multiple of the block length, or its padding values, when | |||
| checked, weren't correct. This message is always fatal. | checked, weren't correct. This message is always fatal. | |||
| decryption_failed_RESERVED | decryption_failed_RESERVED | |||
| This alert was used in some earlier versions of TLS, and may have | This alert was used in some earlier versions of TLS, and may have | |||
| permitted certain attacks against the CBC mode [CBCATT]. It MUST | permitted certain attacks against the CBC mode [CBCATT]. It MUST | |||
| NOT be sent by compliant implementations. | NOT be sent by compliant implementations. | |||
| record_overflow | record_overflow | |||
| A TLSCiphertext record was received that had a length more than | A TLSCiphertext record was received that had a length more than | |||
| 2^14+2048 bytes, or a record decrypted to a TLSCompressed record | 2^14+2048 bytes, or a record decrypted to a TLSCompressed record | |||
| with more than 2^14+1024 bytes. This message is always fatal. | with more than 2^14+1024 bytes. This message is always fatal. | |||
| decompression_failure | decompression_failure | |||
| The decompression function received improper input (e.g., data | The decompression function received improper input (e.g., data | |||
| that would expand to excessive length). This message is always | that would expand to excessive length). This message is always | |||
| fatal. | fatal. | |||
| handshake_failure | handshake_failure | |||
| Reception of a handshake_failure alert message indicates that the | Reception of a handshake_failure alert message indicates that the | |||
| sender was unable to negotiate an acceptable set of security | sender was unable to negotiate an acceptable set of security | |||
| parameters given the options available. This is a fatal error. | parameters given the options available. This is a fatal error. | |||
| no_certificate_RESERVED | no_certificate_RESERVED | |||
| This alert was used in SSLv3 but not any version of TLS. It MUST | This alert was used in SSLv3 but not any version of TLS. It MUST | |||
| NOT be sent by compliant implementations. | NOT be sent by compliant implementations. | |||
| bad_certificate | bad_certificate | |||
| A certificate was corrupt, contained signatures that did not | A certificate was corrupt, contained signatures that did not | |||
| verify correctly, etc. | verify correctly, etc. | |||
| unsupported_certificate | unsupported_certificate | |||
| A certificate was of an unsupported type. | A certificate was of an unsupported type. | |||
| certificate_revoked | certificate_revoked | |||
| A certificate was revoked by its signer. | A certificate was revoked by its signer. | |||
| certificate_expired | certificate_expired | |||
| A certificate has expired or is not currently valid. | A certificate has expired or is not currently valid. | |||
| certificate_unknown | certificate_unknown | |||
| Some other (unspecified) issue arose in processing the | Some other (unspecified) issue arose in processing the | |||
| certificate, rendering it unacceptable. | certificate, rendering it unacceptable. | |||
| illegal_parameter | illegal_parameter | |||
| A field in the handshake was out of range or inconsistent with | A field in the handshake was out of range or inconsistent with | |||
| other fields. This message is always fatal. | other fields. This message is always fatal. | |||
| unknown_ca | unknown_ca | |||
| A valid certificate chain or partial chain was received, but the | A valid certificate chain or partial chain was received, but the | |||
| certificate was not accepted because the CA certificate could not | certificate was not accepted because the CA certificate could not | |||
| be located or couldn't be matched with a known, trusted CA. This | be located or couldn't be matched with a known, trusted CA. This | |||
| message is always fatal. | message is always fatal. | |||
| access_denied | access_denied | |||
| A valid certificate was received, but when access control was | A valid certificate was received, but when access control was | |||
| applied, the sender decided not to proceed with negotiation. | applied, the sender decided not to proceed with negotiation. This | |||
| This message is always fatal. | message is always fatal. | |||
| decode_error | decode_error | |||
| A message could not be decoded because some field was out of the | A message could not be decoded because some field was out of the | |||
| specified range or the length of the message was incorrect. This | specified range or the length of the message was incorrect. This | |||
| message is always fatal. | message is always fatal. | |||
| decrypt_error | decrypt_error | |||
| A handshake cryptographic operation failed, including being | A handshake cryptographic operation failed, including being unable | |||
| unable to correctly verify a signature, decrypt a key exchange, | to correctly verify a signature, decrypt a key exchange, or | |||
| or validate a finished message. | validate a finished message. | |||
| export_restriction_RESERVED | export_restriction_RESERVED | |||
| This alert was used in some earlier versions of TLS. It MUST NOT | This alert was used in some earlier versions of TLS. It MUST NOT | |||
| be sent by compliant implementations. | be sent by compliant implementations. | |||
| protocol_version | protocol_version | |||
| The protocol version the client has attempted to negotiate is | The protocol version the client has attempted to negotiate is | |||
| recognized but not supported. (For example, old protocol versions | recognized but not supported. (For example, old protocol versions | |||
| might be avoided for security reasons). This message is always | might be avoided for security reasons). This message is always | |||
| fatal. | fatal. | |||
| insufficient_security | insufficient_security | |||
| Returned instead of handshake_failure when a negotiation has | Returned instead of handshake_failure when a negotiation has | |||
| failed specifically because the server requires ciphers more | failed specifically because the server requires ciphers more | |||
| secure than those supported by the client. This message is always | secure than those supported by the client. This message is always | |||
| fatal. | fatal. | |||
| internal_error | internal_error | |||
| An internal error unrelated to the peer or the correctness of the | An internal error unrelated to the peer or the correctness of the | |||
| protocol (such as a memory allocation failure) makes it | protocol (such as a memory allocation failure) makes it impossible | |||
| impossible to continue. This message is always fatal. | to continue. This message is always fatal. | |||
| user_canceled | user_canceled | |||
| This handshake is being canceled for some reason unrelated to a | This handshake is being canceled for some reason unrelated to a | |||
| protocol failure. If the user cancels an operation after the | protocol failure. If the user cancels an operation after the | |||
| handshake is complete, just closing the connection by sending a | handshake is complete, just closing the connection by sending a | |||
| close_notify is more appropriate. This alert should be followed | close_notify is more appropriate. This alert should be followed by | |||
| by a close_notify. This message is generally a warning. | a close_notify. This message is generally a warning. | |||
| no_renegotiation | no_renegotiation | |||
| Sent by the client in response to a hello request or by the | Sent by the client in response to a hello request or by the server | |||
| server in response to a client hello after initial handshaking. | in response to a client hello after initial handshaking. Either | |||
| Either of these would normally lead to renegotiation; when that | of these would normally lead to renegotiation; when that is not | |||
| is not appropriate, the recipient should respond with this alert. | appropriate, the recipient should respond with this alert. At | |||
| At that point, the original requester can decide whether to | that point, the original requester can decide whether to proceed | |||
| proceed with the connection. One case where this would be | with the connection. One case where this would be appropriate is | |||
| appropriate is where a server has spawned a process to satisfy a | where a server has spawned a process to satisfy a request; the | |||
| request; the process might receive security parameters (key | process might receive security parameters (key length, | |||
| length, authentication, etc.) at startup and it might be | authentication, etc.) at startup and it might be difficult to | |||
| difficult to communicate changes to these parameters after that | communicate changes to these parameters after that point. This | |||
| point. This message is always a warning. | message is always a warning. | |||
| unsupported_extension | unsupported_extension | |||
| sent by clients that receive an extended server hello containing | sent by clients that receive an extended server hello containing | |||
| an extension that they did not put in the corresponding client | an extension that they did not put in the corresponding client | |||
| hello. This message is always fatal. | hello. This message is always fatal. | |||
| For all errors where an alert level is not explicitly specified, the | For all errors where an alert level is not explicitly specified, the | |||
| sending party MAY determine at its discretion whether this is a fatal | sending party MAY determine at its discretion whether this is a fatal | |||
| error or not; if an alert with a level of warning is received, the | error or not; if an alert with a level of warning is received, the | |||
| receiving party MAY decide at its discretion whether to treat this as | receiving party MAY decide at its discretion whether to treat this as | |||
| a fatal error or not. However, all messages that are transmitted | a fatal error or not. However, all messages that are transmitted | |||
| with a level of fatal MUST be treated as fatal messages. | with a level of fatal MUST be treated as fatal messages. | |||
| New Alert values are assigned by IANA as described in Section 12. | New Alert values are assigned by IANA as described in Section 12. | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 32, line 30 ¶ | |||
| The cryptographic parameters of the session state are produced by the | The cryptographic parameters of the session state are produced by the | |||
| TLS Handshake Protocol, which operates on top of the TLS Record | TLS Handshake Protocol, which operates on top of the TLS Record | |||
| Layer. When a TLS client and server first start communicating, they | Layer. When a TLS client and server first start communicating, they | |||
| agree on a protocol version, select cryptographic algorithms, | agree on a protocol version, select cryptographic algorithms, | |||
| optionally authenticate each other, and use public-key encryption | optionally authenticate each other, and use public-key encryption | |||
| techniques to generate shared secrets. | techniques to generate shared secrets. | |||
| The TLS Handshake Protocol involves the following steps: | The TLS Handshake Protocol involves the following steps: | |||
| - Exchange hello messages to agree on algorithms, exchange random | - Exchange hello messages to agree on algorithms, exchange random | |||
| values, and check for session resumption. | values, and check for session resumption. | |||
| - Exchange the necessary cryptographic parameters to allow the | - Exchange the necessary cryptographic parameters to allow the | |||
| client and server to agree on a premaster secret. | client and server to agree on a premaster secret. | |||
| - Exchange certificates and cryptographic information to allow the | - Exchange certificates and cryptographic information to allow the | |||
| client and server to authenticate themselves. | client and server to authenticate themselves. | |||
| - Generate a master secret from the premaster secret and exchanged | - Generate a master secret from the premaster secret and exchanged | |||
| random values. | random values. | |||
| - Provide security parameters to the record layer. | - Provide security parameters to the record layer. | |||
| - Allow the client and server to verify that their peer has | - Allow the client and server to verify that their peer has | |||
| calculated the same security parameters and that the handshake | calculated the same security parameters and that the handshake | |||
| occurred without tampering by an attacker. | occurred without tampering by an attacker. | |||
| Note that higher layers should not be overly reliant on whether TLS | Note that higher layers should not be overly reliant on whether TLS | |||
| always negotiates the strongest possible connection between two | always negotiates the strongest possible connection between two | |||
| peers. There are a number of ways in which a man in the middle | peers. There are a number of ways in which a man in the middle | |||
| attacker can attempt to make two entities drop down to the least | attacker can attempt to make two entities drop down to the least | |||
| secure method they support. The protocol has been designed to | secure method they support. The protocol has been designed to | |||
| minimize this risk, but there are still attacks available: for | minimize this risk, but there are still attacks available: for | |||
| example, an attacker could block access to the port a secure service | example, an attacker could block access to the port a secure service | |||
| runs on, or attempt to get the peers to negotiate an unauthenticated | runs on, or attempt to get the peers to negotiate an unauthenticated | |||
| connection. The fundamental rule is that higher levels must be | connection. The fundamental rule is that higher levels must be | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 34, line 37 ¶ | |||
| Finished --------> | Finished --------> | |||
| [ChangeCipherSpec] | [ChangeCipherSpec] | |||
| <-------- Finished | <-------- Finished | |||
| Application Data <-------> Application Data | Application Data <-------> Application Data | |||
| Fig. 1. Message flow for a full handshake | Fig. 1. Message flow for a full handshake | |||
| * Indicates optional or situation-dependent messages that are not | * Indicates optional or situation-dependent messages that are not | |||
| always sent. | always sent. | |||
| Note: To help avoid pipeline stalls, ChangeCipherSpec is an | Note: To help avoid pipeline stalls, ChangeCipherSpec is an | |||
| independent TLS Protocol content type, and is not actually a TLS | independent TLS Protocol content type, and is not actually a TLS | |||
| handshake message. | handshake message. | |||
| When the client and server decide to resume a previous session or | When the client and server decide to resume a previous session or | |||
| duplicate an existing session (instead of negotiating new security | duplicate an existing session (instead of negotiating new security | |||
| parameters), the message flow is as follows: | parameters), the message flow is as follows: | |||
| The client sends a ClientHello using the Session ID of the session to | The client sends a ClientHello using the Session ID of the session to | |||
| be resumed. The server then checks its session cache for a match. If | be resumed. The server then checks its session cache for a match. If | |||
| a match is found, and the server is willing to re-establish the | a match is found, and the server is willing to re-establish the | |||
| connection under the specified session state, it will send a | connection under the specified session state, it will send a | |||
| ServerHello with the same Session ID value. At this point, both | ServerHello with the same Session ID value. At this point, both | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 35, line 33 ¶ | |||
| 7.4. Handshake Protocol | 7.4. Handshake Protocol | |||
| The TLS Handshake Protocol is one of the defined higher-level clients | The TLS Handshake Protocol is one of the defined higher-level clients | |||
| of the TLS Record Protocol. This protocol is used to negotiate the | of the TLS Record Protocol. This protocol is used to negotiate the | |||
| secure attributes of a session. Handshake messages are supplied to | secure attributes of a session. Handshake messages are supplied to | |||
| the TLS Record Layer, where they are encapsulated within one or more | the TLS Record Layer, where they are encapsulated within one or more | |||
| TLSPlaintext structures, which are processed and transmitted as | TLSPlaintext structures, which are processed and transmitted as | |||
| specified by the current active session state. | specified by the current active session state. | |||
| enum { | enum { | |||
| hello_request(0), client_hello(1), server_hello(2), | hello_request(0), client_hello(1), server_hello(2), | |||
| certificate(11), server_key_exchange (12), | certificate(11), server_key_exchange (12), | |||
| certificate_request(13), server_hello_done(14), | certificate_request(13), server_hello_done(14), | |||
| certificate_verify(15), client_key_exchange(16), | certificate_verify(15), client_key_exchange(16), | |||
| finished(20), (255) | finished(20), (255) | |||
| } HandshakeType; | } HandshakeType; | |||
| struct { | struct { | |||
| HandshakeType msg_type; /* handshake type */ | HandshakeType msg_type; /* handshake type */ | |||
| uint24 length; /* bytes in message */ | uint24 length; /* bytes in message */ | |||
| select (HandshakeType) { | select (HandshakeType) { | |||
| case hello_request: HelloRequest; | case hello_request: HelloRequest; | |||
| case client_hello: ClientHello; | case client_hello: ClientHello; | |||
| case server_hello: ServerHello; | case server_hello: ServerHello; | |||
| case certificate: Certificate; | case certificate: Certificate; | |||
| case server_key_exchange: ServerKeyExchange; | case server_key_exchange: ServerKeyExchange; | |||
| case certificate_request: CertificateRequest; | case certificate_request: CertificateRequest; | |||
| case server_hello_done: ServerHelloDone; | case server_hello_done: ServerHelloDone; | |||
| case certificate_verify: CertificateVerify; | case certificate_verify: CertificateVerify; | |||
| case client_key_exchange: ClientKeyExchange; | case client_key_exchange: ClientKeyExchange; | |||
| case finished: Finished; | case finished: Finished; | |||
| } body; | } body; | |||
| } Handshake; | } Handshake; | |||
| The handshake protocol messages are presented below in the order they | The handshake protocol messages are presented below in the order they | |||
| MUST be sent; sending handshake messages in an unexpected order | MUST be sent; sending handshake messages in an unexpected order | |||
| results in a fatal error. Unneeded handshake messages can be omitted, | results in a fatal error. Unneeded handshake messages can be omitted, | |||
| however. Note one exception to the ordering: the Certificate message | however. Note one exception to the ordering: the Certificate message | |||
| is used twice in the handshake (from server to client, then from | is used twice in the handshake (from server to client, then from | |||
| client to server), but described only in its first position. The one | client to server), but described only in its first position. The one | |||
| message that is not bound by these ordering rules is the Hello | message that is not bound by these ordering rules is the Hello | |||
| Request message, which can be sent at any time, but which SHOULD be | Request message, which can be sent at any time, but which SHOULD be | |||
| ignored by the client if it arrives in the middle of a handshake. | ignored by the client if it arrives in the middle of a handshake. | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 36, line 34 ¶ | |||
| The hello phase messages are used to exchange security enhancement | The hello phase messages are used to exchange security enhancement | |||
| capabilities between the client and server. When a new session | capabilities between the client and server. When a new session | |||
| begins, the Record Layer's connection state encryption, hash, and | begins, the Record Layer's connection state encryption, hash, and | |||
| compression algorithms are initialized to null. The current | compression algorithms are initialized to null. The current | |||
| connection state is used for renegotiation messages. | connection state is used for renegotiation messages. | |||
| 7.4.1.1. Hello Request | 7.4.1.1. Hello Request | |||
| When this message will be sent: | When this message will be sent: | |||
| The hello request message MAY be sent by the server at any time. | ||||
| The hello request message MAY be sent by the server at any time. | ||||
| Meaning of this message: | Meaning of this message: | |||
| Hello request is a simple notification that the client should | ||||
| begin the negotiation process anew by sending a client hello | ||||
| message when convenient. This message is not intended to | ||||
| establish which side is the client or server but merely to | ||||
| initiate a new negotiation. Servers SHOULD NOT send a | ||||
| HelloRequest immediately upon the client's initial connection. | ||||
| It is the client's job to send a ClientHello at that time. | ||||
| This message will be ignored by the client if the client is | Hello request is a simple notification that the client should | |||
| currently negotiating a session. This message may be ignored by | begin the negotiation process anew by sending a client hello | |||
| the client if it does not wish to renegotiate a session, or the | message when convenient. This message is not intended to establish | |||
| client may, if it wishes, respond with a no_renegotiation alert. | which side is the client or server but merely to initiate a new | |||
| Since handshake messages are intended to have transmission | negotiation. Servers SHOULD NOT send a HelloRequest immediately | |||
| precedence over application data, it is expected that the | upon the client's initial connection. It is the client's job to | |||
| negotiation will begin before no more than a few records are | send a ClientHello at that time. | |||
| received from the client. If the server sends a hello request but | ||||
| does not receive a client hello in response, it may close the | ||||
| connection with a fatal alert. | ||||
| After sending a hello request, servers SHOULD NOT repeat the request | This message will be ignored by the client if the client is | |||
| until the subsequent handshake negotiation is complete. | currently negotiating a session. This message may be ignored by | |||
| the client if it does not wish to renegotiate a session, or the | ||||
| client may, if it wishes, respond with a no_renegotiation alert. | ||||
| Since handshake messages are intended to have transmission | ||||
| precedence over application data, it is expected that the | ||||
| negotiation will begin before no more than a few records are | ||||
| received from the client. If the server sends a hello request but | ||||
| does not receive a client hello in response, it may close the | ||||
| connection with a fatal alert. | ||||
| After sending a hello request, servers SHOULD NOT repeat the | ||||
| request until the subsequent handshake negotiation is complete. | ||||
| Structure of this message: | Structure of this message: | |||
| struct { } HelloRequest; | ||||
| Note: This message MUST NOT be included in the message hashes that are | struct { } HelloRequest; | |||
| maintained throughout the handshake and used in the finished | ||||
| messages and the certificate verify message. | Note: This message MUST NOT be included in the message hashes that | |||
| are maintained throughout the handshake and used in the finished | ||||
| messages and the certificate verify message. | ||||
| 7.4.1.2. Client Hello | 7.4.1.2. Client Hello | |||
| When this message will be sent: | When this message will be sent: | |||
| When a client first connects to a server it is required to send | ||||
| the client hello as its first message. The client can also send a | When a client first connects to a server it is required to send | |||
| client hello in response to a hello request or on its own | the client hello as its first message. The client can also send a | |||
| initiative in order to renegotiate the security parameters in an | client hello in response to a hello request or on its own | |||
| existing connection. | initiative in order to renegotiate the security parameters in an | |||
| existing connection. | ||||
| Structure of this message: | Structure of this message: | |||
| The client hello message includes a random structure, which is | ||||
| used later in the protocol. | ||||
| struct { | The client hello message includes a random structure, which is | |||
| uint32 gmt_unix_time; | used later in the protocol. | |||
| opaque random_bytes[28]; | ||||
| } Random; | ||||
| gmt_unix_time | struct { | |||
| The current time and date in standard UNIX 32-bit format (seconds | uint32 gmt_unix_time; | |||
| since the midnight starting Jan 1, 1970, GMT, ignoring leap | opaque random_bytes[28]; | |||
| seconds) according to the sender's internal clock. Clocks are not | } Random; | |||
| required to be set correctly by the basic TLS Protocol; higher- | ||||
| level or application protocols may define additional | ||||
| requirements. | ||||
| random_bytes | gmt_unix_time | |||
| 28 bytes generated by a secure random number generator. | The current time and date in standard UNIX 32-bit format | |||
| (seconds since the midnight starting Jan 1, 1970, GMT, ignoring | ||||
| leap seconds) according to the sender's internal clock. Clocks | ||||
| are not required to be set correctly by the basic TLS Protocol; | ||||
| higher-level or application protocols may define additional | ||||
| requirements. | ||||
| random_bytes | ||||
| 28 bytes generated by a secure random number generator. | ||||
| The client hello message includes a variable-length session | The client hello message includes a variable-length session | |||
| identifier. If not empty, the value identifies a session between the | identifier. If not empty, the value identifies a session between the | |||
| same client and server whose security parameters the client wishes to | same client and server whose security parameters the client wishes to | |||
| reuse. The session identifier MAY be from an earlier connection, this | reuse. The session identifier MAY be from an earlier connection, this | |||
| connection, or from another currently active connection. The second | connection, or from another currently active connection. The second | |||
| option is useful if the client only wishes to update the random | option is useful if the client only wishes to update the random | |||
| structures and derived values of a connection, and the third option | structures and derived values of a connection, and the third option | |||
| makes it possible to establish several independent secure connections | makes it possible to establish several independent secure connections | |||
| without repeating the full handshake protocol. These independent | without repeating the full handshake protocol. These independent | |||
| connections may occur sequentially or simultaneously; a SessionID | connections may occur sequentially or simultaneously; a SessionID | |||
| becomes valid when the handshake negotiating it completes with the | becomes valid when the handshake negotiating it completes with the | |||
| exchange of Finished messages and persists until it is removed due to | exchange of Finished messages and persists until it is removed due to | |||
| aging or because a fatal error was encountered on a connection | aging or because a fatal error was encountered on a connection | |||
| associated with the session. The actual contents of the SessionID are | associated with the session. The actual contents of the SessionID are | |||
| defined by the server. | defined by the server. | |||
| opaque SessionID<0..32>; | opaque SessionID<0..32>; | |||
| Warning: | Warning: Because the SessionID is transmitted without encryption or | |||
| Because the SessionID is transmitted without encryption or | immediate MAC protection, servers MUST NOT place confidential | |||
| immediate MAC protection, servers MUST NOT place confidential | information in session identifiers or let the contents of fake | |||
| information in session identifiers or let the contents of fake | session identifiers cause any breach of security. (Note that the | |||
| session identifiers cause any breach of security. (Note that the | content of the handshake as a whole, including the SessionID, is | |||
| content of the handshake as a whole, including the SessionID, is | protected by the Finished messages exchanged at the end of the | |||
| protected by the Finished messages exchanged at the end of the | handshake.) | |||
| handshake.) | ||||
| The CipherSuite list, passed from the client to the server in the | The CipherSuite list, passed from the client to the server in the | |||
| client hello message, contains the combinations of cryptographic | client hello message, contains the combinations of cryptographic | |||
| algorithms supported by the client in order of the client's | algorithms supported by the client in order of the client's | |||
| preference (favorite choice first). Each CipherSuite defines a key | preference (favorite choice first). Each CipherSuite defines a key | |||
| exchange algorithm, a bulk encryption algorithm (including secret key | exchange algorithm, a bulk encryption algorithm (including secret key | |||
| length), a MAC algorithm, and a PRF. The server will select a cipher | length), a MAC algorithm, and a PRF. The server will select a cipher | |||
| suite or, if no acceptable choices are presented, return a handshake | suite or, if no acceptable choices are presented, return a handshake | |||
| failure alert and close the connection. | failure alert and close the connection. | |||
| uint8 CipherSuite[2]; /* Cryptographic suite selector */ | uint8 CipherSuite[2]; /* Cryptographic suite selector */ | |||
| The client hello includes a list of compression algorithms supported | The client hello includes a list of compression algorithms supported | |||
| by the client, ordered according to the client's preference. | by the client, ordered according to the client's preference. | |||
| enum { null(0), (255) } CompressionMethod; | enum { null(0), (255) } CompressionMethod; | |||
| struct { | struct { | |||
| ProtocolVersion client_version; | ProtocolVersion client_version; | |||
| Random random; | Random random; | |||
| SessionID session_id; | SessionID session_id; | |||
| CipherSuite cipher_suites<2..2^16-2>; | CipherSuite cipher_suites<2..2^16-2>; | |||
| CompressionMethod compression_methods<1..2^8-1>; | CompressionMethod compression_methods<1..2^8-1>; | |||
| select (extensions_present) { | select (extensions_present) { | |||
| case false: | case false: | |||
| struct {}; | struct {}; | |||
| case true: | case true: | |||
| Extension extensions<0..2^16-1>; | Extension extensions<0..2^16-1>; | |||
| }; | }; | |||
| } ClientHello; | } ClientHello; | |||
| TLS allows extensions to follow the compression_methods field in an | TLS allows extensions to follow the compression_methods field in an | |||
| extensions block. The presence of extensions can be detected by | extensions block. The presence of extensions can be detected by | |||
| determining whether there are bytes following the compression_methods | determining whether there are bytes following the compression_methods | |||
| at the end of the ClientHello. Note that this method of detecting | at the end of the ClientHello. Note that this method of detecting | |||
| optional data differs from the normal TLS method of having a | optional data differs from the normal TLS method of having a | |||
| variable-length field but is used for compatibility with TLS before | variable-length field but is used for compatibility with TLS before | |||
| extensions were defined. | extensions were defined. | |||
| client_version | client_version | |||
| The version of the TLS protocol by which the client wishes to | The version of the TLS protocol by which the client wishes to | |||
| communicate during this session. This SHOULD be the latest | communicate during this session. This SHOULD be the latest | |||
| (highest valued) version supported by the client. For this | (highest valued) version supported by the client. For this version | |||
| version of the specification, the version will be 3.3 (See | of the specification, the version will be 3.3 (See Appendix E for | |||
| Appendix E for details about backward compatibility). | details about backward compatibility). | |||
| random | random | |||
| A client-generated random structure. | A client-generated random structure. | |||
| session_id | session_id | |||
| The ID of a session the client wishes to use for this connection. | The ID of a session the client wishes to use for this connection. | |||
| This field is empty if no session_id is available, or it the | This field is empty if no session_id is available, or it the | |||
| client wishes to generate new security parameters. | client wishes to generate new security parameters. | |||
| cipher_suites | cipher_suites | |||
| This is a list of the cryptographic options supported by the | This is a list of the cryptographic options supported by the | |||
| client, with the client's first preference first. If the | client, with the client's first preference first. If the | |||
| session_id field is not empty (implying a session resumption | session_id field is not empty (implying a session resumption | |||
| request) this vector MUST include at least the cipher_suite from | request) this vector MUST include at least the cipher_suite from | |||
| that session. Values are defined in Appendix A.5. | that session. Values are defined in Appendix A.5. | |||
| compression_methods | compression_methods | |||
| This is a list of the compression methods supported by the | This is a list of the compression methods supported by the client, | |||
| client, sorted by client preference. If the session_id field is | sorted by client preference. If the session_id field is not empty | |||
| not empty (implying a session resumption request) it MUST include | (implying a session resumption request) it MUST include the | |||
| the compression_method from that session. This vector MUST | compression_method from that session. This vector MUST contain, | |||
| contain, and all implementations MUST support, | and all implementations MUST support, CompressionMethod.null. | |||
| CompressionMethod.null. Thus, a client and server will always be | Thus, a client and server will always be able to agree on a | |||
| able to agree on a compression method. | compression method. | |||
| client_hello_extension_list | client_hello_extension_list | |||
| Clients MAY request extended functionality from servers by | Clients MAY request extended functionality from servers by sending | |||
| sending data in the client_hello_extension_list. Here the new | data in the client_hello_extension_list. Here the new | |||
| "client_hello_extension_list" field contains a list of | "client_hello_extension_list" field contains a list of extensions. | |||
| extensions. The actual "Extension" format is defined in Section | The actual "Extension" format is defined in Section 7.4.1.4. | |||
| 7.4.1.4. | ||||
| In the event that a client requests additional functionality using | In the event that a client requests additional functionality using | |||
| extensions, and this functionality is not supplied by the server, the | extensions, and this functionality is not supplied by the server, the | |||
| client MAY abort the handshake. A server that supports the | client MAY abort the handshake. A server that supports the | |||
| extensions mechanism MUST accept client hello messages in either the | extensions mechanism MUST accept client hello messages in either the | |||
| original (TLS 1.0/TLS 1.1) ClientHello or the extended ClientHello | original (TLS 1.0/TLS 1.1) ClientHello or the extended ClientHello | |||
| format defined in this document, and (as for all other messages) MUST | format defined in this document, and (as for all other messages) MUST | |||
| check that the amount of data in the message precisely matches one of | check that the amount of data in the message precisely matches one of | |||
| these formats; if not then it MUST send a fatal "decode_error" alert. | these formats; if not then it MUST send a fatal "decode_error" alert. | |||
| After sending the client hello message, the client waits for a server | After sending the client hello message, the client waits for a server | |||
| hello message. Any other handshake message returned by the server | hello message. Any other handshake message returned by the server | |||
| except for a hello request is treated as a fatal error. | except for a hello request is treated as a fatal error. | |||
| 7.4.1.3. Server Hello | 7.4.1.3. Server Hello | |||
| When this message will be sent: | When this message will be sent: | |||
| The server will send this message in response to a client hello | ||||
| message when it was able to find an acceptable set of algorithms. | The server will send this message in response to a client hello | |||
| If it cannot find such a match, it will respond with a handshake | message when it was able to find an acceptable set of algorithms. | |||
| failure alert. | If it cannot find such a match, it will respond with a handshake | |||
| failure alert. | ||||
| Structure of this message: | Structure of this message: | |||
| struct { | ||||
| ProtocolVersion server_version; | struct { | |||
| Random random; | ProtocolVersion server_version; | |||
| SessionID session_id; | Random random; | |||
| CipherSuite cipher_suite; | SessionID session_id; | |||
| CompressionMethod compression_method; | CipherSuite cipher_suite; | |||
| select (extensions_present) { | CompressionMethod compression_method; | |||
| case false: | select (extensions_present) { | |||
| struct {}; | case false: | |||
| case true: | struct {}; | |||
| Extension extensions<0..2^16-1>; | case true: | |||
| }; | Extension extensions<0..2^16-1>; | |||
| } ServerHello; | }; | |||
| } ServerHello; | ||||
| The presence of extensions can be detected by determining whether | The presence of extensions can be detected by determining whether | |||
| there are bytes following the compression_method field at the end of | there are bytes following the compression_method field at the end of | |||
| the ServerHello. | the ServerHello. | |||
| server_version | server_version | |||
| This field will contain the lower of that suggested by the client | This field will contain the lower of that suggested by the client | |||
| in the client hello and the highest supported by the server. For | in the client hello and the highest supported by the server. For | |||
| this version of the specification, the version is 3.3. (See | this version of the specification, the version is 3.3. (See | |||
| Appendix E for details about backward compatibility.) | Appendix E for details about backward compatibility.) | |||
| random | random | |||
| This structure is generated by the server and MUST be | This structure is generated by the server and MUST be | |||
| independently generated from the ClientHello.random. | independently generated from the ClientHello.random. | |||
| session_id | session_id | |||
| This is the identity of the session corresponding to this | This is the identity of the session corresponding to this | |||
| connection. If the ClientHello.session_id was non-empty, the | connection. If the ClientHello.session_id was non-empty, the | |||
| server will look in its session cache for a match. If a match is | server will look in its session cache for a match. If a match is | |||
| found and the server is willing to establish the new connection | found and the server is willing to establish the new connection | |||
| using the specified session state, the server will respond with | using the specified session state, the server will respond with | |||
| the same value as was supplied by the client. This indicates a | the same value as was supplied by the client. This indicates a | |||
| resumed session and dictates that the parties must proceed | resumed session and dictates that the parties must proceed | |||
| directly to the finished messages. Otherwise this field will | directly to the finished messages. Otherwise this field will | |||
| contain a different value identifying the new session. The server | contain a different value identifying the new session. The server | |||
| may return an empty session_id to indicate that the session will | may return an empty session_id to indicate that the session will | |||
| not be cached and therefore cannot be resumed. If a session is | not be cached and therefore cannot be resumed. If a session is | |||
| resumed, it must be resumed using the same cipher suite it was | resumed, it must be resumed using the same cipher suite it was | |||
| originally negotiated with. Note that there is no requirement | originally negotiated with. Note that there is no requirement that | |||
| that the server resume any session even if it had formerly | the server resume any session even if it had formerly provided a | |||
| provided a session_id. Client MUST be prepared to do a full | session_id. Client MUST be prepared to do a full negotiation -- | |||
| negotiation -- including negotiating new cipher suites -- during | including negotiating new cipher suites -- during any handshake. | |||
| any handshake. | ||||
| cipher_suite | cipher_suite | |||
| The single cipher suite selected by the server from the list in | The single cipher suite selected by the server from the list in | |||
| ClientHello.cipher_suites. For resumed sessions, this field is | ClientHello.cipher_suites. For resumed sessions, this field is the | |||
| the value from the state of the session being resumed. | value from the state of the session being resumed. | |||
| compression_method | compression_method | |||
| The single compression algorithm selected by the server from the | The single compression algorithm selected by the server from the | |||
| list in ClientHello.compression_methods. For resumed sessions | list in ClientHello.compression_methods. For resumed sessions this | |||
| this field is the value from the resumed session state. | field is the value from the resumed session state. | |||
| server_hello_extension_list | server_hello_extension_list | |||
| A list of extensions. Note that only extensions offered by the | A list of extensions. Note that only extensions offered by the | |||
| client can appear in the server's list. | client can appear in the server's list. | |||
| 7.4.1.4 Hello Extensions | 7.4.1.4 Hello Extensions | |||
| The extension format is: | The extension format is: | |||
| struct { | struct { | |||
| ExtensionType extension_type; | ExtensionType extension_type; | |||
| opaque extension_data<0..2^16-1>; | opaque extension_data<0..2^16-1>; | |||
| } Extension; | } Extension; | |||
| enum { | enum { | |||
| signature_hash_algorithms(TBD-BY-IANA), (65535) | signature_algorithms(TBD-BY-IANA), (65535) | |||
| } ExtensionType; | } ExtensionType; | |||
| Here: | Here: | |||
| - "extension_type" identifies the particular extension type. | - "extension_type" identifies the particular extension type. | |||
| - "extension_data" contains information specific to the particular | - "extension_data" contains information specific to the particular | |||
| extension type. | extension type. | |||
| The initial set of extensions is defined in a companion document | The initial set of extensions is defined in a companion document | |||
| [TLSEXT]. The list of extension types is maintained by IANA as | [TLSEXT]. The list of extension types is maintained by IANA as | |||
| described in Section 12. | described in Section 12. | |||
| There are subtle (and not so subtle) interactions that may occur in | There are subtle (and not so subtle) interactions that may occur in | |||
| this protocol between new features and existing features which may | this protocol between new features and existing features which may | |||
| result in a significant reduction in overall security, The following | result in a significant reduction in overall security, The following | |||
| considerations should be taken into account when designing new | considerations should be taken into account when designing new | |||
| extensions: | extensions: | |||
| - Some cases where a server does not agree to an extension are | - Some cases where a server does not agree to an extension are error | |||
| error conditions, and some simply a refusal to support a | conditions, and some simply a refusal to support a particular | |||
| particular feature. In general error alerts should be used for | feature. In general error alerts should be used for the former, | |||
| the former, and a field in the server extension response for the | and a field in the server extension response for the latter. | |||
| latter. | ||||
| - Extensions should as far as possible be designed to prevent any | - Extensions should as far as possible be designed to prevent any | |||
| attack that forces use (or non-use) of a particular feature by | attack that forces use (or non-use) of a particular feature by | |||
| manipulation of handshake messages. This principle should be | manipulation of handshake messages. This principle should be | |||
| followed regardless of whether the feature is believed to cause a | followed regardless of whether the feature is believed to cause a | |||
| security problem. | security problem. | |||
| Often the fact that the extension fields are included in the | Often the fact that the extension fields are included in the | |||
| inputs to the Finished message hashes will be sufficient, but | inputs to the Finished message hashes will be sufficient, but | |||
| extreme care is needed when the extension changes the meaning of | extreme care is needed when the extension changes the meaning of | |||
| messages sent in the handshake phase. Designers and implementors | messages sent in the handshake phase. Designers and implementors | |||
| should be aware of the fact that until the handshake has been | should be aware of the fact that until the handshake has been | |||
| authenticated, active attackers can modify messages and insert, | authenticated, active attackers can modify messages and insert, | |||
| remove, or replace extensions. | remove, or replace extensions. | |||
| - It would be technically possible to use extensions to change | - It would be technically possible to use extensions to change major | |||
| major aspects of the design of TLS; for example the design of | aspects of the design of TLS; for example the design of cipher | |||
| cipher suite negotiation. This is not recommended; it would be | suite negotiation. This is not recommended; it would be more | |||
| more appropriate to define a new version of TLS - particularly | appropriate to define a new version of TLS - particularly since | |||
| since the TLS handshake algorithms have specific protection | the TLS handshake algorithms have specific protection against | |||
| against version rollback attacks based on the version number, and | version rollback attacks based on the version number, and the | |||
| the possibility of version rollback should be a significant | possibility of version rollback should be a significant | |||
| consideration in any major design change. | consideration in any major design change. | |||
| 7.4.1.4.1 Signature Hash Algorithms | 7.4.1.4.1 Signature Algorithms | |||
| The client MAY use the "signature_hash_algorithms" to indicate to the | The client MAY use the "signature_algorithms" extension to indicate | |||
| server which signature/hash algorithm pairs may be used in digital | to the server which signature/hash algorithm pairs may be used in | |||
| signatures. The "extension_data" field of this extension contains a | digital signatures. The "extension_data" field of this extension | |||
| "supported_signature_algorithms" value. | contains a "supported_signature_algorithms" value. | |||
| enum{ | enum { | |||
| none(0), md5(1), sha1(2), sha256(3), sha384(4), | none(0), md5(1), sha1(2), sha256(3), sha384(4), | |||
| sha512(5), (255) | sha512(5), (255) | |||
| } HashAlgorithm; | } HashAlgorithm; | |||
| enum { anonymous(0), rsa(1), dsa(2), (255) } SignatureAlgorithm; | enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) } | |||
| SignatureAlgorithm; | ||||
| struct { | struct { | |||
| HashAlgorithm hash; | HashAlgorithm hash; | |||
| SignatureAlgorithm signature; | SignatureAlgorithm signature; | |||
| } SignatureAndHashAlgorithm; | } SignatureAndHashAlgorithm; | |||
| SignatureAndHashAlgorithm | SignatureAndHashAlgorithm | |||
| supported_signature_algorithms<2..2^16-1>; | supported_signature_algorithms<2..2^16-1>; | |||
| Each SignatureAndHashAlgorithm value lists a single digest/signature | Each SignatureAndHashAlgorithm value lists a single hash/signature | |||
| pair which the client is willing to verify. The values are indicated | pair which the client is willing to verify. The values are indicated | |||
| in descending order of preference. | in descending order of preference. | |||
| Note: Because not all signature algorithms and hash algorithms may be | Note: Because not all signature algorithms and hash algorithms may be | |||
| accepted by an implementation (e.g., DSA with SHA-1, but not | accepted by an implementation (e.g., DSA with SHA-1, but not | |||
| SHA-256), algorithms here are listed in pairs. | SHA-256), algorithms here are listed in pairs. | |||
| hash | hash | |||
| This field indicates the hash algorithm which may be used. The | This field indicates the hash algorithm which may be used. The | |||
| values indicate support for undigested data, MD5 [MD5], SHA-1, | values indicate support for unhashed data, MD5 [MD5], SHA-1, | |||
| SHA-256, SHA-384, and SHA-512 [SHA] respectively. The "none" | SHA-256, SHA-384, and SHA-512 [SHA] respectively. The "none" value | |||
| value is provided for future extensibility, in case of a | is provided for future extensibility, in case of a signature | |||
| signature algorithm which does not require hashing before | algorithm which does not require hashing before signing. | |||
| signing. | ||||
| signature | signature | |||
| This field indicates the signature algorithm which may be used. | This field indicates the signature algorithm which may be used. | |||
| The values indicate anonymous signatures, RSA [PKCS1] and DSA | The values indicate anonymous signatures, RSA [PKCS1] and DSA | |||
| [DSS] respectively. The "anonymous" value is meaningless in this | [DSS] respectively. The "anonymous" value is meaningless in this | |||
| context but used later in the specification. It MUST NOT appear | context but used later in the specification. It MUST NOT appear in | |||
| in this extension. | this extension. | |||
| The semantics of this extension are somewhat complicated because the | The semantics of this extension are somewhat complicated because the | |||
| cipher suite indicates permissible signature algorithms but not | cipher suite indicates permissible signature algorithms but not hash | |||
| digest algorithm. Sections 7.4.2 and 7.4.3 describe the appropriate | algorithm. Sections 7.4.2 and 7.4.3 describe the appropriate rules. | |||
| rules. | ||||
| Clients SHOULD send this extension if they support any digest | Clients SHOULD send this extension if they support any hash algorithm | |||
| algorithm other than SHA-1. If this extension is not used, servers | other than SHA-1. | |||
| SHOULD assume that the client supports only SHA-1. Note: this is a | ||||
| change from TLS 1.1 where there are no explicit rules but as a | If the client does not send the signature_algorithms extension, the | |||
| practical matter one can assume that the peer supports MD5 and SHA-1. | server SHOULD assume the following: | |||
| - If the negotiated key exchange algorithm is one of (RSA, DHE_RSA, | ||||
| DH_RSA, RSA_PSK, ECDH_RSA, ECDHE_RSA), behave as if client had sent | ||||
| the value (sha1,rsa). | ||||
| - If the negotiated key exchange algorithm is one of (DHE_DSS, | ||||
| DH_DSS), behave as if the client had sent the value (sha1,dsa). | ||||
| - If the negotiated key exchnage algorithm is one of (ECDH_ECDSA, | ||||
| ECDHE_ECDSA), behave as if the client had sent value (sha1,ecdsa). | ||||
| Note: this is a change from TLS 1.1 where there are no explicit rules | ||||
| but as a practical matter one can assume that the peer supports MD5 | ||||
| and SHA-1. | ||||
| Servers MUST NOT send this extension. | Servers MUST NOT send this extension. | |||
| 7.4.2. Server Certificate | 7.4.2. Server Certificate | |||
| When this message will be sent: | When this message will be sent: | |||
| The server MUST send a certificate whenever the agreed-upon key | ||||
| exchange method uses certificates for authentication (this | The server MUST send a certificate whenever the agreed-upon key | |||
| includes all key exchange methods defined in this document except | exchange method uses certificates for authentication (this | |||
| DH_anon). This message will always immediately follow the server | includes all key exchange methods defined in this document except | |||
| hello message. | DH_anon). This message will always immediately follow the server | |||
| hello message. | ||||
| Meaning of this message: | Meaning of this message: | |||
| This message conveys the server's certificate to the client. The | ||||
| certificate MUST be appropriate for the negotiated cipher suite's | This message conveys the server's certificate to the client. The | |||
| key exchange algorithm, and any negotiated extensions. | certificate MUST be appropriate for the negotiated cipher suite's | |||
| key exchange algorithm, and any negotiated extensions. | ||||
| Structure of this message: | Structure of this message: | |||
| opaque ASN.1Cert<1..2^24-1>; | ||||
| struct { | ||||
| ASN.1Cert certificate_list<0..2^24-1>; | ||||
| } Certificate; | ||||
| certificate_list | opaque ASN.1Cert<1..2^24-1>; | |||
| This is a sequence (chain) of certificates. The sender's | struct { | |||
| certificate MUST come first in the list. Each following | ASN.1Cert certificate_list<0..2^24-1>; | |||
| certificate MUST directly certify the one preceding it. Because | } Certificate; | |||
| certificate validation requires that root keys be distributed | ||||
| independently, the self-signed certificate that specifies the | certificate_list | |||
| root certificate authority MAY optionally be omitted from the | This is a sequence (chain) of certificates. The sender's | |||
| chain, under the assumption that the remote end must already | certificate MUST come first in the list. Each following | |||
| possess it in order to validate it in any case. | certificate MUST directly certify the one preceding it. Because | |||
| certificate validation requires that root keys be distributed | ||||
| independently, the self-signed certificate that specifies the root | ||||
| certificate authority MAY optionally be omitted from the chain, | ||||
| under the assumption that the remote end must already possess it | ||||
| in order to validate it in any case. | ||||
| The same message type and structure will be used for the client's | The same message type and structure will be used for the client's | |||
| response to a certificate request message. Note that a client MAY | response to a certificate request message. Note that a client MAY | |||
| send no certificates if it does not have an appropriate certificate | send no certificates if it does not have an appropriate certificate | |||
| to send in response to the server's authentication request. | to send in response to the server's authentication request. | |||
| Note: PKCS #7 [PKCS7] is not used as the format for the certificate | Note: PKCS #7 [PKCS7] is not used as the format for the certificate | |||
| vector because PKCS #6 [PKCS6] extended certificates are not | vector because PKCS #6 [PKCS6] extended certificates are not used. | |||
| used. Also, PKCS #7 defines a SET rather than a SEQUENCE, making | Also, PKCS #7 defines a SET rather than a SEQUENCE, making the task | |||
| the task of parsing the list more difficult. | of parsing the list more difficult. | |||
| The following rules apply to the certificates sent by the server: | The following rules apply to the certificates sent by the server: | |||
| - The certificate type MUST be X.509v3, unless explicitly | - The certificate type MUST be X.509v3, unless explicitly negotiated | |||
| negotiated otherwise (e.g., [TLSPGP]). | otherwise (e.g., [TLSPGP]). | |||
| - The certificate's public key (and associated restrictions) | - The certificate's public key (and associated restrictions) MUST be | |||
| MUST be compatible with the selected key exchange | compatible with the selected key exchange algorithm. | |||
| algorithm. | ||||
| Key Exchange Alg. Certificate Key Type | Key Exchange Alg. Certificate Key Type | |||
| RSA RSA public key; the certificate MUST | RSA RSA public key; the certificate MUST | |||
| RSA_PSK allow the key to be used for encryption | RSA_PSK allow the key to be used for encryption | |||
| (the keyEncipherment bit MUST be set | (the keyEncipherment bit MUST be set | |||
| if the key usage extension is present). | if the key usage extension is present). | |||
| Note: RSA_PSK is defined in [TLSPSK]. | Note: RSA_PSK is defined in [TLSPSK]. | |||
| DHE_RSA RSA public key; the certificate MUST | DHE_RSA RSA public key; the certificate MUST | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 46, line 29 ¶ | |||
| by the client, as described in [TLSECC]. | by the client, as described in [TLSECC]. | |||
| ECDHE_ECDSA ECDSA-capable public key; the certificate | ECDHE_ECDSA ECDSA-capable public key; the certificate | |||
| MUST allow the key to be used for signing | MUST allow the key to be used for signing | |||
| with the hash algorithm that will be | with the hash algorithm that will be | |||
| employed in the server key exchange | employed in the server key exchange | |||
| message. The public key MUST use a curve | message. The public key MUST use a curve | |||
| and point format supported by the client, | and point format supported by the client, | |||
| as described in [TLSECC]. | as described in [TLSECC]. | |||
| - The "server_name" and "trusted_ca_keys" extensions | - The "server_name" and "trusted_ca_keys" extensions [4366bis] are | |||
| [4366bis] are used to guide certificate selection. | used to guide certificate selection. | |||
| If the client provided a "signature_algorithms" extension, then all | If the client provided a "signature_algorithms" extension, then all | |||
| certificates provided by the server MUST be signed by a | certificates provided by the server MUST be signed by a | |||
| digest/signature algorithm pair that appears in that extension. Note | hash/signature algorithm pair that appears in that extension. Note | |||
| that this implies that a certificate containing a key for one | that this implies that a certificate containing a key for one | |||
| signature algorithm MAY be signed using a different signature | signature algorithm MAY be signed using a different signature | |||
| algorithm (for instance, an RSA key signed with a DSA key.) This is a | algorithm (for instance, an RSA key signed with a DSA key.) This is a | |||
| departure from TLS 1.1, which required that the algorithms be the | departure from TLS 1.1, which required that the algorithms be the | |||
| same. Note that this also implies that the DH_DS, DH_RSA, | same. Note that this also implies that the DH_DSS, DH_RSA, | |||
| ECDH_ECDSA, and ECDH_RSA key exchange algorithms do not restrict the | ECDH_ECDSA, and ECDH_RSA key exchange algorithms do not restrict the | |||
| algorithm used to sign the certificate. Fixed DH certificates MAY be | algorithm used to sign the certificate. Fixed DH certificates MAY be | |||
| signed with any digest/signature algorithm pair appearing in the | signed with any hash/signature algorithm pair appearing in the | |||
| extension. The naming is historical. | extension. The naming is historical. | |||
| If no "signature_algorithms" extension is present, the end-entity | ||||
| certificate MUST be signed as follows: | ||||
| Key Exchange Alg. Signature Algorithm Used by Issuer | ||||
| RSA RSA (RSASSA-PKCS1-v1_5) | ||||
| DHE_RSA | ||||
| DH_RSA | ||||
| RSA_PSK | ||||
| ECDH_RSA | ||||
| ECDHE_RSA | ||||
| DHE_DSS DSA | ||||
| DH_DSS | ||||
| ECDH_ECDSA ECDSA | ||||
| ECDHE_ECDSA | ||||
| If the server has multiple certificates, it chooses one of them based | If the server has multiple certificates, it chooses one of them based | |||
| on the above-mentioned criteria (in addition to other criteria, such | on the above-mentioned criteria (in addition to other criteria, such | |||
| as transport layer endpoint, local configuration and preferences, | as transport layer endpoint, local configuration and preferences, | |||
| etc.). | etc.). | |||
| Note that there are certificates that use algorithms and/or algorithm | Note that there are certificates that use algorithms and/or algorithm | |||
| combinations that cannot be currently used with TLS. For example, a | combinations that cannot be currently used with TLS. For example, a | |||
| certificate with RSASSA-PSS signature key (id-RSASSA-PSS OID in | certificate with RSASSA-PSS signature key (id-RSASSA-PSS OID in | |||
| SubjectPublicKeyInfo) cannot be used because TLS defines no | SubjectPublicKeyInfo) cannot be used because TLS defines no | |||
| corresponding signature algorithm. | corresponding signature algorithm. | |||
| As CipherSuites that specify new key exchange methods are specified | As CipherSuites that specify new key exchange methods are specified | |||
| for the TLS Protocol, they will imply certificate format and the | for the TLS Protocol, they will imply certificate format and the | |||
| required encoded keying information. | required encoded keying information. | |||
| 7.4.3. Server Key Exchange Message | 7.4.3. Server Key Exchange Message | |||
| When this message will be sent: | When this message will be sent: | |||
| This message will be sent immediately after the server | ||||
| certificate message (or the server hello message, if this is an | ||||
| anonymous negotiation). | ||||
| The server key exchange message is sent by the server only when | This message will be sent immediately after the server certificate | |||
| the server certificate message (if sent) does not contain enough | message (or the server hello message, if this is an anonymous | |||
| data to allow the client to exchange a premaster secret. This is | negotiation). | |||
| true for the following key exchange methods: | ||||
| DHE_DSS | The server key exchange message is sent by the server only when | |||
| DHE_RSA | the server certificate message (if sent) does not contain enough | |||
| DH_anon | data to allow the client to exchange a premaster secret. This is | |||
| true for the following key exchange methods: | ||||
| It is not legal to send the server key exchange message for the | DHE_DSS | |||
| following key exchange methods: | DHE_RSA | |||
| DH_anon | ||||
| It is not legal to send the server key exchange message for the | ||||
| following key exchange methods: | ||||
| RSA | ||||
| DH_DSS | ||||
| DH_RSA | ||||
| RSA | ||||
| DH_DSS | ||||
| DH_RSA | ||||
| Meaning of this message: | Meaning of this message: | |||
| This message conveys cryptographic information to allow the | ||||
| client to communicate the premaster secret: a Diffie-Hellman | This message conveys cryptographic information to allow the client | |||
| public key with which the client can complete a key exchange | to communicate the premaster secret: a Diffie-Hellman public key | |||
| (with the result being the premaster secret) or a public key for | with which the client can complete a key exchange (with the result | |||
| some other algorithm. | being the premaster secret) or a public key for some other | |||
| algorithm. | ||||
| Structure of this message: | Structure of this message: | |||
| enum { diffie_hellman, rsa} KeyExchangeAlgorithm; | ||||
| struct { | enum { diffie_hellman, rsa } KeyExchangeAlgorithm; | |||
| opaque dh_p<1..2^16-1>; | ||||
| opaque dh_g<1..2^16-1>; | ||||
| opaque dh_Ys<1..2^16-1>; | ||||
| } ServerDHParams; /* Ephemeral DH parameters */ | ||||
| dh_p | struct { | |||
| The prime modulus used for the Diffie-Hellman operation. | opaque dh_p<1..2^16-1>; | |||
| opaque dh_g<1..2^16-1>; | ||||
| opaque dh_Ys<1..2^16-1>; | ||||
| dh_g | } ServerDHParams; /* Ephemeral DH parameters */ | |||
| The generator used for the Diffie-Hellman operation. | ||||
| dh_Ys | dh_p | |||
| The server's Diffie-Hellman public value (g^X mod p). | The prime modulus used for the Diffie-Hellman operation. | |||
| struct { | dh_g | |||
| select (KeyExchangeAlgorithm) { | The generator used for the Diffie-Hellman operation. | |||
| case diffie_hellman: | ||||
| ServerDHParams params; | ||||
| Signature signed_params; | ||||
| }; | ||||
| } ServerKeyExchange; | ||||
| struct { | dh_Ys | |||
| select (KeyExchangeAlgorithm) { | The server's Diffie-Hellman public value (g^X mod p). | |||
| case diffie_hellman: | ||||
| ServerDHParams params; | ||||
| }; | ||||
| } ServerParams; | ||||
| params | struct { | |||
| The server's key exchange parameters. | select (KeyExchangeAlgorithm) { | |||
| case diffie_hellman: | ||||
| ServerDHParams params; | ||||
| Signature signed_params; | ||||
| }; | ||||
| } ServerKeyExchange; | ||||
| signed_params | struct { | |||
| For non-anonymous key exchanges, a hash of the corresponding | select (KeyExchangeAlgorithm) { | |||
| params value, with the signature appropriate to that hash | case diffie_hellman: | |||
| applied. | ServerDHParams params; | |||
| }; | ||||
| } ServerParams; | ||||
| hash | params | |||
| Hash(ClientHello.random + ServerHello.random + ServerParams) | The server's key exchange parameters. | |||
| struct { | signed_params | |||
| select (SignatureAlgorithm) { | For non-anonymous key exchanges, a hash of the corresponding | |||
| case anonymous: struct { }; | params value, with the signature appropriate to that hash | |||
| case rsa: | applied. | |||
| SignatureAndHashAlgorithm signature_algorithm; /*NEW*/ | ||||
| digitally-signed struct { | hash | |||
| opaque hash[Hash.length]; | Hash(ClientHello.random + ServerHello.random + ServerParams) | |||
| }; | where Hash is the chosen hash value and Hash.length is | |||
| case dsa: | its output. | |||
| SignatureAndHashAlgorithm signature_algorithm; /*NEW*/ | ||||
| digitally-signed struct { | struct { | |||
| opaque hash[Hash.length]; | select (SignatureAlgorithm) { | |||
| }; | case anonymous: struct { }; | |||
| }; | case rsa: | |||
| }; | SignatureAndHashAlgorithm signature_algorithm; /*NEW*/ | |||
| } Signature; | digitally-signed struct { | |||
| opaque hash[Hash.length]; | ||||
| }; | ||||
| case dsa: | ||||
| SignatureAndHashAlgorithm signature_algorithm; /*NEW*/ | ||||
| digitally-signed struct { | ||||
| opaque hash[Hash.length]; | ||||
| }; | ||||
| }; | ||||
| }; | ||||
| } Signature; | ||||
| If the client has offered the "signature_algorithms" extension, the | If the client has offered the "signature_algorithms" extension, the | |||
| signature algorithm and digest algorithm MUST be a pair listed in | signature algorithm and hash algorithm MUST be a pair listed in that | |||
| that extension. Note that there is a possibility for inconsistencies | extension. Note that there is a possibility for inconsistencies here. | |||
| here. For instance, the client might offer DHE_DSS key exchange but | For instance, the client might offer DHE_DSS key exchange but omit | |||
| omit any DSS pairs from its "signature_algorithms" extension. In | any DSS pairs from its "signature_algorithms" extension. In order to | |||
| order to negotiate correctly, the server MUST check any candidate | negotiate correctly, the server MUST check any candidate cipher | |||
| cipher suites against the "signature_algorithms" extension before | suites against the "signature_algorithms" extension before selecting | |||
| selecting them. This is somewhat inelegant but is a compromise | them. This is somewhat inelegant but is a compromise designed to | |||
| designed to minimize changes to the original cipher suite design. | minimize changes to the original cipher suite design. | |||
| If no "signature_algorithms" extension is present, the server MUST | If no "signature_algorithms" extension is present, the server MUST | |||
| use SHA-1 as the hash algorithm. | use SHA-1 as the hash algorithm. | |||
| In addition, the digest and signature algorithms MUST be compatible | In addition, the hash and signature algorithms MUST be compatible | |||
| with the key in the client's end-entity certificate. RSA keys MAY be | with the key in the server's end-entity certificate. RSA keys MAY be | |||
| used with any permitted digest algorithm. | used with any permitted hash algorithm, subject to restrictions in | |||
| the certificate, if any. | ||||
| Because DSA signatures do not contain any secure indication of digest | ||||
| algorithm, it must be unambiguous which digest algorithm is to be | ||||
| used with any key. DSA keys specified with Object Identifier | ||||
| 1 2 840 10040 4 1 MUST only be used with SHA-1. Future revisions of | ||||
| [PKIX] MAY define new object identifiers for DSA with other digest | ||||
| algorithms. | ||||
| The hash algorithm is denoted Hash below. Hash.length is the length | Because DSA signatures do not contain any secure indication of hash | |||
| of the output of that algorithm. | algorithm, there is a risk of hash substitution if multiple hashes | |||
| may be used with any key. Currently, DSS [DSS] may only be used with | ||||
| SHA-1. Future revisions of DSS [DSS-3] are expected to allow other | ||||
| digest algorithms, as well as guidance as to which digest algorithms | ||||
| should be used with each key size. In addition, future revisions of | ||||
| [PKIX] may specify mechanisms for certificates to indicate which | ||||
| digest algorithms are to be used with DSA. | ||||
| As additional CipherSuites are defined for TLS that include new key | As additional CipherSuites are defined for TLS that include new key | |||
| exchange algorithms, the server key exchange message will be sent if | exchange algorithms, the server key exchange message will be sent if | |||
| and only if the certificate type associated with the key exchange | and only if the certificate type associated with the key exchange | |||
| algorithm does not provide enough information for the client to | algorithm does not provide enough information for the client to | |||
| exchange a premaster secret. | exchange a premaster secret. | |||
| 7.4.4. Certificate Request | 7.4.4. Certificate Request | |||
| When this message will be sent: | When this message will be sent: | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 49, line 50 ¶ | |||
| As additional CipherSuites are defined for TLS that include new key | As additional CipherSuites are defined for TLS that include new key | |||
| exchange algorithms, the server key exchange message will be sent if | exchange algorithms, the server key exchange message will be sent if | |||
| and only if the certificate type associated with the key exchange | and only if the certificate type associated with the key exchange | |||
| algorithm does not provide enough information for the client to | algorithm does not provide enough information for the client to | |||
| exchange a premaster secret. | exchange a premaster secret. | |||
| 7.4.4. Certificate Request | 7.4.4. Certificate Request | |||
| When this message will be sent: | When this message will be sent: | |||
| A non-anonymous server can optionally request a certificate from | A non-anonymous server can optionally request a certificate from | |||
| the client, if appropriate for the selected cipher suite. This | the client, if appropriate for the selected cipher suite. This | |||
| message, if sent, will immediately follow the Server Key Exchange | message, if sent, will immediately follow the Server Key Exchange | |||
| message (if it is sent; otherwise, the Server Certificate | message (if it is sent; otherwise, the Server Certificate | |||
| message). | message). | |||
| Structure of this message: | Structure of this message: | |||
| enum { | ||||
| rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4), | ||||
| rsa_ephemeral_dh_RESERVED(5), dss_ephemeral_dh_RESERVED(6), | ||||
| fortezza_dms_RESERVED(20), (255) | ||||
| } ClientCertificateType; | ||||
| opaque DistinguishedName<1..2^16-1>; | enum { | |||
| rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4), | ||||
| rsa_ephemeral_dh_RESERVED(5), dss_ephemeral_dh_RESERVED(6), | ||||
| fortezza_dms_RESERVED(20), (255) | ||||
| } ClientCertificateType; | ||||
| struct { | opaque DistinguishedName<1..2^16-1>; | |||
| ClientCertificateType certificate_types<1..2^8-1>; | ||||
| SignatureAndHashAlgorithm | struct { | |||
| supported_signature_algorithms<2^16-1>; | ClientCertificateType certificate_types<1..2^8-1>; | |||
| DistinguishedName certificate_authorities<0..2^16-1>; | SignatureAndHashAlgorithm | |||
| } CertificateRequest; | supported_signature_algorithms<2^16-1>; | |||
| DistinguishedName certificate_authorities<0..2^16-1>; | ||||
| } CertificateRequest; | ||||
| certificate_types | certificate_types | |||
| A list of the types of certificate types which the client may | A list of the types of certificate types which the client may | |||
| offer. | offer. | |||
| rsa_sign a certificate containing an RSA key | ||||
| dss_sign a certificate containing a DSS key | rsa_sign a certificate containing an RSA key | |||
| rsa_fixed_dh a certificate containing a static DH key. | dss_sign a certificate containing a DSS key | |||
| dss_fixed_dh a certificate containing a static DH key | rsa_fixed_dh a certificate containing a static DH key. | |||
| dss_fixed_dh a certificate containing a static DH key | ||||
| supported_signature_algorithms | supported_signature_algorithms | |||
| A list of the digest/signature algorithm pairs that the server is | A list of the hash/signature algorithm pairs that the server is | |||
| able to verify, listed in descending order of preference. | able to verify, listed in descending order of preference. | |||
| certificate_authorities | certificate_authorities | |||
| A list of the distinguished names [X501] of acceptable | A list of the distinguished names [X501] of acceptable | |||
| certificate_authorities, represented in DER-encoded format. These | certificate_authorities, represented in DER-encoded format. These | |||
| distinguished names may specify a desired distinguished name for | distinguished names may specify a desired distinguished name for a | |||
| a root CA or for a subordinate CA; thus, this message can be used | root CA or for a subordinate CA; thus, this message can be used | |||
| both to describe known roots and a desired authorization space. | both to describe known roots and a desired authorization space. If | |||
| If the certificate_authorities list is empty then the client MAY | the certificate_authorities list is empty then the client MAY send | |||
| send any certificate of the appropriate ClientCertificateType, | any certificate of the appropriate ClientCertificateType, unless | |||
| unless there is some external arrangement to the contrary. | there is some external arrangement to the contrary. | |||
| The interaction of the certificate_types and | The interaction of the certificate_types and | |||
| supported_signature_algorithms fields is somewhat complicated. | supported_signature_algorithms fields is somewhat complicated. | |||
| certificate_types has been present in TLS since SSLv3, but was | certificate_types has been present in TLS since SSLv3, but was | |||
| somewhat underspecified. Much of its functionality is superseded by | somewhat underspecified. Much of its functionality is superseded by | |||
| supported_signature_algorithms. The following rules apply: | supported_signature_algorithms. The following rules apply: | |||
| - Any certificates provided by the client MUST be signed using | - Any certificates provided by the client MUST be signed using a | |||
| a digest/signature algorithm pair found in | hash/signature algorithm pair found in supported_signature_types. | |||
| supported_signature_types. | ||||
| - The end-entity certificate provided by the client MUST contain a | - The end-entity certificate provided by the client MUST contain a | |||
| key which is compatible with certificate_types. If the key is a | key which is compatible with certificate_types. If the key is a | |||
| signature key, it MUST be usable with some digest/signature | signature key, it MUST be usable with some hash/signature | |||
| algorithm pair in supported_signature_types. | algorithm pair in supported_signature_types. | |||
| - For historical reasons, the names of some client certificate | - For historical reasons, the names of some client certificate types | |||
| types include the algorithm used to sign the certificate. For | include the algorithm used to sign the certificate. For example, | |||
| example, in earlier versions of TLS, rsa_fixed_dh meant a | in earlier versions of TLS, rsa_fixed_dh meant a certificate | |||
| certificate signed with RSA and containing a static DH key. In | signed with RSA and containing a static DH key. In TLS 1.2, this | |||
| TLS 1.2, this functionality has been obsoleted by the | functionality has been obsoleted by the signature_types field, and | |||
| signature_types field, and the certificate type no longer | the certificate type no longer restricts the algorithm used to | |||
| restricts the algorithm used to sign the certificate. For | sign the certificate. For example, if the server sends | |||
| example, if the server sends dss_fixed_dh certificate type and | dss_fixed_dh certificate type and {dss_sha1, rsa_sha1} signature | |||
| {dss_sha1, rsa_sha1} signature types, the client MAY to reply | types, the client MAY to reply with a certificate containing a | |||
| with a certificate containing a static DH key, signed with RSA- | static DH key, signed with RSA-SHA1. | |||
| SHA1. | ||||
| New ClientCertificateType values are assigned by IANA as described in | New ClientCertificateType values are assigned by IANA as described in | |||
| Section 12. | Section 12. | |||
| Note: Values listed as RESERVED may not be used. They were used in | Note: Values listed as RESERVED may not be used. They were used in | |||
| SSLv3. | SSLv3. | |||
| Note: It is a fatal handshake_failure alert for an anonymous server to | Note: It is a fatal handshake_failure alert for an anonymous server | |||
| request client authentication. | to request client authentication. | |||
| 7.4.5 Server hello done | 7.4.5 Server hello done | |||
| When this message will be sent: | When this message will be sent: | |||
| The server hello done message is sent by the server to indicate | ||||
| the end of the server hello and associated messages. After | The server hello done message is sent by the server to indicate | |||
| sending this message, the server will wait for a client response. | the end of the server hello and associated messages. After sending | |||
| this message, the server will wait for a client response. | ||||
| Meaning of this message: | Meaning of this message: | |||
| This message means that the server is done sending messages to | ||||
| support the key exchange, and the client can proceed with its | ||||
| phase of the key exchange. | ||||
| Upon receipt of the server hello done message, the client SHOULD | This message means that the server is done sending messages to | |||
| verify that the server provided a valid certificate, if required | support the key exchange, and the client can proceed with its | |||
| and check that the server hello parameters are acceptable. | phase of the key exchange. | |||
| Upon receipt of the server hello done message, the client SHOULD | ||||
| verify that the server provided a valid certificate, if required | ||||
| and check that the server hello parameters are acceptable. | ||||
| Structure of this message: | Structure of this message: | |||
| struct { } ServerHelloDone; | ||||
| struct { } ServerHelloDone; | ||||
| 7.4.6. Client Certificate | 7.4.6. Client Certificate | |||
| When this message will be sent: | When this message will be sent: | |||
| This is the first message the client can send after receiving a | ||||
| server hello done message. This message is only sent if the | This is the first message the client can send after receiving a | |||
| server requests a certificate. If no suitable certificate is | server hello done message. This message is only sent if the server | |||
| available, the client SHOULD send a certificate message | requests a certificate. If no suitable certificate is available, | |||
| containing no certificates. That is, the certificate_list | the client MUST send a certificate message containing no | |||
| structure has a length of zero. If client authentication is | certificates. That is, the certificate_list structure has a length | |||
| required by the server for the handshake to continue, it may | of zero. If client authentication is required by the server for | |||
| respond with a fatal handshake failure alert. Client certificates | the handshake to continue, it may respond with a fatal handshake | |||
| are sent using the Certificate structure defined in Section | failure alert. Client certificates are sent using the Certificate | |||
| 7.4.2. | structure defined in Section 7.4.2. | |||
| Meaning of this message: | Meaning of this message: | |||
| This message conveys the client's certificate to the server; the | ||||
| server will use it when verifying the certificate verify message | ||||
| (when the client authentication is based on signing), or | ||||
| calculate the premaster secret (for non-ephemeral Diffie- | ||||
| Hellman). The certificate MUST be appropriate for the negotiated | ||||
| cipher suite's key exchange algorithm, and any negotiated | ||||
| extensions. | ||||
| In particular: | This message conveys the client's certificate to the server; the | |||
| server will use it when verifying the certificate verify message | ||||
| (when the client authentication is based on signing), or calculate | ||||
| the premaster secret (for non-ephemeral Diffie-Hellman). The | ||||
| certificate MUST be appropriate for the negotiated cipher suite's | ||||
| key exchange algorithm, and any negotiated extensions. | ||||
| - The certificate type MUST be X.509v3, unless explicitly | In particular: | |||
| negotiated otherwise (e.g. [TLSPGP]). | ||||
| - The certificate's public key (and associated restrictions) | - The certificate type MUST be X.509v3, unless explicitly negotiated | |||
| has to be compatible with the certificate types listed in | otherwise (e.g. [TLSPGP]). | |||
| CertificateRequest: | ||||
| Client Cert. Type Certificate Key Type | - The certificate's public key (and associated restrictions) has to | |||
| rsa_sign RSA public key; the certificate MUST allow | be compatible with the certificate types listed in | |||
| the key to be used for signing with the | CertificateRequest: | |||
| signature scheme and hash algorithm that | ||||
| will be employed in the certificate verify | ||||
| message. | ||||
| dss_sign DSA public key; the certificate MUST allow | Client Cert. Type Certificate Key Type | |||
| the key to be used for signing with the | ||||
| hash algorithm that will be employed in | ||||
| the certificate verify message. | ||||
| ecdsa_sign ECDSA-capable public key; the certificate | rsa_sign RSA public key; the certificate MUST allow | |||
| MUST allow the key to be used for signing | the key to be used for signing with the | |||
| with the hash algorithm that will be | signature scheme and hash algorithm that | |||
| employed in the certificate verify | will be employed in the certificate verify | |||
| message; the public key MUST use a | message. | |||
| curve and point format supported by the | ||||
| server. | ||||
| rsa_fixed_dh Diffie-Hellman public key; MUST use | dss_sign DSA public key; the certificate MUST allow | |||
| dss_fixed_dh the same parameters as server's key. | the key to be used for signing with the | |||
| hash algorithm that will be employed in | ||||
| the certificate verify message. | ||||
| rsa_fixed_ecdh ECDH-capable public key; MUST use | ecdsa_sign ECDSA-capable public key; the certificate | |||
| ecdsa_fixed_ecdh the same curve as server's key, and | MUST allow the key to be used for signing | |||
| MUST use a point format supported by | with the hash algorithm that will be | |||
| employed in the certificate verify | ||||
| message; the public key MUST use a | ||||
| curve and point format supported by the | ||||
| server. | ||||
| - If the certificate_authorities list in the certificate | rsa_fixed_dh Diffie-Hellman public key; MUST use | |||
| request message was non-empty, the certificate SHOULD be | dss_fixed_dh the same parameters as server's key. | |||
| issued by one of the listed CAs. | ||||
| - The certificates MUST be signed using an acceptable digest/ | rsa_fixed_ecdh ECDH-capable public key; MUST use | |||
| signature algorithm pair, as described in Section 7.4.4. Note | ecdsa_fixed_ecdh the same curve as server's key, and | |||
| that this relaxes the constraints on certificate signing | MUST use a point format supported by | |||
| algorithms found in prior versions of TLS. | ||||
| - If the certificate_authorities list in the certificate request | ||||
| message was non-empty, the certificate SHOULD be issued by one of | ||||
| the listed CAs. | ||||
| - The certificates MUST be signed using an acceptable hash/ | ||||
| signature algorithm pair, as described in Section 7.4.4. Note that | ||||
| this relaxes the constraints on certificate signing algorithms | ||||
| found in prior versions of TLS. | ||||
| Note that as with the server certificate, there are certificates that | Note that as with the server certificate, there are certificates that | |||
| use algorithms/algorithm combinations that cannot be currently used | use algorithms/algorithm combinations that cannot be currently used | |||
| with TLS. | with TLS. | |||
| 7.4.7. Client Key Exchange Message | 7.4.7. Client Key Exchange Message | |||
| When this message will be sent: | When this message will be sent: | |||
| This message is always sent by the client. It MUST immediately follow | ||||
| the client certificate message, if it is sent. Otherwise it MUST be | This message is always sent by the client. It MUST immediately | |||
| the first message sent by the client after it receives the server | follow the client certificate message, if it is sent. Otherwise it | |||
| hello done message. | MUST be the first message sent by the client after it receives the | |||
| server hello done message. | ||||
| Meaning of this message: | Meaning of this message: | |||
| With this message, the premaster secret is set, either though direct | With this message, the premaster secret is set, either though | |||
| transmission of the RSA-encrypted secret, or by the transmission of | direct transmission of the RSA-encrypted secret, or by the | |||
| Diffie-Hellman parameters that will allow each side to agree upon the | transmission of Diffie-Hellman parameters that will allow each | |||
| same premaster secret. When the key exchange method is DH_RSA or | side to agree upon the same premaster secret. | |||
| DH_DSS, client certification has been requested, and the client was | ||||
| able to respond with a certificate that contained a Diffie-Hellman | When the client is using an ephemeral Diffie-Hellman exponent, | |||
| public key whose parameters (group and generator) matched those | then this message contains the client's Diffie-Hellman public | |||
| specified by the server in its certificate, this message MUST NOT | value. If the client is sending a certificate containing a static | |||
| contain any data. | DH exponent (i.e., it is doing fixed_dh client authentication) | |||
| then this message MUST be sent but MUST be empty. | ||||
| Structure of this message: | Structure of this message: | |||
| The choice of messages depends on which key exchange method has been | ||||
| selected. See Section 7.4.3 for the KeyExchangeAlgorithm definition. | ||||
| struct { | The choice of messages depends on which key exchange method has | |||
| select (KeyExchangeAlgorithm) { | been selected. See Section 7.4.3 for the KeyExchangeAlgorithm | |||
| case rsa: EncryptedPreMasterSecret; | definition. | |||
| case diffie_hellman: ClientDiffieHellmanPublic; | ||||
| } exchange_keys; | struct { | |||
| } ClientKeyExchange; | select (KeyExchangeAlgorithm) { | |||
| case rsa: EncryptedPreMasterSecret; | ||||
| case diffie_hellman: ClientDiffieHellmanPublic; | ||||
| } exchange_keys; | ||||
| } ClientKeyExchange; | ||||
| 7.4.7.1. RSA Encrypted Premaster Secret Message | 7.4.7.1. RSA Encrypted Premaster Secret Message | |||
| Meaning of this message: | Meaning of this message: | |||
| If RSA is being used for key agreement and authentication, the client | ||||
| generates a 48-byte premaster secret, encrypts it using the public | If RSA is being used for key agreement and authentication, the | |||
| key from the server's certificate and sends the result in an | client generates a 48-byte premaster secret, encrypts it using the | |||
| encrypted premaster secret message. This structure is a variant of | public key from the server's certificate and sends the result in | |||
| the client key exchange message and is not a message in itself. | an encrypted premaster secret message. This structure is a variant | |||
| of the client key exchange message and is not a message in itself. | ||||
| Structure of this message: | Structure of this message: | |||
| struct { | ||||
| ProtocolVersion client_version; | ||||
| opaque random[46]; | ||||
| } PreMasterSecret; | ||||
| client_version | struct { | |||
| ProtocolVersion client_version; | ||||
| opaque random[46]; | ||||
| } PreMasterSecret; | ||||
| The latest (newest) version supported by the client. This is | client_version | |||
| used to detect version roll-back attacks. | The latest (newest) version supported by the client. This is | |||
| used to detect version roll-back attacks. | ||||
| random | random | |||
| 46 securely-generated random bytes. | 46 securely-generated random bytes. | |||
| struct { | struct { | |||
| public-key-encrypted PreMasterSecret pre_master_secret; | public-key-encrypted PreMasterSecret pre_master_secret; | |||
| } EncryptedPreMasterSecret; | } EncryptedPreMasterSecret; | |||
| pre_master_secret | ||||
| This random value is generated by the client and is used to | pre_master_secret | |||
| generate the master secret, as specified in Section 8.1. | This random value is generated by the client and is used to | |||
| generate the master secret, as specified in Section 8.1. | ||||
| Note: The version number in the PreMasterSecret is the version | Note: The version number in the PreMasterSecret is the version | |||
| offered by the client in the ClientHello.client_version, not the | offered by the client in the ClientHello.client_version, not the | |||
| version negotiated for the connection. This feature is designed | version negotiated for the connection. This feature is designed to | |||
| to prevent rollback attacks. Unfortunately, some old | prevent rollback attacks. Unfortunately, some old implementations | |||
| implementations use the negotiated version instead and therefore | use the negotiated version instead and therefore checking the version | |||
| checking the version number may lead to failure to interoperate | number may lead to failure to interoperate with such incorrect client | |||
| with such incorrect client implementations. | implementations. | |||
| Client implementations MUST always send the correct version | Client implementations MUST always send the correct version number in | |||
| number in PreMasterSecret. If ClientHello.client_version is TLS | PreMasterSecret. If ClientHello.client_version is TLS 1.1 or higher, | |||
| 1.1 or higher, server implementations MUST check the version | server implementations MUST check the version number as described in | |||
| number as described in the note below. If the version number is | the note below. If the version number is earlier than 1.0, server | |||
| earlier than 1.0, server implementations SHOULD check the version | implementations SHOULD check the version number, but MAY have a | |||
| number, but MAY have a configuration option to disable the check. | configuration option to disable the check. Note that if the check | |||
| Note that if the check fails, the PreMasterSecret SHOULD be | fails, the PreMasterSecret SHOULD be randomized as described below. | |||
| randomized as described below. | ||||
| Note: Attacks discovered by Bleichenbacher [BLEI] and Klima et al. | Note: Attacks discovered by Bleichenbacher [BLEI] and Klima et al. | |||
| [KPR03] can be used to attack a TLS server that reveals whether a | [KPR03] can be used to attack a TLS server that reveals whether a | |||
| particular message, when decrypted, is properly PKCS#1 formatted, | particular message, when decrypted, is properly PKCS#1 formatted, | |||
| contains a valid PreMasterSecret structure, or has the correct | contains a valid PreMasterSecret structure, or has the correct | |||
| version number. | version number. | |||
| The best way to avoid these vulnerabilities is to treat incorrectly | The best way to avoid these vulnerabilities is to treat incorrectly | |||
| formatted messages in a manner indistinguishable from correctly | formatted messages in a manner indistinguishable from correctly | |||
| formatted RSA blocks. In other words: | formatted RSA blocks. In other words: | |||
| 1. Generate a string R of 46 random bytes | 1. Generate a string R of 46 random bytes | |||
| 2. Decrypt the message M | 2. Decrypt the message M | |||
| 3. If the PKCS#1 padding is not correct, or the length of | 3. If the PKCS#1 padding is not correct, or the length of | |||
| message M is not exactly 48 bytes: | message M is not exactly 48 bytes: | |||
| premaster secret = ClientHello.client_version || R | premaster secret = ClientHello.client_version || R | |||
| else If ClientHello.client_version <= TLS 1.0, and | else If ClientHello.client_version <= TLS 1.0, and | |||
| version number check is explicitly disabled: | version number check is explicitly disabled: | |||
| premaster secret = M | premaster secret = M | |||
| else: | else: | |||
| premaster secret = ClientHello.client_version || M[2..47] | premaster secret = ClientHello.client_version || M[2..47] | |||
| In any case, a TLS server MUST NOT generate an alert if processing an | In any case, a TLS server MUST NOT generate an alert if processing an | |||
| RSA-encrypted premaster secret message fails, or the version number | RSA-encrypted premaster secret message fails, or the version number | |||
| is not as expected. Instead, it MUST continue the handshake with a | is not as expected. Instead, it MUST continue the handshake with a | |||
| randomly generated premaster secret. It may be useful to log the | randomly generated premaster secret. It may be useful to log the | |||
| real cause of failure for troubleshooting purposes; however, care | real cause of failure for troubleshooting purposes; however, care | |||
| must be taken to avoid leaking the information to an attacker | must be taken to avoid leaking the information to an attacker | |||
| (though, e.g., timing, log files, or other channels.) | (though, e.g., timing, log files, or other channels.) | |||
| The RSAES-OAEP encryption scheme defined in [PKCS1] is more secure | The RSAES-OAEP encryption scheme defined in [PKCS1] is more secure | |||
| against the Bleichenbacher attack. However, for maximal compatibility | against the Bleichenbacher attack. However, for maximal compatibility | |||
| with earlier versions of TLS, this specification uses the RSAES- | with earlier versions of TLS, this specification uses the RSAES- | |||
| PKCS1-v1_5 scheme. No variants of the Bleichenbacher attack are known | PKCS1-v1_5 scheme. No variants of the Bleichenbacher attack are known | |||
| to exist provided that the above recommendations are followed. | to exist provided that the above recommendations are followed. | |||
| Implementation Note: Public-key-encrypted data is represented as an | Implementation Note: Public-key-encrypted data is represented as an | |||
| opaque vector <0..2^16-1> (see Section 4.7). Thus, the RSA-encrypted | opaque vector <0..2^16-1> (see Section 4.7). Thus, the RSA-encrypted | |||
| PreMasterSecret in a ClientKeyExchange is preceded by two length | PreMasterSecret in a ClientKeyExchange is preceded by two length | |||
| bytes. These bytes are redundant in the case of RSA because the | bytes. These bytes are redundant in the case of RSA because the | |||
| EncryptedPreMasterSecret is the only data in the ClientKeyExchange | EncryptedPreMasterSecret is the only data in the ClientKeyExchange | |||
| and its length can therefore be unambiguously determined. The SSLv3 | and its length can therefore be unambiguously determined. The SSLv3 | |||
| specification was not clear about the encoding of public-key- | specification was not clear about the encoding of public-key- | |||
| encrypted data, and therefore many SSLv3 implementations do not | encrypted data, and therefore many SSLv3 implementations do not | |||
| include the the length bytes, encoding the RSA encrypted data | include the the length bytes, encoding the RSA encrypted data | |||
| directly in the ClientKeyExchange message. | directly in the ClientKeyExchange message. | |||
| This specification requires correct encoding of the | This specification requires correct encoding of the | |||
| EncryptedPreMasterSecret complete with length bytes. The resulting | EncryptedPreMasterSecret complete with length bytes. The resulting | |||
| PDU is incompatible with many SSLv3 implementations. Implementors | PDU is incompatible with many SSLv3 implementations. Implementors | |||
| upgrading from SSLv3 MUST modify their implementations to generate | upgrading from SSLv3 MUST modify their implementations to generate | |||
| and accept the correct encoding. Implementors who wish to be | and accept the correct encoding. Implementors who wish to be | |||
| compatible with both SSLv3 and TLS should make their implementation's | compatible with both SSLv3 and TLS should make their implementation's | |||
| behavior dependent on the protocol version. | behavior dependent on the protocol version. | |||
| Implementation Note: It is now known that remote timing-based attacks | Implementation Note: It is now known that remote timing-based attacks | |||
| on TLS are possible, at least when the client and server are on the | on TLS are possible, at least when the client and server are on the | |||
| same LAN. Accordingly, implementations that use static RSA keys MUST | same LAN. Accordingly, implementations that use static RSA keys MUST | |||
| use RSA blinding or some other anti-timing technique, as described in | use RSA blinding or some other anti-timing technique, as described in | |||
| [TIMING]. | [TIMING]. | |||
| 7.4.7.2. Client Diffie-Hellman Public Value | 7.4.7.2. Client Diffie-Hellman Public Value | |||
| Meaning of this message: | Meaning of this message: | |||
| This structure conveys the client's Diffie-Hellman public value | ||||
| (Yc) if it was not already included in the client's certificate. | This structure conveys the client's Diffie-Hellman public value | |||
| The encoding used for Yc is determined by the enumerated | (Yc) if it was not already included in the client's certificate. | |||
| PublicValueEncoding. This structure is a variant of the client | The encoding used for Yc is determined by the enumerated | |||
| key exchange message, and not a message in itself. | PublicValueEncoding. This structure is a variant of the client key | |||
| exchange message, and not a message in itself. | ||||
| Structure of this message: | Structure of this message: | |||
| enum { implicit, explicit } PublicValueEncoding; | ||||
| implicit | ||||
| If the client certificate already contains a suitable Diffie- | ||||
| Hellman key, then Yc is implicit and does not need to be sent | ||||
| again. In this case, the client key exchange message will be | ||||
| sent, but it MUST be empty. | ||||
| explicit | enum { implicit, explicit } PublicValueEncoding; | |||
| Yc needs to be sent. | ||||
| struct { | implicit | |||
| select (PublicValueEncoding) { | If the client has sent a certificate which contains a suitable | |||
| case implicit: struct { }; | Diffie-Hellman key (for fixed_dh client authentication) then Yc | |||
| case explicit: opaque dh_Yc<1..2^16-1>; | is implicit and does not need to be sent again. In this case, | |||
| } dh_public; | the client key exchange message will be sent, but it MUST be | |||
| } ClientDiffieHellmanPublic; | empty. | |||
| dh_Yc | explicit | |||
| The client's Diffie-Hellman public value (Yc). | Yc needs to be sent. | |||
| struct { | ||||
| select (PublicValueEncoding) { | ||||
| case implicit: struct { }; | ||||
| case explicit: opaque dh_Yc<1..2^16-1>; | ||||
| } dh_public; | ||||
| } ClientDiffieHellmanPublic; | ||||
| dh_Yc | ||||
| The client's Diffie-Hellman public value (Yc). | ||||
| 7.4.8. Certificate verify | 7.4.8. Certificate verify | |||
| When this message will be sent: | When this message will be sent: | |||
| This message is used to provide explicit verification of a client | ||||
| certificate. This message is only sent following a client | This message is used to provide explicit verification of a client | |||
| certificate that has signing capability (i.e. all certificates | certificate. This message is only sent following a client | |||
| except those containing fixed Diffie-Hellman parameters). When | certificate that has signing capability (i.e. all certificates | |||
| sent, it MUST immediately follow the client key exchange message. | except those containing fixed Diffie-Hellman parameters). When | |||
| sent, it MUST immediately follow the client key exchange message. | ||||
| Structure of this message: | Structure of this message: | |||
| struct { | ||||
| Signature signature; | ||||
| } CertificateVerify; | ||||
| The Signature type is defined in 7.4.3. | struct { | |||
| Signature signature; | ||||
| } CertificateVerify; | ||||
| The hash algorithm is denoted Hash below. | The Signature type is defined in 7.4.3. | |||
| CertificateVerify.signature.hash = Hash(handshake_messages); | The hash algorithm is denoted Hash below. | |||
| The digest and signature algorithms MUST be one of those present | CertificateVerify.signature.hash = Hash(handshake_messages); | |||
| in the supported_signature_algorithms field of the | ||||
| CertificateRequest message. In addition, the digest and signature | ||||
| algorithms MUST be compatible with the key in the client's end- | ||||
| entity certificate. RSA keys MAY be used with any permitted | ||||
| digest algorithm. | ||||
| Because DSA signatures do not contain any secure indication of | The hash and signature algorithms MUST be one of those present in the | |||
| digest algorithm, it must be unambiguous which digest algorithm | supported_signature_algorithms field of the CertificateRequest | |||
| is to be used with any key. DSA keys specified with Object | message. In addition, the hash and signature algorithms MUST be | |||
| Identifier 1 2 840 10040 4 1 MUST only be used with SHA-1. | compatible with the key in the client's end-entity certificate. RSA | |||
| Future revisions of [PKIX] MAY define new object identifiers for | keys MAY be used with any permitted hash algorith, subject to | |||
| DSA with other digest algorithms. | restrictions in the certificate, if any. | |||
| Because DSA signatures do not contain any secure indication of hash | ||||
| algorithm, there is a risk of hash substitution if multiple hashes | ||||
| may be used with any key. Currently, DSS [DSS] may only be used with | ||||
| SHA-1. Future revisions of DSS [DSS-3] are expected to allow other | ||||
| digest algorithms, as well as guidance as to which digest algorithms | ||||
| should be used with each key size. In addition, future revisions of | ||||
| [PKIX] may specify mechanisms for certificates to indicate which | ||||
| digest algorithms are to be used with DSA. | ||||
| Here handshake_messages refers to all handshake messages sent or | Here handshake_messages refers to all handshake messages sent or | |||
| received starting at client hello up to but not including this | received starting at client hello up to but not including this | |||
| message, including the type and length fields of the handshake | message, including the type and length fields of the handshake | |||
| messages. This is the concatenation of all the Handshake structures | messages. This is the concatenation of all the Handshake structures | |||
| as defined in 7.4 exchanged thus far. | as defined in 7.4 exchanged thus far. | |||
| 7.4.9. Finished | 7.4.9. Finished | |||
| When this message will be sent: | When this message will be sent: | |||
| A finished message is always sent immediately after a change | ||||
| cipher spec message to verify that the key exchange and | A finished message is always sent immediately after a change | |||
| authentication processes were successful. It is essential that a | cipher spec message to verify that the key exchange and | |||
| change cipher spec message be received between the other | authentication processes were successful. It is essential that a | |||
| handshake messages and the Finished message. | change cipher spec message be received between the other handshake | |||
| messages and the Finished message. | ||||
| Meaning of this message: | Meaning of this message: | |||
| The finished message is the first protected with the just- | ||||
| negotiated algorithms, keys, and secrets. Recipients of finished | ||||
| messages MUST verify that the contents are correct. Once a side | ||||
| has sent its Finished message and received and validated the | ||||
| Finished message from its peer, it may begin to send and receive | ||||
| application data over the connection. | ||||
| struct { | The finished message is the first protected with the just- | |||
| opaque verify_data[SecurityParameters.verify_data_length]; | negotiated algorithms, keys, and secrets. Recipients of finished | |||
| } Finished; | messages MUST verify that the contents are correct. Once a side | |||
| has sent its Finished message and received and validated the | ||||
| Finished message from its peer, it may begin to send and receive | ||||
| application data over the connection. | ||||
| verify_data | Structure of this message: | |||
| PRF(master_secret, finished_label, Hash(handshake_messages)) | ||||
| [0..SecurityParameters.verify_data_length-1]; | ||||
| finished_label | struct { | |||
| For Finished messages sent by the client, the string "client | opaque verify_data[verify_data_length]; | |||
| finished". For Finished messages sent by the server, the | } Finished; | |||
| string "server finished". | ||||
| Hash denotes the negotiated hash used for the PRF. If a new | verify_data | |||
| PRF is defined, then this hash MUST be specified. | PRF(master_secret, finished_label, Hash(handshake_messages)) | |||
| [0..verify_data_length-1]; | ||||
| In previous versions of TLS, the verify_data was always 12 | finished_label | |||
| octets long. In the current version of TLS, it depends on the | For Finished messages sent by the client, the string "client | |||
| cipher suite. Any cipher suite which does not explicitly | finished". For Finished messages sent by the server, the string | |||
| specify SecurityParameters.verify_data_length has a | "server finished". | |||
| SecurityParameters.verify_data_length equal to 12. This | ||||
| includes all existing cipher suites. Note that this | ||||
| representation has the same encoding as with previous | ||||
| versions. Future cipher suites MAY specify other lengths but | ||||
| such length MUST be at least 12 bytes. | ||||
| handshake_messages | Hash denotes a Hash of the handshake messages. For the PRF defined | |||
| All of the data from all messages in this handshake (not | in Section 5, the Hash MUST be the Hash used as the basis for the | |||
| including any HelloRequest messages) up to but not including | PRF. Any cipher suite which defines a different PRF MUST also | |||
| this message. This is only data visible at the handshake | define the Hash to use in the Finished computation. | |||
| layer and does not include record layer headers. This is the | ||||
| concatenation of all the Handshake structures as defined in | In previous versions of TLS, the verify_data was always 12 octets | |||
| 7.4, exchanged thus far. | long. In the current version of TLS, it depends on the cipher | |||
| suite. Any cipher suite which does not explicitly specify | ||||
| verify_data_length has a verify_data_length equal to 12. This | ||||
| includes all existing cipher suites. Note that this | ||||
| representation has the same encoding as with previous versions. | ||||
| Future cipher suites MAY specify other lengths but such length | ||||
| MUST be at least 12 bytes. | ||||
| handshake_messages | ||||
| All of the data from all messages in this handshake (not | ||||
| including any HelloRequest messages) up to but not including | ||||
| this message. This is only data visible at the handshake layer | ||||
| and does not include record layer headers. This is the | ||||
| concatenation of all the Handshake structures as defined in | ||||
| 7.4, exchanged thus far. | ||||
| It is a fatal error if a finished message is not preceded by a change | It is a fatal error if a finished message is not preceded by a change | |||
| cipher spec message at the appropriate point in the handshake. | cipher spec message at the appropriate point in the handshake. | |||
| The value handshake_messages includes all handshake messages starting | The value handshake_messages includes all handshake messages starting | |||
| at client hello up to, but not including, this finished message. This | at client hello up to, but not including, this finished message. This | |||
| may be different from handshake_messages in Section 7.4.8 because it | may be different from handshake_messages in Section 7.4.8 because it | |||
| would include the certificate verify message (if sent). Also, the | would include the certificate verify message (if sent). Also, the | |||
| handshake_messages for the finished message sent by the client will | handshake_messages for the finished message sent by the client will | |||
| be different from that for the finished message sent by the server, | be different from that for the finished message sent by the server, | |||
| because the one that is sent second will include the prior one. | because the one that is sent second will include the prior one. | |||
| Note: Change cipher spec messages, alerts, and any other record types | Note: Change cipher spec messages, alerts, and any other record types | |||
| are not handshake messages and are not included in the hash | are not handshake messages and are not included in the hash | |||
| computations. Also, Hello Request messages are omitted from | computations. Also, Hello Request messages are omitted from handshake | |||
| handshake hashes. | hashes. | |||
| 8. Cryptographic Computations | 8. Cryptographic Computations | |||
| In order to begin connection protection, the TLS Record Protocol | In order to begin connection protection, the TLS Record Protocol | |||
| requires specification of a suite of algorithms, a master secret, and | requires specification of a suite of algorithms, a master secret, and | |||
| the client and server random values. The authentication, encryption, | the client and server random values. The authentication, encryption, | |||
| and MAC algorithms are determined by the cipher_suite selected by the | and MAC algorithms are determined by the cipher_suite selected by the | |||
| server and revealed in the server hello message. The compression | server and revealed in the server hello message. The compression | |||
| algorithm is negotiated in the hello messages, and the random values | algorithm is negotiated in the hello messages, and the random values | |||
| are exchanged in the hello messages. All that remains is to calculate | are exchanged in the hello messages. All that remains is to calculate | |||
| the master secret. | the master secret. | |||
| 8.1. Computing the Master Secret | 8.1. Computing the Master Secret | |||
| For all key exchange methods, the same algorithm is used to convert | For all key exchange methods, the same algorithm is used to convert | |||
| the pre_master_secret into the master_secret. The pre_master_secret | the pre_master_secret into the master_secret. The pre_master_secret | |||
| should be deleted from memory once the master_secret has been | should be deleted from memory once the master_secret has been | |||
| computed. | computed. | |||
| master_secret = PRF(pre_master_secret, "master secret", | master_secret = PRF(pre_master_secret, "master secret", | |||
| ClientHello.random + ServerHello.random) | ClientHello.random + ServerHello.random) | |||
| [0..47]; | [0..47]; | |||
| The master secret is always exactly 48 bytes in length. The length of | The master secret is always exactly 48 bytes in length. The length of | |||
| the premaster secret will vary depending on key exchange method. | the premaster secret will vary depending on key exchange method. | |||
| 8.1.1. RSA | 8.1.1. RSA | |||
| When RSA is used for server authentication and key exchange, a | When RSA is used for server authentication and key exchange, a | |||
| 48-byte pre_master_secret is generated by the client, encrypted under | 48-byte pre_master_secret is generated by the client, encrypted under | |||
| the server's public key, and sent to the server. The server uses its | the server's public key, and sent to the server. The server uses its | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 60, line 36 ¶ | |||
| above. | above. | |||
| 8.1.2. Diffie-Hellman | 8.1.2. Diffie-Hellman | |||
| A conventional Diffie-Hellman computation is performed. The | A conventional Diffie-Hellman computation is performed. The | |||
| negotiated key (Z) is used as the pre_master_secret, and is converted | negotiated key (Z) is used as the pre_master_secret, and is converted | |||
| into the master_secret, as specified above. Leading bytes of Z that | into the master_secret, as specified above. Leading bytes of Z that | |||
| contain all zero bits are stripped before it is used as the | contain all zero bits are stripped before it is used as the | |||
| pre_master_secret. | pre_master_secret. | |||
| Note: Diffie-Hellman parameters are specified by the server and may | Note: Diffie-Hellman parameters are specified by the server and may | |||
| be either ephemeral or contained within the server's certificate. | be either ephemeral or contained within the server's certificate. | |||
| 9. Mandatory Cipher Suites | 9. Mandatory Cipher Suites | |||
| In the absence of an application profile standard specifying | In the absence of an application profile standard specifying | |||
| otherwise, a TLS compliant application MUST implement the cipher | otherwise, a TLS compliant application MUST implement the cipher | |||
| suite TLS_RSA_WITH_AES_128_CBC_SHA. | suite TLS_RSA_WITH_AES_128_CBC_SHA. | |||
| 10. Application Data Protocol | 10. Application Data Protocol | |||
| Application data messages are carried by the Record Layer and are | Application data messages are carried by the Record Layer and are | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 61, line 4 ¶ | |||
| suite TLS_RSA_WITH_AES_128_CBC_SHA. | suite TLS_RSA_WITH_AES_128_CBC_SHA. | |||
| 10. Application Data Protocol | 10. Application Data Protocol | |||
| Application data messages are carried by the Record Layer and are | Application data messages are carried by the Record Layer and are | |||
| fragmented, compressed, and encrypted based on the current connection | fragmented, compressed, and encrypted based on the current connection | |||
| state. The messages are treated as transparent data to the record | state. The messages are treated as transparent data to the record | |||
| layer. | layer. | |||
| 11. Security Considerations | 11. Security Considerations | |||
| Security issues are discussed throughout this memo, especially in | Security issues are discussed throughout this memo, especially in | |||
| Appendices D, E, and F. | Appendices D, E, and F. | |||
| 12. IANA Considerations | 12. IANA Considerations | |||
| This document uses several registries that were originally created in | This document uses several registries that were originally created in | |||
| [TLS1.1]. IANA is requested to update (has updated) these to | [TLS1.1]. IANA is requested to update (has updated) these to | |||
| reference this document. The registries and their allocation policies | reference this document. The registries and their allocation policies | |||
| (unchanged from [TLS1.1]) are listed below. | (unchanged from [TLS1.1]) are listed below. | |||
| - TLS ClientCertificateType Identifiers Registry: Future | - TLS ClientCertificateType Identifiers Registry: Future values in | |||
| values in the range 0-63 (decimal) inclusive are assigned via | the range 0-63 (decimal) inclusive are assigned via Standards | |||
| Standards Action [RFC2434]. Values in the range 64-223 | Action [RFC2434]. Values in the range 64-223 (decimal) inclusive | |||
| (decimal) inclusive are assigned Specification Required | are assigned Specification Required [RFC2434]. Values from 224-255 | |||
| [RFC2434]. Values from 224-255 (decimal) inclusive are | (decimal) inclusive are reserved for Private Use [RFC2434]. | |||
| reserved for Private Use [RFC2434]. | ||||
| - TLS Cipher Suite Registry: Future values with the first byte | - TLS Cipher Suite Registry: Future values with the first byte in | |||
| in the range 0-191 (decimal) inclusive are assigned via | the range 0-191 (decimal) inclusive are assigned via Standards | |||
| Standards Action [RFC2434]. Values with the first byte in | Action [RFC2434]. Values with the first byte in the range 192-254 | |||
| the range 192-254 (decimal) are assigned via Specification | (decimal) are assigned via Specification Required [RFC2434]. | |||
| Required [RFC2434]. Values with the first byte 255 (decimal) | Values with the first byte 255 (decimal) are reserved for Private | |||
| are reserved for Private Use [RFC2434]. | Use [RFC2434]. | |||
| - TLS ContentType Registry: Future values are allocated via | - TLS ContentType Registry: Future values are allocated via | |||
| Standards Action [RFC2434]. | Standards Action [RFC2434]. | |||
| - TLS Alert Registry: Future values are allocated via | - TLS Alert Registry: Future values are allocated via Standards | |||
| Standards Action [RFC2434]. | Action [RFC2434]. | |||
| - TLS HandshakeType Registry: Future values are allocated via | - TLS HandshakeType Registry: Future values are allocated via | |||
| Standards Action [RFC2434]. | Standards Action [RFC2434]. | |||
| This document also uses a registry originally created in [RFC4366]. | This document also uses a registry originally created in [RFC4366]. | |||
| IANA is requested to update (has updated) it to reference this | IANA is requested to update (has updated) it to reference this | |||
| document. The registry and its allocation policy (unchanged from | document. The registry and its allocation policy (unchanged from | |||
| [RFC4366]) is listed below:. | [RFC4366]) is listed below: | |||
| - TLS ExtensionType Registry: Future values are allocated | - TLS ExtensionType Registry: Future values are allocated via IETF | |||
| via IETF Consensus [RFC2434] | Consensus [RFC2434] | |||
| In addition, this document defines one new registry to be maintained | In addition, this document defines two new registries to be | |||
| by IANA: | maintained by IANA: | |||
| - TLS SignatureAlgorithm Registry: The registry will be initially | - TLS SignatureAlgorithm Registry: The registry will be initially | |||
| populated with the values described in Section 7.4.1.4.1. | populated with the values described in Section 7.4.1.4.1. Future | |||
| Future values in the range 0-63 (decimal) inclusive are | values in the range 0-63 (decimal) inclusive are assigned via | |||
| assigned via Standards Action [RFC2434]. Values in the | Standards Action [RFC2434]. Values in the range 64-223 (decimal) | |||
| range 64-223 (decimal) inclusive are assigned via | inclusive are assigned via Specification Required [RFC2434]. | |||
| Specification Required [RFC2434]. Values from 224-255 | ||||
| (decimal) inclusive are reserved for Private Use [RFC2434]. | ||||
| - TLS HashAlgorithm Registry: The registry will be initially | Values from 224-255 (decimal) inclusive are reserved for Private | |||
| populated with the values described in Section 7.4.1.4.1. | Use [RFC2434]. | |||
| Future values in the range 0-63 (decimal) inclusive are | - TLS HashAlgorithm Registry: The registry will be initially | |||
| assigned via Standards Action [RFC2434]. Values in the | populated with the values described in Section 7.4.1.4.1. Future | |||
| range 64-223 (decimal) inclusive are assigned via | values in the range 0-63 (decimal) inclusive are assigned via | |||
| Specification Required [RFC2434]. Values from 224-255 | Standards Action [RFC2434]. Values in the range 64-223 (decimal) | |||
| (decimal) inclusive are reserved for Private Use [RFC2434]. | inclusive are assigned via Specification Required [RFC2434]. | |||
| Values from 224-255 (decimal) inclusive are reserved for Private | ||||
| Use [RFC2434]. | ||||
| This document defines one new TLS extension, cert_hash_type, which is | This document defines one new TLS extension, signature_algorithms, | |||
| to be (has been) allocated value TBD-BY-IANA in the TLS ExtensionType | which is to be (has been) allocated value TBD-BY-IANA in the TLS | |||
| registry. | ExtensionType registry. | |||
| This document also uses the TLS Compression Method Identifiers | This document also uses the TLS Compression Method Identifiers | |||
| Registry, defined in [RFC3749]. IANA is requested to allocate value | Registry, defined in [RFC3749]. IANA is requested to allocate value | |||
| 0 for the "null" compression method. | 0 for the "null" compression method. | |||
| Appendix A. Protocol Constant Values | Appendix A. Protocol Constant Values | |||
| This section describes protocol types and constants. | This section describes protocol types and constants. | |||
| A.1. Record Layer | A.1. Record Layer | |||
| struct { | struct { | |||
| uint8 major, minor; | uint8 major, minor; | |||
| } ProtocolVersion; | } ProtocolVersion; | |||
| ProtocolVersion version = { 3, 3 }; /* TLS v1.2*/ | ||||
| enum { | ProtocolVersion version = { 3, 3 }; /* TLS v1.2*/ | |||
| change_cipher_spec(20), alert(21), handshake(22), | ||||
| application_data(23), (255) | ||||
| } ContentType; | ||||
| struct { | enum { | |||
| ContentType type; | change_cipher_spec(20), alert(21), handshake(22), | |||
| ProtocolVersion version; | application_data(23), (255) | |||
| uint16 length; | } ContentType; | |||
| opaque fragment[TLSPlaintext.length]; | ||||
| } TLSPlaintext; | ||||
| struct { | struct { | |||
| ContentType type; | ContentType type; | |||
| ProtocolVersion version; | ProtocolVersion version; | |||
| uint16 length; | uint16 length; | |||
| opaque fragment[TLSCompressed.length]; | opaque fragment[TLSPlaintext.length]; | |||
| } TLSCompressed; | } TLSPlaintext; | |||
| struct { | struct { | |||
| ContentType type; | ContentType type; | |||
| ProtocolVersion version; | ProtocolVersion version; | |||
| uint16 length; | uint16 length; | |||
| select (SecurityParameters.cipher_type) { | opaque fragment[TLSCompressed.length]; | |||
| case stream: GenericStreamCipher; | } TLSCompressed; | |||
| case block: GenericBlockCipher; | ||||
| case aead: GenericAEADCipher; | ||||
| } fragment; | ||||
| } TLSCiphertext; | ||||
| stream-ciphered struct { | struct { | |||
| opaque content[TLSCompressed.length]; | ContentType type; | |||
| opaque MAC[SecurityParameters.mac_length]; | ProtocolVersion version; | |||
| } GenericStreamCipher; | uint16 length; | |||
| select (SecurityParameters.cipher_type) { | ||||
| case stream: GenericStreamCipher; | ||||
| case block: GenericBlockCipher; | ||||
| case aead: GenericAEADCipher; | ||||
| } fragment; | ||||
| } TLSCiphertext; | ||||
| struct { | stream-ciphered struct { | |||
| opaque IV[SecurityParameters.record_iv_length]; | opaque content[TLSCompressed.length]; | |||
| block-ciphered struct { | opaque MAC[SecurityParameters.mac_length]; | |||
| opaque content[TLSCompressed.length]; | } GenericStreamCipher; | |||
| opaque MAC[SecurityParameters.mac_length]; | struct { | |||
| uint8 padding[GenericBlockCipher.padding_length]; | opaque IV[SecurityParameters.record_iv_length]; | |||
| uint8 padding_length; | block-ciphered struct { | |||
| }; | opaque content[TLSCompressed.length]; | |||
| } GenericBlockCipher; | opaque MAC[SecurityParameters.mac_length]; | |||
| uint8 padding[GenericBlockCipher.padding_length]; | ||||
| uint8 padding_length; | ||||
| }; | ||||
| } GenericBlockCipher; | ||||
| aead-ciphered struct { | aead-ciphered struct { | |||
| opaque IV[SecurityParameters.record_iv_length]; | opaque IV[SecurityParameters.record_iv_length]; | |||
| opaque aead_output[AEADEncrypted.length]; | opaque aead_output[AEADEncrypted.length]; | |||
| } GenericAEADCipher; | } GenericAEADCipher; | |||
| A.2. Change Cipher Specs Message | A.2. Change Cipher Specs Message | |||
| struct { | struct { | |||
| enum { change_cipher_spec(1), (255) } type; | enum { change_cipher_spec(1), (255) } type; | |||
| } ChangeCipherSpec; | } ChangeCipherSpec; | |||
| A.3. Alert Messages | A.3. Alert Messages | |||
| enum { warning(1), fatal(2), (255) } AlertLevel; | enum { warning(1), fatal(2), (255) } AlertLevel; | |||
| enum { | enum { | |||
| close_notify(0), | close_notify(0), | |||
| unexpected_message(10), | unexpected_message(10), | |||
| bad_record_mac(20), | bad_record_mac(20), | |||
| decryption_failed_RESERVED(21), | decryption_failed_RESERVED(21), | |||
| record_overflow(22), | record_overflow(22), | |||
| decompression_failure(30), | decompression_failure(30), | |||
| handshake_failure(40), | handshake_failure(40), | |||
| no_certificate_RESERVED(41), | no_certificate_RESERVED(41), | |||
| bad_certificate(42), | bad_certificate(42), | |||
| unsupported_certificate(43), | unsupported_certificate(43), | |||
| certificate_revoked(44), | certificate_revoked(44), | |||
| certificate_expired(45), | certificate_expired(45), | |||
| certificate_unknown(46), | certificate_unknown(46), | |||
| illegal_parameter(47), | illegal_parameter(47), | |||
| unknown_ca(48), | unknown_ca(48), | |||
| access_denied(49), | access_denied(49), | |||
| decode_error(50), | decode_error(50), | |||
| decrypt_error(51), | decrypt_error(51), | |||
| export_restriction_RESERVED(60), | export_restriction_RESERVED(60), | |||
| protocol_version(70), | protocol_version(70), | |||
| insufficient_security(71), | insufficient_security(71), | |||
| internal_error(80), | internal_error(80), | |||
| user_canceled(90), | user_canceled(90), | |||
| no_renegotiation(100), | no_renegotiation(100), | |||
| unsupported_extension(110), /* new */ | unsupported_extension(110), /* new */ | |||
| (255) | (255) | |||
| } AlertDescription; | } AlertDescription; | |||
| struct { | ||||
| AlertLevel level; | ||||
| AlertDescription description; | ||||
| } Alert; | ||||
| struct { | ||||
| AlertLevel level; | ||||
| AlertDescription description; | ||||
| } Alert; | ||||
| A.4. Handshake Protocol | A.4. Handshake Protocol | |||
| enum { | enum { | |||
| hello_request(0), client_hello(1), server_hello(2), | hello_request(0), client_hello(1), server_hello(2), | |||
| certificate(11), server_key_exchange (12), | certificate(11), server_key_exchange (12), | |||
| certificate_request(13), server_hello_done(14), | certificate_request(13), server_hello_done(14), | |||
| certificate_verify(15), client_key_exchange(16), | certificate_verify(15), client_key_exchange(16), | |||
| finished(20) | finished(20) | |||
| (255) | (255) | |||
| } HandshakeType; | } HandshakeType; | |||
| struct { | struct { | |||
| HandshakeType msg_type; | HandshakeType msg_type; | |||
| uint24 length; | uint24 length; | |||
| select (HandshakeType) { | select (HandshakeType) { | |||
| case hello_request: HelloRequest; | case hello_request: HelloRequest; | |||
| case client_hello: ClientHello; | case client_hello: ClientHello; | |||
| case server_hello: ServerHello; | case server_hello: ServerHello; | |||
| case certificate: Certificate; | case certificate: Certificate; | |||
| case server_key_exchange: ServerKeyExchange; | case server_key_exchange: ServerKeyExchange; | |||
| case certificate_request: CertificateRequest; | case certificate_request: CertificateRequest; | |||
| case server_hello_done: ServerHelloDone; | case server_hello_done: ServerHelloDone; | |||
| case certificate_verify: CertificateVerify; | case certificate_verify: CertificateVerify; | |||
| case client_key_exchange: ClientKeyExchange; | case client_key_exchange: ClientKeyExchange; | |||
| case finished: Finished; | case finished: Finished; | |||
| } body; | } body; | |||
| } Handshake; | } Handshake; | |||
| A.4.1. Hello Messages | A.4.1. Hello Messages | |||
| struct { } HelloRequest; | struct { } HelloRequest; | |||
| struct { | ||||
| uint32 gmt_unix_time; | ||||
| opaque random_bytes[28]; | ||||
| } Random; | ||||
| opaque SessionID<0..32>; | struct { | |||
| uint32 gmt_unix_time; | ||||
| opaque random_bytes[28]; | ||||
| } Random; | ||||
| opaque SessionID<0..32>; | ||||
| uint8 CipherSuite[2]; | uint8 CipherSuite[2]; | |||
| enum { null(0), (255) } CompressionMethod; | enum { null(0), (255) } CompressionMethod; | |||
| struct { | struct { | |||
| ProtocolVersion client_version; | ProtocolVersion client_version; | |||
| Random random; | Random random; | |||
| SessionID session_id; | SessionID session_id; | |||
| CipherSuite cipher_suites<2..2^16-1>; | CipherSuite cipher_suites<2..2^16-2>; | |||
| CompressionMethod compression_methods<1..2^8-1>; | CompressionMethod compression_methods<1..2^8-1>; | |||
| select (extensions_present) { | select (extensions_present) { | |||
| case false: | case false: | |||
| struct {}; | struct {}; | |||
| case true: | case true: | |||
| Extension extensions<0..2^16-1>; | Extension extensions<0..2^16-1>; | |||
| }; | }; | |||
| } ClientHello; | } ClientHello; | |||
| struct { | struct { | |||
| ProtocolVersion server_version; | ProtocolVersion server_version; | |||
| Random random; | Random random; | |||
| SessionID session_id; | SessionID session_id; | |||
| CipherSuite cipher_suite; | CipherSuite cipher_suite; | |||
| CompressionMethod compression_method; | CompressionMethod compression_method; | |||
| select (extensions_present) { | select (extensions_present) { | |||
| case false: | case false: | |||
| struct {}; | struct {}; | |||
| case true: | case true: | |||
| Extension extensions<0..2^16-1>; | Extension extensions<0..2^16-1>; | |||
| }; | }; | |||
| } ServerHello; | } ServerHello; | |||
| struct { | struct { | |||
| ExtensionType extension_type; | ExtensionType extension_type; | |||
| opaque extension_data<0..2^16-1>; | opaque extension_data<0..2^16-1>; | |||
| } Extension; | } Extension; | |||
| enum { | enum { | |||
| signature_hash_algorithms(TBD-BY-IANA), (65535) | signature_algorithms(TBD-BY-IANA), (65535) | |||
| } ExtensionType; | } ExtensionType; | |||
| enum{ | enum{ | |||
| none(0), md5(1), sha1(2), sha256(3), sha384(4), | none(0), md5(1), sha1(2), sha256(3), sha384(4), | |||
| sha512(5), (255) | sha512(5), (255) | |||
| } HashAlgorithm; | } HashAlgorithm; | |||
| enum { anonymous(0), rsa(1), dsa(2), (255) } SignatureAlgorithm; | ||||
| enum { anonymous(0), rsa(1), dsa(2), (255) } SignatureAlgorithm; | struct { | |||
| HashAlgorithm hash; | ||||
| SignatureAlgorithm signature; | ||||
| } SignatureAndHashAlgorithm; | ||||
| struct { | SignatureAndHashAlgorithm | |||
| HashAlgorithm hash; | supported_signature_algorithms<2..2^16-1>; | |||
| SignatureAlgorithm signature; | ||||
| } SignatureAndHashAlgorithm; | ||||
| SignatureAndHashAlgorithm | ||||
| supported_signature_algorithms<2..2^16-1>; | ||||
| A.4.2. Server Authentication and Key Exchange Messages | A.4.2. Server Authentication and Key Exchange Messages | |||
| opaque ASN.1Cert<2^24-1>; | opaque ASN.1Cert<2^24-1>; | |||
| struct { | struct { | |||
| ASN.1Cert certificate_list<0..2^24-1>; | ASN.1Cert certificate_list<0..2^24-1>; | |||
| } Certificate; | } Certificate; | |||
| enum { rsa, diffie_hellman } KeyExchangeAlgorithm; | enum { rsa, diffie_hellman } KeyExchangeAlgorithm; | |||
| struct { | struct { | |||
| opaque dh_p<1..2^16-1>; | opaque dh_p<1..2^16-1>; | |||
| opaque dh_g<1..2^16-1>; | opaque dh_g<1..2^16-1>; | |||
| opaque dh_Ys<1..2^16-1>; | opaque dh_Ys<1..2^16-1>; | |||
| } ServerDHParams; | } ServerDHParams; | |||
| struct { | struct { | |||
| select (KeyExchangeAlgorithm) { | select (KeyExchangeAlgorithm) { | |||
| case diffie_hellman: | case diffie_hellman: | |||
| ServerDHParams params; | ServerDHParams params; | |||
| Signature signed_params; | Signature signed_params; | |||
| } | } | |||
| } ServerKeyExchange; | } ServerKeyExchange; | |||
| struct { | struct { | |||
| select (KeyExchangeAlgorithm) { | select (KeyExchangeAlgorithm) { | |||
| case diffie_hellman: | case diffie_hellman: | |||
| ServerDHParams params; | ServerDHParams params; | |||
| }; | }; | |||
| } ServerParams; | } ServerParams; | |||
| struct { | struct { | |||
| select (SignatureAlgorithm) { | select (SignatureAlgorithm) { | |||
| case anonymous: struct { }; | case anonymous: struct { }; | |||
| case rsa: | case rsa: | |||
| SignatureAndHashAlgorithm signature_algorithm; /*NEW*/ | SignatureAndHashAlgorithm signature_algorithm; /*NEW*/ | |||
| digitally-signed struct { | digitally-signed struct { | |||
| opaque hash[Hash.length]; | opaque hash[Hash.length]; | |||
| }; | ||||
| case dsa: | ||||
| SignatureAndHashAlgorithm signature_algorithm; /*NEW*/ | ||||
| digitally-signed struct { | ||||
| opaque hash[Hash.length]; | ||||
| }; | ||||
| }; | ||||
| }; | ||||
| } Signature; | ||||
| enum { | ||||
| rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4), | ||||
| rsa_ephemeral_dh_RESERVED(5), dss_ephemeral_dh_RESERVED(6), | ||||
| fortezza_dms_RESERVED(20), | ||||
| (255) | ||||
| } ClientCertificateType; | ||||
| opaque DistinguishedName<1..2^16-1>; | }; | |||
| case dsa: | ||||
| SignatureAndHashAlgorithm signature_algorithm; /*NEW*/ | ||||
| digitally-signed struct { | ||||
| opaque hash[Hash.length]; | ||||
| }; | ||||
| }; | ||||
| }; | ||||
| } Signature; | ||||
| struct { | enum { | |||
| ClientCertificateType certificate_types<1..2^8-1>; | rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4), | |||
| DistinguishedName certificate_authorities<0..2^16-1>; | rsa_ephemeral_dh_RESERVED(5), dss_ephemeral_dh_RESERVED(6), | |||
| } CertificateRequest; | fortezza_dms_RESERVED(20), | |||
| (255) | ||||
| } ClientCertificateType; | ||||
| struct { } ServerHelloDone; | opaque DistinguishedName<1..2^16-1>; | |||
| struct { | ||||
| ClientCertificateType certificate_types<1..2^8-1>; | ||||
| DistinguishedName certificate_authorities<0..2^16-1>; | ||||
| } CertificateRequest; | ||||
| struct { } ServerHelloDone; | ||||
| A.4.3. Client Authentication and Key Exchange Messages | A.4.3. Client Authentication and Key Exchange Messages | |||
| struct { | struct { | |||
| select (KeyExchangeAlgorithm) { | select (KeyExchangeAlgorithm) { | |||
| case rsa: EncryptedPreMasterSecret; | case rsa: EncryptedPreMasterSecret; | |||
| case diffie_hellman: ClientDiffieHellmanPublic; | case diffie_hellman: ClientDiffieHellmanPublic; | |||
| } exchange_keys; | } exchange_keys; | |||
| } ClientKeyExchange; | } ClientKeyExchange; | |||
| struct { | struct { | |||
| ProtocolVersion client_version; | ProtocolVersion client_version; | |||
| opaque random[46]; | opaque random[46]; | |||
| } PreMasterSecret; | } PreMasterSecret; | |||
| struct { | struct { | |||
| public-key-encrypted PreMasterSecret pre_master_secret; | public-key-encrypted PreMasterSecret pre_master_secret; | |||
| } EncryptedPreMasterSecret; | } EncryptedPreMasterSecret; | |||
| enum { implicit, explicit } PublicValueEncoding; | enum { implicit, explicit } PublicValueEncoding; | |||
| struct { | struct { | |||
| select (PublicValueEncoding) { | select (PublicValueEncoding) { | |||
| case implicit: struct {}; | case implicit: struct {}; | |||
| case explicit: opaque DH_Yc<1..2^16-1>; | case explicit: opaque DH_Yc<1..2^16-1>; | |||
| } dh_public; | } dh_public; | |||
| } ClientDiffieHellmanPublic; | } ClientDiffieHellmanPublic; | |||
| struct { | struct { | |||
| Signature signature; | Signature signature; | |||
| } CertificateVerify; | } CertificateVerify; | |||
| A.4.4. Handshake Finalization Message | A.4.4. Handshake Finalization Message | |||
| struct { | ||||
| opaque verify_data[SecurityParameters.verify_data_length]; | struct { | |||
| } Finished; | opaque verify_data[verify_data_length]; | |||
| } Finished; | ||||
| A.5. The CipherSuite | A.5. The CipherSuite | |||
| The following values define the CipherSuite codes used in the client | The following values define the CipherSuite codes used in the client | |||
| hello and server hello messages. | hello and server hello messages. | |||
| A CipherSuite defines a cipher specification supported in TLS Version | A CipherSuite defines a cipher specification supported in TLS Version | |||
| 1.2. | 1.2. | |||
| TLS_NULL_WITH_NULL_NULL is specified and is the initial state of a | TLS_NULL_WITH_NULL_NULL is specified and is the initial state of a | |||
| TLS connection during the first handshake on that channel, but MUST | TLS connection during the first handshake on that channel, but MUST | |||
| not be negotiated, as it provides no more protection than an | not be negotiated, as it provides no more protection than an | |||
| unsecured connection. | unsecured connection. | |||
| CipherSuite TLS_NULL_WITH_NULL_NULL = { 0x00,0x00 }; | CipherSuite TLS_NULL_WITH_NULL_NULL = { 0x00,0x00 }; | |||
| The following CipherSuite definitions require that the server provide | The following CipherSuite definitions require that the server provide | |||
| an RSA certificate that can be used for key exchange. The server may | an RSA certificate that can be used for key exchange. The server may | |||
| request either an RSA or a DSS signature-capable certificate in the | request either any signature-capable certificate in the certificate | |||
| certificate request message. | request message. | |||
| CipherSuite TLS_RSA_WITH_NULL_MD5 = { 0x00,0x01 }; | CipherSuite TLS_RSA_WITH_NULL_MD5 = { 0x00,0x01 }; | |||
| CipherSuite TLS_RSA_WITH_NULL_SHA = { 0x00,0x02 }; | CipherSuite TLS_RSA_WITH_NULL_SHA = { 0x00,0x02 }; | |||
| CipherSuite TLS_RSA_WITH_RC4_128_MD5 = { 0x00,0x04 }; | CipherSuite TLS_RSA_WITH_RC4_128_MD5 = { 0x00,0x04 }; | |||
| CipherSuite TLS_RSA_WITH_RC4_128_SHA = { 0x00,0x05 }; | CipherSuite TLS_RSA_WITH_RC4_128_SHA = { 0x00,0x05 }; | |||
| CipherSuite TLS_RSA_WITH_IDEA_CBC_SHA = { 0x00,0x07 }; | CipherSuite TLS_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0A }; | |||
| CipherSuite TLS_RSA_WITH_DES_CBC_SHA = { 0x00,0x09 }; | CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA = { 0x00,0x2F }; | |||
| CipherSuite TLS_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0A }; | CipherSuite TLS_RSA_WITH_AES_256_CBC_SHA = { 0x00,0x35 }; | |||
| CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA = { 0x00, 0x2F }; | ||||
| CipherSuite TLS_RSA_WITH_AES_256_CBC_SHA = { 0x00, 0x35 }; | ||||
| The following CipherSuite definitions are used for server- | The following CipherSuite definitions are used for server- | |||
| authenticated (and optionally client-authenticated) Diffie-Hellman. | authenticated (and optionally client-authenticated) Diffie-Hellman. | |||
| DH denotes cipher suites in which the server's certificate contains | DH denotes cipher suites in which the server's certificate contains | |||
| the Diffie-Hellman parameters signed by the certificate authority | the Diffie-Hellman parameters signed by the certificate authority | |||
| (CA). DHE denotes ephemeral Diffie-Hellman, where the Diffie-Hellman | (CA). DHE denotes ephemeral Diffie-Hellman, where the Diffie-Hellman | |||
| parameters are signed by a DSS or RSA certificate, which has been | parameters are signed by a a signature-capable certificate, which has | |||
| signed by the CA. The signing algorithm used is specified after the | been signed by the CA. The signing algorithm used is specified after | |||
| DH or DHE parameter. The server can request an RSA or DSS signature- | the DH or DHE parameter. The server can request any signature-capable | |||
| capable certificate from the client for client authentication or it | certificate from the client for client authentication or it may | |||
| may request a Diffie-Hellman certificate. Any Diffie-Hellman | request a Diffie-Hellman certificate. Any Diffie-Hellman certificate | |||
| certificate provided by the client must use the parameters (group and | provided by the client must use the parameters (group and generator) | |||
| generator) described by the server. | described by the server. | |||
| CipherSuite TLS_DH_DSS_WITH_DES_CBC_SHA = { 0x00,0x0C }; | CipherSuite TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0D }; | |||
| CipherSuite TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0D }; | CipherSuite TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x10 }; | |||
| CipherSuite TLS_DH_RSA_WITH_DES_CBC_SHA = { 0x00,0x0F }; | CipherSuite TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x13 }; | |||
| CipherSuite TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x10 }; | CipherSuite TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x16 }; | |||
| CipherSuite TLS_DHE_DSS_WITH_DES_CBC_SHA = { 0x00,0x12 }; | CipherSuite TLS_DH_DSS_WITH_AES_128_CBC_SHA = { 0x00,0x30 }; | |||
| CipherSuite TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x13 }; | CipherSuite TLS_DH_RSA_WITH_AES_128_CBC_SHA = { 0x00,0x31 }; | |||
| CipherSuite TLS_DHE_RSA_WITH_DES_CBC_SHA = { 0x00,0x15 }; | CipherSuite TLS_DHE_DSS_WITH_AES_128_CBC_SHA = { 0x00,0x32 }; | |||
| CipherSuite TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x16 }; | CipherSuite TLS_DHE_RSA_WITH_AES_128_CBC_SHA = { 0x00,0x33 }; | |||
| CipherSuite TLS_DH_DSS_WITH_AES_128_CBC_SHA = { 0x00, 0x30 }; | CipherSuite TLS_DH_DSS_WITH_AES_256_CBC_SHA = { 0x00,0x36 }; | |||
| CipherSuite TLS_DH_RSA_WITH_AES_128_CBC_SHA = { 0x00, 0x31 }; | CipherSuite TLS_DH_RSA_WITH_AES_256_CBC_SHA = { 0x00,0x37 }; | |||
| CipherSuite TLS_DHE_DSS_WITH_AES_128_CBC_SHA = { 0x00, 0x32 }; | CipherSuite TLS_DHE_DSS_WITH_AES_256_CBC_SHA = { 0x00,0x38 }; | |||
| CipherSuite TLS_DHE_RSA_WITH_AES_128_CBC_SHA = { 0x00, 0x33 }; | CipherSuite TLS_DHE_RSA_WITH_AES_256_CBC_SHA = { 0x00,0x39 }; | |||
| CipherSuite TLS_DH_DSS_WITH_AES_256_CBC_SHA = { 0x00, 0x36 }; | ||||
| CipherSuite TLS_DH_RSA_WITH_AES_256_CBC_SHA = { 0x00, 0x37 }; | ||||
| CipherSuite TLS_DHE_DSS_WITH_AES_256_CBC_SHA = { 0x00, 0x38 }; | ||||
| CipherSuite TLS_DHE_RSA_WITH_AES_256_CBC_SHA = { 0x00, 0x39 }; | ||||
| The following cipher suites are used for completely anonymous Diffie- | The following cipher suites are used for completely anonymous Diffie- | |||
| Hellman communications in which neither party is authenticated. Note | Hellman communications in which neither party is authenticated. Note | |||
| that this mode is vulnerable to man-in-the-middle attacks. Using | that this mode is vulnerable to man-in-the-middle attacks. Using | |||
| this mode therefore is of limited use: These ciphersuites MUST NOT be | this mode therefore is of limited use: These ciphersuites MUST NOT be | |||
| used by TLS 1.2 implementations unless the application layer has | used by TLS 1.2 implementations unless the application layer has | |||
| specifically requested to allow anonymous key exchange. (Anonymous | specifically requested to allow anonymous key exchange. (Anonymous | |||
| key exchange may sometimes be acceptable, for example, to support | key exchange may sometimes be acceptable, for example, to support | |||
| opportunistic encryption when no set-up for authentication is in | opportunistic encryption when no set-up for authentication is in | |||
| place, or when TLS is used as part of more complex security protocols | place, or when TLS is used as part of more complex security protocols | |||
| that have other means to ensure authentication.) | that have other means to ensure authentication.) | |||
| CipherSuite TLS_DH_anon_WITH_RC4_128_MD5 = { 0x00, 0x18 }; | CipherSuite TLS_DH_anon_WITH_RC4_128_MD5 = { 0x00,0x18 }; | |||
| CipherSuite TLS_DH_anon_WITH_DES_CBC_SHA = { 0x00, 0x1A }; | CipherSuite TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = { 0x00,0x1B }; | |||
| CipherSuite TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x1B }; | CipherSuite TLS_DH_anon_WITH_AES_128_CBC_SHA = { 0x00,0x34 }; | |||
| CipherSuite TLS_DH_anon_WITH_AES_128_CBC_SHA = { 0x00, 0x34 }; | CipherSuite TLS_DH_anon_WITH_AES_256_CBC_SHA = { 0x00,0x3A }; | |||
| CipherSuite TLS_DH_anon_WITH_AES_256_CBC_SHA = { 0x00, 0x3A }; | ||||
| Note that using non-anonymous key exchange without actually verifying | Note that using non-anonymous key exchange without actually verifying | |||
| the key exchange is essentially equivalent to anonymous key exchange, | the key exchange is essentially equivalent to anonymous key exchange, | |||
| and the same precautions apply. While non-anonymous key exchange | and the same precautions apply. While non-anonymous key exchange | |||
| will generally involve a higher computational and communicational | will generally involve a higher computational and communicational | |||
| cost than anonymous key exchange, it may be in the interest of | cost than anonymous key exchange, it may be in the interest of | |||
| interoperability not to disable non-anonymous key exchange when the | interoperability not to disable non-anonymous key exchange when the | |||
| application layer is allowing anonymous key exchange. | application layer is allowing anonymous key exchange. | |||
| SSLv3, TLS 1.0, and TLS 1.1 supported DES and IDEA. DES had a 56-bit | ||||
| key which is too weak for modern use. Triple-DES (3DES) has an | ||||
| effective key strength of 112 bits and is still acceptable. IDEA and | ||||
| is no longer in wide use. Cipher suites using RC2, DES, and IDEA are | ||||
| hereby deprecated for TLS 1.2. TLS 1.2 implementations MUST NOT | ||||
| negotiate these cipher suites in TLS 1.2 mode. However, for backward | ||||
| compatibility they may be offered in the ClientHello for use with TLS | ||||
| 1.0 or SSLv3 only servers. TLS 1.2 clients MUST check that the server | ||||
| did not choose one of these cipher suites during the handshake. These | ||||
| ciphersuites are listed below for informational purposes and to | ||||
| reserve the numbers. | ||||
| CipherSuite TLS_RSA_WITH_IDEA_CBC_SHA = { 0x00,0x07 }; | ||||
| CipherSuite TLS_RSA_WITH_DES_CBC_SHA = { 0x00,0x09 }; | ||||
| CipherSuite TLS_DH_DSS_WITH_DES_CBC_SHA = { 0x00,0x0C }; | ||||
| CipherSuite TLS_DH_RSA_WITH_DES_CBC_SHA = { 0x00,0x0F }; | ||||
| CipherSuite TLS_DHE_RSA_WITH_DES_CBC_SHA = { 0x00,0x15 }; | ||||
| CipherSuite TLS_DHE_DSS_WITH_DES_CBC_SHA = { 0x00,0x12 }; | ||||
| CipherSuite TLS_DH_anon_WITH_DES_CBC_SHA = { 0x00,0x1A }; | ||||
| When SSLv3 and TLS 1.0 were designed, the United States restricted | When SSLv3 and TLS 1.0 were designed, the United States restricted | |||
| the export of cryptographic software containing certain strong | the export of cryptographic software containing certain strong | |||
| encryption algorithms. A series of cipher suites were designed to | encryption algorithms. A series of cipher suites were designed to | |||
| operate at reduced key lengths in order to comply with those | operate at reduced key lengths in order to comply with those | |||
| regulations. Due to advances in computer performance, these | regulations. Due to advances in computer performance, these | |||
| algorithms are now unacceptably weak and export restrictions have | algorithms are now unacceptably weak and export restrictions have | |||
| since been loosened. TLS 1.2 implementations MUST NOT negotiate these | since been loosened. TLS 1.2 implementations MUST NOT negotiate these | |||
| cipher suites in TLS 1.2 mode. However, for backward compatibility | cipher suites in TLS 1.2 mode. However, for backward compatibility | |||
| they may be offered in the ClientHello for use with TLS 1.0 or SSLv3 | they may be offered in the ClientHello for use with TLS 1.0 or SSLv3 | |||
| only servers. TLS 1.2 clients MUST check that the server did not | only servers. TLS 1.2 clients MUST check that the server did not | |||
| choose one of these cipher suites during the handshake. These | choose one of these cipher suites during the handshake. These | |||
| ciphersuites are listed below for informational purposes and to | ciphersuites are listed below for informational purposes and to | |||
| reserve the numbers. | reserve the numbers. | |||
| CipherSuite TLS_RSA_EXPORT_WITH_RC4_40_MD5 = { 0x00,0x03 }; | CipherSuite TLS_RSA_EXPORT_WITH_RC4_40_MD5 = { 0x00,0x03 }; | |||
| CipherSuite TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = { 0x00,0x06 }; | CipherSuite TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = { 0x00,0x06 }; | |||
| CipherSuite TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x08 }; | CipherSuite TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x08 }; | |||
| CipherSuite TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x0B }; | CipherSuite TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x0B }; | |||
| CipherSuite TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x0E }; | CipherSuite TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x0E }; | |||
| CipherSuite TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x11 }; | CipherSuite TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x11 }; | |||
| CipherSuite TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x14 }; | CipherSuite TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x14 }; | |||
| CipherSuite TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = { 0x00,0x17 }; | CipherSuite TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = { 0x00,0x17 }; | |||
| CipherSuite TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x19 }; | CipherSuite TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x19 }; | |||
| New cipher suite values are assigned by IANA as described in Section | New cipher suite values are assigned by IANA as described in Section | |||
| 12. | 12. | |||
| Note: The cipher suite values { 0x00, 0x1C } and { 0x00, 0x1D } are | Note: The cipher suite values { 0x00, 0x1C } and { 0x00, 0x1D } are | |||
| reserved to avoid collision with Fortezza-based cipher suites in SSL | reserved to avoid collision with Fortezza-based cipher suites in SSL | |||
| 3. | 3. | |||
| A.6. The Security Parameters | A.6. The Security Parameters | |||
| These security parameters are determined by the TLS Handshake | These security parameters are determined by the TLS Handshake | |||
| Protocol and provided as parameters to the TLS Record Layer in order | Protocol and provided as parameters to the TLS Record Layer in order | |||
| to initialize a connection state. SecurityParameters includes: | to initialize a connection state. SecurityParameters includes: | |||
| enum { null(0), (255) } CompressionMethod; | enum { null(0), (255) } CompressionMethod; | |||
| enum { server, client } ConnectionEnd; | enum { server, client } ConnectionEnd; | |||
| enum { null, rc4, rc2, des, 3des, des40, aes, idea } | enum { tls_prf_sha256 } PRFAlgorithm; | |||
| BulkCipherAlgorithm; | ||||
| enum { stream, block, aead } CipherType; | enum { null, rc4, 3des, aes } | |||
| BulkCipherAlgorithm; | ||||
| enum { null, hmac_md5, hmac_sha, hmac_sha256, hmac_sha384, | enum { stream, block, aead } CipherType; | |||
| hmac_sha512} MACAlgorithm; | ||||
| enum { null, hmac_md5, hmac_sha, hmac_sha256, hmac_sha384, | ||||
| hmac_sha512} MACAlgorithm; | ||||
| /* The algorithms specified in CompressionMethod, | /* The algorithms specified in CompressionMethod, | |||
| BulkCipherAlgorithm, and MACAlgorithm may be added to. */ | BulkCipherAlgorithm, and MACAlgorithm may be added to. */ | |||
| struct { | struct { | |||
| ConnectionEnd entity; | ConnectionEnd entity; | |||
| BulkCipherAlgorithm bulk_cipher_algorithm; | PRFAlgorithm prf_algorithm; | |||
| CipherType cipher_type; | BulkCipherAlgorithm bulk_cipher_algorithm; | |||
| uint8 enc_key_length; | CipherType cipher_type; | |||
| uint8 block_length; | uint8 enc_key_length; | |||
| uint8 fixed_iv_length; | uint8 block_length; | |||
| uint8 record_iv_length; | uint8 fixed_iv_length; | |||
| MACAlgorithm mac_algorithm; | uint8 record_iv_length; | |||
| uint8 mac_length; | MACAlgorithm mac_algorithm; | |||
| uint8 mac_key_length; | uint8 mac_length; | |||
| uint8 verify_data_length; | uint8 mac_key_length; | |||
| CompressionMethod compression_algorithm; | CompressionMethod compression_algorithm; | |||
| opaque master_secret[48]; | opaque master_secret[48]; | |||
| opaque client_random[32]; | opaque client_random[32]; | |||
| opaque server_random[32]; | opaque server_random[32]; | |||
| } SecurityParameters; | } SecurityParameters; | |||
| Appendix B. Glossary | Appendix B. Glossary | |||
| Advanced Encryption Standard (AES) | Advanced Encryption Standard (AES) | |||
| AES is a widely used symmetric encryption algorithm. AES is a | AES is a widely used symmetric encryption algorithm. AES is a | |||
| block cipher with a 128, 192, or 256 bit keys and a 16 byte block | block cipher with a 128, 192, or 256 bit keys and a 16 byte block | |||
| size. [AES] TLS currently only supports the 128 and 256 bit key | size. [AES] TLS currently only supports the 128 and 256 bit key | |||
| sizes. | sizes. | |||
| application protocol | application protocol | |||
| An application protocol is a protocol that normally layers | An application protocol is a protocol that normally layers | |||
| directly on top of the transport layer (e.g., TCP/IP). Examples | directly on top of the transport layer (e.g., TCP/IP). Examples | |||
| include HTTP, TELNET, FTP, and SMTP. | include HTTP, TELNET, FTP, and SMTP. | |||
| asymmetric cipher | asymmetric cipher | |||
| See public key cryptography. | See public key cryptography. | |||
| authenticated encryption with additional data (AEAD) | authenticated encryption with additional data (AEAD) | |||
| A symmetric encryption algorithm that simultaneously provides | A symmetric encryption algorithm that simultaneously provides | |||
| confidentiality and message integrity. | confidentiality and message integrity. | |||
| authentication | authentication | |||
| Authentication is the ability of one entity to determine the | Authentication is the ability of one entity to determine the | |||
| identity of another entity. | identity of another entity. | |||
| block cipher | block cipher | |||
| A block cipher is an algorithm that operates on plaintext in | A block cipher is an algorithm that operates on plaintext in | |||
| groups of bits, called blocks. 64 bits is a common block size. | groups of bits, called blocks. 64 bits is a common block size. | |||
| bulk cipher | bulk cipher | |||
| A symmetric encryption algorithm used to encrypt large quantities | A symmetric encryption algorithm used to encrypt large quantities | |||
| of data. | of data. | |||
| cipher block chaining (CBC) | cipher block chaining (CBC) | |||
| CBC is a mode in which every plaintext block encrypted with a | CBC is a mode in which every plaintext block encrypted with a | |||
| block cipher is first exclusive-ORed with the previous ciphertext | block cipher is first exclusive-ORed with the previous ciphertext | |||
| block (or, in the case of the first block, with the | block (or, in the case of the first block, with the initialization | |||
| initialization vector). For decryption, every block is first | vector). For decryption, every block is first decrypted, then | |||
| decrypted, then exclusive-ORed with the previous ciphertext block | exclusive-ORed with the previous ciphertext block (or IV). | |||
| (or IV). | ||||
| certificate | certificate | |||
| As part of the X.509 protocol (a.k.a. ISO Authentication | As part of the X.509 protocol (a.k.a. ISO Authentication | |||
| framework), certificates are assigned by a trusted Certificate | framework), certificates are assigned by a trusted Certificate | |||
| Authority and provide a strong binding between a party's identity | Authority and provide a strong binding between a party's identity | |||
| or some other attributes and its public key. | or some other attributes and its public key. | |||
| client | client | |||
| The application entity that initiates a TLS connection to a | The application entity that initiates a TLS connection to a | |||
| server. This may or may not imply that the client initiated the | server. This may or may not imply that the client initiated the | |||
| underlying transport connection. The primary operational | underlying transport connection. The primary operational | |||
| difference between the server and client is that the server is | difference between the server and client is that the server is | |||
| generally authenticated, while the client is only optionally | generally authenticated, while the client is only optionally | |||
| authenticated. | authenticated. | |||
| client write key | client write key | |||
| The key used to encrypt data written by the client. | The key used to encrypt data written by the client. | |||
| client write MAC secret | client write MAC key | |||
| The secret data used to authenticate data written by the client. | The secret data used to authenticate data written by the client. | |||
| connection | connection | |||
| A connection is a transport (in the OSI layering model | A connection is a transport (in the OSI layering model definition) | |||
| definition) that provides a suitable type of service. For TLS, | that provides a suitable type of service. For TLS, such | |||
| such connections are peer-to-peer relationships. The connections | connections are peer-to-peer relationships. The connections are | |||
| are transient. Every connection is associated with one session. | transient. Every connection is associated with one session. | |||
| Data Encryption Standard | Data Encryption Standard | |||
| DES is a very widely used symmetric encryption algorithm. DES is | DES is a very widely used symmetric encryption algorithm. DES is a | |||
| a block cipher with a 56 bit key and an 8 byte block size. Note | block cipher with a 56 bit key and an 8 byte block size. Note that | |||
| that in TLS, for key generation purposes, DES is treated as | in TLS, for key generation purposes, DES is treated as having an 8 | |||
| having an 8 byte key length (64 bits), but it still only provides | byte key length (64 bits), but it still only provides 56 bits of | |||
| 56 bits of protection. (The low bit of each key byte is presumed | protection. (The low bit of each key byte is presumed to be set to | |||
| to be set to produce odd parity in that key byte.) DES can also | produce odd parity in that key byte.) DES can also be operated in | |||
| be operated in a mode where three independent keys and three | a mode where three independent keys and three encryptions are used | |||
| encryptions are used for each block of data; this uses 168 bits | for each block of data; this uses 168 bits of key (24 bytes in the | |||
| of key (24 bytes in the TLS key generation method) and provides | TLS key generation method) and provides the equivalent of 112 bits | |||
| the equivalent of 112 bits of security. [DES], [3DES] | of security. [DES], [3DES] | |||
| Digital Signature Standard (DSS) | Digital Signature Standard (DSS) | |||
| A standard for digital signing, including the Digital Signing | A standard for digital signing, including the Digital Signing | |||
| Algorithm, approved by the National Institute of Standards and | Algorithm, approved by the National Institute of Standards and | |||
| Technology, defined in NIST FIPS PUB 186, "Digital Signature | Technology, defined in NIST FIPS PUB 186, "Digital Signature | |||
| Standard", published May, 1994 by the U.S. Dept. of Commerce. | Standard", published May, 1994 by the U.S. Dept. of Commerce. | |||
| [DSS] | [DSS] | |||
| digital signatures | digital signatures | |||
| Digital signatures utilize public key cryptography and one-way | Digital signatures utilize public key cryptography and one-way | |||
| hash functions to produce a signature of the data that can be | hash functions to produce a signature of the data that can be | |||
| authenticated, and is difficult to forge or repudiate. | authenticated, and is difficult to forge or repudiate. | |||
| handshake | handshake | |||
| An initial negotiation between client and server that establishes | An initial negotiation between client and server that establishes | |||
| the parameters of their transactions. | the parameters of their transactions. | |||
| Initialization Vector (IV) | Initialization Vector (IV) | |||
| When a block cipher is used in CBC mode, the initialization | When a block cipher is used in CBC mode, the initialization vector | |||
| vector is exclusive-ORed with the first plaintext block prior to | is exclusive-ORed with the first plaintext block prior to | |||
| encryption. | encryption. | |||
| IDEA | IDEA | |||
| A 64-bit block cipher designed by Xuejia Lai and James Massey. | A 64-bit block cipher designed by Xuejia Lai and James Massey. | |||
| [IDEA] | [IDEA] | |||
| Message Authentication Code (MAC) | Message Authentication Code (MAC) | |||
| A Message Authentication Code is a one-way hash computed from a | A Message Authentication Code is a one-way hash computed from a | |||
| message and some secret data. It is difficult to forge without | message and some secret data. It is difficult to forge without | |||
| knowing the secret data. Its purpose is to detect if the message | knowing the secret data. Its purpose is to detect if the message | |||
| has been altered. | has been altered. | |||
| master secret | master secret | |||
| Secure secret data used for generating encryption keys, MAC | Secure secret data used for generating encryption keys, MAC | |||
| secrets, and IVs. | secrets, and IVs. | |||
| MD5 | MD5 | |||
| MD5 is a secure hashing function that converts an arbitrarily | MD5 is a secure hashing function that converts an arbitrarily long | |||
| long data stream into a digest of fixed size (16 bytes). [MD5] | data stream into a hash of fixed size (16 bytes). [MD5] | |||
| public key cryptography | public key cryptography | |||
| A class of cryptographic techniques employing two-key ciphers. | A class of cryptographic techniques employing two-key ciphers. | |||
| Messages encrypted with the public key can only be decrypted with | Messages encrypted with the public key can only be decrypted with | |||
| the associated private key. Conversely, messages signed with the | the associated private key. Conversely, messages signed with the | |||
| private key can be verified with the public key. | private key can be verified with the public key. | |||
| one-way hash function | one-way hash function | |||
| A one-way transformation that converts an arbitrary amount of | A one-way transformation that converts an arbitrary amount of data | |||
| data into a fixed-length hash. It is computationally hard to | into a fixed-length hash. It is computationally hard to reverse | |||
| reverse the transformation or to find collisions. MD5 and SHA are | the transformation or to find collisions. MD5 and SHA are examples | |||
| examples of one-way hash functions. | of one-way hash functions. | |||
| RC2 | RC2 | |||
| A block cipher developed by Ron Rivest, described in [RC2]. | A block cipher developed by Ron Rivest, described in [RC2]. | |||
| RC4 | RC4 | |||
| A stream cipher invented by Ron Rivest. A compatible cipher is | A stream cipher invented by Ron Rivest. A compatible cipher is | |||
| described in [SCH]. | described in [SCH]. | |||
| RSA | RSA | |||
| A very widely used public-key algorithm that can be used for | A very widely used public-key algorithm that can be used for | |||
| either encryption or digital signing. [RSA] | either encryption or digital signing. [RSA] | |||
| server | server | |||
| The server is the application entity that responds to requests | The server is the application entity that responds to requests for | |||
| for connections from clients. See also under client. | connections from clients. See also under client. | |||
| session | session | |||
| A TLS session is an association between a client and a server. | A TLS session is an association between a client and a server. | |||
| Sessions are created by the handshake protocol. Sessions define a | Sessions are created by the handshake protocol. Sessions define a | |||
| set of cryptographic security parameters that can be shared among | set of cryptographic security parameters that can be shared among | |||
| multiple connections. Sessions are used to avoid the expensive | multiple connections. Sessions are used to avoid the expensive | |||
| negotiation of new security parameters for each connection. | negotiation of new security parameters for each connection. | |||
| session identifier | session identifier | |||
| A session identifier is a value generated by a server that | A session identifier is a value generated by a server that | |||
| identifies a particular session. | identifies a particular session. | |||
| server write key | server write key | |||
| The key used to encrypt data written by the server. | The key used to encrypt data written by the server. | |||
| server write MAC secret | server write MAC key | |||
| The secret data used to authenticate data written by the server. | The secret data used to authenticate data written by the server. | |||
| SHA | SHA | |||
| The Secure Hash Algorithm is defined in FIPS PUB 180-2. It | The Secure Hash Algorithm is defined in FIPS PUB 180-2. It | |||
| produces a 20-byte output. Note that all references to SHA | produces a 20-byte output. Note that all references to SHA | |||
| actually use the modified SHA-1 algorithm. [SHA] | actually use the modified SHA-1 algorithm. [SHA] | |||
| SSL | SSL | |||
| Netscape's Secure Socket Layer protocol [SSL3]. TLS is based on | Netscape's Secure Socket Layer protocol [SSL3]. TLS is based on | |||
| SSL Version 3.0 | SSL Version 3.0 | |||
| stream cipher | stream cipher | |||
| An encryption algorithm that converts a key into a | An encryption algorithm that converts a key into a | |||
| cryptographically strong keystream, which is then exclusive-ORed | cryptographically strong keystream, which is then exclusive-ORed | |||
| with the plaintext. | with the plaintext. | |||
| symmetric cipher | symmetric cipher | |||
| See bulk cipher. | See bulk cipher. | |||
| Transport Layer Security (TLS) | Transport Layer Security (TLS) | |||
| This protocol; also, the Transport Layer Security working group | This protocol; also, the Transport Layer Security working group of | |||
| of the Internet Engineering Task Force (IETF). See "Comments" at | the Internet Engineering Task Force (IETF). See "Comments" at the | |||
| the end of this document. | end of this document. | |||
| Appendix C. CipherSuite Definitions | Appendix C. CipherSuite Definitions | |||
| CipherSuite Key Cipher Hash | CipherSuite Key Cipher Hash | |||
| Exchange | Exchange | |||
| TLS_NULL_WITH_NULL_NULL NULL NULL NULL | TLS_NULL_WITH_NULL_NULL NULL NULL NULL | |||
| TLS_RSA_WITH_NULL_MD5 RSA NULL MD5 | TLS_RSA_WITH_NULL_MD5 RSA NULL MD5 | |||
| TLS_RSA_WITH_NULL_SHA RSA NULL SHA | TLS_RSA_WITH_NULL_SHA RSA NULL SHA | |||
| TLS_RSA_WITH_RC4_128_MD5 RSA RC4_128 MD5 | TLS_RSA_WITH_RC4_128_MD5 RSA RC4_128 MD5 | |||
| TLS_RSA_WITH_RC4_128_SHA RSA RC4_128 SHA | TLS_RSA_WITH_RC4_128_SHA RSA RC4_128 SHA | |||
| TLS_RSA_WITH_IDEA_CBC_SHA RSA IDEA_CBC SHA | ||||
| TLS_RSA_WITH_DES_CBC_SHA RSA DES_CBC SHA | ||||
| TLS_RSA_WITH_3DES_EDE_CBC_SHA RSA 3DES_EDE_CBC SHA | TLS_RSA_WITH_3DES_EDE_CBC_SHA RSA 3DES_EDE_CBC SHA | |||
| TLS_RSA_WITH_AES_128_CBC_SHA RSA AES_128_CBC SHA | TLS_RSA_WITH_AES_128_CBC_SHA RSA AES_128_CBC SHA | |||
| TLS_RSA_WITH_AES_256_CBC_SHA RSA AES_256_CBC SHA | TLS_RSA_WITH_AES_256_CBC_SHA RSA AES_256_CBC SHA | |||
| TLS_DH_DSS_WITH_DES_CBC_SHA DH_DSS DES_CBC SHA | ||||
| TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA DH_DSS 3DES_EDE_CBC SHA | TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA DH_DSS 3DES_EDE_CBC SHA | |||
| TLS_DH_RSA_WITH_DES_CBC_SHA DH_RSA DES_CBC SHA | ||||
| TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA DH_RSA 3DES_EDE_CBC SHA | TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA DH_RSA 3DES_EDE_CBC SHA | |||
| TLS_DHE_DSS_WITH_DES_CBC_SHA DHE_DSS DES_CBC SHA | ||||
| TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA DHE_DSS 3DES_EDE_CBC SHA | TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA DHE_DSS 3DES_EDE_CBC SHA | |||
| TLS_DHE_RSA_WITH_DES_CBC_SHA DHE_RSA DES_CBC SHA | ||||
| TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA DHE_RSA 3DES_EDE_CBC SHA | TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA DHE_RSA 3DES_EDE_CBC SHA | |||
| TLS_DH_anon_WITH_RC4_128_MD5 DH_anon RC4_128 MD5 | TLS_DH_anon_WITH_RC4_128_MD5 DH_anon RC4_128 MD5 | |||
| TLS_DH_anon_WITH_DES_CBC_SHA DH_anon DES_CBC SHA | ||||
| TLS_DH_anon_WITH_3DES_EDE_CBC_SHA DH_anon 3DES_EDE_CBC SHA | TLS_DH_anon_WITH_3DES_EDE_CBC_SHA DH_anon 3DES_EDE_CBC SHA | |||
| TLS_DH_DSS_WITH_AES_128_CBC_SHA DH_DSS AES_128_CBC SHA | TLS_DH_DSS_WITH_AES_128_CBC_SHA DH_DSS AES_128_CBC SHA | |||
| TLS_DH_RSA_WITH_AES_128_CBC_SHA DH_RSA AES_128_CBC SHA | TLS_DH_RSA_WITH_AES_128_CBC_SHA DH_RSA AES_128_CBC SHA | |||
| TLS_DHE_DSS_WITH_AES_128_CBC_SHA DHE_DSS AES_128_CBC SHA | TLS_DHE_DSS_WITH_AES_128_CBC_SHA DHE_DSS AES_128_CBC SHA | |||
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA DHE_RSA AES_128_CBC SHA | TLS_DHE_RSA_WITH_AES_128_CBC_SHA DHE_RSA AES_128_CBC SHA | |||
| TLS_DH_anon_WITH_AES_128_CBC_SHA DH_anon AES_128_CBC SHA | TLS_DH_anon_WITH_AES_128_CBC_SHA DH_anon AES_128_CBC SHA | |||
| TLS_DH_DSS_WITH_AES_256_CBC_SHA DH_DSS AES_256_CBC SHA | TLS_DH_DSS_WITH_AES_256_CBC_SHA DH_DSS AES_256_CBC SHA | |||
| TLS_DH_RSA_WITH_AES_256_CBC_SHA DH_RSA AES_256_CBC SHA | TLS_DH_RSA_WITH_AES_256_CBC_SHA DH_RSA AES_256_CBC SHA | |||
| TLS_DHE_DSS_WITH_AES_256_CBC_SHA DHE_DSS AES_256_CBC SHA | TLS_DHE_DSS_WITH_AES_256_CBC_SHA DHE_DSS AES_256_CBC SHA | |||
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA DHE_RSA AES_256_CBC SHA | TLS_DHE_RSA_WITH_AES_256_CBC_SHA DHE_RSA AES_256_CBC SHA | |||
| TLS_DH_anon_WITH_AES_256_CBC_SHA DH_anon AES_256_CBC SHA | TLS_DH_anon_WITH_AES_256_CBC_SHA DH_anon AES_256_CBC SHA | |||
| Key | Key Expanded IV Block | |||
| Exchange | Cipher Type Material Key Material Size Size | |||
| Algorithm Description Key size limit | ||||
| DHE_DSS Ephemeral DH with DSS signatures None | ||||
| DHE_RSA Ephemeral DH with RSA signatures None | ||||
| DH_anon Anonymous DH, no signatures None | ||||
| DH_DSS DH with DSS-based certificates None | ||||
| DH_RSA DH with RSA-based certificates None | ||||
| NULL No key exchange N/A | ||||
| RSA RSA key exchange None | ||||
| Key Expanded IV Block | ||||
| Cipher Type Material Key Material Size Size | ||||
| NULL Stream 0 0 0 N/A | NULL Stream 0 0 0 N/A | |||
| IDEA_CBC Block 16 16 8 8 | RC4_128 Stream 16 16 0 N/A | |||
| RC4_128 Stream 16 16 0 N/A | 3DES_EDE_CBC Block 24 24 8 8 | |||
| DES_CBC Block 8 8 8 8 | ||||
| 3DES_EDE_CBC Block 24 24 8 8 | ||||
| Type | Type | |||
| Indicates whether this is a stream cipher or a block cipher | Indicates whether this is a stream cipher or a block cipher | |||
| running in CBC mode. | running in CBC mode. | |||
| Key Material | Key Material | |||
| The number of bytes from the key_block that are used for | The number of bytes from the key_block that are used for | |||
| generating the write keys. | generating the write keys. | |||
| Expanded Key Material | Expanded Key Material | |||
| The number of bytes actually fed into the encryption algorithm. | The number of bytes actually fed into the encryption algorithm. | |||
| IV Size | IV Size | |||
| The amount of data needed to be generated for the initialization | The amount of data needed to be generated for the initialization | |||
| vector. Zero for stream ciphers; equal to the block size for | vector. Zero for stream ciphers; equal to the block size for block | |||
| block ciphers (this is equal to | ciphers (this is equal to SecurityParameters.record_iv_length). | |||
| SecurityParameters.record_iv_length). | ||||
| Block Size | Block Size | |||
| The amount of data a block cipher enciphers in one chunk; a | The amount of data a block cipher enciphers in one chunk; a block | |||
| block cipher running in CBC mode can only encrypt an even | cipher running in CBC mode can only encrypt an even multiple of | |||
| multiple of its block size. | its block size. | |||
| Hash Hash Padding | ||||
| function Size Size | ||||
| NULL 0 0 | ||||
| MD5 16 48 | ||||
| SHA 20 40 | ||||
| Appendix D. Implementation Notes | Appendix D. Implementation Notes | |||
| The TLS protocol cannot prevent many common security mistakes. This | The TLS protocol cannot prevent many common security mistakes. This | |||
| section provides several recommendations to assist implementors. | section provides several recommendations to assist implementors. | |||
| D.1 Random Number Generation and Seeding | D.1 Random Number Generation and Seeding | |||
| TLS requires a cryptographically secure pseudorandom number generator | TLS requires a cryptographically secure pseudorandom number generator | |||
| (PRNG). Care must be taken in designing and seeding PRNGs. PRNGs | (PRNG). Care must be taken in designing and seeding PRNGs. PRNGs | |||
| based on secure hash operations, most notably SHA-1, are acceptable, | based on secure hash operations, most notably SHA-1, are acceptable, | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 80, line 21 ¶ | |||
| cases like a ClientHello that is split to several small | cases like a ClientHello that is split to several small | |||
| fragments? | fragments? | |||
| - Do you ignore the TLS record layer version number in all TLS | - Do you ignore the TLS record layer version number in all TLS | |||
| records before ServerHello (see Appendix E.1)? | records before ServerHello (see Appendix E.1)? | |||
| - Do you handle TLS extensions in ClientHello correctly, | - Do you handle TLS extensions in ClientHello correctly, | |||
| including omitting the extensions field completely? | including omitting the extensions field completely? | |||
| - Do you support renegotiation, both client and server initiated? | - Do you support renegotiation, both client and server initiated? | |||
| While renegotiation this is an optional feature, supporting | While renegotiation is an optional feature, supporting | |||
| it is highly recommended. | it is highly recommended. | |||
| - When the server has requested a client certificate, but no | - When the server has requested a client certificate, but no | |||
| suitable certificate is available, do you correctly send | suitable certificate is available, do you correctly send | |||
| an empty Certificate message, instead of omitting the whole | an empty Certificate message, instead of omitting the whole | |||
| message (see Section 7.4.6)? | message (see Section 7.4.6)? | |||
| Cryptographic details: | Cryptographic details: | |||
| - In RSA-encrypted Premaster Secret, do you correctly send and | - In RSA-encrypted Premaster Secret, do you correctly send and | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 82, line 51 ¶ | |||
| ClientHello.client_version. For example, if the server supports TLS | ClientHello.client_version. For example, if the server supports TLS | |||
| 1.0, 1.1, and 1.2, and client_version is TLS 1.0, the server will | 1.0, 1.1, and 1.2, and client_version is TLS 1.0, the server will | |||
| proceed with a TLS 1.0 ServerHello. If server supports (or is willing | proceed with a TLS 1.0 ServerHello. If server supports (or is willing | |||
| to use) only versions greater than client_version, it MUST send a | to use) only versions greater than client_version, it MUST send a | |||
| "protocol_version" alert message and close the connection. | "protocol_version" alert message and close the connection. | |||
| Whenever a client already knows the highest protocol known to a | Whenever a client already knows the highest protocol known to a | |||
| server (for example, when resuming a session), it SHOULD initiate the | server (for example, when resuming a session), it SHOULD initiate the | |||
| connection in that native protocol. | connection in that native protocol. | |||
| Note: some server implementations are known to implement version | Note: some server implementations are known to implement version | |||
| negotiation incorrectly. For example, there are buggy TLS 1.0 servers | negotiation incorrectly. For example, there are buggy TLS 1.0 servers | |||
| that simply close the connection when the client offers a version | that simply close the connection when the client offers a version | |||
| newer than TLS 1.0. Also, it is known that some servers will refuse | newer than TLS 1.0. Also, it is known that some servers will refuse | |||
| connection if any TLS extensions are included in ClientHello. | connection if any TLS extensions are included in ClientHello. | |||
| Interoperability with such buggy servers is a complex topic beyond | Interoperability with such buggy servers is a complex topic beyond | |||
| the scope of this document, and may require multiple connection | the scope of this document, and may require multiple connection | |||
| attempts by the client. | attempts by the client. | |||
| Earlier versions of the TLS specification were not fully clear on | Earlier versions of the TLS specification were not fully clear on | |||
| what the record layer version number (TLSPlaintext.version) should | what the record layer version number (TLSPlaintext.version) should | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 83, line 33 ¶ | |||
| complex topic beyond the scope of this document. | complex topic beyond the scope of this document. | |||
| E.2 Compatibility with SSL 2.0 | E.2 Compatibility with SSL 2.0 | |||
| TLS 1.2 clients that wish to support SSL 2.0 servers MUST send | TLS 1.2 clients that wish to support SSL 2.0 servers MUST send | |||
| version 2.0 CLIENT-HELLO messages defined in [SSL2]. The message MUST | version 2.0 CLIENT-HELLO messages defined in [SSL2]. The message MUST | |||
| contain the same version number as would be used for ordinary | contain the same version number as would be used for ordinary | |||
| ClientHello, and MUST encode the supported TLS ciphersuites in the | ClientHello, and MUST encode the supported TLS ciphersuites in the | |||
| CIPHER-SPECS-DATA field as described below. | CIPHER-SPECS-DATA field as described below. | |||
| Warning: The ability to send version 2.0 CLIENT-HELLO messages will be | Warning: The ability to send version 2.0 CLIENT-HELLO messages will | |||
| phased out with all due haste, since the newer ClientHello format | be phased out with all due haste, since the newer ClientHello format | |||
| provides better mechanisms for moving to newer versions and | provides better mechanisms for moving to newer versions and | |||
| negotiating extensions. TLS 1.2 clients SHOULD NOT support SSL 2.0. | negotiating extensions. TLS 1.2 clients SHOULD NOT support SSL 2.0. | |||
| However, even TLS servers that do not support SSL 2.0 SHOULD accept | However, even TLS servers that do not support SSL 2.0 MAY accept | |||
| version 2.0 CLIENT-HELLO messages. The message is presented below in | version 2.0 CLIENT-HELLO messages. The message is presented below in | |||
| sufficient detail for TLS server implementors; the true definition is | sufficient detail for TLS server implementors; the true definition is | |||
| still assumed to be [SSL2]. | still assumed to be [SSL2]. | |||
| For negotiation purposes, 2.0 CLIENT-HELLO is interpreted the same | For negotiation purposes, 2.0 CLIENT-HELLO is interpreted the same | |||
| way as a ClientHello with a "null" compression method and no | way as a ClientHello with a "null" compression method and no | |||
| extensions. Note that this message MUST be sent directly on the wire, | extensions. Note that this message MUST be sent directly on the wire, | |||
| not wrapped as a TLS record. For the purposes of calculating Finished | not wrapped as a TLS record. For the purposes of calculating Finished | |||
| and CertificateVerify, the msg_length field is not considered to be a | and CertificateVerify, the msg_length field is not considered to be a | |||
| part of the handshake message. | part of the handshake message. | |||
| uint8 V2CipherSpec[3]; | uint8 V2CipherSpec[3]; | |||
| struct { | struct { | |||
| uint16 msg_length; | uint16 msg_length; | |||
| uint8 msg_type; | uint8 msg_type; | |||
| Version version; | Version version; | |||
| uint16 cipher_spec_length; | uint16 cipher_spec_length; | |||
| uint16 session_id_length; | uint16 session_id_length; | |||
| uint16 challenge_length; | uint16 challenge_length; | |||
| V2CipherSpec cipher_specs[V2ClientHello.cipher_spec_length]; | V2CipherSpec cipher_specs[V2ClientHello.cipher_spec_length]; | |||
| opaque session_id[V2ClientHello.session_id_length]; | opaque session_id[V2ClientHello.session_id_length]; | |||
| opaque challenge[V2ClientHello.challenge_length; | opaque challenge[V2ClientHello.challenge_length; | |||
| } V2ClientHello; | } V2ClientHello; | |||
| msg_length | msg_length | |||
| The highest bit MUST be 1; the remaining bits contain the | The highest bit MUST be 1; the remaining bits contain the length | |||
| length of the following data in bytes. | of the following data in bytes. | |||
| msg_type | msg_type | |||
| This field, in conjunction with the version field, identifies a | This field, in conjunction with the version field, identifies a | |||
| version 2 client hello message. The value MUST be one (1). | version 2 client hello message. The value MUST be one (1). | |||
| version | version | |||
| Equal to ClientHello.client_version. | Equal to ClientHello.client_version. | |||
| cipher_spec_length | cipher_spec_length | |||
| This field is the total length of the field cipher_specs. It | This field is the total length of the field cipher_specs. It | |||
| cannot be zero and MUST be a multiple of the V2CipherSpec length | cannot be zero and MUST be a multiple of the V2CipherSpec length | |||
| (3). | (3). | |||
| session_id_length | session_id_length | |||
| This field MUST have a value of zero for a client that claims to | This field MUST have a value of zero for a client that claims to | |||
| support TLS 1.2. | support TLS 1.2. | |||
| challenge_length | challenge_length | |||
| The length in bytes of the client's challenge to the server to | The length in bytes of the client's challenge to the server to | |||
| authenticate itself. Historically, permissible values are between | authenticate itself. Historically, permissible values are between | |||
| 16 and 32 bytes inclusive. When using the SSLv2 backward | 16 and 32 bytes inclusive. When using the SSLv2 backward | |||
| compatible handshake the client SHOULD use a 32 byte challenge. | compatible handshake the client SHOULD use a 32 byte challenge. | |||
| cipher_specs | cipher_specs | |||
| This is a list of all CipherSpecs the client is willing and able | This is a list of all CipherSpecs the client is willing and able | |||
| to use. In addition to the 2.0 cipher specs defined in [SSL2], | to use. In addition to the 2.0 cipher specs defined in [SSL2], | |||
| this includes the TLS cipher suites normally sent in | this includes the TLS cipher suites normally sent in | |||
| ClientHello.cipher_suites, each cipher suite prefixed by a zero | ClientHello.cipher_suites, each cipher suite prefixed by a zero | |||
| byte. For example, TLS ciphersuite {0x00,0x0A} would be sent as | byte. For example, TLS ciphersuite {0x00,0x0A} would be sent as | |||
| {0x00,0x00,0x0A}. | {0x00,0x00,0x0A}. | |||
| session_id | session_id | |||
| This field MUST be empty. | This field MUST be empty. | |||
| challenge | challenge | |||
| Corresponds to ClientHello.random. If the challenge length is | Corresponds to ClientHello.random. If the challenge length is less | |||
| less than 32, the TLS server will pad the data with leading | than 32, the TLS server will pad the data with leading (note: not | |||
| (note: not trailing) zero bytes to make it 32 bytes long. | trailing) zero bytes to make it 32 bytes long. | |||
| Note: Requests to resume a TLS session MUST use a TLS client hello. | Note: Requests to resume a TLS session MUST use a TLS client hello. | |||
| E.3. Avoiding Man-in-the-Middle Version Rollback | E.3. Avoiding Man-in-the-Middle Version Rollback | |||
| When TLS clients fall back to Version 2.0 compatibility mode, they | When TLS clients fall back to Version 2.0 compatibility mode, they | |||
| MUST use special PKCS#1 block formatting. This is done so that TLS | MUST use special PKCS#1 block formatting. This is done so that TLS | |||
| servers will reject Version 2.0 sessions with TLS-capable clients. | servers will reject Version 2.0 sessions with TLS-capable clients. | |||
| When a client negotiates SSL 2.0 but also supports TLS, it MUST set | When a client negotiates SSL 2.0 but also supports TLS, it MUST set | |||
| the right-hand (least-significant) 8 random bytes of the PKCS padding | the right-hand (least-significant) 8 random bytes of the PKCS padding | |||
| (not including the terminal null of the padding) for the RSA | (not including the terminal null of the padding) for the RSA | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 86, line 43 ¶ | |||
| its certificate message must provide a valid certificate chain | its certificate message must provide a valid certificate chain | |||
| leading to an acceptable certificate authority. Similarly, | leading to an acceptable certificate authority. Similarly, | |||
| authenticated clients must supply an acceptable certificate to the | authenticated clients must supply an acceptable certificate to the | |||
| server. Each party is responsible for verifying that the other's | server. Each party is responsible for verifying that the other's | |||
| certificate is valid and has not expired or been revoked. | certificate is valid and has not expired or been revoked. | |||
| The general goal of the key exchange process is to create a | The general goal of the key exchange process is to create a | |||
| pre_master_secret known to the communicating parties and not to | pre_master_secret known to the communicating parties and not to | |||
| attackers. The pre_master_secret will be used to generate the | attackers. The pre_master_secret will be used to generate the | |||
| master_secret (see Section 8.1). The master_secret is required to | master_secret (see Section 8.1). The master_secret is required to | |||
| generate the finished messages, encryption keys, and MAC secrets (see | generate the finished messages, encryption keys, and MAC keys (see | |||
| Sections 7.4.9 and 6.3). By sending a correct finished message, | Sections 7.4.9 and 6.3). By sending a correct finished message, | |||
| parties thus prove that they know the correct pre_master_secret. | parties thus prove that they know the correct pre_master_secret. | |||
| F.1.1.1. Anonymous Key Exchange | F.1.1.1. Anonymous Key Exchange | |||
| Completely anonymous sessions can be established using Diffie-Hellman | Completely anonymous sessions can be established using Diffie-Hellman | |||
| for key exchange. The server's public parameters are contained in the | for key exchange. The server's public parameters are contained in the | |||
| server key exchange message and the client's are sent in the client | server key exchange message and the client's are sent in the client | |||
| key exchange message. Eavesdroppers who do not know the private | key exchange message. Eavesdroppers who do not know the private | |||
| values should not be able to find the Diffie-Hellman result (i.e. the | values should not be able to find the Diffie-Hellman result (i.e. the | |||
| pre_master_secret). | pre_master_secret). | |||
| Warning: Completely anonymous connections only provide protection | Warning: Completely anonymous connections only provide protection | |||
| against passive eavesdropping. Unless an independent tamper- | against passive eavesdropping. Unless an independent tamper-proof | |||
| proof channel is used to verify that the finished messages | channel is used to verify that the finished messages were not | |||
| were not replaced by an attacker, server authentication is | replaced by an attacker, server authentication is required in | |||
| required in environments where active man-in-the-middle | environments where active man-in-the-middle attacks are a concern. | |||
| attacks are a concern. | ||||
| F.1.1.2. RSA Key Exchange and Authentication | F.1.1.2. RSA Key Exchange and Authentication | |||
| With RSA, key exchange and server authentication are combined. The | With RSA, key exchange and server authentication are combined. The | |||
| public key is contained in the server's certificate. Note that | public key is contained in the server's certificate. Note that | |||
| compromise of the server's static RSA key results in a loss of | compromise of the server's static RSA key results in a loss of | |||
| confidentiality for all sessions protected under that static key. TLS | confidentiality for all sessions protected under that static key. TLS | |||
| users desiring Perfect Forward Secrecy should use DHE cipher suites. | users desiring Perfect Forward Secrecy should use DHE cipher suites. | |||
| The damage done by exposure of a private key can be limited by | The damage done by exposure of a private key can be limited by | |||
| changing one's private key (and certificate) frequently. | changing one's private key (and certificate) frequently. | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 89, line 26 ¶ | |||
| result, the parties will not accept each others' finished messages. | result, the parties will not accept each others' finished messages. | |||
| Without the master_secret, the attacker cannot repair the finished | Without the master_secret, the attacker cannot repair the finished | |||
| messages, so the attack will be discovered. | messages, so the attack will be discovered. | |||
| F.1.4. Resuming Sessions | F.1.4. Resuming Sessions | |||
| When a connection is established by resuming a session, new | When a connection is established by resuming a session, new | |||
| ClientHello.random and ServerHello.random values are hashed with the | ClientHello.random and ServerHello.random values are hashed with the | |||
| session's master_secret. Provided that the master_secret has not been | session's master_secret. Provided that the master_secret has not been | |||
| compromised and that the secure hash operations used to produce the | compromised and that the secure hash operations used to produce the | |||
| encryption keys and MAC secrets are secure, the connection should be | encryption keys and MAC keys are secure, the connection should be | |||
| secure and effectively independent from previous connections. | secure and effectively independent from previous connections. | |||
| Attackers cannot use known encryption keys or MAC secrets to | Attackers cannot use known encryption keys or MAC secrets to | |||
| compromise the master_secret without breaking the secure hash | compromise the master_secret without breaking the secure hash | |||
| operations. | operations. | |||
| Sessions cannot be resumed unless both the client and server agree. | Sessions cannot be resumed unless both the client and server agree. | |||
| If either party suspects that the session may have been compromised, | If either party suspects that the session may have been compromised, | |||
| or that certificates may have expired or been revoked, it should | or that certificates may have expired or been revoked, it should | |||
| force a full handshake. An upper limit of 24 hours is suggested for | force a full handshake. An upper limit of 24 hours is suggested for | |||
| session ID lifetimes, since an attacker who obtains a master_secret | session ID lifetimes, since an attacker who obtains a master_secret | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 89, line 50 ¶ | |||
| stable storage. | stable storage. | |||
| F.2. Protecting Application Data | F.2. Protecting Application Data | |||
| The master_secret is hashed with the ClientHello.random and | The master_secret is hashed with the ClientHello.random and | |||
| ServerHello.random to produce unique data encryption keys and MAC | ServerHello.random to produce unique data encryption keys and MAC | |||
| secrets for each connection. | secrets for each connection. | |||
| Outgoing data is protected with a MAC before transmission. To prevent | Outgoing data is protected with a MAC before transmission. To prevent | |||
| message replay or modification attacks, the MAC is computed from the | message replay or modification attacks, the MAC is computed from the | |||
| MAC secret, the sequence number, the message length, the message | MAC key, the sequence number, the message length, the message | |||
| contents, and two fixed character strings. The message type field is | contents, and two fixed character strings. The message type field is | |||
| necessary to ensure that messages intended for one TLS Record Layer | necessary to ensure that messages intended for one TLS Record Layer | |||
| client are not redirected to another. The sequence number ensures | client are not redirected to another. The sequence number ensures | |||
| that attempts to delete or reorder messages will be detected. Since | that attempts to delete or reorder messages will be detected. Since | |||
| sequence numbers are 64 bits long, they should never overflow. | sequence numbers are 64 bits long, they should never overflow. | |||
| Messages from one party cannot be inserted into the other's output, | Messages from one party cannot be inserted into the other's output, | |||
| since they use independent MAC secrets. Similarly, the server-write | since they use independent MAC keys. Similarly, the server-write and | |||
| and client-write keys are independent, so stream cipher keys are used | client-write keys are independent, so stream cipher keys are used | |||
| only once. | only once. | |||
| If an attacker does break an encryption key, all messages encrypted | If an attacker does break an encryption key, all messages encrypted | |||
| with it can be read. Similarly, compromise of a MAC key can make | with it can be read. Similarly, compromise of a MAC key can make | |||
| message modification attacks possible. Because MACs are also | message modification attacks possible. Because MACs are also | |||
| encrypted, message-alteration attacks generally require breaking the | encrypted, message-alteration attacks generally require breaking the | |||
| encryption algorithm as well as the MAC. | encryption algorithm as well as the MAC. | |||
| Note: MAC secrets may be larger than encryption keys, so messages can | Note: MAC keys may be larger than encryption keys, so messages can | |||
| remain tamper resistant even if encryption keys are broken. | remain tamper resistant even if encryption keys are broken. | |||
| F.3. Explicit IVs | F.3. Explicit IVs | |||
| [CBCATT] describes a chosen plaintext attack on TLS that depends on | [CBCATT] describes a chosen plaintext attack on TLS that depends on | |||
| knowing the IV for a record. Previous versions of TLS [TLS1.0] used | knowing the IV for a record. Previous versions of TLS [TLS1.0] used | |||
| the CBC residue of the previous record as the IV and therefore | the CBC residue of the previous record as the IV and therefore | |||
| enabled this attack. This version uses an explicit IV in order to | enabled this attack. This version uses an explicit IV in order to | |||
| protect against this attack. | protect against this attack. | |||
| F.4. Security of Composite Cipher Modes | F.4. Security of Composite Cipher Modes | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 92, line 14 ¶ | |||
| cryptographic functions should be used. Short public keys and | cryptographic functions should be used. Short public keys and | |||
| anonymous servers should be used with great caution. Implementations | anonymous servers should be used with great caution. Implementations | |||
| and users must be careful when deciding which certificates and | and users must be careful when deciding which certificates and | |||
| certificate authorities are acceptable; a dishonest certificate | certificate authorities are acceptable; a dishonest certificate | |||
| authority can do tremendous damage. | authority can do tremendous damage. | |||
| Changes in This Version | Changes in This Version | |||
| [RFC Editor: Please delete this] | [RFC Editor: Please delete this] | |||
| - Redid the hash function advertisements for CertificateRequest | - SSLv2 backward compatibility downgraded to MAY | |||
| and the client-side extension. They are now pairs of | ||||
| hash/signature and the semantics are clearly defined for | ||||
| all uses of signatures (hopefully). [Issue 41] | ||||
| - Clarified the DH group checking per list discussion [Issue 35] | - Altered DSA hash rules to more closely match FIPS186-3 and | |||
| PKIX, plus remove OID restriction. | ||||
| - Added a note about DSS vs. DSA [Issue 58] | - verify_length no longer in SecurityParameters | |||
| - Editorial issues [Issue 59] | - Moved/cleaned up cert selection text for server cert | |||
| when signature_algorithms is not specified. | ||||
| - Cleaned up certificate text in 7.4.2 and 7.4.6 [Issue 57] | - Other editorial changes. | |||
| Normative References | Normative References | |||
| [AES] National Institute of Standards and Technology, | [AES] National Institute of Standards and Technology, | |||
| "Specification for the Advanced Encryption Standard (AES)" | "Specification for the Advanced Encryption Standard (AES)" | |||
| FIPS 197. November 26, 2001. | FIPS 197. November 26, 2001. | |||
| [3DES] National Institute of Standards and Technology, | [3DES] National Institute of Standards and Technology, | |||
| "Recommendation for the Triple Data Encryption Algorithm | "Recommendation for the Triple Data Encryption Algorithm | |||
| (TDEA) Block Cipher", NIST Special Publication 800-67, May | (TDEA) Block Cipher", NIST Special Publication 800-67, May | |||
| 2004. | 2004. | |||
| [DES] National Institute of Standards and Technology, "Data | [DES] National Institute of Standards and Technology, "Data | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 93, line 8 ¶ | |||
| Hashing for Message Authentication", RFC 2104, February | Hashing for Message Authentication", RFC 2104, February | |||
| 1997. | 1997. | |||
| [IDEA] X. Lai, "On the Design and Security of Block Ciphers," ETH | [IDEA] X. Lai, "On the Design and Security of Block Ciphers," ETH | |||
| Series in Information Processing, v. 1, Konstanz: Hartung- | Series in Information Processing, v. 1, Konstanz: Hartung- | |||
| Gorre Verlag, 1992. | Gorre Verlag, 1992. | |||
| [MD5] Rivest, R., "The MD5 Message Digest Algorithm", RFC 1321, | [MD5] Rivest, R., "The MD5 Message Digest Algorithm", RFC 1321, | |||
| April 1992. | April 1992. | |||
| [PKCS1] J. Jonsson, B. Kaliski, "Public-Key Cryptography Standards | [PKCS1] J. Jonsson, B. Kaliski, "Public-Key Cryptography Standards | |||
| (PKCS) #1: RSA Cryptography Specifications Version 2.1", RFC | (PKCS) #1: RSA Cryptography Specifications Version 2.1", RFC | |||
| 3447, February 2003. | 3447, February 2003. | |||
| [PKIX] Housley, R., Ford, W., Polk, W. and D. Solo, "Internet X.509 | [PKIX] Housley, R., Ford, W., Polk, W. and D. Solo, "Internet X.509 | |||
| Public Key Infrastructure Certificate and Certificate | Public Key Infrastructure Certificate and Certificate | |||
| Revocation List (CRL) Profile", RFC 3280, April 2002. | Revocation List (CRL) Profile", RFC 3280, April 2002. | |||
| [RC2] Rivest, R., "A Description of the RC2(r) Encryption | [RC2] Rivest, R., "A Description of the RC2(r) Encryption | |||
| Algorithm", RFC 2268, March 1998. | Algorithm", RFC 2268, March 1998. | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 93, line 45 ¶ | |||
| [AEAD] Mcgrew, D., "Authenticated Encryption", February 2007, | [AEAD] Mcgrew, D., "Authenticated Encryption", February 2007, | |||
| draft-mcgrew-auth-enc-02.txt. | draft-mcgrew-auth-enc-02.txt. | |||
| [AH] Kent, S., and Atkinson, R., "IP Authentication Header", RFC | [AH] Kent, S., and Atkinson, R., "IP Authentication Header", RFC | |||
| 4302, December 2005. | 4302, December 2005. | |||
| [BLEI] Bleichenbacher D., "Chosen Ciphertext Attacks against | [BLEI] Bleichenbacher D., "Chosen Ciphertext Attacks against | |||
| Protocols Based on RSA Encryption Standard PKCS #1" in | Protocols Based on RSA Encryption Standard PKCS #1" in | |||
| Advances in Cryptology -- CRYPTO'98, LNCS vol. 1462, pages: | Advances in Cryptology -- CRYPTO'98, LNCS vol. 1462, pages: | |||
| 1-12, 1998. | 1-12, 1998. | |||
| [CBCATT] Moeller, B., "Security of CBC Ciphersuites in SSL/TLS: | [CBCATT] Moeller, B., "Security of CBC Ciphersuites in SSL/TLS: | |||
| Problems and Countermeasures", | Problems and Countermeasures", | |||
| http://www.openssl.org/~bodo/tls-cbc.txt. | http://www.openssl.org/~bodo/tls-cbc.txt. | |||
| [CBCTIME] Canvel, B., Hiltgen, A., Vaudenay, S., and M. Vuagnoux, | [CBCTIME] Canvel, B., Hiltgen, A., Vaudenay, S., and M. Vuagnoux, | |||
| "Password Interception in a SSL/TLS Channel", Advances in | "Password Interception in a SSL/TLS Channel", Advances in | |||
| Cryptology -- CRYPTO 2003, LNCS vol. 2729, 2003. | Cryptology -- CRYPTO 2003, LNCS vol. 2729, 2003. | |||
| [CCM] "NIST Special Publication 800-38C: The CCM Mode for | [CCM] "NIST Special Publication 800-38C: The CCM Mode for | |||
| Authentication and Confidentiality", | Authentication and Confidentiality", | |||
| http://csrc.nist.gov/publications/nistpubs/800-38C/ | http://csrc.nist.gov/publications/nistpubs/800-38C/ | |||
| SP800-38C.pdf | SP800-38C.pdf | |||
| [DSS-3] NIST FIPS PUB 186-3 Draft, "Digital Signature Standard," | ||||
| National Institute of Standards and Technology, U.S. | ||||
| Department of Commerce, 2006. | ||||
| [ENCAUTH] Krawczyk, H., "The Order of Encryption and Authentication | [ENCAUTH] Krawczyk, H., "The Order of Encryption and Authentication | |||
| for Protecting Communications (Or: How Secure is SSL?)", | for Protecting Communications (Or: How Secure is SSL?)", | |||
| Crypto 2001. | Crypto 2001. | |||
| [ESP] Kent, S., and Atkinson, R., "IP Encapsulating Security | [ESP] Kent, S., and Atkinson, R., "IP Encapsulating Security | |||
| Payload (ESP)", RFC 4303, December 2005. | Payload (ESP)", RFC 4303, December 2005. | |||
| [FI06] Hal Finney, "Bleichenbacher's RSA signature forgery based on | [FI06] Hal Finney, "Bleichenbacher's RSA signature forgery based on | |||
| implementation error", ietf-openpgp@imc.org mailing list, 27 | implementation error", ietf-openpgp@imc.org mailing list, 27 | |||
| August 2006, http://www.imc.org/ietf-openpgp/mail- | August 2006, http://www.imc.org/ietf-openpgp/mail- | |||
| archive/msg14307.html. | archive/msg14307.html. | |||
| [GCM] "NIST Special Publication 800-38D DRAFT (June, 2007): | [GCM] "NIST Special Publication 800-38D DRAFT (June, 2007): | |||
| Recommendation for Block Cipher Modes of Operation: | Recommendation for Block Cipher Modes of Operation: | |||
| Galois/Counter Mode (GCM) and GMAC" | Galois/Counter Mode (GCM) and GMAC" | |||
| [IKEALG] Schiller, J., "Cryptographic Algorithms for Use in the | [IKEALG] Schiller, J., "Cryptographic Algorithms for Use in the | |||
| Internet Key Exchange Version 2 (IKEv2)", RFC 4307, December | Internet Key Exchange Version 2 (IKEv2)", RFC 4307, December | |||
| 2005. | 2005. | |||
| [KEYSIZ] Orman, H., and Hoffman, P., "Determining Strengths For | [KEYSIZ] Orman, H., and Hoffman, P., "Determining Strengths For | |||
| Public Keys Used For Exchanging Symmetric Keys" RFC 3766, | Public Keys Used For Exchanging Symmetric Keys" RFC 3766, | |||
| April 2004. | April 2004. | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 95, line 5 ¶ | |||
| [MODP] Kivinen, T. and M. Kojo, "More Modular Exponential (MODP) | [MODP] Kivinen, T. and M. Kojo, "More Modular Exponential (MODP) | |||
| Diffie-Hellman groups for Internet Key Exchange (IKE)", RFC | Diffie-Hellman groups for Internet Key Exchange (IKE)", RFC | |||
| 3526, May 2003. | 3526, May 2003. | |||
| [PKCS6] RSA Laboratories, "PKCS #6: RSA Extended Certificate Syntax | [PKCS6] RSA Laboratories, "PKCS #6: RSA Extended Certificate Syntax | |||
| Standard," version 1.5, November 1993. | Standard," version 1.5, November 1993. | |||
| [PKCS7] RSA Laboratories, "PKCS #7: RSA Cryptographic Message Syntax | [PKCS7] RSA Laboratories, "PKCS #7: RSA Cryptographic Message Syntax | |||
| Standard," version 1.5, November 1993. | Standard," version 1.5, November 1993. | |||
| [RANDOM] Eastlake, D., 3rd, Schiller, J., and S. Crocker, | [RANDOM] Eastlake, D., 3rd, Schiller, J., and S. Crocker, "Randomness | |||
| "Randomness Requirements for Security", BCP 106, RFC 4086, | Requirements for Security", BCP 106, RFC 4086, June 2005. | |||
| June 2005. | ||||
| [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol | [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol | |||
| Compression Methods", RFC 3749, May 2004. | Compression Methods", RFC 3749, May 2004. | |||
| [RFC4366] Blake-Wilson, S., Nystrom, M., Hopwood, D., Mikkelsen, J., | [RFC4366] Blake-Wilson, S., Nystrom, M., Hopwood, D., Mikkelsen, J., | |||
| Wright, T., "Transport Layer Security (TLS) Extensions", RFC | Wright, T., "Transport Layer Security (TLS) Extensions", RFC | |||
| 4366, April 2006. | 4366, April 2006. | |||
| [RSA] R. Rivest, A. Shamir, and L. M. Adleman, "A Method for | [RSA] R. Rivest, A. Shamir, and L. M. Adleman, "A Method for | |||
| Obtaining Digital Signatures and Public-Key Cryptosystems," | Obtaining Digital Signatures and Public-Key Cryptosystems," | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 96, line 5 ¶ | |||
| Suites for Transport Layer Security (TLS)", RFC 4492, May | Suites for Transport Layer Security (TLS)", RFC 4492, May | |||
| 2006. | 2006. | |||
| [TLSEXT] Eastlake, D.E., "Transport Layer Security (TLS) Extensions: | [TLSEXT] Eastlake, D.E., "Transport Layer Security (TLS) Extensions: | |||
| Extension Definitions", July 2007, draft-ietf-tls- | Extension Definitions", July 2007, draft-ietf-tls- | |||
| rfc4366-bis-00.txt. | rfc4366-bis-00.txt. | |||
| [TLSPGP] Mavrogiannopoulos, N., "Using OpenPGP keys for TLS | [TLSPGP] Mavrogiannopoulos, N., "Using OpenPGP keys for TLS | |||
| authentication", draft-ietf-tls-openpgp-keys-11, July 2006. | authentication", draft-ietf-tls-openpgp-keys-11, July 2006. | |||
| [TLSPSK] Eronen, P., Tschofenig, H., "Pre-Shared Key Ciphersuites | [TLSPSK] Eronen, P., Tschofenig, H., "Pre-Shared Key Ciphersuites for | |||
| for Transport Layer Security (TLS)", RFC 4279, December | Transport Layer Security (TLS)", RFC 4279, December 2005. | |||
| 2005. | ||||
| [TLS1.0] Dierks, T., and C. Allen, "The TLS Protocol, Version 1.0", | [TLS1.0] Dierks, T., and C. Allen, "The TLS Protocol, Version 1.0", | |||
| RFC 2246, January 1999. | RFC 2246, January 1999. | |||
| [TLS1.1] Dierks, T., and E. Rescorla, "The TLS Protocol, Version | [TLS1.1] Dierks, T., and E. Rescorla, "The TLS Protocol, Version | |||
| 1.1", RFC 4346, April, 2006. | 1.1", RFC 4346, April, 2006. | |||
| [X501] ITU-T Recommendation X.501: Information Technology - Open | [X501] ITU-T Recommendation X.501: Information Technology - Open | |||
| Systems Interconnection - The Directory: Models, 1993. | Systems Interconnection - The Directory: Models, 1993. | |||
| [XDR] Eisler, M., "External Data Representation Standard", RFC | [XDR] Eisler, M., "External Data Representation Standard", RFC | |||
| 4506, May 2006. | 4506, May 2006. | |||
| Credits | Credits | |||
| Working Group Chairs | Working Group Chairs | |||
| Eric Rescorla | Eric Rescorla | |||
| EMail: ekr@networkresonance.com | EMail: ekr@networkresonance.com | |||
| Pasi Eronen | Pasi Eronen | |||
| pasi.eronen@nokia.com | pasi.eronen@nokia.com | |||
| Editors | Editors | |||
| Tim Dierks Eric Rescorla | Tim Dierks Eric Rescorla | |||
| Independent Network Resonance, Inc. | Independent Network Resonance, Inc. | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 97, line 38 ¶ | |||
| Independent Consultant | Independent Consultant | |||
| EMail: david.hopwood@blueyonder.co.uk | EMail: david.hopwood@blueyonder.co.uk | |||
| Phil Karlton (co-author of SSLv3) | Phil Karlton (co-author of SSLv3) | |||
| Paul Kocher (co-author of SSLv3) | Paul Kocher (co-author of SSLv3) | |||
| Cryptography Research | Cryptography Research | |||
| paul@cryptography.com | paul@cryptography.com | |||
| Hugo Krawczyk | Hugo Krawczyk | |||
| Technion Israel Institute of Technology | IBM | |||
| hugo@ee.technion.ac.il | hugo@ee.technion.ac.il | |||
| Jan Mikkelsen | Jan Mikkelsen | |||
| Transactionware | Transactionware | |||
| EMail: janm@transactionware.com | EMail: janm@transactionware.com | |||
| Magnus Nystrom | Magnus Nystrom | |||
| RSA Security | RSA Security | |||
| EMail: magnus@rsasecurity.com | EMail: magnus@rsasecurity.com | |||
| Robert Relyea | Robert Relyea | |||
| Netscape Communications | Netscape Communications | |||
| relyea@netscape.com | relyea@netscape.com | |||
| Jim Roskind | Jim Roskind | |||
| Netscape Communications | Netscape Communications | |||
| jar@netscape.com | jar@netscape.com | |||
| Michael Sabin | Michael Sabin | |||
| Dan Simon | Dan Simon | |||
| Microsoft, Inc. | Microsoft, Inc. | |||
| dansimon@microsoft.com | dansimon@microsoft.com | |||
| skipping to change at page 99, line ? ¶ | skipping to change at page 98, line 28 ¶ | |||
| EMail: timothy.wright@vodafone.com | EMail: timothy.wright@vodafone.com | |||
| Comments | Comments | |||
| The discussion list for the IETF TLS working group is located at the | The discussion list for the IETF TLS working group is located at the | |||
| e-mail address <tls@ietf.org>. Information on the group and | e-mail address <tls@ietf.org>. Information on the group and | |||
| information on how to subscribe to the list is at | information on how to subscribe to the list is at | |||
| <https://www1.ietf.org/mailman/listinfo/tls> | <https://www1.ietf.org/mailman/listinfo/tls> | |||
| Archives of the list can be found at: | Archives of the list can be found at: | |||
| <http://www.ietf.org/mail-archive/web/tls/current/index.html> | <http://www.ietf.org/mail-archive/web/tls/current/index.html> | |||
| Full Copyright Statement | Full Copyright Statement | |||
| Copyright (C) The IETF Trust (2007). | Copyright (C) The IETF Trust (2007). | |||
| This document is subject to the rights, licenses and restrictions | This document is subject to the rights, licenses and restrictions | |||
| contained in BCP 78, and except as set forth therein, the authors | contained in BCP 78, and except as set forth therein, the authors | |||
| retain all their rights. | retain all their rights. | |||
| This document and the information contained herein are provided on an | This document and the information contained herein are provided on an | |||
| "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS | "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS | |||
| End of changes. 496 change blocks. | ||||
| 1814 lines changed or deleted | 1849 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||