10<- 目次 ->AB


A. プロトコル定数値 English

(準備中)

この章においては、プロトコルの型と定数について示す。

 

A.1. レコード層 English

struct {

uint8 major, minor;

} ProtocolVersion;

ProtocolVersion version = { 3, 1 }; /* TLS v1.0 */

enum {

change_cipher_spec(20), alert(21), handshake(22),
application_data(23), (255)

} ContentType;

struct {

ContentType type;
ProtocolVersion version;
uint16 length;
opaque fragment[TLSPlaintext.length];

} TLSPlaintext;

struct {

ContentType type;
ProtocolVersion version;
uint16 length;
opaque fragment[TLSCompressed.length];

} TLSCompressed;

struct {

ContentType type;
ProtocolVersion version;
uint16 length;
select (CipherSpec.cipher_type) {

case stream: GenericStreamCipher;
case block: GenericBlockCipher;

} fragment;

} TLSCiphertext;

stream-ciphered struct {

opaque content[TLSCompressed.length];
opaque MAC[CipherSpec.hash_size];

} GenericStreamCipher;

block-ciphered struct {

opaque content[TLSCompressed.length];
opaque MAC[CipherSpec.hash_size];
uint8 padding[GenericBlockCipher.padding_length];
uint8 padding_length;

} GenericBlockCipher;

 

A.2. ChangeCipherSpecメッセージ English

struct {

enum { change_cipher_spec(1), (255) } type;

} ChangeCipherSpec;

 

A.3. Alertメッセージ English

enum { warning(1), fatal(2), (255) } AlertLevel;

enum {

close_notify(0),
unexpected_message(10),
bad_record_mac(20),
decryption_failed(21),
record_overflow(22),
decompression_failure(30),
handshake_failure(40),
bad_certificate(42),
unsupported_certificate(43),
certificate_revoked(44),
certificate_expired(45),
certificate_unknown(46),
illegal_parameter(47),
unknown_ca(48),
access_denied(49),
decode_error(50),
decrypt_error(51),
export_restriction(60),
protocol_version(70),
insufficient_security(71),
internal_error(80),
user_canceled(90),
no_renegotiation(100),
(255)

} AlertDescription;

struct {

AlertLevel level;
AlertDescription description;

} Alert;

A.4. ハンドシェイクプロトコル English

enum {

hello_request(0), client_hello(1), server_hello(2),
certificate(11), server_key_exchange (12),
certificate_request(13), server_hello_done(14),
certificate_verify(15), client_key_exchange(16),
finished(20), (255)

} HandshakeType;

struct {

HandshakeType msg_type;
uint24 length;
select (HandshakeType) {

case hello_request: HelloRequest;
case client_hello: ClientHello;
case server_hello: ServerHello;
case certificate: Certificate;
case server_key_exchange: ServerKeyExchange;
case certificate_request: CertificateRequest;
case server_hello_done: ServerHelloDone;
case certificate_verify: CertificateVerify;
case client_key_exchange: ClientKeyExchange;
case finished: Finished;

} body;

} Handshake;

A.4.1. 各種Helloメッセージ English

struct { } HelloRequest;

struct {

uint32 gmt_unix_time;
opaque random_bytes[28];

} Random;
opaque SessionID<0..32>;
uint8 CipherSuite[2];
enum { null(0), (255) } CompressionMethod;
struct {

ProtocolVersion client_version;
Random random;
SessionID session_id;
CipherSuite cipher_suites<2..2^16-1>;
CompressionMethod compression_methods<1..2^8-1>;

} ClientHello;
struct {

ProtocolVersion server_version;
Random random;
SessionID session_id;
CipherSuite cipher_suite;
CompressionMethod compression_method;

} ServerHello;

A.4.2. サーバー認証と各種鍵交換メッセージ English

opaque ASN.1Cert<2^24-1>;

struct {

ASN.1Cert certificate_list<1..2^24-1>;

} Certificate;

enum { rsa, diffie_hellman } KeyExchangeAlgorithm;

