-
Notifications
You must be signed in to change notification settings - Fork 4
/
752.txt
133 lines (105 loc) · 6.88 KB
/
752.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
[1] [DFN[[[TLS Record Protocol]]]] ([DFN[[RUBYB[[[記録層]]]@en[record layer]]]]) は、 [[TLS]] の下位側の[[プロトコル階層]]です。
* 仕様書
[REFS[
- [2] '''[CITE@en[RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2]] ([TIME[2015-02-19 08:58:15 +09:00]] 版) <http://tools.ietf.org/html/rfc5246#section-6>'''
- [17] [CITE[Transport Layer Security (TLS) Parameters]] ([TIME[2015-02-27 12:03:35 +09:00]] 版) <http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-5>
- [18] [CITE@en[RFC 6066 - Transport Layer Security (TLS) Extensions: Extension Definitions]] ([TIME[2015-02-01 18:07:52 +09:00]] 版) <http://tools.ietf.org/html/rfc6066#section-4>
]REFS]
* 記録層データ構造
[9] [[記録層]]では、 2[SUP[14]] [[バイト]][[以下]]のデータに分割して
[CODE[[[TLSPlaintext]]]] として扱います。[[記録層]]データ構造間で分割した境界は意味を持たず、
同じ[[記録内容型]]なら1つの [CODE[[[TLSPlaintext]]]] に結合したり、分解したりできます。
[SRC[>>2]]
[11] [CODE[[[TLSPlaintext]]]] に[[圧縮アルゴリズム]]を適用した結果が
[CODE[[[TLSCompressed]]]] です。 (ここでいう[[圧縮アルゴリズム]]には、無変換の
「[[null]]」も含まれます。)
[12] [CODE[[[TLSCompressed]]]] に [[MACアルゴリズム]]と[[暗号化アルゴリズム]]を適用した結果が
[CODE[[[TLSCiphertext]]]] です。
[10] [CODE[[[TLSPlaintext]]]] や [CODE[[[TLSCompressed]]]] や
[CODE[[[TLSCiphertext]]]] は、次のもので構成されます [SRC[>>2]]。
;; [20] 含まれるデータの意味 (処理状態) が異なるだけで、[[欄]]の構成は同じです。
[FIG(list members)[
:[CODE[[[type]]]]:含まれているデータを処理する上位層プロトコル ([[記録内容型]] 1バイト)。
:[CODE[[[version]]]]:プロトコルの版 (2バイト)。 3.3 なら [[TLS/1.2]], 3.2 なら [[TLS/1.1]],
3.1 なら [[TLS/1.0]]。
:[CODE[[[length]]]]:データの長さ ([CODE[[[uint16]]]])。
:[CODE[[[fragment]]]]:データ ([CODE[[[length]]]] [[欄]]の値の長さ)。
]FIG]
;; [13] [[TLS]] のプロトコルの版は[[記録層]]のメッセージに記述されるだけでなく、
[[TLS Handshake Protocol]] の [CODE[[[ClientHello]]]] や [CODE[[[ServerHello]]]]
にも記述されます。そちらとこちらの値は異なるかもしれません。
[19] データ ([CODE[[[fragment]]]]) の長さは、
[[TLS拡張]] [CODE[[[max_fragment_length]]]] [SRC[>>18]] により最大値を折衝できます。
[15] [[TLS]] で送受信されるデータはすべて [[TLS Record Protocol]] のメッセージという形で送信されます。
[[TLS]] が開始された当初は暗号化、圧縮などを行わない[[接続状態]]なので、
平文のままのメッセージが送信されます。この状態で上位層プロトコルとして [[TLS Handshake Protocol]]
を用いて新たな[[接続状態]]を折衝し、移行します。これによって [[TLS Record Protocol]]
のメッセージに暗号化、圧縮などが適用された状態になります。これで上位層プロトコルとして[[TLS応用データプロトコル]]を用い、上位[[アプリケーション層プロトコル]]のデータの送受信が行えるようになります。
その後も [[alert protocol]] 等 [[TLS]] の[[メッセージ]]が送受信されることがあります。
* 内容型
[3] [[TLS Record Protocol]] を使って規定される[[プロトコル]]はいくつかあり、
その区別を表す値を[DFN[[RUBYB[[[記録内容型]]]@en[record content type]]]]
([DFN[[CODE[[[ContentType]]]]]]) といいます [SRC[>>2]]。
[16] 値は1バイトの数値で表されます。
[FIG(table)[
:n:数値
:name:名称
:desc:プロトコル名
:n:[CODE[[[22]]]]
:name:[CODE[[[handshake]]]]
:desc:[[handshake protocol]]
:n:[CODE[[[21]]]]
:name:[CODE[[[alert]]]]
:desc:[[alert protocol]]
:n:[CODE[[[20]]]]
:name:[CODE[[[change_cipher_spec]]]]
:desc:[[change cipher spec protocol]]
:n:[CODE[[[23]]]]
:name:[CODE[[[application_data]]]]
:desc:[[application data protocol]]
:n:[CODE[[[24]]]]
:name:[CODE[[[heartbeat]]]]
:desc:[[Heartbeat protocol]]
]FIG]
[21] [[IANA登録簿]] (>>17) もあります [SRC[>>2]]。
* 接続状態
[4] [[TLS Record Protocol]] の[RUBYB[運用環境]@en[operating environment]]のことを
[RUBYB[[[TLS接続状態]]]@en[TLS connection state]]といい、
次のもので構成されます [SRC[>>2]]。
[FIG(list members)[
:[RUBYB[[[セキュリティー引数]]]@en[security parameter]] ([CODE[[[SecurityParameters]]]]):
[FIG(list members)[
:[RUBYB[[[接続端]]]@en[connection end]] ([CODE[[[entity]]]]):自身が[[クライアント]]か[[鯖]]か。
:[[PRFアルゴリズム]] ([CODE[[[prf_algorithm]]]]):[[master secret]] から[[鍵]]を生成するのに使う[[アルゴリズム]]。
:[[bulk encryption algorithm]]:[[bulk encryption]] に使う[[アルゴリズム]]
([CODE[[[bulk_cipher_algorithm]]]])。
鍵サイズ ([CODE[[[enc_key_length]]]])、
ブロック・ストリーム・[[AEAD]] のいずれであるか ([CODE[[[cipher_type]]]])、
[[cipher]] のブロック長 ([CODE[[[block_length]]]])、
明示的および暗示的な初期化ベクトル ([[nonce]]) ([CODE[[[fixed_iv_length]]]], [CODE[[[record_iv_length]]]])。
:[[MACアルゴリズム]]:[[メッセージ認証]]に使う[[アルゴリズム]] ([CODE[[[mac_algorithm]]]])。
アルゴリズムが返す値の長さ ([CODE[[[mac_length]]]])。
鍵の長さ ([CODE[[[mac_key_length]]]])。
:[[圧縮アルゴリズム]] ([CODE[[[compression_algorithm]]]]):[[データ圧縮]]に使う[[アルゴリズム]]。
:[[master secret]] ([CODE[[[master_secret]]]]):48バイト秘密。
:[[client random]] ([CODE[[[client_random]]]]):[[クライアント]]による32バイト値。
:[[server random]] ([CODE[[[server_random]]]]):[[鯖]]による32バイト値。
]FIG]
:[[client write MAC key]]:
:[[server write MAC key]]:
:[[client write encryption key]]:
:[[server write encryption key]]:
:[[client write IV]]:
:[[server write IV]]:
:[[圧縮状態]]:
:[[cipher state]]:
:[[MAC鍵]]:
:[[シーケンス番号]]:
]FIG]
[5] [[接続状態]]は、現在の読み取り用状態、書き込み用状態と、
pending の読み取り用状態、書き込み用状態の4つがあります [SRC[>>2]]。
[8] [RUBYB[[[記録]]]@en[record]]は、現在の読み取り用状態と書き込み用状態に従い処理されます
[SRC[>>2]]。
[6] 現在の接続状態の初期値は、暗号化、圧縮、MAC のいずれも使用しないものです [SRC[>>2]]。
[7] [[TLS Handshake Protocol]] は pending [[接続状態]]の[[セキュリティー引数]]を設定します。
[[ChangeCipherSpec]] は pending [[接続状態]]を現在の[[接続状態]]とします。 [SRC[>>2]]