Expand description
TLS 1.2 クライアント(ECDHE + AES-GCM のみ)。
【2026-10-03】HTTPS は embedded-tls(TLS 1.3 専用)で行っているため、TLS 1.2 しか
話さないサーバーには接続できなかった。sugi-lab.net/smarthome.htm の Microsoft Sway 埋め込み
(sway.com。openssl s_client -tls1_3 で応答なし、TLS 1.2 では ECDHE-RSA-AES256-GCM-SHA384)
がこれに当たり、iframe の中身を取得できなかった。TLS 1.2 のみのサーバーは今も多いので、
TLS 1.3 のハンドシェイクが失敗したときの代替として最小限の TLS 1.2 を持つ。
対応範囲(RFC 5246 / 5289 / 8422):
- 暗号スイート: ECDHE_{ECDSA,RSA}WITH_AES{128_GCM_SHA256,256_GCM_SHA384}
- 鍵交換の曲線: secp256r1 のみ、点は非圧縮のみ
- 証明書・ServerKeyExchange の署名は検証しない(TLS 1.3 側も
UnsecureProviderで 検証していないのと同じ水準。証明書検証は全体の課題としてspec/TODO.mdにある) - セッション再開・再ネゴシエーション・圧縮・クライアント証明書は無し (CertificateRequest には空の Certificate を返す)
入出力は embedded_io の Read/Write の上に作り、ホスト試験では偽のサーバーと
メモリ上でハンドシェイクさせて確かめる(tests/src/test_tls12.rs)。
Structs§
- Keys
- 鍵の導出結果。
- Record
Cipher - 一方向のレコード暗号(AES-GCM。RFC 5288)。nonce = 暗黙部 4 バイト + 明示部 8 バイト(= 通番)。
- Suite
- 対応する暗号スイート。
- Tls12
- TLS 1.2 の接続。ハンドシェイク後は
embedded_ioの Read/Write として使う。
Enums§
- Aead 🔒
- 鍵スケジュールが約 1KB あるので箱に入れる(カーネルのスタックを使わない)。
- HashAlg
- ハッシュ関数(PRF とハンドシェイクの要約に使う)。
- Tls12
Error
Constants§
- CT_
ALERT - CT_
APPLICATION_ DATA - CT_
CHANGE_ CIPHER_ SPEC - CT_
HANDSHAKE - HS_
CERTIFICATE - HS_
CERTIFICATE_ REQUEST - HS_
CLIENT_ HELLO - HS_
CLIENT_ KEY_ EXCHANGE - HS_
FINISHED - HS_
NEW_ SESSION_ TICKET - HS_
SERVER_ HELLO - HS_
SERVER_ HELLO_ DONE - HS_
SERVER_ KEY_ EXCHANGE - MAX_
FRAGMENT 🔒 - 1 レコードの平文の上限(RFC 5246 6.2.1)。
- SUITES
- ClientHello で申し出る順(AES-128 を先に。どれも ECDHE + GCM)。
Functions§
- client_
hello - ClientHello(ハンドシェイクメッセージ全体)。
- derive_
keys - premaster → master secret → 鍵ブロック(RFC 5246 8.1 / 6.3)。
- handshake_
msg - ハンドシェイクメッセージ(種別 + 3 バイト長 + 本体)。
- hash
- hmac 🔒
- parse_
server_ hello - ServerHello の本体から (server_random, 暗号スイート) を読む。
- parse_
server_ key_ exchange - ServerKeyExchange(ECDHE)の本体からサーバーの公開鍵(SEC1 非圧縮)を読む。署名は見ない。
- prf
- TLS 1.2 の PRF(RFC 5246 5 節の P_hash)。
- push_
ext 🔒 - suite_
by_ id - verify_
data - Finished の verify_data(12 バイト)。
labelは b“client finished“ / b“server finished“。