{"action":"created","comment":{"url":"https://api.github.com/repos/ekr/base-drafts/pulls/comments/195530881","pull_request_review_id":128916048,"id":195530881,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5NTUzMDg4MQ==","diff_hunk":"@@ -440,102 +433,63 @@ Important:\n   STREAM frame that carries the Finished message in multiple packets.  This\n   enables immediate server processing for those packets.\n \n+### Encryption Level Changes\n \n-### Source Address Validation\n-\n-During the processing of the TLS ClientHello, TLS requests that the transport\n-make a decision about whether to request source address validation from the\n-client.\n-\n-An initial TLS ClientHello that resumes a session includes an address validation\n-token in the session ticket; this includes all attempts at 0-RTT.  If the client\n-does not attempt session resumption, no token will be present.  While processing\n-the initial ClientHello, TLS provides QUIC with any token that is present. In\n-response, QUIC provides one of three responses:\n-\n-* proceed with the connection,\n-\n-* ask for client address validation, or\n-\n-* abort the connection.\n-\n-If QUIC requests source address validation, it also provides a new address\n-validation token.  TLS includes that along with any information it requires in\n-the cookie extension of a TLS HelloRetryRequest message.  In the other cases,\n-the connection either proceeds or terminates with a handshake error.\n-\n-The client echoes the cookie extension in a second ClientHello.  A ClientHello\n-that contains a valid cookie extension will always be in response to a\n-HelloRetryRequest.  If address validation was requested by QUIC, then this will\n-include an address validation token.  TLS makes a second address validation\n-request of QUIC, including the value extracted from the cookie extension.  In\n-response to this request, QUIC cannot ask for client address validation, it can\n-only abort or permit the connection attempt to proceed.\n-\n-QUIC can provide a new address validation token for use in session resumption at\n-any time after the handshake is complete.  Each time a new token is provided TLS\n-generates a NewSessionTicket message, with the token included in the ticket.\n-\n-See {{client-address-validation}} for more details on client address validation.\n-\n-\n-### Key Ready Events\n-\n-TLS provides QUIC with signals when 0-RTT and 1-RTT keys are ready for use.\n+At each change of encryption level in either direction, TLS signals\n+QUIC, providing the new level and the encryption keys.\n These events are not asynchronous, they always occur immediately after TLS is\n provided with new handshake octets, or after TLS produces handshake octets.\n \n-When TLS completed its handshake, 1-RTT keys can be provided to QUIC.  On both\n-client and server, this occurs after sending the TLS Finished message.\n-\n-This ordering means that there could be frames that carry TLS handshake messages\n-ready to send at the same time that application data is available.  An\n-implementation MUST ensure that TLS handshake messages are always sent in\n-packets protected with handshake keys (see {{handshake-secrets}}).  Separate\n-packets are required for data that needs protection from 1-RTT keys.\n-\n If 0-RTT is possible, it is ready after the client sends a TLS ClientHello\n message or the server receives that message.  After providing a QUIC client with\n-the first handshake octets, the TLS stack might signal that 0-RTT keys are\n-ready.  On the server, after receiving handshake octets that contain a\n+the first handshake octets, the TLS stack might signal the change to the\n+the 0-RTT keys. On the server, after receiving handshake octets that contain a\n ClientHello message, a TLS server might signal that 0-RTT keys are available.\n \n-1-RTT keys are used for packets in both directions.  0-RTT keys are only\n-used to protect packets sent by the client.\n-\n-\n-### Secret Export\n+Note that although TLS only uses one encryption level at a time, QUIC\n+may use more than one level. For instance, after sending its Finished\n+message (using a CRYPTO_HS frame in Handshake encryption) may send STREAM\n+data (in 1-RTT encryption). However, if the Finished is lost, the client\n+would have to retransmit the Finished, in which case it would use\n+Handshake encryption.\n \n-Details how secrets are exported from TLS are included in {{key-expansion}}.\n \n \n ### TLS Interface Summary\n \n {{exchange-summary}} summarizes the exchange between QUIC and TLS for both\n-client and server.\n+client and server. Each arrow is tagged with the encryption level used for\n+that transmission.\n \n ~~~\n Client                                                    Server\n \n Get Handshake\n-0-RTT Key Ready\n-                      --- send/receive --->\n+                      Initial ------------>\n+Rekey tx to 0-RTT Keys\n+                      0-RTT -------------->\n                                               Handshake Received\n-                                                 0-RTT Key Ready\n                                                    Get Handshake\n-                                                1-RTT Keys Ready\n-                     <--- send/receive ---\n+                      <------------ Initial\n+                                          Rekey rx to 0-RTT keys\n+                                              Handshake Received\n+                                      Rekey rx to Handshake keys\n+                                                   Get Handshake\n+                     <----------- Handshake\n+                                          Rekey tx to 1-RTT keys\n+Handshake Received\n+Rekey rx to Handshake keys\n Handshake Received\n Get Handshake\n Handshake Complete\n-1-RTT Keys Ready\n-                      --- send/receive --->\n+Rekey tx to 1-RTT keys\n+                      Handshake ---------->\n                                               Handshake Received\n+                                          Rekey rx to 1-RTT keys\n                                                    Get Handshake\n                                               Handshake Complete\n-                     <--- send/receive ---\n+                     <--------------- 1-RTT","path":"draft-ietf-quic-tls.md","position":581,"original_position":581,"commit_id":"108e166adf16f681bb4458a9a8dc9f6a30b3e112","original_commit_id":"108e166adf16f681bb4458a9a8dc9f6a30b3e112","user":{"login":"ekr","id":1111457,"node_id":"MDQ6VXNlcjExMTE0NTc=","avatar_url":"https://avatars0.githubusercontent.com/u/1111457?v=4","gravatar_id":"","url":"https://api.github.com/users/ekr","html_url":"https://github.com/ekr","followers_url":"https://api.github.com/users/ekr/followers","following_url":"https://api.github.com/users/ekr/following{/other_user}","gists_url":"https://api.github.com/users/ekr/gists{/gist_id}","starred_url":"https://api.github.com/users/ekr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ekr/subscriptions","organizations_url":"https://api.github.com/users/ekr/orgs","repos_url":"https://api.github.com/users/ekr/repos","events_url":"https://api.github.com/users/ekr/events{/privacy}","received_events_url":"https://api.github.com/users/ekr/received_events","type":"User","site_admin":false},"body":"upper case rx/tx","created_at":"2018-06-14T18:41:51Z","updated_at":"2018-06-14T18:58:45Z","html_url":"https://github.com/ekr/base-drafts/pull/33#discussion_r195530881","pull_request_url":"https://api.github.com/repos/ekr/base-drafts/pulls/33","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/ekr/base-drafts/pulls/comments/195530881"},"html":{"href":"https://github.com/ekr/base-drafts/pull/33#discussion_r195530881"},"pull_request":{"href":"https://api.github.com/repos/ekr/base-drafts/pulls/33"}}},"pull_request":{"url":"https://api.github.com/repos/ekr/base-drafts/pulls/33","id":194974880,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk0OTc0ODgw","html_url":"https://github.com/ekr/base-drafts/pull/33","diff_url":"https://github.com/ekr/base-drafts/pull/33.diff","patch_url":"https://github.com/ekr/base-drafts/pull/33.patch","issue_url":"https://api.github.com/repos/ekr/base-drafts/issues/33","number":33,"state":"open","locked":false,"title":"Stream0 dt output for merge","user":{"login":"ekr","id":1111457,"node_id":"MDQ6VXNlcjExMTE0NTc=","avatar_url":"https://avatars0.githubusercontent.com/u/1111457?v=4","gravatar_id":"","url":"https://api.github.com/users/ekr","html_url":"https://github.com/ekr","followers_url":"https://api.github.com/users/ekr/followers","following_url":"https://api.github.com/users/ekr/following{/other_user}","gists_url":"https://api.github.com/users/ekr/gists{/gist_id}","starred_url":"https://api.github.com/users/ekr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ekr/subscriptions","organizations_url":"https://api.github.com/users/ekr/orgs","repos_url":"https://api.github.com/users/ekr/repos","events_url":"https://api.github.com/users/ekr/events{/privacy}","received_events_url":"https://api.github.com/users/ekr/received_events","type":"User","site_admin":false},"body":"PR so I can self-review","created_at":"2018-06-14T18:09:43Z","updated_at":"2018-06-14T18:58:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2d27917445c8d7a0d4310ce6500cba3c2b94d015","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ekr/base-drafts/pulls/33/commits","review_comments_url":"https://api.github.com/repos/ekr/base-drafts/pulls/33/comments","review_comment_url":"https://api.github.com/repos/ekr/base-drafts/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ekr/base-drafts/issues/33/comments","statuses_url":"https://api.github.com/repos/ekr/base-drafts/statuses/108e166adf16f681bb4458a9a8dc9f6a30b3e112","head":{"label":"ekr:stream0_dt_output_for_merge","ref":"stream0_dt_output_for_merge","sha":"108e166adf16f681bb4458a9a8dc9f6a30b3e112","user":{"login":"ekr","id":1111457,"node_id":"MDQ6VXNlcjExMTE0NTc=","avatar_url":"https://avatars0.githubusercontent.com/u/1111457?v=4","gravatar_id":"","url":"https://api.github.com/users/ekr","html_url":"https://github.com/ekr","followers_url":"https://api.github.com/users/ekr/followers","following_url":"https://api.github.com/users/ekr/following{/other_user}","gists_url":"https://api.github.com/users/ekr/gists{/gist_id}","starred_url":"https://api.github.com/users/ekr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ekr/subscriptions","organizations_url":"https://api.github.com/users/ekr/orgs","repos_url":"https://api.github.com/users/ekr/repos","events_url":"https://api.github.com/users/ekr/events{/privacy}","received_events_url":"https://api.github.com/users/ekr/received_events","type":"User","site_admin":false},"repo":{"id":74522960,"node_id":"MDEwOlJlcG9zaXRvcnk3NDUyMjk2MA==","name":"base-drafts","full_name":"ekr/base-drafts","owner":{"login":"ekr","id":1111457,"node_id":"MDQ6VXNlcjExMTE0NTc=","avatar_url":"https://avatars0.githubusercontent.com/u/1111457?v=4","gravatar_id":"","url":"https://api.github.com/users/ekr","html_url":"https://github.com/ekr","followers_url":"https://api.github.com/users/ekr/followers","following_url":"https://api.github.com/users/ekr/following{/other_user}","gists_url":"https://api.github.com/users/ekr/gists{/gist_id}","starred_url":"https://api.github.com/users/ekr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ekr/subscriptions","organizations_url":"https://api.github.com/users/ekr/orgs","repos_url":"https://api.github.com/users/ekr/repos","events_url":"https://api.github.com/users/ekr/events{/privacy}","received_events_url":"https://api.github.com/users/ekr/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ekr/base-drafts","description":" Internet-Drafts that make up the base QUIC specification","fork":true,"url":"https://api.github.com/repos/ekr/base-drafts","forks_url":"https://api.github.com/repos/ekr/base-drafts/forks","keys_url":"https://api.github.com/repos/ekr/base-drafts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ekr/base-drafts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ekr/base-drafts/teams","hooks_url":"https://api.github.com/repos/ekr/base-drafts/hooks","issue_events_url":"https://api.github.com/repos/ekr/base-drafts/issues/events{/number}","events_url":"https://api.github.com/repos/ekr/base-drafts/events","assignees_url":"https://api.github.com/repos/ekr/base-drafts/assignees{/user}","branches_url":"https://api.github.com/repos/ekr/base-drafts/branches{/branch}","tags_url":"https://api.github.com/repos/ekr/base-drafts/tags","blobs_url":"https://api.github.com/repos/ekr/base-drafts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ekr/base-drafts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ekr/base-drafts/git/refs{/sha}","trees_url":"https://api.github.com/repos/ekr/base-drafts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ekr/base-drafts/statuses/{sha}","languages_url":"https://api.github.com/repos/ekr/base-drafts/languages","stargazers_url":"https://api.github.com/repos/ekr/base-drafts/stargazers","contributors_url":"https://api.github.com/repos/ekr/base-drafts/contributors","subscribers_url":"https://api.github.com/repos/ekr/base-drafts/subscribers","subscription_url":"https://api.github.com/repos/ekr/base-drafts/subscription","commits_url":"https://api.github.com/repos/ekr/base-drafts/commits{/sha}","git_commits_url":"https://api.github.com/repos/ekr/base-drafts/git/commits{/sha}","comments_url":"https://api.github.com/repos/ekr/base-drafts/comments{/number}","issue_comment_url":"https://api.github.com/repos/ekr/base-drafts/issues/comments{/number}","contents_url":"https://api.github.com/repos/ekr/base-drafts/contents/{+path}","compare_url":"https://api.github.com/repos/ekr/base-drafts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ekr/base-drafts/merges","archive_url":"https://api.github.com/repos/ekr/base-drafts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ekr/base-drafts/downloads","issues_url":"https://api.github.com/repos/ekr/base-drafts/issues{/number}","pulls_url":"https://api.github.com/repos/ekr/base-drafts/pulls{/number}","milestones_url":"https://api.github.com/repos/ekr/base-drafts/milestones{/number}","notifications_url":"https://api.github.com/repos/ekr/base-drafts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ekr/base-drafts/labels{/name}","releases_url":"https://api.github.com/repos/ekr/base-drafts/releases{/id}","deployments_url":"https://api.github.com/repos/ekr/base-drafts/deployments","created_at":"2016-11-22T23:42:49Z","updated_at":"2018-06-14T18:07:33Z","pushed_at":"2018-06-14T18:09:44Z","git_url":"git://github.com/ekr/base-drafts.git","ssh_url":"git@github.com:ekr/base-drafts.git","clone_url":"https://github.com/ekr/base-drafts.git","svn_url":"https://github.com/ekr/base-drafts","homepage":null,"size":5207,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":3,"license":null,"forks":2,"open_issues":3,"watchers":1,"default_branch":"master"}},"base":{"label":"ekr:master","ref":"master","sha":"5cdb2b2025706fa92880bce8e6e86a19073e60bf","user":{"login":"ekr","id":1111457,"node_id":"MDQ6VXNlcjExMTE0NTc=","avatar_url":"https://avatars0.githubusercontent.com/u/1111457?v=4","gravatar_id":"","url":"https://api.github.com/users/ekr","html_url":"https://github.com/ekr","followers_url":"https://api.github.com/users/ekr/followers","following_url":"https://api.github.com/users/ekr/following{/other_user}","gists_url":"https://api.github.com/users/ekr/gists{/gist_id}","starred_url":"https://api.github.com/users/ekr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ekr/subscriptions","organizations_url":"https://api.github.com/users/ekr/orgs","repos_url":"https://api.github.com/users/ekr/repos","events_url":"https://api.github.com/users/ekr/events{/privacy}","received_events_url":"https://api.github.com/users/ekr/received_events","type":"User","site_admin":false},"repo":{"id":74522960,"node_id":"MDEwOlJlcG9zaXRvcnk3NDUyMjk2MA==","name":"base-drafts","full_name":"ekr/base-drafts","owner":{"login":"ekr","id":1111457,"node_id":"MDQ6VXNlcjExMTE0NTc=","avatar_url":"https://avatars0.githubusercontent.com/u/1111457?v=4","gravatar_id":"","url":"https://api.github.com/users/ekr","html_url":"https://github.com/ekr","followers_url":"https://api.github.com/users/ekr/followers","following_url":"https://api.github.com/users/ekr/following{/other_user}","gists_url":"https://api.github.com/users/ekr/gists{/gist_id}","starred_url":"https://api.github.com/users/ekr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ekr/subscriptions","organizations_url":"https://api.github.com/users/ekr/orgs","repos_url":"https://api.github.com/users/ekr/repos","events_url":"https://api.github.com/users/ekr/events{/privacy}","received_events_url":"https://api.github.com/users/ekr/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ekr/base-drafts","description":" Internet-Drafts that make up the base QUIC specification","fork":true,"url":"https://api.github.com/repos/ekr/base-drafts","forks_url":"https://api.github.com/repos/ekr/base-drafts/forks","keys_url":"https://api.github.com/repos/ekr/base-drafts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ekr/base-drafts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ekr/base-drafts/teams","hooks_url":"https://api.github.com/repos/ekr/base-drafts/hooks","issue_events_url":"https://api.github.com/repos/ekr/base-drafts/issues/events{/number}","events_url":"https://api.github.com/repos/ekr/base-drafts/events","assignees_url":"https://api.github.com/repos/ekr/base-drafts/assignees{/user}","branches_url":"https://api.github.com/repos/ekr/base-drafts/branches{/branch}","tags_url":"https://api.github.com/repos/ekr/base-drafts/tags","blobs_url":"https://api.github.com/repos/ekr/base-drafts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ekr/base-drafts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ekr/base-drafts/git/refs{/sha}","trees_url":"https://api.github.com/repos/ekr/base-drafts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ekr/base-drafts/statuses/{sha}","languages_url":"https://api.github.com/repos/ekr/base-drafts/languages","stargazers_url":"https://api.github.com/repos/ekr/base-drafts/stargazers","contributors_url":"https://api.github.com/repos/ekr/base-drafts/contributors","subscribers_url":"https://api.github.com/repos/ekr/base-drafts/subscribers","subscription_url":"https://api.github.com/repos/ekr/base-drafts/subscription","commits_url":"https://api.github.com/repos/ekr/base-drafts/commits{/sha}","git_commits_url":"https://api.github.com/repos/ekr/base-drafts/git/commits{/sha}","comments_url":"https://api.github.com/repos/ekr/base-drafts/comments{/number}","issue_comment_url":"https://api.github.com/repos/ekr/base-drafts/issues/comments{/number}","contents_url":"https://api.github.com/repos/ekr/base-drafts/contents/{+path}","compare_url":"https://api.github.com/repos/ekr/base-drafts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ekr/base-drafts/merges","archive_url":"https://api.github.com/repos/ekr/base-drafts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ekr/base-drafts/downloads","issues_url":"https://api.github.com/repos/ekr/base-drafts/issues{/number}","pulls_url":"https://api.github.com/repos/ekr/base-drafts/pulls{/number}","milestones_url":"https://api.github.com/repos/ekr/base-drafts/milestones{/number}","notifications_url":"https://api.github.com/repos/ekr/base-drafts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ekr/base-drafts/labels{/name}","releases_url":"https://api.github.com/repos/ekr/base-drafts/releases{/id}","deployments_url":"https://api.github.com/repos/ekr/base-drafts/deployments","created_at":"2016-11-22T23:42:49Z","updated_at":"2018-06-14T18:07:33Z","pushed_at":"2018-06-14T18:09:44Z","git_url":"git://github.com/ekr/base-drafts.git","ssh_url":"git@github.com:ekr/base-drafts.git","clone_url":"https://github.com/ekr/base-drafts.git","svn_url":"https://github.com/ekr/base-drafts","homepage":null,"size":5207,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":3,"license":null,"forks":2,"open_issues":3,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ekr/base-drafts/pulls/33"},"html":{"href":"https://github.com/ekr/base-drafts/pull/33"},"issue":{"href":"https://api.github.com/repos/ekr/base-drafts/issues/33"},"comments":{"href":"https://api.github.com/repos/ekr/base-drafts/issues/33/comments"},"review_comments":{"href":"https://api.github.com/repos/ekr/base-drafts/pulls/33/comments"},"review_comment":{"href":"https://api.github.com/repos/ekr/base-drafts/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ekr/base-drafts/pulls/33/commits"},"statuses":{"href":"https://api.github.com/repos/ekr/base-drafts/statuses/108e166adf16f681bb4458a9a8dc9f6a30b3e112"}},"author_association":"OWNER"}}
{"actor":{"display_login":"ekr"}}