struct {

opaque RSA_modulus<1..2^16-1>;
opaque RSA_exponent<1..2^16-1>;

} ServerRSAParams;

struct {

opaque DH_p<1..2^16-1>;
opaque DH_g<1..2^16-1>;
opaque DH_Ys<1..2^16-1>;

} ServerDHParams;

struct {

select (KeyExchangeAlgorithm) {

case diffie_hellman:
ServerDHParams params;
Signature signed_params;
case rsa:
ServerRSAParams params;
Signature signed_params;

};

} ServerKeyExchange;

enum { anonymous, rsa, dsa } SignatureAlgorithm;
select (SignatureAlgorithm)

{ case anonymous: struct { };

case rsa:

digitally-signed struct {

opaque md5_hash[16];
opaque sha_hash[20];

};

case dsa:

digitally-signed struct {

opaque sha_hash[20];

};

} Signature;
enum {

rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4),
(255)

} ClientCertificateType;

opaque DistinguishedName<1..2^16-1>;
struct {

ClientCertificateType certificate_types<1..2^8-1>;
DistinguishedName certificate_authorities<3..2^16-1>;

} CertificateRequest;
struct { } ServerHelloDone;

A.4.3. クライアント認証と各種鍵交換メッセージ English

struct {

select (KeyExchangeAlgorithm) {

case rsa: EncryptedPreMasterSecret;
case diffie_hellman: DiffieHellmanClientPublicValue;

} exchange_keys;

} ClientKeyExchange;

struct {

ProtocolVersion client_version;
opaque random[46];

} PreMasterSecret;

struct {

public-key-encrypted PreMasterSecret pre_master_secret;

} EncryptedPreMasterSecret;
enum { implicit, explicit } PublicValueEncoding;
struct {

select (PublicValueEncoding) {

case implicit: struct {};
case explicit: opaque DH_Yc<1..2^16-1>;

} dh_public;

} ClientDiffieHellmanPublic;
struct {

Signature signature;

} CertificateVerify;

A.4.4. Finishedメッセージ English

struct {

opaque verify_data[12];

} Finished;

 

A.5. 暗号スイート English

以下では、ClientHello と ServerHello メッセージで使用される CipherSuite コードを定義する。

また、それぞれの CipherSuite は、TLS バージョン 1.0 でサポートされる暗号仕様を定義する。

TLS_NULL_WITH_NULL_NULL が定義され、またこれはTLSコネクションの最初のハンドシェイクにおける初期状態とされるが、共有においてこれを選択してはならない。なぜならば、これはコネクションを保護しないからである。

CipherSuite TLS_NULL_WITH_NULL_NULL = { 0x00,0x00 };

以下の CipherSuite 定義では、鍵交換に使用することのできるRSA証明書をサーバーが提供する必要がある。 サーバーは、CertificateRequest メッセージにおいて、 RSA または DSS のどちらかの、署名可能な証明書を要求することができる。

CipherSuite TLS_RSA_WITH_NULL_MD5 = { 0x00,0x01 };
CipherSuite TLS_RSA_WITH_NULL_SHA = { 0x00,0x02 };
CipherSuite TLS_RSA_EXPORT_WITH_RC4_40_MD5 = { 0x00,0x03 };
CipherSuite TLS_RSA_WITH_RC4_128_MD5 = { 0x00,0x04 };
CipherSuite TLS_RSA_WITH_RC4_128_SHA = { 0x00,0x05 };
CipherSuite TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = { 0x00,0x06 };
CipherSuite TLS_RSA_WITH_IDEA_CBC_SHA = { 0x00,0x07 };
CipherSuite TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x08 };
CipherSuite TLS_RSA_WITH_DES_CBC_SHA = { 0x00,0x09 };
CipherSuite TLS_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0A };

