Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 16314] ファイルの概要

このコミットは、Go言語の crypto/tls パッケージにおけるTLSレコードの処理に関するものです。具体的には、OpenSSLが送信する可能性のある空のTLSレコードを適切に処理するように変更が加えられています。これにより、tls.Conn.Read メソッドが空のレコードを受信した際に (0, nil) を返す問題を解決し、アプリケーション層での予期せぬ動作を防ぎます。

変更されたファイルは以下の通りです。

  • src/pkg/crypto/tls/conn.go: TLS接続の読み取りロジックが修正されました。
  • src/pkg/crypto/tls/handshake_client_test.go: 空のTLSレコードの処理を検証するための新しいテストケースが追加されました。

コミット

commit a1dbfee15b7283a41ae01c482a3862d2148798b8
Author: Adam Langley <agl@golang.org>
Date:   Wed May 15 10:25:54 2013 -0400

    crypto/tls: ignore empty TLS records.
    
    OpenSSL can be configured to send empty records in order to randomise
    the CBC IV. This is an early version of 1/n-1 record splitting (that Go
    does) and is quite reasonable, but it results in tls.Conn.Read
    returning (0, nil).
    
    This change ignores up to 100 consecutive, empty records to avoid
    returning (0, nil) to callers.
    
    Fixes 5309.
    
    R=golang-dev, r, minux.ma
    CC=golang-dev
    https://golang.org/cl/8852044

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/a1dbfee15b7283a41ae01c482a3862d2148798b8

元コミット内容

crypto/tls: 空のTLSレコードを無視する。

OpenSSLは、CBC IVをランダム化するために空のレコードを送信するように設定できます。これは、Goが行う1/n-1レコード分割の初期バージョンであり、非常に合理的ですが、tls.Conn.Read(0, nil) を返す原因となります。

この変更は、呼び出し元に (0, nil) を返すことを避けるために、最大100個の連続した空のレコードを無視します。

Fixes 5309.

変更の背景

この変更の背景には、TLS (Transport Layer Security) プロトコルにおけるデータ転送の挙動と、OpenSSLの実装特性があります。

TLS通信では、アプリケーションデータはレコードと呼ばれる単位で送受信されます。暗号化された通信において、特にCBC (Cipher Block Chaining) モードのようなブロック暗号を使用する場合、各暗号ブロックの初期化ベクトル (IV: Initialization Vector) のランダム性がセキュリティ上非常に重要になります。IVが予測可能であると、特定の攻撃(例えば、Chosen-plaintext attack)に対して脆弱になる可能性があります。

OpenSSLは、CBC IVのランダム性を高めるための手法として、「空のTLSレコード」を送信する設定をサポートしていました。これは、TLS 1.0のIV処理の脆弱性(前のレコードの最後の暗号文ブロックからIVが導出されるため、予測可能になる可能性があった)を緩和するための一つのアプローチでした。TLS 1.1以降では、各レコードに明示的なIVを含めることでこの問題に対処していますが、古いOpenSSLの実装や特定の構成では、この「空レコード」の送信が行われることがありました。

Go言語の crypto/tls パッケージの tls.Conn.Read メソッドは、通常、アプリケーションデータを含むレコードを読み取り、そのデータをバイトスライスとして返します。しかし、OpenSSLが送信する空のレコードは、Goの Read メソッドにとって有効なアプリケーションデータと認識されず、結果として (0, nil)(読み取ったバイト数0、エラーなし)を返してしまう問題がありました。これは、呼び出し元のアプリケーションがデータが読み取れなかったと誤解し、デッドロックやタイムアウトなどの予期せぬ動作を引き起こす可能性がありました。

このコミットは、この (0, nil) の問題を解決し、GoのTLS実装がOpenSSLとの相互運用性を向上させることを目的としています。

前提知識の解説

TLS (Transport Layer Security)

TLSは、インターネット上で安全な通信を行うための暗号化プロトコルです。ウェブブラウザとサーバー間のHTTPS通信などで広く利用されています。TLSは、データの機密性(盗聴防止)、完全性(改ざん防止)、認証(通信相手の確認)を提供します。

TLS通信は、以下の主要なフェーズで構成されます。

  1. ハンドシェイクフェーズ: クライアントとサーバーが互いに認証し、暗号スイート(使用する暗号アルゴリズムの組み合わせ)をネゴシエートし、セッションキーを確立します。
  2. レコードプロトコルフェーズ: ハンドシェイクで確立されたセッションキーを使用して、アプリケーションデータを暗号化・復号化して送受信します。データは「レコード」と呼ばれる単位でカプセル化されます。

CBC (Cipher Block Chaining) モードとIV (Initialization Vector)

CBCは、ブロック暗号の動作モードの一つです。ブロック暗号は、固定長のブロック単位でデータを暗号化・復号化します。CBCモードでは、各プレーンテキストブロックが暗号化される前に、前の暗号文ブロックとXORされます。これにより、同じプレーンテキストブロックが連続しても、異なる暗号文ブロックが生成され、パターンが漏洩するのを防ぎます。

CBCモードの最初のブロックを暗号化する際には、前の暗号文ブロックが存在しないため、代わりに「初期化ベクトル (IV)」と呼ばれるランダムな値が使用されます。このIVは、各暗号化操作ごとにユニークで予測不可能である必要があります。IV自体は秘密にする必要はなく、通常は暗号文と一緒に送信されます。

TLSにおける空のレコード

TLSレコードは、アプリケーションデータだけでなく、ハンドシェイクメッセージ、アラートメッセージ、変更暗号仕様メッセージなど、様々な種類のデータをカプセル化できます。理論的には、アプリケーションデータを含まない空のレコードも存在し得ます。

OpenSSLのような一部のTLS実装では、CBCモードのIVランダム化を目的として、意図的にデータを含まない「空のアプリケーションデータレコード」を送信することがありました。これは、TLS 1.0のIV処理の設計上の問題(前のレコードの暗号文ブロックが次のレコードのIVとして使用される)を回避し、IVの予測可能性を低減するための工夫でした。これにより、攻撃者がIVを推測して暗号文を解読するのを困難にすることが期待されました。

Goの tls.Conn.Read メソッドは、通常、有効なアプリケーションデータが到着することを期待して動作します。しかし、OpenSSLが送信するこのような空のレコードは、Goの Read メソッドにとっては「読み取るべきデータがない」状態と解釈され、結果として (0, nil) を返してしまうという問題が発生していました。これは、Goのアプリケーションがデータが到着しなかったと誤解し、通信が停止したり、タイムアウトしたりする原因となる可能性がありました。

技術的詳細

このコミットは、Go言語の crypto/tls パッケージにおける Conn.Read メソッドの挙動を修正し、OpenSSLが送信する空のTLSレコードを適切に処理するようにします。

元の Conn.Read メソッドは、c.inputnil であり、かつエラーがない場合に c.readRecord(recordTypeApplicationData) を呼び出して新しいレコードを読み込もうとします。このループは、有効なアプリケーションデータが c.input に読み込まれるまで続きます。しかし、OpenSSLが送信する空のレコードは、readRecord が成功しても c.input に実質的なデータが読み込まれないため、n, err = c.input.Read(b) の結果 n0 になり、errnil となる状況が発生していました。この (0, nil) の戻り値は、Goの io.Reader インターフェースのセマンティクスにおいて「EOF(ファイルの終端)または一時的な読み取り不能状態」を示すことがあり、アプリケーションがこれをデータがない状態と誤解する可能性がありました。

この変更では、Conn.Read メソッド内に新しいループが導入されます。

  1. maxConsecutiveEmptyRecords 定数の導入: const maxConsecutiveEmptyRecords = 100 という定数が追加されました。これは、連続して無視する空のレコードの最大数を定義します。これにより、無限ループに陥ることを防ぎつつ、合理的な数の空レコードを許容します。
  2. 外側のループの追加: for emptyRecordCount := 0; emptyRecordCount <= maxConsecutiveEmptyRecords; emptyRecordCount++ という新しいループが追加されました。このループは、指定された最大回数まで空のレコードを読み飛ばすことを試みます。
  3. データ読み取りと条件分岐:
    • 内側の for c.input == nil && c.error() == nil ループは、引き続き新しいレコードを読み込む役割を担います。
    • レコードが読み込まれた後、n, err = c.input.Read(b) で実際にデータを読み取ります。
    • 重要な変更は、if n != 0 || err != nil という条件分岐です。
      • もし n0 でない(つまり、何らかのデータが読み取れた)か、または errnil でない(つまり、エラーが発生した)場合、その nerr をそのまま呼び出し元に返します。これは、有効なデータが読み取れたか、または処理すべきエラーが発生したことを意味します。
      • この条件が満たされない場合(つまり、n0errnil の場合、これは空のレコードが読み取られたことを意味します)、外側のループの次のイテレーションに進み、さらに空のレコードを読み飛ばそうとします。
  4. io.ErrNoProgress の導入: maxConsecutiveEmptyRecords の回数を超えても有効なデータが読み取れなかった場合、最終的に return 0, io.ErrNoProgress を返します。io.ErrNoProgress は、Go 1.0で導入されたエラーで、「I/O操作が進行しなかった」ことを示します。これにより、アプリケーションは、単にデータがないだけでなく、一定回数試行してもデータが読み取れなかったことを明確に認識できます。

