Skip to main content

Module tls12

Module tls12 

Source
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
鍵の導出結果。
RecordCipher
一方向のレコード暗号(AES-GCM。RFC 5288)。nonce = 暗黙部 4 バイト + 明示部 8 バイト(= 通番)。
Suite
対応する暗号スイート。
Tls12
TLS 1.2 の接続。ハンドシェイク後は embedded_io の Read/Write として使う。

Enums§

Aead 🔒
鍵スケジュールが約 1KB あるので箱に入れる(カーネルのスタックを使わない)。
HashAlg
ハッシュ関数(PRF とハンドシェイクの要約に使う)。
Tls12Error

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“。