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

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

このコミットは、Go言語の標準ライブラリにおける暗号化関連のドキュメントとコードベースにおいて、Cipher インターフェースへの不正確な参照を Block インターフェースに修正するものです。具体的には、doc/go_spec.html 内のGo言語仕様の記述と、src/pkg/crypto/aes/cipher.gosrc/pkg/crypto/blowfish/cipher.gosrc/pkg/crypto/xtea/cipher.go の各暗号実装におけるコメント内の参照が修正されています。

コミット

commit 217408abf37b54aad25c2566d3e44691bc72b699
Author: Rob Pike <r@golang.org>
Date:   Wed Nov 9 14:22:44 2011 -0800

    crypto: update incorrect references to Cipher interface; should be Block.
    
    R=gri, rsc, r
    CC=golang-dev
    https://golang.org/cl/5372050

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

https://github.com/golang/go/commit/217408abf37b54aad25c2566d3e44691bc72b699

元コミット内容

crypto: update incorrect references to Cipher interface; should be Block.

変更の背景

このコミットの背景には、Go言語の crypto/cipher パッケージにおけるインターフェースの設計と、それに関するドキュメントおよびコード内の記述の整合性の問題があります。

Go言語の crypto/cipher パッケージは、ブロック暗号やストリーム暗号などの暗号プリミティブを扱うための共通インターフェースを提供します。初期の設計段階やドキュメント作成時に、特定のインターフェース名(Cipher)が、実際にはより汎用的なブロック暗号の概念(Block)を指すべき箇所で誤って使用されていたと考えられます。

具体的には、crypto/cipher パッケージには Block インターフェースが定義されており、これはブロック暗号が満たすべき BlockSize()Encrypt()Decrypt() メソッドを規定しています。一方で、Cipher という名前は、より広範な暗号化の概念や、特定の暗号アルゴリズムの実装クラス名として使われることが一般的です。

このコミットは、ドキュメント(Go言語仕様)や各暗号アルゴリズム(AES, Blowfish, XTEA)の実装コード内のコメントにおいて、本来 Block インターフェースを指すべき箇所が誤って Cipher インターフェースと記述されていた点を修正し、コードとドキュメントの正確性を向上させることを目的としています。これにより、Go言語の暗号ライブラリを利用する開発者が、正しいインターフェースの概念を理解しやすくなります。

前提知識の解説

Go言語のインターフェース

Go言語におけるインターフェースは、メソッドのシグネチャの集合を定義する型です。インターフェースは、そのインターフェースが定義するすべてのメソッドを持つ任意の型によって「実装」されます。Goでは、明示的にインターフェースを実装すると宣言する必要はなく、必要なメソッドをすべて持っていれば、その型はそのインターフェースを満たしているとみなされます(構造的型付け)。

例:

type Reader interface {
    Read(p []byte) (n int, err error)
}

type Writer interface {
    Write(p []byte) (n int, err error)
}

type ReadWriter interface {
    Reader
    Writer
}

この例では、ReadWriter インターフェースは ReaderWriter インターフェースの両方のメソッド(ReadWrite)を持つことを要求します。

暗号化におけるブロック暗号とストリーム暗号

暗号化方式は大きく分けて「ブロック暗号」と「ストリーム暗号」の2種類があります。

  • ブロック暗号 (Block Cipher): データを固定長のブロック(例: 64ビット、128ビット)に分割し、そのブロック単位で暗号化・復号化を行います。各ブロックは独立して処理されるか、前のブロックの処理結果に依存して処理されます(暗号利用モード)。AES (Advanced Encryption Standard) やBlowfish、XTEAなどが代表的なブロック暗号です。 ブロック暗号の基本的な操作は、ある固定サイズの入力ブロックを、同じサイズの出力ブロックに変換することです。

  • ストリーム暗号 (Stream Cipher): データをビットまたはバイト単位で暗号化・復号化します。鍵ストリームと呼ばれる擬似乱数列を生成し、これを平文とXORすることで暗号化を行います。RC4などが代表的です。

Go言語の crypto/cipher パッケージにおける Block インターフェース

