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

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

このコミットは、Go言語の標準ライブラリ crypto/sha256 パッケージにおいて、SHA256ハッシュ関数の Size() および BlockSize() メソッドに対するテストを追加するものです。これにより、これらのメソッドが期待通りの値を返すことを保証し、ライブラリの堅牢性を高めます。

コミット

commit e3040e2bbaeb064cd728d4bf78006a9f85036f63
Author: Shawn Smith <shawn.p.smith@gmail.com>
Date:   Wed Jan 1 07:46:00 2014 +1100

    crypto/sha256: add tests for Size() and BlockSize()
    
    R=golang-codereviews, dave
    CC=golang-codereviews
    https://golang.org/cl/46470043

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

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

元コミット内容

crypto/sha256: add tests for Size() and BlockSize()

このコミットは、crypto/sha256 パッケージに Size()BlockSize() メソッドのテストを追加します。

変更の背景

ソフトウェア開発において、テストはコードの品質と信頼性を保証するために不可欠です。特に暗号化ライブラリのようなセキュリティに直結するコンポーネントでは、その正確性が極めて重要となります。Go言語の crypto/sha256 パッケージは、セキュアハッシュアルゴリズムSHA-256の実装を提供しており、多くのアプリケーションでデータの完全性検証やデジタル署名などに利用されています。

hash.Hash インターフェースを実装するハッシュ関数は、Size() メソッドでハッシュ値のバイト長を、BlockSize() メソッドでハッシュ計算のブロックサイズを公開します。これらの値は、ハッシュ関数の特性を正確に反映するものであり、ライブラリの利用者にとって重要な情報です。

このコミットが行われた背景には、おそらく Size()BlockSize() メソッドが期待通りの値を返すことを明示的にテストすることで、将来的な変更やリファクタリングがあった場合でも、これらの基本的な特性が損なわれないようにするという意図があったと考えられます。テストを追加することで、コードの意図が明確になり、予期せぬバグの混入を防ぐことができます。

前提知識の解説

SHA-256 (Secure Hash Algorithm 256-bit)

SHA-256は、アメリカ国家安全保障局(NSA)によって設計された暗号学的ハッシュ関数の一つです。入力された任意の長さのデータから、256ビット(32バイト)の固定長のハッシュ値(メッセージダイジェスト)を生成します。主な特徴は以下の通りです。

  • 一方向性: ハッシュ値から元のデータを復元することは計算上困難です。
  • 衝突耐性: 異なる入力から同じハッシュ値が生成されること(衝突)は計算上困難です。
  • 雪崩効果: 入力データのごくわずかな変更でも、ハッシュ値が大きく変化します。

これらの特性により、SHA-256はデータの改ざん検出、パスワードの保存、デジタル署名、ブロックチェーン技術など、幅広いセキュリティ用途で利用されています。

Go言語の hash パッケージと hash.Hash インターフェース

Go言語の標準ライブラリには、暗号学的ハッシュ関数を扱うための hash パッケージが提供されています。このパッケージは、ハッシュ関数の共通インターフェースである hash.Hash を定義しています。

hash.Hash インターフェースは、以下の主要なメソッドを含んでいます。

  • Write(p []byte) (n int, err error): 入力データをハッシュ関数に書き込みます。
  • Sum(b []byte) []byte: 現在のハッシュ値を計算し、b に追加して返します。
  • Reset(): ハッシュ関数を初期状態に戻します。
  • Size() int: ハッシュ値のバイト長を返します。
  • BlockSize() int: ハッシュ計算のブロックサイズ(内部処理単位)を返します。

crypto/sha256 パッケージの New() 関数や New224() 関数は、この hash.Hash インターフェースを実装したオブジェクトを返します。

Size()BlockSize() メソッド

  • Size(): このメソッドは、ハッシュ関数が生成するメッセージダイジェスト(ハッシュ値)のバイト長を返します。SHA-256の場合、これは32バイト(256ビット)です。SHA-224の場合、これは28バイト(224ビット)です。
  • BlockSize(): このメソッドは、ハッシュ関数が内部的にデータを処理する際のブロックサイズを返します。SHA-256およびSHA-224の場合、これは64バイトです。ハッシュ関数は、入力データをこのブロックサイズに分割し、各ブロックを順次処理してハッシュ値を計算します。

これらの定数 (Size, Size224, BlockSize) は、crypto/sha256 パッケージ内で定義されており、ハッシュ関数の特性を静的に表現しています。

技術的詳細

このコミットは、src/pkg/crypto/sha256/sha256_test.go ファイルに新しいテスト関数 TestSizeTestBlockSize を追加することで、crypto/sha256 パッケージの Size() および BlockSize() メソッドの動作を検証します。

TestSize 関数

TestSize 関数は、以下の手順で Size() メソッドをテストします。

  1. New() を呼び出して、標準のSHA-256ハッシュオブジェクトを作成します。
  2. 作成したオブジェクトの Size() メソッドを呼び出し、その戻り値がパッケージ定数 Size (32) と等しいことを確認します。等しくない場合はエラーを報告します。
  3. New224() を呼び出して、SHA-224ハッシュオブジェクトを作成します。
  4. 作成したオブジェクトの Size() メソッドを呼び出し、その戻り値がパッケージ定数 Size224 (28) と等しいことを確認します。等しくない場合はエラーを報告します。