この修正により、GoのTLSクライアントは、OpenSSLサーバーが送信するCBC IVランダム化のための空レコードを透過的に処理できるようになり、アプリケーション層に (0, nil) が伝播して誤動作を引き起こすことを防ぎます。

コアとなるコードの変更箇所

src/pkg/crypto/tls/conn.go

--- a/src/pkg/crypto/tls/conn.go
+++ b/src/pkg/crypto/tls/conn.go
@@ -792,21 +792,32 @@ func (c *Conn) Read(b []byte) (n int, err error) {
  	c.in.Lock()
  	defer c.in.Unlock()
  
-	for c.input == nil && c.error() == nil {
-		if err := c.readRecord(recordTypeApplicationData); err != nil {
-			// Soft error, like EAGAIN
-			return 0, err
-		}
-	}
-	if err := c.error(); err != nil {
-		return 0, err
-	}
-	n, err = c.input.Read(b)
-	if c.input.off >= len(c.input.data) {
-		c.in.freeBlock(c.input)
-		c.input = nil
-	}
-	return n, nil
+	// Some OpenSSL servers send empty records in order to randomize the
+	// CBC IV. So this loop ignores a limited number of empty records.
+	const maxConsecutiveEmptyRecords = 100
+	for emptyRecordCount := 0; emptyRecordCount <= maxConsecutiveEmptyRecords; emptyRecordCount++ {
+		for c.input == nil && c.error() == nil {
+			if err := c.readRecord(recordTypeApplicationData); err != nil {
+				// Soft error, like EAGAIN
+				return 0, err
+			}
+		}
+		if err := c.error(); err != nil {
+			return 0, err
+		}
+
+		n, err = c.input.Read(b)
+		if c.input.off >= len(c.input.data) {
+			c.in.freeBlock(c.input)
+			c.input = nil
+		}
+
+		if n != 0 || err != nil {
+			return n, err
+		}
+	}
+
+	return 0, io.ErrNoProgress
  }
  
  // Close closes the connection.

src/pkg/crypto/tls/handshake_client_test.go

このファイルには、TestEmptyRecords という新しいテスト関数と、テストで使用される emptyRecordScript というバイトスライスが追加されました。emptyRecordScript は、空のTLSレコードを含むTLS通信のシーケンスをシミュレートするためのデータです。

--- a/src/pkg/crypto/tls/handshake_client_test.go
+++ b/src/pkg/crypto/tls/handshake_client_test.go
@@ -79,6 +79,48 @@ func TestRunClient(t *testing.T) {
  	record.WriteTo(os.Stdout)
  }
  
+func TestEmptyRecords(t *testing.T) {
+	// emptyRecordScript contains a TLS connection with an empty record as
+	// the first application data from the server. This test ensures that
+	// the empty record doesn't cause (0, nil) to be returned from
+	// Conn.Read.
+	var config = *testConfig
+	config.CipherSuites = []uint16{TLS_RSA_WITH_AES_256_CBC_SHA}
+
+	c, s := net.Pipe()
+	cli := Client(c, &config)
+	go func() {
+		buf := make([]byte, 1024)
+		n, err := cli.Read(buf)
+		defer cli.Close()
+		defer c.Close()
+
+		if err != nil {
+			t.Fatalf("error reading from tls.Client: %s", err)
+		}
+		const expectedLength = 197
+		if n != expectedLength {
+			t.Fatalf("incorrect length reading from tls.Client, got %d, want %d", n, expectedLength)
+		}
+	}()
+
+	defer c.Close()
+	for i, b := range emptyRecordScript {
+		if i%2 == 1 {
+			s.Write(b)
+			continue
+		}
+		bb := make([]byte, len(b))
+		_, err := io.ReadFull(s, bb)
+		if err != nil {
+			t.Fatalf("#%d: %s", i, err)
+		}
+		if !bytes.Equal(b, bb) {
+			t.Fatalf("#%d: mismatch on read: got:%x want:%x", i, bb, b)
+		}
+	}
+}
+
  // Script of interaction with gnutls implementation.
  // The values for this test are obtained by building and running in client mode:
  //   % go test -test.run "TestRunClient" -connect