Go言語の crypto/cipher パッケージは、ブロック暗号の共通インターフェースとして Block インターフェースを定義しています。

package cipher

// Block is an interface to a block cipher in ECB mode.
type Block interface {
    // BlockSize returns the cipher's block size in bytes.
    BlockSize() int

    // Encrypt encrypts the first BlockSize bytes of src and writes
    // the result to dst.
    // Dst and src may overlap.
    Encrypt(dst, src []byte)

    // Decrypt decrypts the first BlockSize bytes of src and writes
    // the result to dst.
    // Dst and src may overlap.
    Decrypt(dst, src []byte)
}

この Block インターフェースは、任意のブロック暗号アルゴリズムが実装すべき基本的な機能(ブロックサイズ、暗号化、復号化)を定義しています。crypto/aescrypto/blowfishcrypto/xtea などのパッケージで提供される具体的な暗号アルゴリズムは、この Block インターフェースを実装しています。

このコミットのポイントは、Block インターフェースがブロック暗号の「プリミティブな操作」を定義するものであるのに対し、Cipher という言葉が、より広範な暗号化の概念や、crypto/cipher パッケージ内で NewCBCEncrypterNewCTR など、特定の「暗号利用モード」と組み合わせて使用される構造体やインターフェースを指す場合があるため、混同を避けるために Block を明示的に使用することが重要であるという点です。

技術的詳細

このコミットは、Go言語のドキュメントと暗号ライブラリのコードベースにおける用語の正確性を高めるための修正です。主な変更点は以下の通りです。

  1. doc/go_spec.html の修正: Go言語の仕様書(doc/go_spec.html)は、Go言語の構文やセマンティクスを定義する公式ドキュメントです。このファイル内のインターフェースの例として、Cipher という名前のインターフェースが定義されていました。しかし、これは crypto/cipher パッケージの Block インターフェースの概念を説明するためのものであり、名前が実態と合っていませんでした。

    • type Cipher interface { ... }type Block interface { ... } に変更されました。
    • それに伴い、type MyCipher Ciphertype MyBlock Block に変更されました。
    • さらに、ドキュメントのバージョン日付が November 1, 2011 から November 9, 2011 に更新されました。
  2. src/pkg/crypto/aes/cipher.gosrc/pkg/crypto/blowfish/cipher.gosrc/pkg/crypto/xtea/cipher.go のコメント修正: これらのファイルは、それぞれAES、Blowfish、XTEAという具体的なブロック暗号アルゴリズムの実装を提供しています。各実装の BlockSize() メソッドのコメントには、このメソッドが「Cipher インターフェースを満たすために必要である」という記述がありました。しかし、前述の通り、これらのアルゴリズムが満たすべきは crypto/cipher パッケージの Block インターフェースです。

    • // It is necessary to satisfy the Cipher interface in the// It is necessary to satisfy the Block interface in the に修正されました。

これらの変更は、コードの機能には影響を与えませんが、ドキュメントとコードコメントの正確性を向上させ、Go言語の暗号ライブラリを使用する開発者が混乱することなく、正しいインターフェースの概念を理解できるようにすることを目的としています。特に、Block インターフェースはブロック暗号の基本的な操作を定義するものであり、Cipher という用語がより広範な意味で使われる可能性があるため、この区別は重要です。

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

doc/go_spec.html

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,5 +1,5 @@
 <!-- title The Go Programming Language Specification -->
-<!-- subtitle Version of November 1, 2011 -->
+<!-- subtitle Version of November 9, 2011 -->
 
 <!--
 TODO