このテストにより、SHA-256とSHA-224のハッシュ値の長さが、それぞれ256ビットと224ビットであることをプログラム的に保証します。

TestBlockSize 関数

TestBlockSize 関数は、以下の手順で BlockSize() メソッドをテストします。

  1. New() を呼び出して、標準のSHA-256ハッシュオブジェクトを作成します。
  2. 作成したオブジェクトの BlockSize() メソッドを呼び出し、その戻り値がパッケージ定数 BlockSize (64) と等しいことを確認します。等しくない場合はエラーを報告します。

このテストにより、SHA-256の内部ブロックサイズが64バイトであることをプログラム的に保証します。SHA-224も同じブロックサイズを使用するため、別途テストは追加されていませんが、SHA-256のテストで十分と判断されたと考えられます。

これらのテストは、Go言語の標準的なテストフレームワーク testing パッケージを使用しており、t.Errorf を用いてテスト失敗時にエラーメッセージを出力します。

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

src/pkg/crypto/sha256/sha256_test.go ファイルに以下のコードが追加されました。

--- a/src/pkg/crypto/sha256/sha256_test.go
+++ b/src/pkg/crypto/sha256/sha256_test.go
@@ -132,6 +132,24 @@ func TestGolden(t *testing.T) {
 	}\n }\n \n+func TestSize(t *testing.T) {\n+\tc := New()\n+\tif got := c.Size(); got != Size {\n+\t\tt.Errorf(\"Size = %d; want %d\", got, Size)\n+\t}\n+\tc = New224()\n+\tif got := c.Size(); got != Size224 {\n+\t\tt.Errorf(\"New224.Size = %d; want %d\", got, Size224)\n+\t}\n+}\n+\n+func TestBlockSize(t *testing.T) {\n+\tc := New()\n+\tif got := c.BlockSize(); got != BlockSize {\n+\t\tt.Errorf(\"BlockSize = %d want %d\", got, BlockSize)\n+\t}\n+}\n+\n var bench = New()\n var buf = make([]byte, 8192)\n \n```

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

追加されたコードは、Goの `testing` パッケージを利用した標準的な単体テストの形式に従っています。

### `func TestSize(t *testing.T)`

この関数は、SHA-256およびSHA-224ハッシュ関数の出力サイズを検証します。

*   `c := New()`: SHA-256ハッシュオブジェクトの新しいインスタンスを作成します。
*   `if got := c.Size(); got != Size`: 作成したハッシュオブジェクトの `Size()` メソッドを呼び出し、その結果 (`got`) が `sha256` パッケージで定義されている定数 `Size` (SHA-256のハッシュ値のバイト長、つまり32) と等しいかどうかを比較します。
*   `t.Errorf("Size = %d; want %d", got, Size)`: もし `got` と `Size` が一致しない場合、`t.Errorf` を使ってエラーメッセージを出力し、テストを失敗としてマークします。
*   `c = New224()`: 同様に、SHA-224ハッシュオブジェクトの新しいインスタンスを作成します。
*   `if got := c.Size(); got != Size224`: SHA-224オブジェクトの `Size()` メソッドの結果が定数 `Size224` (SHA-224のハッシュ値のバイト長、つまり28) と一致するかを検証します。

### `func TestBlockSize(t *testing.T)`

この関数は、SHA-256ハッシュ関数の内部ブロックサイズを検証します。

*   `c := New()`: SHA-256ハッシュオブジェクトの新しいインスタンスを作成します。
*   `if got := c.BlockSize(); got != BlockSize`: 作成したハッシュオブジェクトの `BlockSize()` メソッドを呼び出し、その結果 (`got`) が `sha256` パッケージで定義されている定数 `BlockSize` (SHA-256のブロックサイズ、つまり64) と等しいかどうかを比較します。
*   `t.Errorf("BlockSize = %d want %d", got, BlockSize)`: もし `got` と `BlockSize` が一致しない場合、エラーメッセージを出力し、テストを失敗としてマークします。

これらのテストは非常にシンプルですが、`crypto/sha256` パッケージの基本的な契約(ハッシュ値の長さとブロックサイズ)が常に満たされることを保証する上で重要な役割を果たします。

## 関連リンク

*   Go言語の `crypto/sha256` パッケージのドキュメント: [https://pkg.go.dev/crypto/sha256](https://pkg.go.dev/crypto/sha256)
*   Go言語の `hash` パッケージのドキュメント: [https://pkg.go.dev/hash](https://pkg.go.dev/hash)
*   Go言語の `testing` パッケージのドキュメント: [https://pkg.go.dev/testing](https://pkg.go.dev/testing)
*   このコミットのGo Code Review (CL) ページ: [https://golang.org/cl/46470043](https://golang.org/cl/46470043) (ただし、このリンクは古い可能性があり、現在のGoのコードレビューシステムでは直接アクセスできない場合があります。)

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

*   Secure Hash Algorithm (SHA) Family: [https://en.wikipedia.org/wiki/Secure_Hash_Algorithm](https://en.wikipedia.org/wiki/Secure_Hash_Algorithm)
*   Go言語のテストの書き方に関する公式ドキュメントやチュートリアル (一般的な情報源として)
*   Go言語の標準ライブラリのソースコード (特に `crypto/sha256` および `hash` パッケージ)
*   Go言語のコードレビュープロセスに関する情報 (一般的な情報源として)
*   Go言語のコミット履歴とGitHubリポジトリ