@@ -406,3 +448,555 @@ var ecdheAESClientScript = [][]byte{\n  	\t0x57, 0x33, 0xc3, 0xbc, 0x3f, 0x7a, 0x4d,\n  	},\n  }\n+\n+var emptyRecordScript = [][]byte{\n+\t{\n+\t\t0x16, 0x03, 0x01, 0x00, 0x4a, 0x01, 0x00, 0x00,\n+\t\t0x46, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n+\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n+\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n+\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n+\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x35,\n+\t\t0x01, 0x00, 0x00, 0x1b, 0x00, 0x05, 0x00, 0x05,\n+\t\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00,\n+\t\t0x08, 0x00, 0x06, 0x00, 0x17, 0x00, 0x18, 0x00,\n+\t\t0x19, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00,\n+\t},\n+\t{\n+\t\t0x16, 0x03, 0x01, 0x00, 0x4a, 0x02, 0x00, 0x00,\n+\t\t0x46, 0x03, 0x01, 0x51, 0x71, 0x8e, 0x03, 0x02,\n+\t\t0xef, 0x09, 0xf2, 0x0e, 0xf5, 0x3b, 0x29, 0x9a,\n+\t\t0xa8, 0x8b, 0x46, 0xa3, 0xd4, 0xb4, 0xc1, 0x14,\n+\t\t0xc3, 0x19, 0x99, 0xba, 0x3d, 0x78, 0xcf, 0x50,\n+\t\t0xd1, 0xe7, 0x26, 0x20, 0xa0, 0x37, 0x6d, 0xc9,\n+\t\t0xae, 0x93, 0x33, 0x81, 0x20, 0xe3, 0xc1, 0x90,\n+\t\t0x64, 0x6e, 0x67, 0x93, 0xdb, 0xb4, 0x04, 0x16,\n+\t\t0xc4, 0x25, 0xdd, 0x10, 0x79, 0x3c, 0x18, 0x0a,\n+\t\t0x7c, 0xfd, 0x28, 0x65, 0x00, 0x35, 0x00, 0x16,\n+\t\t0x03, 0x01, 0x09, 0x9e, 0x0b, 0x00, 0x09, 0x9a,\n+\t\t0x00, 0x09, 0x97, 0x00, 0x04, 0xea, 0x30, 0x82,\n+\t\t0x04, 0xe6, 0x30, 0x82, 0x03, 0xce, 0xa0, 0x03,\n+\t\t0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0xff, 0xab,\n+\t\t0x02, 0x93, 0xe0, 0x72, 0x99, 0x18, 0x6c, 0x9e,\n+\t\t0x96, 0xb8, 0xb9, 0xf7, 0x47, 0xcb, 0x30, 0x0d,\n+\t\t0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,\n+\t\t0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x41, 0x31,\n+\t\t0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+\t\t0x13, 0x02, 0x46, 0x52, 0x31, 0x12, 0x30, 0x10,\n+\t\t0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09, 0x47,\n+\t\t0x41, 0x4e, 0x44, 0x49, 0x20, 0x53, 0x41, 0x53,\n+\t\t0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04,\n+\t\t0x03, 0x13, 0x15, 0x47, 0x61, 0x6e, 0x64, 0x69,\n+\t\t0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,\n+\t\t0x64, 0x20, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x41,\n+\t\t0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x31,\n+\t\t0x31, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n+\t\t0x5a, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x31, 0x31,\n+\t\t0x34, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a,\n+\t\t0x30, 0x62, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03,\n+\t\t0x55, 0x04, 0x0b, 0x13, 0x18, 0x44, 0x6f, 0x6d,\n+\t\t0x61, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x74,\n+\t\t0x72, 0x6f, 0x6c, 0x20, 0x56, 0x61, 0x6c, 0x69,\n+\t\t0x64, 0x61, 0x74, 0x65, 0x64, 0x31, 0x24, 0x30,\n+\t\t0x22, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1b,\n+\t\t0x47, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x53, 0x74,\n+\t\t0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x57,\n+\t\t0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x20,\n+\t\t0x53, 0x53, 0x4c, 0x31, 0x17, 0x30, 0x15, 0x06,\n+\t\t0x03, 0x55, 0x04, 0x03, 0x14, 0x0e, 0x2a, 0x2e,\n+\t\t0x66, 0x72, 0x65, 0x65, 0x6e, 0x6f, 0x64, 0x65,\n+\t\t0x2e, 0x6e, 0x65, 0x74, 0x30, 0x82, 0x01, 0x22,\n+\t\t0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+\t\t0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,\n+\t\t0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a,\n+\t\t0x02, 0x82, 0x01, 0x01, 0x00, 0xdc, 0xe3, 0xfd,\n+\t\t0xce, 0xc1, 0x66, 0x62, 0x28, 0x8b, 0x99, 0x65,\n+\t\t0x72, 0x52, 0x88, 0x93, 0x5b, 0x3f, 0x8d, 0xde,\n+\t\t0x2b, 0xb0, 0xa0, 0xf4, 0xbd, 0xb4, 0x07, 0x5f,\n+\t\t0x9e, 0x01, 0x47, 0x60, 0x57, 0x5f, 0xdf, 0xdc,\n+\t\t0x63, 0x28, 0x1c, 0x1e, 0x5b, 0xc8, 0xe6, 0x29,\n+\t\t0xdd, 0xeb, 0x26, 0x63, 0xd5, 0xbf, 0x83, 0xb2,\n+\t\t0x2d, 0xcd, 0x2c, 0xa0, 0xb6, 0x91, 0xad, 0xaf,\n+\t\t0x95, 0x21, 0x1d, 0x1f, 0x39, 0x8d, 0x3e, 0x17,\n+\t\t0xd6, 0xbd, 0x99, 0xf5, 0x6c, 0xd4, 0xcb, 0x79,\n+\t\t0x12, 0x3e, 0x11, 0xb9, 0x7e, 0x62, 0xbc, 0x2d,\n+\t\t0xbf, 0xe0, 0x55, 0x1b, 0x5c, 0x1e, 0xce, 0x31,\n+\t\t0xd9, 0xf8, 0x56, 0x68, 0x95, 0x2b, 0x15, 0x84,\n+\t\t0x35, 0xae, 0x98, 0x2c, 0x63, 0x01, 0xb2, 0x0d,\n+\t\t0xab, 0xa8, 0x61, 0xef, 0x7f, 0x15, 0x2c, 0x6d,\n+\t\t0xf7, 0x67, 0x1d, 0xb8, 0x8d, 0xf6, 0xa2, 0x1c,\n+\t\t0x4e, 0x85, 0xf0, 0xea, 0x1a, 0x2b, 0xc8, 0xac,\n+\t\t0x70, 0x86, 0x9a, 0xbb, 0x9e, 0x9d, 0xbd, 0xc9,\n+\t\t0x87, 0x2b, 0x9f, 0x5e, 0x40, 0x44, 0x9b, 0xba,\n+\t\t0x96, 0x45, 0x24, 0xbc, 0x49, 0xb8, 0xfe, 0x26,\n+\t\t0x3a, 0x1d, 0x1a, 0x0a, 0x3a, 0x90, 0x9c, 0x75,\n+\t\t0x51, 0x59, 0x89, 0x98, 0x1a, 0x56, 0xe1, 0x3a,\n+\t\t0x1a, 0xba, 0xff, 0xb4, 0x37, 0x7d, 0xd8, 0x99,\n+\t\t0xe2, 0xeb, 0x45, 0x27, 0xe2, 0x42, 0x42, 0x46,\n+\t\t0xbb, 0x00, 0x29, 0x9f, 0x30, 0xc9, 0x1e, 0x6c,\n+\t\t0xce, 0x59, 0x0e, 0xbe, 0x16, 0x03, 0x31, 0xec,\n+\t\t0x10, 0xc1, 0x6d, 0xca, 0x9d, 0x5f, 0x6d, 0xf1,\n+\t\t0x26, 0x11, 0xe5, 0x50, 0xa1, 0xbb, 0x67, 0xb2,\n+\t\t0xe0, 0x2b, 0xed, 0x76, 0x5b, 0xc7, 0x68, 0xc0,\n+\t\t0x18, 0xad, 0x91, 0x9e, 0xb5, 0xd4, 0x4d, 0x21,\n+\t\t0xcd, 0x98, 0xd9, 0xe0, 0x05, 0x0a, 0x4d, 0x24,\n+\t\t0xa3, 0xe6, 0x12, 0x04, 0xdd, 0x50, 0xe6, 0xc8,\n+\t\t0x7a, 0x69, 0xb9, 0x32, 0x43, 0x02, 0x03, 0x01,\n+\t\t0x00, 0x01, 0xa3, 0x82, 0x01, 0xb6, 0x30, 0x82,\n+\t\t0x01, 0xb2, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d,\n+\t\t0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb6,\n+\t\t0xa8, 0xff, 0xa2, 0xa8, 0x2f, 0xd0, 0xa6, 0xcd,\n+\t\t0x4b, 0xb1, 0x68, 0xf3, 0xe7, 0x50, 0x10, 0x31,\n+\t\t0xa7, 0x79, 0x21, 0x30, 0x1d, 0x06, 0x03, 0x55,\n+\t\t0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x62, 0x37,\n+\t\t0xd4, 0x3c, 0xbf, 0xd9, 0xc2, 0x99, 0xf3, 0x28,\n+\t\t0x3e, 0xdb, 0xca, 0xee, 0xf3, 0xb3, 0xc8, 0x73,\n+\t\t0xb0, 0x3c, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,\n+\t\t0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,\n+\t\t0x05, 0xa0, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d,\n+\t\t0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00,\n+\t\t0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04,\n+\t\t0x16, 0x30, 0x14, 0x06, 0x08, 0x2b, 0x06, 0x01,\n+\t\t0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2b,\n+\t\t0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30,\n+\t\t0x60, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x59,\n+\t\t0x30, 0x57, 0x30, 0x4b, 0x06, 0x0b, 0x2b, 0x06,\n+\t\t0x01, 0x04, 0x01, 0xb2, 0x31, 0x01, 0x02, 0x02,\n+\t\t0x1a, 0x30, 0x3c, 0x30, 0x3a, 0x06, 0x08, 0x2b,\n+\t\t0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16,\n+\t\t0x2e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,\n+\t\t0x77, 0x77, 0x77, 0x2e, 0x67, 0x61, 0x6e, 0x64,\n+\t\t0x69, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x63, 0x6f,\n+\t\t0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x2f,\n+\t\t0x66, 0x72, 0x2f, 0x73, 0x73, 0x6c, 0x2f, 0x63,\n+\t\t0x70, 0x73, 0x2f, 0x70, 0x64, 0x66, 0x2f, 0x30,\n+\t\t0x08, 0x06, 0x06, 0x67, 0x81, 0x0c, 0x01, 0x02,\n+\t\t0x01, 0x30, 0x3c, 0x06, 0x03, 0x55, 0x1d, 0x1f,\n+\t\t0x04, 0x35, 0x30, 0x33, 0x30, 0x31, 0xa0, 0x2f,\n+\t\t0xa0, 0x2d, 0x86, 0x2b, 0x68, 0x74, 0x74, 0x70,\n+\t\t0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x67,\n+\t\t0x61, 0x6e, 0x64, 0x69, 0x2e, 0x6e, 0x65, 0x74,\n+\t\t0x2f, 0x47, 0x61, 0x6e, 0x64, 0x69, 0x53, 0x74,\n+\t\t0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x53, 0x53,\n+\t\t0x4c, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x6c, 0x30,\n+\t\t0x6a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,\n+\t\t0x07, 0x01, 0x01, 0x04, 0x5e, 0x30, 0x5c, 0x30,\n+\t\t0x37, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,\n+\t\t0x07, 0x30, 0x02, 0x86, 0x2b, 0x68, 0x74, 0x74,\n+\t\t0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x74, 0x2e,\n+\t\t0x67, 0x61, 0x6e, 0x64, 0x69, 0x2e, 0x6e, 0x65,\n+\t\t0x74, 0x2f, 0x47, 0x61, 0x6e, 0x64, 0x69, 0x53,\n+\t\t0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x53,\n+\t\t0x53, 0x4c, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x74,\n+\t\t0x30, 0x21, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05,\n+\t\t0x05, 0x07, 0x30, 0x01, 0x86, 0x15, 0x68, 0x74,\n+\t\t0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73,\n+\t\t0x70, 0x2e, 0x67, 0x61, 0x6e, 0x64, 0x69, 0x2e,\n+\t\t0x6e, 0x65, 0x74, 0x30, 0x27, 0x06, 0x03, 0x55,\n+\t\t0x1d, 0x11, 0x04, 0x20, 0x30, 0x1e, 0x82, 0x0e,\n+\t\t0x2a, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x6e, 0x6f,\n+\t\t0x64, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x82, 0x0c,\n+\t\t0x66, 0x72, 0x65, 0x65, 0x6e, 0x6f, 0x64, 0x65,\n+\t\t0x2e, 0x6e, 0x65, 0x74, 0x30, 0x0d, 0x06, 0x09,\n+\t\t0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,\n+\t\t0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,\n+\t\t0x5b, 0x4a, 0x3a, 0x1d, 0x75, 0xe0, 0xc0, 0x9e,\n+\t\t0xc9, 0x16, 0x66, 0x7f, 0x73, 0x95, 0x6e, 0x35,\n+\t\t0xe4, 0x27, 0xfa, 0x8c, 0x9d, 0xee, 0xb1, 0x37,\n+\t\t0x42, 0x3f, 0x54, 0x6a, 0x9d, 0x41, 0x84, 0x57,\n+\t\t0xe1, 0x03, 0x3d, 0x69, 0x61, 0x77, 0x3b, 0x91,\n+\t\t0xa2, 0x70, 0x94, 0xb6, 0x8e, 0x41, 0x63, 0x70,\n+\t\t0xf2, 0x16, 0x04, 0x50, 0x05, 0x14, 0xfb, 0x59,\n+\t\t0x7d, 0x89, 0x09, 0x3f, 0xb6, 0xef, 0xca, 0x3c,\n+\t\t0x89, 0x88, 0x08, 0xe9, 0xa1, 0xf3, 0x33, 0x31,\n+\t\t0x05, 0x4d, 0x70, 0xff, 0xdd, 0xa7, 0xd2, 0xe2,\n+\t\t0xa0, 0x94, 0x3a, 0xf7, 0xc2, 0x9f, 0xad, 0x2b,\n+\t\t0x2e, 0x20, 0xfa, 0x6c, 0xe1, 0xfc, 0xe6, 0x62,\n+\t\t0x22, 0xa1, 0x38, 0x93, 0xec, 0x3e, 0xce, 0xfd,\n+\t\t0x1f, 0xdd, 0xd4, 0x7c, 0x39, 0x46, 0x8b, 0xb4,\n+\t\t0x64, 0xfa, 0xa1, 0x46, 0x87, 0x78, 0x2c, 0xd7,\n+\t\t0x9c, 0xdd, 0x60, 0xd6, 0xda, 0x8e, 0xd8, 0x29,\n+\t\t0x6d, 0x61, 0xa7, 0x29, 0x07, 0x76, 0xfc, 0xf9,\n+\t\t0xbd, 0xfd, 0x14, 0xeb, 0x44, 0x70, 0xff, 0xd0,\n+\t\t0x23, 0x99, 0x83, 0xc5, 0x5c, 0x56, 0x88, 0xaa,\n+\t\t0x34, 0xda, 0xa6, 0xb3, 0x9a, 0xbf, 0xda, 0x58,\n+\t\t0x1e, 0xa4, 0xb8, 0xc0, 0x40, 0x9d, 0xf0, 0xfc,\n+\t\t0xf1, 0x23, 0xc2, 0xbc, 0x59, 0xe1, 0x82, 0xed,\n+\t\t0x5d, 0xfb, 0x99, 0xaf, 0xf5, 0xf5, 0x15, 0xb8,\n+\t\t0x8b, 0x59, 0xce, 0xaa, 0xca, 0xdf, 0xdc, 0x94,\n+\t\t0x11, 0xe0, 0x96, 0xbf, 0x9f, 0x54, 0xa4, 0x9f,\n+\t\t0x54, 0x36, 0x4a, 0xe8, 0x93, 0xda, 0xf4, 0x8c,\n+\t\t0xb0, 0x6b, 0x8d, 0x4a, 0x9e, 0x11, 0xae, 0xcb,\n+\t\t0xcb, 0x33, 0x8a, 0x4d, 0xcd, 0x4e, 0xa5, 0x9b,\n+\t\t0xe9, 0x14, 0x46, 0x43, 0x9b, 0x96, 0x5f, 0x6d,\n+\t\t0xf2, 0xea, 0x40, 0xef, 0x14, 0xc3, 0x99, 0x9f,\n+\t\t0x23, 0x1e, 0xa5, 0x13, 0xab, 0x08, 0xea, 0x8f,\n+\t\t0x68, 0x5b, 0x7d, 0x71, 0xdf, 0x18, 0xd1, 0x57,\n+\t\t0x00, 0x04, 0xa7, 0x30, 0x82, 0x04, 0xa3, 0x30,\n+\t\t0x82, 0x03, 0x8b, 0xa0, 0x03, 0x02, 0x01, 0x02,\n+\t\t0x02, 0x10, 0x5a, 0xb6, 0x1d, 0xac, 0x1e, 0x4d,\n+\t\t0xa2, 0x06, 0x14, 0xc7, 0x55, 0x3d, 0x3d, 0xa9,\n+\t\t0xb2, 0xdc, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+\t\t0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,\n+\t\t0x00, 0x30, 0x81, 0x97, 0x31, 0x0b, 0x30, 0x09,\n+\t\t0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,\n+\t\t0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\n+\t\t0x04, 0x08, 0x13, 0x02, 0x55, 0x54, 0x31, 0x17,\n+\t\t0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13,\n+\t\t0x0e, 0x53, 0x61, 0x6c, 0x74, 0x20, 0x4c, 0x61,\n+\t\t0x6b, 0x65, 0x20, 0x43, 0x69, 0x74, 0x79, 0x31,\n+\t\t0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a,\n+\t\t0x13, 0x15, 0x54, 0x68, 0x65, 0x20, 0x55, 0x53,\n+\t\t0x45, 0x52, 0x54, 0x52, 0x55, 0x53, 0x54, 0x20,\n+\t\t0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31,\n+\t\t0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0b,\n+\t\t0x13, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,\n+\t\t0x2f, 0x77, 0x77, 0x77, 0x2e, 0x75, 0x73, 0x65,\n+\t\t0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x2e, 0x63,\n+\t\t0x6f, 0x6d, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03,\n+\t\t0x55, 0x04, 0x03, 0x13, 0x16, 0x55, 0x54, 0x4e,\n+\t\t0x2d, 0x55, 0x53, 0x45, 0x52, 0x46, 0x69, 0x72,\n+\t\t0x73, 0x74, 0x2d, 0x48, 0x61, 0x72, 0x64, 0x77,\n+\t\t0x61, 0x72, 0x65, 0x30, 0x1e, 0x17, 0x0d, 0x30,\n+\t\t0x38, 0x31, 0x30, 0x32, 0x33, 0x30, 0x30, 0x30,\n+\t\t0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x30,\n+\t\t0x30, 0x35, 0x33, 0x30, 0x31, 0x30, 0x34, 0x38,\n+\t\t0x33, 0x38, 0x5a, 0x30, 0x41, 0x31, 0x0b, 0x30,\n+\t\t0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,\n+\t\t0x46, 0x52, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03,\n+\t\t0x55, 0x04, 0x0a, 0x13, 0x09, 0x47, 0x41, 0x4e,\n+\t\t0x44, 0x49, 0x20, 0x53, 0x41, 0x53, 0x31, 0x1e,\n+\t\t0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,\n+\t\t0x15, 0x47, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x53,\n+\t\t0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,\n+\t\t0x53, 0x53, 0x4c, 0x20, 0x43, 0x41, 0x30, 0x82,\n+\t\t0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,\n+\t\t0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,\n+\t\t0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82,\n+\t\t0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb6,\n+\t\t0x54, 0x3d, 0xa5, 0xdb, 0x0d, 0x22, 0x78, 0x50,\n+\t\t0x6a, 0x5a, 0x23, 0x89, 0x3f, 0x97, 0xa1, 0xd4,\n+\t\t0x07, 0x1a, 0xa9, 0x58, 0x08, 0x9b, 0xa0, 0x15,\n+\t\t0xc3, 0x32, 0xb6, 0xb7, 0xf1, 0xe8, 0xb9, 0xa5,\n+\t\t0x6f, 0xad, 0x37, 0xf6, 0x6e, 0x71, 0x1b, 0xb4,\n+\t\t0x75, 0x2d, 0x48, 0x5e, 0x9f, 0xc6, 0x15, 0xaa,\n+\t\t0x81, 0xef, 0xe5, 0xc4, 0x88, 0x95, 0x8a, 0x3a,\n+\t\t0x6c, 0x77, 0xcc, 0xb5, 0xcd, 0x65, 0xe4, 0x67,\n+\t\t0xe5, 0x73, 0xc9, 0x50, 0x52, 0x94, 0xc1, 0x27,\n+\t\t0x49, 0x3e, 0xa0, 0x6b, 0x41, 0x16, 0x41, 0xb6,\n+\t\t0x94, 0x99, 0x41, 0xae, 0x3e, 0xcb, 0xe2, 0x06,\n+\t\t0x46, 0x09, 0xe9, 0x4d, 0xbe, 0xc9, 0x4c, 0x55,\n+\t\t0xa9, 0x18, 0x7e, 0xa6, 0xdf, 0x6e, 0xfd, 0x4a,\n+\t\t0xb2, 0xcc, 0x6c, 0x4e, 0xd9, 0xc8, 0x50, 0x15,\n+\t\t0x93, 0xb3, 0xf2, 0xe9, 0xe3, 0xc2, 0x6a, 0xad,\n+\t\t0x3a, 0xd5, 0xfb, 0xc3, 0x79, 0x50, 0x9f, 0x25,\n+\t\t0x79, 0x29, 0xb2, 0x47, 0x64, 0x7c, 0x20, 0x3e,\n+\t\t0xe2, 0x08, 0x4d, 0x93, 0x29, 0x14, 0xb6, 0x34,\n+\t\t0x6e, 0xcf, 0x71, 0x46, 0x7e, 0x76, 0x10, 0xf4,\n+\t\t0xfd, 0x6c, 0xaa, 0x01, 0xd2, 0xc2, 0x06, 0xde,\n+\t\t0x92, 0x83, 0xcc, 0x58, 0x90, 0x2e, 0x92, 0xde,\n+\t\t0x1e, 0x65, 0xb7, 0x63, 0x2f, 0x3d, 0xb2, 0xeb,\n+\t\t0x70, 0x8c, 0x4c, 0xe0, 0xbe, 0x15, 0x9d, 0xde,\n+\t\t0xc1, 0x4d, 0x56, 0xf8, 0x0b, 0xc6, 0x8e, 0x07,\n+\t\t0xb9, 0x5d, 0xdf, 0x95, 0xf0, 0x7b, 0x40, 0x1f,\n+\t\t0x1a, 0x2c, 0xd7, 0x9c, 0x2b, 0x4b, 0x76, 0xf4,\n+\t\t0x59, 0xf5, 0x43, 0xc1, 0x2c, 0x66, 0x10, 0x9e,\n+\t\t0x9e, 0x66, 0x96, 0x60, 0x9d, 0x1c, 0x74, 0x1b,\n+\t\t0x4e, 0x18, 0x5c, 0x08, 0xb0, 0x6e, 0x6c, 0xca,\n+\t\t0x69, 0x1a, 0x02, 0xe9, 0xbb, 0xca, 0x78, 0xef,\n+\t\t0x66, 0x2e, 0xe3, 0x32, 0xfd, 0x41, 0x5c, 0x95,\n+\t\t0x74, 0x81, 0x4d, 0xf4, 0xda, 0xfe, 0x4b, 0x02,\n+\t\t0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x3e,\n+\t\t0x30, 0x82, 0x01, 0x3a, 0x30, 0x1f, 0x06, 0x03,\n+\t\t0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80,\n+\t\t0x14, 0xa1, 0x72, 0x5f, 0x26, 0x1b, 0x28, 0x98,\n+\t\t0x43, 0x95, 0x5d, 0x07, 0x37, 0xd5, 0x85, 0x96,\n+\t\t0x9d, 0x4b, 0xd2, 0xc3, 0x45, 0x30, 0x1d, 0x06,\n+\t\t0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,\n+\t\t0xb6, 0xa8, 0xff, 0xa2, 0xa8, 0x2f, 0xd0, 0xa6,\n+\t\t0xcd, 0x4b, 0xb1, 0x68, 0xf3, 0xe7, 0x50, 0x10,\n+\t\t0x31, 0xa7, 0x79, 0x21, 0x30, 0x0e, 0x06, 0x03, \n+\t\t0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,\n+\t\t0x03, 0x02, 0x01, 0x06, 0x30, 0x12, 0x06, 0x03,\n+\t\t0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08,\n+\t\t0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x00,\n+\t\t0x30, 0x18, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04,\n+\t\t0x11, 0x30, 0x0f, 0x30, 0x0d, 0x06, 0x0b, 0x2b,\n+\t\t0x06, 0x01, 0x04, 0x01, 0xb2, 0x31, 0x01, 0x02,\n+\t\t0x02, 0x1a, 0x30, 0x44, 0x06, 0x03, 0x55, 0x1d,\n+\t\t0x1f, 0x04, 0x3d, 0x30, 0x3b, 0x30, 0x39, 0xa0,\n+\t\t0x37, 0xa0, 0x35, 0x86, 0x33, 0x68, 0x74, 0x74,\n+\t\t0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e,\n+\t\t0x75, 0x73, 0x65, 0x72, 0x74, 0x72, 0x75, 0x73,\n+\t\t0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x54,\n+\t\t0x4e, 0x2d, 0x55, 0x53, 0x45, 0x52, 0x46, 0x69,\n+\t\t0x72, 0x73, 0x74, 0x2d, 0x48, 0x61, 0x72, 0x64,\n+\t\t0x77, 0x61, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x6c,\n+\t\t0x30, 0x74, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05,\n+\t\t0x05, 0x07, 0x01, 0x01, 0x04, 0x68, 0x30, 0x66,\n+\t\t0x30, 0x3d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05,\n+\t\t0x05, 0x07, 0x30, 0x02, 0x86, 0x31, 0x68, 0x74,\n+\t\t0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x74,\n+\t\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, 0x75,\n+\t\t0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55,\n+\t\t0x54, 0x4e, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75,\n+\t\t0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,\n+\t\t0x5f, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x74, 0x30,\n+\t\t0x25, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,\n+\t\t0x07, 0x30, 0x01, 0x86, 0x19, 0x68, 0x74, 0x74,\n+\t\t0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73,\n+\t\t0x70, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x72, \n+\t\t0x75, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x30, \n+\t\t0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+\t\t0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82,\n+\t\t0x01, 0x01, 0x00, 0x19, 0x53, 0xbf, 0x03, 0x3d,\n+\t\t0x9b, 0xe2, 0x6b, 0x5a, 0xfd, 0xba, 0x49, 0x1f,\n+\t\t0x4f, 0xec, 0xe1, 0xc6, 0x82, 0x39, 0x3c, 0xd2,\n+\t\t0x03, 0x04, 0x0f, 0xab, 0x7b, 0x3e, 0x82, 0xa9,\n+\t\t0x85, 0x10, 0x1f, 0xf4, 0xde, 0x32, 0xaf, 0x58,\n+\t\t0x3f, 0xff, 0x70, 0xf3, 0x30, 0x1d, 0x97, 0x2d,\n+\t\t0x4c, 0x9a, 0xe2, 0xec, 0x0c, 0x3e, 0x14, 0x2d,\n+\t\t0x2f, 0x98, 0x48, 0x9d, 0xae, 0x16, 0x6a, 0xac,\n+\t\t0x2d, 0x42, 0xaa, 0xb5, 0x64, 0xa4, 0x70, 0xbb,\n+\t\t0xeb, 0x73, 0x94, 0x7b, 0x46, 0x4c, 0xe7, 0x7a,\n+\t\t0x14, 0x76, 0x5b, 0x4c, 0x1d, 0x84, 0xa1, 0x20,\n+\t\t0x74, 0x1f, 0x2e, 0x4b, 0x5c, 0x70, 0x88, 0xdc,\n+\t\t0xbd, 0xf7, 0x19, 0x3d, 0xed, 0x59, 0x0d, 0xe2,\n+\t\t0x3f, 0x26, 0xe2, 0x9c, 0xac, 0xa4, 0x3c, 0x95,\n+\t\t0x1c, 0xf8, 0xbe, 0x8c, 0x03, 0xae, 0xf0, 0xe5,\n+\t\t0x9c, 0x4d, 0xbc, 0xc7, 0x9b, 0x58, 0x00, 0xbf,\n+\t\t0xaf, 0xad, 0xfa, 0x37, 0x6e, 0x71, 0x6d, 0x18,\n+\t\t0x34, 0x0e, 0xc1, 0xea, 0x6a, 0xf8, 0x0d, 0xdf,\n+\t\t0x69, 0x54, 0x56, 0x15, 0xf2, 0x28, 0xb3, 0xfe,\n+\t\t0xa4, 0x63, 0xec, 0xc5, 0x04, 0x64, 0x60, 0xbb,\n+\t\t0xfe, 0x2a, 0xf0, 0xf4, 0x87, 0xa1, 0xb0, 0xae,\n+\t\t0xbd, 0xaa, 0xe4, 0x2f, 0xe3, 0x03, 0x0b, 0x2f,\n+\t\t0x66, 0x5f, 0x85, 0xa4, 0x32, 0x7b, 0x46, 0xed,\n+\t\t0x25, 0x0c, 0xe7, 0xf1, 0xb7, 0xe7, 0x19, 0xfd,\n+\t\t0x60, 0xba, 0x5f, 0x87, 0x77, 0xde, 0x98, 0x07,\n+\t\t0x96, 0xe4, 0x5e, 0xea, 0x63, 0x7d, 0xa8, 0xde,\n+\t\t0x55, 0xda, 0x61, 0x5c, 0x3c, 0x90, 0x83, 0x43,\n+\t\t0x04, 0x07, 0x3c, 0xdd, 0xf3, 0xf8, 0x9f, 0x06,\n+\t\t0x52, 0x0a, 0xde, 0xc7, 0xb6, 0x7b, 0x8f, 0xe1,\n+\t\t0x11, 0xf7, 0x04, 0x7a, 0x35, 0xff, 0x6a, 0xbc,\n+\t\t0x5b, 0xc7, 0x50, 0x49, 0x08, 0x70, 0x6f, 0x94,\n+\t\t0x43, 0xcd, 0x9e, 0xc7, 0x70, 0xf1, 0xdb, 0xd0,\n+\t\t0x6d, 0xda, 0x8f, 0x16, 0x03, 0x01, 0x00, 0x0e,\n+\t\t0x0d, 0x00, 0x00, 0x06, 0x03, 0x01, 0x02, 0x40,\n+\t\t0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,\n+\t},\n+\t{\n+\t\t0x16, 0x03, 0x01, 0x02, 0xbe, 0x0b, 0x00, 0x02,\n+\t\t0xba, 0x00, 0x02, 0xb7, 0x00, 0x02, 0xb4, 0x30,\n+\t\t0x82, 0x02, 0xb0, 0x30, 0x82, 0x02, 0x19, 0xa0,\n+\t\t0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0x85,\n+\t\t0xb0, 0xbb, 0xa4, 0x8a, 0x7f, 0xb8, 0xca, 0x30,\n+\t\t0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+\t\t0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x45,\n+\t\t0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,\n+\t\t0x06, 0x13, 0x02, 0x41, 0x55, 0x31, 0x13, 0x30,\n+\t\t0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a,\n+\t\t0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61,\n+\t\t0x74, 0x65, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03,\n+\t\t0x55, 0x04, 0x0a, 0x13, 0x18, 0x49, 0x6e, 0x74,\n+\t\t0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69,\n+\t\t0x64, 0x67, 0x69, 0x74, 0x73, 0x20, 0x50, 0x74,\n+\t\t0x79, 0x20, 0x4c, 0x74, 0x64, 0x30, 0x1e, 0x17,\n+\t\t0x0d, 0x31, 0x30, 0x30, 0x34, 0x32, 0x34, 0x30,\n+\t\t0x39, 0x30, 0x39, 0x33, 0x38, 0x5a, 0x17, 0x0d,\n+\t\t0x31, 0x31, 0x30, 0x34, 0x32, 0x34, 0x30, 0x39,\n+\t\t0x30, 0x39, 0x33, 0x38, 0x5a, 0x30, 0x45, 0x31,\n+\t\t0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,\n+\t\t0x13, 0x02, 0x41, 0x55, 0x31, 0x13, 0x30, 0x11,\n+\t\t0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x53,\n+\t\t0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74,\n+\t\t0x65, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, \n+\t\t0x04, 0x0a, 0x13, 0x18, 0x49, 0x6e, 0x74, 0x65,\n+\t\t0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64,\n+\t\t0x67, 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79,\n+\t\t0x20, 0x4c, 0x74, 0x64, 0x30, 0x81, 0x9f, 0x30,\n+\t\t0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,\n+\t\t0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81,\n+\t\t0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81,\n+\t\t0x00, 0xbb, 0x79, 0xd6, 0xf5, 0x17, 0xb5, 0xe5,\n+\t\t0xbf, 0x46, 0x10, 0xd0, 0xdc, 0x69, 0xbe, 0xe6,\n+\t\t0x2b, 0x07, 0x43, 0x5a, 0xd0, 0x03, 0x2d, 0x8a,\n+\t\t0x7a, 0x43, 0x85, 0xb7, 0x14, 0x52, 0xe7, 0xa5,\n+\t\t0x65, 0x4c, 0x2c, 0x78, 0xb8, 0x23, 0x8c, 0xb5,\n+\t\t0xb4, 0x82, 0xe5, 0xde, 0x1f, 0x95, 0x3b, 0x7e,\n+\t\t0x62, 0xa5, 0x2c, 0xa5, 0x33, 0xd6, 0xfe, 0x12,\n+\t\t0x5c, 0x7a, 0x56, 0xfc, 0xf5, 0x06, 0xbf, 0xfa,\n+\t\t0x58, 0x7b, 0x26, 0x3f, 0xb5, 0xcd, 0x04, 0xd3,\n+\t\t0xd0, 0xc9, 0x21, 0x96, 0x4a, 0xc7, 0xf4, 0x54,\n+\t\t0x9f, 0x5a, 0xbf, 0xef, 0x42, 0x71, 0x00, 0xfe,\n+\t\t0x18, 0x99, 0x07, 0x7f, 0x7e, 0x88, 0x7d, 0x7d,\n+\t\t0xf1, 0x04, 0x39, 0xc4, 0xa2, 0x2e, 0xdb, 0x51,\n+\t\t0xc9, 0x7c, 0xe3, 0xc0, 0x4c, 0x3b, 0x32, 0x66,\n+\t\t0x01, 0xcf, 0xaf, 0xb1, 0x1d, 0xb8, 0x71, 0x9a,\n+\t\t0x1d, 0xdb, 0xdb, 0x89, 0x6b, 0xae, 0xda, 0x2d,\n+\t\t0x79, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81,\n+\t\t0xa7, 0x30, 0x81, 0xa4, 0x30, 0x1d, 0x06, 0x03,\n+\t\t0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb1,\n+\t\t0xad, 0xe2, 0x85, 0x5a, 0xcf, 0xcb, 0x28, 0xdb,\n+\t\t0x69, 0xce, 0x23, 0x69, 0xde, 0xd3, 0x26, 0x8e,\n+\t\t0x18, 0x88, 0x39, 0x30, 0x75, 0x06, 0x03, 0x55,\n+\t\t0x1d, 0x23, 0x04, 0x6e, 0x30, 0x6c, 0x80, 0x14,\n+\t\t0xb1, 0xad, 0xe2, 0x85, 0x5a, 0xcf, 0xcb, 0x28,\n+\t\t0xdb, 0x69, 0xce, 0x23, 0x69, 0xde, 0xd3, 0x26,\n+\t\t0x8e, 0x18, 0x88, 0x39, 0xa1, 0x49, 0xa4, 0x47,\n+\t\t0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,\n+\t\t0x55, 0x04, 0x06, 0x13, 0x02, 0x41, 0x55, 0x31,\n+\t\t0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,\n+\t\t0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53,\n+\t\t0x74, 0x61, 0x74, 0x65, 0x31, 0x21, 0x30, 0x1f,\n+\t\t0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x49,\n+\t\t0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20,\n+\t\t0x57, 0x69, 0x64, 0x67, 0x69, 0x74, 0x73, 0x20,\n+\t\t0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x82,\n+\t\t0x09, 0x00, 0x85, 0xb0, 0xbb, 0xa4, 0x8a, 0x7f,\n+\t\t0xb8, 0xca, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d,\n+\t\t0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,\n+\t\t0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\n+\t\t0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03,\n+\t\t0x81, 0x81, 0x00, 0x08, 0x6c, 0x45, 0x24, 0xc7,\n+\t\t0x6b, 0xb1, 0x59, 0xab, 0x0c, 0x52, 0xcc, 0xf2,\n+\t\t0xb0, 0x14, 0xd7, 0x87, 0x9d, 0x7a, 0x64, 0x75,\n+\t\t0xb5, 0x5a, 0x95, 0x66, 0xe4, 0xc5, 0x2b, 0x8e,\n+\t\t0xae, 0x12, 0x66, 0x1f, 0xeb, 0x4f, 0x38, 0xb3,\n+\t\t0x6e, 0x60, 0xd3, 0x92, 0xfd, 0xf7, 0x41, 0x08,\n+\t\t0xb5, 0x25, 0x13, 0xb1, 0x18, 0x7a, 0x24, 0xfb,\n+\t\t0x30, 0x1d, 0xba, 0xed, 0x98, 0xb9, 0x17, 0xec,\n+\t\t0xe7, 0xd7, 0x31, 0x59, 0xdb, 0x95, 0xd3, 0x1d,\n+\t\t0x78, 0xea, 0x50, 0x56, 0x5c, 0xd5, 0x82, 0x5a,\n+\t\t0x2d, 0x5a, 0x5f, 0x33, 0xc4, 0xb6, 0xd8, 0xc9,\n+\t\t0x75, 0x90, 0x96, 0x8c, 0x0f, 0x52, 0x98, 0xb5,\n+\t\t0xcd, 0x98, 0x1f, 0x89, 0x20, 0x5f, 0xf2, 0xa0,\n+\t\t0x1c, 0xa3, 0x1b, 0x96, 0x94, 0xdd, 0xa9, 0xfd,\n+\t\t0x57, 0xe9, 0x70, 0xe8, 0x26, 0x6d, 0x71, 0x99,\n+\t\t0x9b, 0x26, 0x6e, 0x38, 0x50, 0x29, 0x6c, 0x90,\n+\t\t0xa7, 0xbd, 0xd9, 0x16, 0x03, 0x01, 0x01, 0x06,\n+\t\t0x10, 0x00, 0x01, 0x02, 0x01, 0x00, 0x25, 0x48,\n+\t\t0x6c, 0x0a, 0xde, 0x9d, 0x3a, 0x57, 0xe4, 0x2e,\n+\t\t0xb9, 0xfc, 0xb4, 0x46, 0x1f, 0x20, 0x4f, 0x58,\n+\t\t0x4d, 0x12, 0x08, 0xb4, 0x3e, 0x4c, 0xf5, 0xa8,\n+\t\t0xa5, 0x16, 0x40, 0x29, 0x19, 0x04, 0x4d, 0xf9,\n+\t\t0x54, 0x3a, 0x32, 0xd7, 0x79, 0xf2, 0x0e, 0xc1,\n+\t\t0x7b, 0x0c, 0x62, 0x71, 0xbb, 0xb4, 0x8c, 0xe7,\n+\t\t0x84, 0xd5, 0xf8, 0x11, 0x77, 0x7f, 0x87, 0x6c,\n+\t\t0xfc, 0x25, 0xf3, 0x2d, 0x97, 0x3d, 0x1f, 0xf5,\n+\t\t0xfc, 0x64, 0x94, 0x9f, 0xdd, 0x90, 0x82, 0xdd,\n+\t\t0x11, 0x74, 0x74, 0x59, 0xa2, 0x1a, 0x71, 0xb2,\n+\t\t0x55, 0x6d, 0x18, 0xca, 0x85, 0x47, 0x8b, 0x79,\n+\t\t0x73, 0x06, 0x24, 0x38, 0xc3, 0x34, 0x98, 0x84,\n+\t\t0x62, 0x81, 0xd8, 0xad, 0x54, 0xad, 0x13, 0xa5,\n+\t\t0xf4, 0xe4, 0x82, 0x85, 0xd3, 0xe3, 0x9e, 0xeb,\n+\t\t0xb5, 0xf5, 0x95, 0x83, 0x0e, 0xb9, 0x7d, 0xb6,\n+\t\t0xda, 0x0c, 0xf6, 0x14, 0x6a, 0x60, 0x8c, 0x75,\n+\t\t0x56, 0xf0, 0xe9, 0x60, 0xe0, 0x4c, 0xf4, 0x4e,\n+\t\t0x84, 0x8b, 0x4f, 0xf4, 0x2f, 0xde, 0xb7, 0xec,\n+\t\t0x61, 0xd3, 0x77, 0x07, 0x6e, 0x41, 0x57, 0xc9,\n+\t\t0xd9, 0x1d, 0x75, 0xee, 0x42, 0x63, 0xdc, 0x58,\n+\t\t0xad, 0xfc, 0xc7, 0xe1, 0x77, 0x49, 0xb1, 0x58,\n+\t\t0x21, 0x96, 0x00, 0x55, 0x90, 0x6b, 0xf6, 0x2a,\n+\t\t0x5a, 0x19, 0x25, 0x93, 0x59, 0x9d, 0xaf, 0x79,\n+\t\t0x9b, 0x18, 0x5d, 0xf6, 0x5d, 0x64, 0x4b, 0x9a,\n+\t\t0xf4, 0xde, 0xf2, 0x7f, 0xbd, 0x93, 0x7e, 0x45,\n+\t\t0x3e, 0x17, 0xae, 0xbf, 0x52, 0xe1, 0xba, 0x8e,\n+\t\t0x0b, 0xbc, 0x1e, 0x91, 0x9d, 0xf1, 0x4e, 0x0b,\n+\t\t0xab, 0x9e, 0x5c, 0x4c, 0x6f, 0xf7, 0xf3, 0x8d,\n+\t\t0x8c, 0x6d, 0xeb, 0x46, 0x05, 0x36, 0x7e, 0x2f,\n+\t\t0x9c, 0xa1, 0x86, 0x15, 0xe1, 0xe4, 0xb4, 0x20,\n+\t\t0x06, 0x44, 0x7b, 0x3c, 0x8b, 0x13, 0x96, 0xf5,\n+\t\t0x02, 0xb1, 0x4f, 0x3c, 0x2d, 0x4a, 0x16, 0x03,\n+\t\t0x01, 0x00, 0x86, 0x0f, 0x00, 0x00, 0x82, 0x00,\n+\t\t0x80, 0x52, 0xb1, 0x0d, 0xfc, 0x85, 0x34, 0x56,\n+\t\t0xb9, 0xdf, 0xa7, 0x8e, 0xf4, 0xfd, 0x02, 0x46,\n+\t\t0x8a, 0x23, 0xcc, 0x53, 0x3b, 0x0f, 0xa7, 0x61,\n+\t\t0xf3, 0xb5, 0xbf, 0xfe, 0x59, 0x77, 0x10, 0xd6,\n+\t\t0x56, 0x93, 0x19, 0x6b, 0x2c, 0xf1, 0x35, 0x71,\n+\t\t0xe3, 0x36, 0x2f, 0xa0, 0x90, 0x4e, 0x5a, 0xdf,\n+\t\t0x8d, 0x06, 0x88, 0xcf, 0xb1, 0x06, 0x56, 0x8b,\n+\t\t0x74, 0x8f, 0x02, 0x8e, 0x10, 0xd2, 0xab, 0x8d,\n+\t\t0x3f, 0x3e, 0x02, 0xf1, 0x1a, 0x80, 0x6d, 0x0f,\n+\t\t0x9e, 0x77, 0xd8, 0xfa, 0x92, 0xb3, 0x16, 0x40,\n+\t\t0xeb, 0x9e, 0xca, 0xd7, 0xe4, 0x31, 0xcc, 0x63,\n+\t\t0x5f, 0xe2, 0x4c, 0x85, 0x0e, 0xf2, 0xdd, 0xd3,\n+\t\t0xfe, 0x7e, 0xa7, 0x60, 0x1c, 0xb4, 0x00, 0xd8,\n+\t\t0xbe, 0x4b, 0x9b, 0x66, 0x78, 0x0f, 0xfb, 0x3b,\n+\t\t0x52, 0x30, 0x2b, 0x8b, 0xd9, 0xef, 0x82, 0x0a,\n+\t\t0xa4, 0x18, 0x1d, 0xb0, 0xb5, 0xbf, 0x54, 0x97,\n+\t\t0x0c, 0x14, 0x03, 0x01, 0x00, 0x01, 0x01, 0x16,\n+\t\t0x03, 0x01, 0x00, 0x30, 0xa1, 0x74, 0x22, 0xd8,\n+\t\t0x86, 0x6a, 0xbe, 0x53, 0x34, 0x1d, 0xb3, 0x73,\n+\t\t0xff, 0x51, 0xc0, 0xce, 0x8e, 0x7d, 0x9b, 0xab,\n+\t\t0xcb, 0x8b, 0x79, 0xae, 0x04, 0x01, 0xa7, 0xf2,\n+\t\t0x8e, 0x9d, 0xab, 0xa3, 0x73, 0x80, 0x5c, 0xff,\n+\t\t0x96, 0x20, 0xbb, 0x8d, 0xc0, 0x02, 0x66, 0x6c,\n+\t\t0x83, 0x4b, 0x78, 0x20,\n+\t},\n+\t{\n+\t\t0x14, 0x03, 0x01, 0x00, 0x01, 0x01, 0x16, 0x03,\n+\t\t0x01, 0x00, 0x30, 0x29, 0xd4, 0xfd, 0x03, 0x8b,\n+\t\t0x30, 0x20, 0xf7, 0xca, 0xc0, 0x6c, 0x83, 0x5d,\n+\t\t0x73, 0xcb, 0x81, 0x60, 0xe0, 0x9a, 0x09, 0xcb,\n+\t\t0x33, 0x03, 0x80, 0x81, 0x4e, 0x84, 0x47, 0xd5,\n+\t\t0x74, 0x6c, 0x3b, 0xb5, 0xc0, 0x48, 0x0d, 0x52,\n+\t\t0xdd, 0xbe, 0xc2, 0x06, 0xf5, 0x79, 0x2b, 0x3e,\n+\t\t0x99, 0x56, 0x94, 0x17, 0x03, 0x01, 0x00, 0x20,\n+\t\t0x26, 0x46, 0x90, 0x9d, 0xef, 0x59, 0x00, 0xb6,\n+\t\t0x70, 0xe8, 0x1e, 0x1a, 0x80, 0x8b, 0x04, 0xb2,\n+\t\t0xfc, 0x51, 0xf8, 0x93, 0xbe, 0x00, 0x28, 0xba,\n+\t\t0xb8, 0xdc, 0x51, 0x7e, 0x92, 0x80, 0xfa, 0xf2,\n+\t\t0x17, 0x03, 0x01, 0x00, 0xe0, 0xb8, 0x2e, 0xc4,\n+\t\t0x6b, 0x3f, 0xda, 0x39, 0x87, 0x7f, 0x03, 0x43,\n+\t\t0x28, 0xdd, 0xb9, 0xf9, 0x9e, 0x16, 0xf5, 0xce,\n+\t\t0x3f, 0x7e, 0x6a, 0x7b, 0xb3, 0x60, 0x14, 0xe1,\n+\t\t0xea, 0x54, 0xc5, 0xe6, 0x05, 0x0a, 0x6c, 0xe0,\n+\t\t0xef, 0x58, 0x29, 0x8a, 0x77, 0x64, 0x77, 0x5d,\n+\t\t0x9c, 0xe2, 0xe0, 0x3c, 0x6d, 0x87, 0x82, 0xbe,\n+\t\t0x47, 0x63, 0xd4, 0xfd, 0x0c, 0x25, 0xc4, 0xb1,\n+\t\t0xfe, 0x29, 0x6f, 0x84, 0xfb, 0xab, 0x6e, 0xa7,\n+\t\t0xf9, 0x22, 0x89, 0x97, 0x5b, 0x91, 0x0a, 0x07,\n+\t\t0xe0, 0xef, 0x3d, 0x67, 0xee, 0x87, 0xa8, 0x33,\n+\t\t0x02, 0x64, 0x33, 0xca, 0x15, 0x10, 0xb9, 0x57,\n+\t\t0xd8, 0xe5, 0x1a, 0x4b, 0xe3, 0x45, 0xc1, 0x62,\n+\t\t0x85, 0x50, 0xf1, 0x79, 0x54, 0xe1, 0x2e, 0x25,\n+\t\t0x01, 0x3c, 0xdb, 0x2d, 0x39, 0x14, 0x2f, 0x9b,\n+\t\t0xd0, 0x1d, 0xc1, 0xac, 0x73, 0x7d, 0xa4, 0xed,\n+\t\t0x89, 0x98, 0xb1, 0xae, 0x8a, 0x9e, 0xc8, 0xa7,\n+\t\t0xfe, 0x55, 0x27, 0xb5, 0xb5, 0xa2, 0xec, 0x7e,\n+\t\t0xe3, 0x6b, 0x45, 0x19, 0xfa, 0x20, 0x1c, 0x33,\n+\t\t0x83, 0x22, 0x33, 0x97, 0xd2, 0x5a, 0xc4, 0xf8,\n+\t\t0x9a, 0x03, 0x13, 0x85, 0xf2, 0x2b, 0x04, 0x59,\n+\t\t0x27, 0xd7, 0x0b, 0x42, 0x47, 0x9b, 0x7d, 0x4d,\n+\t\t0xb2, 0x1a, 0x85, 0x7f, 0x97, 0xc2, 0xf2, 0x10,\n+\t\t0xf0, 0xfa, 0x4e, 0x4b, 0x62, 0x43, 0x3a, 0x09,\n+\t\t0x2e, 0xcd, 0x8f, 0xa8, 0xb6, 0x0b, 0x5f, 0x34,\n+\t\t0xd7, 0x3b, 0xba, 0xd9, 0xe5, 0x01, 0x2d, 0x35,\n+\t\t0xae, 0xc5, 0x4c, 0xab, 0x40, 0x64, 0xc2, 0xc9,\n+\t\t0x8c, 0x69, 0x44, 0xf4, 0xb8, 0xb5, 0x3a, 0x05,\n+\t\t0x3c, 0x29, 0x19, 0xb4, 0x09, 0x17, 0x03, 0x01,\n+\t\t0x00, 0x20, 0xc8, 0xc5, 0xb7, 0xe3, 0xd2, 0x3e,\n+\t\t0x27, 0xb5, 0x71, 0x8f, 0x52, 0x0b, 0xce, 0x17,\n+\t\t0x64, 0x86, 0xa4, 0x34, 0x16, 0x1b, 0x61, 0x64,\n+\t\t0x7c, 0xb3, 0xf2, 0xe5, 0x3e, 0xfd, 0xdd, 0xfb,\n+\t\t0x40, 0x78, 0x17, 0x03, 0x01, 0x00, 0x50, 0x8e,\n+\t\t0x79, 0xf0, 0x8e, 0x76, 0x5d, 0x34, 0x09, 0xdc,\n+\t\t0xec, 0x6d, 0xc3, 0x43, 0x1d, 0xcb, 0x2d, 0xaa,\n+\t\t0x08, 0x7a, 0x51, 0x94, 0x4e, 0xc5, 0x26, 0xe4,\n+\t\t0x0b, 0x8e, 0x8f, 0x51, 0xf2, 0x9f, 0xeb, 0xc3,\n+\t\t0x18, 0x43, 0x95, 0x15, 0xfc, 0x59, 0x18, 0x25,\n+\t\t0x47, 0xb6, 0x4a, 0x6e, 0xa3, 0xa4, 0x3b, 0xa3,\n+\t\t0x47, 0x34, 0x74, 0x6b, 0xc5, 0x3d, 0x41, 0x14,\n+\t\t0x64, 0xd5, 0x69, 0x5f, 0x77, 0xf3, 0x7c, 0x41,\n+\t\t0xc6, 0xed, 0x2e, 0xcf, 0xff, 0x40, 0xf2, 0xce,\n+\t\t0xbb, 0xa7, 0x4e, 0x73, 0x88, 0x98, 0x10,\n+\t},\n+\t{\n+\t\t0x15, 0x03, 0x01, 0x00, 0x20, 0x1a, 0xbc, 0x70,\n+\t\t0x24, 0xf8, 0xfb, 0xf2, 0x4a, 0xf9, 0x44, 0x1e,\n+\t\t0x58, 0xf8, 0xaa, 0x41, 0x24, 0xe8, 0x80, 0x33,\n+\t\t0x45, 0x18, 0xa1, 0x5d, 0xee, 0x16, 0x80, 0xae,\n+\t\t0x40, 0x41, 0x8e, 0x41, 0x9b,\n+\t},\n+}\n```

## コアとなるコードの解説

`src/pkg/crypto/tls/conn.go` の `Read` メソッドの変更がこのコミットの核心です。

変更前は、`Conn.Read` は `c.input` が `nil` でない限り、またはエラーが発生しない限り、`c.readRecord` を呼び出してレコードを読み込もうとする単一のループを持っていました。しかし、空のレコードが読み込まれた場合、`c.input.Read(b)` は `n=0, err=nil` を返し、これがそのまま呼び出し元に伝播していました。

変更後は、以下の点が改善されました。

1.  **`maxConsecutiveEmptyRecords`**: `const maxConsecutiveEmptyRecords = 100` が定義され、連続して無視できる空のレコードの最大数を100に制限しています。これにより、悪意のあるピアからの無限の空レコード送信によるサービス拒否攻撃を防ぎます。
2.  **外側のループ**: `for emptyRecordCount := 0; emptyRecordCount <= maxConsecutiveEmptyRecords; emptyRecordCount++` という新しいループが追加されました。このループは、`maxConsecutiveEmptyRecords` の回数だけ、空のレコードを読み飛ばすことを試みます。
3.  **条件 `if n != 0 || err != nil`**:
    *   `n != 0`: 実際にデータが読み取れた場合。この場合、読み取ったデータとエラー(もしあれば)をすぐに呼び出し元に返します。
    *   `err != nil`: データは読み取れなかったが、エラーが発生した場合。この場合も、エラーをすぐに呼び出し元に返します。
    *   この条件が `false` の場合、つまり `n == 0 && err == nil` の場合、これは空のレコードが読み取られたことを意味します。このとき、ループは継続され、`emptyRecordCount` がインクリメントされ、次のレコードの読み込みが試みられます。
4.  **`io.ErrNoProgress`**: `maxConsecutiveEmptyRecords` 回の試行後も有効なデータが読み取れなかった場合、`return 0, io.ErrNoProgress` が返されます。これは、Goの `io` パッケージで定義されているエラーで、読み取り操作が進行しなかったことを示します。これにより、呼び出し元は、単にデータがなかっただけでなく、一定の試行回数を超えてもデータが読み取れなかったという具体的な状況を把握できます。

`src/pkg/crypto/tls/handshake_client_test.go` に追加された `TestEmptyRecords` は、この修正が正しく機能することを検証するためのものです。このテストは、`emptyRecordScript` という事前に定義されたバイトシーケンスを使用して、サーバーが空のTLSレコードを送信するシナリオをシミュレートします。クライアントがこの空レコードを適切に無視し、その後に続く実際のアプリケーションデータを正しく読み取れることを確認します。

## 関連リンク

*   Go CL: [https://golang.org/cl/8852044](https://golang.org/cl/8852044)
*   Go Issue 5309: [https://go.dev/issue/5309](https://go.dev/issue/5309)

## 参考にした情報源リンク

*   Web search results for "OpenSSL empty TLS records CBC IV":
    *   [https://stackoverflow.com/questions/10674880/what-is-the-purpose-of-initialization-vector-in-cbc-mode](https://stackoverflow.com/questions/10674880/what-is-the-purpose-of-initialization-vector-in-cbc-mode)
    *   [https://stackoverflow.com/questions/20087793/what-is-the-purpose-of-initialization-vector-in-cbc-mode-in-tls](https://stackoverflow.com/questions/20087793/what-is-the-purpose-of-initialization-vector-in-cbc-mode-in-tls)
    *   [https://security.stackexchange.com/questions/20087793/what-is-the-purpose-of-initialization-vector-in-cbc-mode-in-tls](https://security.stackexchange.com/questions/20087793/what-is-the-purpose-of-initialization-vector-in-cbc-mode-in-tls)
    *   [https://github.com/openssl/openssl/issues/1000](https://github.com/openssl/openssl/issues/1000)