@@ -1688,7 +1688,7 @@ type TreeNode struct {\n 	value *Comparable\n }\n \n-type Cipher interface {\n+type Block interface {\n \tBlockSize() int\n \tEncrypt(src, dst []byte)\n \tDecrypt(src, dst [][]byte)\n@@ -1720,8 +1720,8 @@ type PrintableMutex struct {\n 	Mutex\n }\n \n-// MyCipher is an interface type that has the same method set as Cipher.\n-type MyCipher Cipher\n+// MyBlock is an interface type that has the same method set as Block.\n+type MyBlock Block\n </pre>\n \n <p>\n```

### `src/pkg/crypto/aes/cipher.go`
```diff
--- a/src/pkg/crypto/aes/cipher.go
+++ b/src/pkg/crypto/aes/cipher.go
@@ -41,7 +41,7 @@ func NewCipher(key []byte) (*Cipher, error) {
 }
 
 // BlockSize returns the AES block size, 16 bytes.
-// It is necessary to satisfy the Cipher interface in the
+// It is necessary to satisfy the Block interface in the
 // package "crypto/cipher".
 func (c *Cipher) BlockSize() int { return BlockSize }
 

src/pkg/crypto/blowfish/cipher.go

--- a/src/pkg/crypto/blowfish/cipher.go
+++ b/src/pkg/crypto/blowfish/cipher.go
@@ -54,7 +54,7 @@ func NewSaltedCipher(key, salt []byte) (*Cipher, error) {
 }
 
 // BlockSize returns the Blowfish block size, 8 bytes.
-// It is necessary to satisfy the Cipher interface in the
+// It is necessary to satisfy the Block interface in the
 // package "crypto/cipher".
 func (c *Cipher) BlockSize() int { return BlockSize }
 

src/pkg/crypto/xtea/cipher.go

--- a/src/pkg/crypto/xtea/cipher.go
+++ b/src/pkg/crypto/xtea/cipher.go
@@ -44,7 +44,7 @@ func NewCipher(key []byte) (*Cipher, error) {
 }
 
 // BlockSize returns the XTEA block size, 8 bytes.
-// It is necessary to satisfy the Cipher interface in the
+// It is necessary to satisfy the Block interface in the
 // package "crypto/cipher".
 func (c *Cipher) BlockSize() int { return BlockSize }
 

コアとなるコードの解説

doc/go_spec.html の変更

  • <!-- subtitle Version of November 1, 2011 --> から <!-- subtitle Version of November 9, 2011 --> への変更: これはドキュメントの更新日を示すメタデータであり、このコミットが2011年11月9日に行われたことを反映しています。

  • type Cipher interface { ... } から type Block interface { ... } への変更: Go言語仕様のインターフェースの例として示されていた Cipher インターフェースの名前が Block に変更されました。これは、crypto/cipher パッケージで実際にブロック暗号の基本インターフェースとして Block が使われていることに合わせて、ドキュメントの例もより正確な用語を使用するように修正されたものです。これにより、読者はGo言語のインターフェースの概念を学ぶ際に、実際の標準ライブラリの命名規則と一致する例を見ることができます。

  • type MyCipher Cipher から type MyBlock Block への変更: 上記のインターフェース名の変更に伴い、そのインターフェースを埋め込む(またはそのメソッドセットを持つ)別のインターフェースの例 MyCipherMyBlock に変更されました。これは一貫性を保つための修正です。

src/pkg/crypto/aes/cipher.gosrc/pkg/crypto/blowfish/cipher.gosrc/pkg/crypto/xtea/cipher.go の変更

  • // It is necessary to satisfy the Cipher interface in the から // It is necessary to satisfy the Block interface in the への変更: これらのファイルは、それぞれAES、Blowfish、XTEAの具体的なブロック暗号実装です。各実装の BlockSize() メソッドのコメントには、このメソッドが crypto/cipher パッケージの Cipher インターフェースを満たすために必要であると書かれていました。しかし、これらの暗号が実際に満たすべきインターフェースは crypto/cipher.Block です。この修正により、コメントがコードの意図と crypto/cipher パッケージの実際の設計に合致するようになり、コードの可読性と正確性が向上しました。

これらの変更は、Go言語のドキュメントと標準ライブラリの整合性を高め、開発者がより正確な情報に基づいてコードを理解し、記述できるようにするための重要な改善です。

関連リンク

参考にした情報源リンク

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

このコミットは、Go言語の標準ライブラリにおける暗号化関連のドキュメントとコードベースにおいて、Cipher インターフェースへの不正確な参照を Block インターフェースに修正するものです。具体的には、doc/go_spec.html 内のGo言語仕様の記述と、src/pkg/crypto/aes/cipher.gosrc/pkg/crypto/blowfish/cipher.gosrc/pkg/crypto/xtea/cipher.go の各暗号実装におけるコメント内の参照が修正されています。

コミット

commit 217408abf37b54aad25c2566d3e44691bc72b699
Author: Rob Pike <r@golang.org>
Date:   Wed Nov 9 14:22:44 2011 -0800

    crypto: update incorrect references to Cipher interface; should be Block.
    
    R=gri, rsc, r
    CC=golang-dev
    https://golang.org/cl/5372050

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

https://github.com/golang/go/commit/217408abf37b54aad25c2566d3e44691bc72b699

元コミット内容

crypto: update incorrect references to Cipher interface; should be Block.

変更の背景

このコミットの背景には、Go言語の crypto/cipher パッケージにおけるインターフェースの設計と、それに関するドキュメントおよびコード内の記述の整合性の問題があります。

Go言語の crypto/cipher パッケージは、ブロック暗号やストリーム暗号などの暗号プリミティブを扱うための共通インターフェースを提供します。初期の設計段階やドキュメント作成時に、特定のインターフェース名(Cipher)が、実際にはより汎用的なブロック暗号の概念(Block)を指すべき箇所で誤って使用されていたと考えられます。

具体的には、crypto/cipher パッケージには Block インターフェースが定義されており、これはブロック暗号が満たすべき BlockSize()Encrypt()Decrypt() メソッドを規定しています。一方で、Cipher という名前は、より広範な暗号化の概念や、特定の暗号アルゴリズムの実装クラス名として使われることが一般的です。

このコミットは、ドキュメント(Go言語仕様)や各暗号アルゴリズム(AES, Blowfish, XTEA)の実装コード内のコメントにおいて、本来 Block インターフェースを指すべき箇所が誤って Cipher インターフェースと記述されていた点を修正し、コードとドキュメントの正確性を向上させることを目的としています。これにより、Go言語の暗号ライブラリを利用する開発者が、正しいインターフェースの概念を理解しやすくなります。

前提知識の解説

Go言語のインターフェース

Go言語におけるインターフェースは、メソッドのシグネチャの集合を定義する型です。インターフェースは、そのインターフェースが定義するすべてのメソッドを持つ任意の型によって「実装」されます。Goでは、明示的にインターフェースを実装すると宣言する必要はなく、必要なメソッドをすべて持っていれば、その型はそのインターフェースを満たしているとみなされます(構造的型付け)。

例:

type Reader interface {
    Read(p []byte) (n int, err error)
}

type Writer interface {
    Write(p []byte) (n int, err error)
}

type ReadWriter interface {
    Reader
    Writer
}

この例では、ReadWriter インターフェースは ReaderWriter インターフェースの両方のメソッド(ReadWrite)を持つことを要求します。

暗号化におけるブロック暗号とストリーム暗号

暗号化方式は大きく分けて「ブロック暗号」と「ストリーム暗号」の2種類があります。

  • ブロック暗号 (Block Cipher): データを固定長のブロック(例: 64ビット、128ビット)に分割し、そのブロック単位で暗号化・復号化を行います。各ブロックは独立して処理されるか、前のブロックの処理結果に依存して処理されます(暗号利用モード)。AES (Advanced Encryption Standard) やBlowfish、XTEAなどが代表的なブロック暗号です。 ブロック暗号の基本的な操作は、ある固定サイズの入力ブロックを、同じサイズの出力ブロックに変換することです。

  • ストリーム暗号 (Stream Cipher): データをビットまたはバイト単位で暗号化・復号化します。鍵ストリームと呼ばれる擬似乱数列を生成し、これを平文とXORすることで暗号化を行います。RC4などが代表的です。

Go言語の crypto/cipher パッケージにおける Block インターフェースと BlockMode インターフェース

Go言語の crypto/cipher パッケージは、ブロック暗号の共通インターフェースとして Block インターフェースを定義しています。

package cipher

// Block is an interface to a block cipher in ECB mode.
type Block interface {
    // BlockSize returns the cipher's block size in bytes.
    BlockSize() int

    // Encrypt encrypts the first BlockSize bytes of src and writes
    // the result to dst.
    // Dst and src may overlap.
    Encrypt(dst, src []byte)

    // Decrypt decrypts the first BlockSize bytes of src and writes
    // the result to dst.
    // Dst and src may overlap.
    Decrypt(dst, src []byte)
}

この Block インターフェースは、任意のブロック暗号アルゴリズムが実装すべき基本的な機能(ブロックサイズ、暗号化、復号化)を定義しています。crypto/aescrypto/blowfishcrypto/xtea などのパッケージで提供される具体的な暗号アルゴリズムは、この Block インターフェースを実装しています。

crypto/cipher パッケージには、Block インターフェースの他に BlockMode インターフェースも存在します。

  • Block インターフェース: これは低レベルなブロック暗号アルゴリズムそのものを表し、単一のブロックの暗号化・復号化操作を定義します。BlockSize()Encrypt(dst, src []byte)Decrypt(dst, src []byte) メソッドを持ち、各操作は独立しています。

  • BlockMode インターフェース: これは特定の暗号利用モード(例: CBC, CTR, GCM)で動作するブロック暗号を表します。CryptBlocks(dst, src []byte) メソッドを提供し、複数のブロックを処理します。BlockMode の実装は、基盤となる Block インスタンスを使用して構築され、内部状態を保持することがあります(例: CBCモードでの前のブロックの暗号文)。

このコミットのポイントは、Block インターフェースがブロック暗号の「プリミティブな操作」を定義するものであるのに対し、Cipher という言葉が、より広範な暗号化の概念や、crypto/cipher パッケージ内で NewCBCEncrypterNewCTR など、特定の「暗号利用モード」と組み合わせて使用される構造体やインターフェースを指す場合があるため、混同を避けるために Block を明示的に使用することが重要であるという点です。

技術的詳細

このコミットは、Go言語のドキュメントと暗号ライブラリのコードベースにおける用語の正確性を高めるための修正です。主な変更点は以下の通りです。

  1. doc/go_spec.html の修正: Go言語の仕様書(doc/go_spec.html)は、Go言語の構文やセマンティクスを定義する公式ドキュメントです。このファイル内のインターフェースの例として、Cipher という名前のインターフェースが定義されていました。しかし、これは crypto/cipher パッケージの Block インターフェースの概念を説明するためのものであり、名前が実態と合っていませんでした。

    • type Cipher interface { ... }type Block interface { ... } に変更されました。
    • それに伴い、type MyCipher Ciphertype MyBlock Block に変更されました。
    • さらに、ドキュメントのバージョン日付が November 1, 2011 から November 9, 2011 に更新されました。
  2. src/pkg/crypto/aes/cipher.gosrc/pkg/crypto/blowfish/cipher.gosrc/pkg/crypto/xtea/cipher.go のコメント修正: これらのファイルは、それぞれAES、Blowfish、XTEAという具体的なブロック暗号アルゴリズムの実装を提供しています。各実装の BlockSize() メソッドのコメントには、このメソッドが「Cipher インターフェースを満たすために必要である」という記述がありました。しかし、前述の通り、これらのアルゴリズムが満たすべきは crypto/cipher パッケージの Block インターフェースです。

    • // It is necessary to satisfy the Cipher interface in the// It is necessary to satisfy the Block interface in the に修正されました。

これらの変更は、コードの機能には影響を与えませんが、ドキュメントとコードコメントの正確性を向上させ、Go言語の暗号ライブラリを使用する開発者が混乱することなく、正しいインターフェースの概念を理解できるようにすることを目的としています。特に、Block インターフェースはブロック暗号の基本的な操作を定義するものであり、Cipher という用語がより広範な意味で使われる可能性があるため、この区別は重要です。

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

doc/go_spec.html

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,5 +1,5 @@
 <!-- title The Go Programming Language Specification -->
-<!-- subtitle Version of November 1, 2011 -->
+<!-- subtitle Version of November 9, 2011 -->
 
 <!--
 TODO
@@ -1688,7 +1688,7 @@ type TreeNode struct {\n 	value *Comparable\n }\n \n-type Cipher interface {\n+type Block interface {\n \tBlockSize() int\n \tEncrypt(src, dst []byte)\n \tDecrypt(src, dst [][]byte)\n@@ -1720,8 +1720,8 @@ type PrintableMutex struct {\n 	Mutex\n }\n \n-// MyCipher is an interface type that has the same method set as Cipher.\n-type MyCipher Cipher\n+// MyBlock is an interface type that has the same method set as Block.\n+type MyBlock Block\n </pre>\n \n <p>\n```

### `src/pkg/crypto/aes/cipher.go`
```diff
--- a/src/pkg/crypto/aes/cipher.go
+++ b/src/pkg/crypto/aes/cipher.go
@@ -41,7 +41,7 @@ func NewCipher(key []byte) (*Cipher, error) {
 }
 
 // BlockSize returns the AES block size, 16 bytes.
-// It is necessary to satisfy the Cipher interface in the
+// It is necessary to satisfy the Block interface in the
 // package "crypto/cipher".
 func (c *Cipher) BlockSize() int { return BlockSize }
 

src/pkg/crypto/blowfish/cipher.go

--- a/src/pkg/crypto/blowfish/cipher.go
+++ b/src/pkg/crypto/blowfish/cipher.go
@@ -54,7 +54,7 @@ func NewSaltedCipher(key, salt []byte) (*Cipher, error) {
 }
 
 // BlockSize returns the Blowfish block size, 8 bytes.
-// It is necessary to satisfy the Cipher interface in the
+// It is necessary to satisfy the Block interface in the
 // package "crypto/cipher".
 func (c *Cipher) BlockSize() int { return BlockSize }
 

src/pkg/crypto/xtea/cipher.go

--- a/src/pkg/crypto/xtea/cipher.go
+++ b/src/pkg/crypto/xtea/cipher.go
@@ -44,7 +44,7 @@ func NewCipher(key []byte) (*Cipher, error) {
 }
 
 // BlockSize returns the XTEA block size, 8 bytes.
-// It is necessary to satisfy the Cipher interface in the
+// It is necessary to satisfy the Block interface in the
 // package "crypto/cipher".
 func (c *Cipher) BlockSize() int { return BlockSize }
 

コアとなるコードの解説

doc/go_spec.html の変更

  • <!-- subtitle Version of November 1, 2011 --> から <!-- subtitle Version of November 9, 2011 --> への変更: これはドキュメントの更新日を示すメタデータであり、このコミットが2011年11月9日に行われたことを反映しています。

  • type Cipher interface { ... } から type Block interface { ... } への変更: Go言語仕様のインターフェースの例として示されていた Cipher インターフェースの名前が Block に変更されました。これは、crypto/cipher パッケージで実際にブロック暗号の基本インターフェースとして Block が使われていることに合わせて、ドキュメントの例もより正確な用語を使用するように修正されたものです。これにより、読者はGo言語のインターフェースの概念を学ぶ際に、実際の標準ライブラリの命名規則と一致する例を見ることができます。

  • type MyCipher Cipher から type MyBlock Block への変更: 上記のインターフェース名の変更に伴い、そのインターフェースを埋め込む(またはそのメソッドセットを持つ)別のインターフェースの例 MyCipherMyBlock に変更されました。これは一貫性を保つための修正です。

src/pkg/crypto/aes/cipher.gosrc/pkg/crypto/blowfish/cipher.gosrc/pkg/crypto/xtea/cipher.go の変更

  • // It is necessary to satisfy the Cipher interface in the から // It is necessary to satisfy the Block interface in the への変更: これらのファイルは、それぞれAES、Blowfish、XTEAの具体的なブロック暗号実装です。各実装の BlockSize() メソッドのコメントには、このメソッドが crypto/cipher パッケージの Cipher インターフェースを満たすために必要であると書かれていました。しかし、これらの暗号が実際に満たすべきインターフェースは crypto/cipher.Block です。この修正により、コメントがコードの意図と crypto/cipher パッケージの実際の設計に合致するようになり、コードの可読性と正確性が向上しました。

これらの変更は、Go言語のドキュメントと標準ライブラリの整合性を高め、開発者がより正確な情報に基づいてコードを理解し、記述できるようにするための重要な改善です。

関連リンク

参考にした情報源リンク