以下の CipherSuite 定義は、サーバーにより認証された(または任意で、クライアントにより認証された)Diffie-Hellman に使用される。DH は、認証局(CA)によって署名されたサーバー証明書に含まれているDiffie-Hellman パラメータを使用した暗号スイートを示すものである。DHEは、CA によって署名された DSS またはRSA証明書により署名されたDiffie-Hellmanパラメータを使用した一時的 Diffie-Hellman を示すものである。使用される署名アルゴリズムは、DHまたは DHEパラメータの後に指定される。サーバーは、クライアント認証を行うために、クライアントに対してRSAまたはDSSの署名可能な証明書、または Diffie-Hellman 証明書を要求することができる。クライアントによってDiffie-Hellman証明書が提供された場合には、サーバーによって指定されたパラメータ(groupとgenerator) を使用しなければならない。

CipherSuite TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x0B };
CipherSuite TLS_DH_DSS_WITH_DES_CBC_SHA = { 0x00,0x0C };
CipherSuite TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0D };
CipherSuite TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x0E };
CipherSuite TLS_DH_RSA_WITH_DES_CBC_SHA = { 0x00,0x0F };
CipherSuite TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x10 };
CipherSuite TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x11 };
CipherSuite TLS_DHE_DSS_WITH_DES_CBC_SHA = { 0x00,0x12 };
CipherSuite TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x13 };
CipherSuite TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x14 };
CipherSuite TLS_DHE_RSA_WITH_DES_CBC_SHA = { 0x00,0x15 };
CipherSuite TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x16 };

以下の暗号スイートは、どちら側のパーティーも認証されることのない、完全に匿名な Diffie-Hellman 通信に使用される。このモードは、なりすまし攻撃を受けやすいため、推奨されないことに注意。

CipherSuite TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = { 0x00,0x17 };
CipherSuite TLS_DH_anon_WITH_RC4_128_MD5 = { 0x00,0x18 };
CipherSuite TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x19 };
CipherSuite TLS_DH_anon_WITH_DES_CBC_SHA = { 0x00,0x1A };
CipherSuite TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = { 0x00,0x1B };

注: 最初のバイトが 0xFF であるすべての暗号スイートは、プライベートなものとされており、ローカルまたは実験的アルゴリズムを定義するのに使用することができる。そのような暗号スイートの共同利用は、そのローカルにおける問題である。

注: 暗号スイートを指定した RFC を発行することにより、暗号スイートを追加登録することができる。そのRFCには、必要な TLS プロトコル情報、すなわちメッセージエンコード、プレマスターシークレット生成方法、共通鍵暗号と MAC 計算、およびそのアルゴリズムにおいて適切な参照情報を記述する。RFC を編集するオフィスでは、その暗号スイートが技術的に有用で、また完全に仕様が決定されていることがわかれば、(例えば機密扱いのアルゴリズムなどの)完全には仕様が公開されない暗号スイートに対する仕様書の発行の可否を、オフィスの裁量により選択することができる。

注:暗号化スイート値 {0x00、0x1C} と {0x00、0x1D} は、SSL 3 における Fortezza ベースの暗号化スイートとの衝突を避けるために予約されている。

 

A.6. セキュリティパラメータ English

これらのセキュリティパラメータは、TLS ハンドシェイクプロトコルで決定され、コネクションステータスを初期化するためのパラメータとして、TLS レコード層へ渡される。SecurityParameters には、以下のものが含まれる。

enum { null(0), (255) } CompressionMethod;
enum { server, client } ConnectionEnd;
enum { null, rc4, rc2, des, 3des, des40, idea }
BulkCipherAlgorithm;
enum { stream, block } CipherType;
enum { true, false } IsExportable;
enum { null, md5, sha } MACAlgorithm;
/* CompressionMethod、BulkCipherAlgorithmとMACAlgorithm で指定されるアルゴリズムは追加が可能である。*/

struct {

ConnectionEnd entity;
BulkCipherAlgorithm bulk_cipher_algorithm;
CipherType cipher_type;
uint8 key_size;
uint8 key_material_length;
IsExportable is_exportable;
MACAlgorithm mac_algorithm;
uint8 hash_size;
CompressionMethod compression_algorithm;
opaque master_secret[48];
opaque client_random[32];
opaque server_random[32];

} SecurityParameters;


10<- 目次 ->AB