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

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

このコミットは、Go言語の標準ライブラリである crypto/sha512 パッケージ内の sha512_test.go ファイルに対する変更です。crypto/sha512 パッケージは、セキュアハッシュアルゴリズムSHA-512およびSHA-384の実装を提供します。このファイルは、これらのハッシュ関数の正確性と堅牢性を保証するためのテストコードを含んでいます。

コミット

このコミットの目的は、crypto/sha512 パッケージが提供するハッシュ関数の Size() メソッドと BlockSize() メソッドの正確性を検証するための新しいテストケースを追加することです。これにより、ハッシュ値の出力サイズと、ハッシュ計算におけるブロックサイズが期待通りであることを保証します。

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

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

元コミット内容

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

R=golang-codereviews, bradfitz, dave
CC=golang-codereviews
https://golang.org/cl/43550047

変更の背景

ソフトウェア開発において、特に暗号ライブラリのようなセキュリティに直結するコンポーネントでは、その機能が期待通りに動作することを徹底的に検証することが不可欠です。ハッシュ関数の Size() メソッドは最終的なハッシュ値のバイト長を、BlockSize() メソッドはハッシュ計算の内部処理におけるブロック長を返します。これらの値は、ハッシュ関数の仕様によって厳密に定義されており、実装がその仕様に準拠していることを確認することは非常に重要です。

このコミット以前は、crypto/sha512 パッケージにおいて Size()BlockSize() メソッドに対する明示的な単体テストが存在しなかった可能性があります。テストを追加することで、将来のコード変更や異なるプラットフォームへの移植の際に、これらの基本的なプロパティが誤って変更されることを防ぎ、ライブラリの信頼性と安定性を向上させることができます。これは、Go言語の標準ライブラリが常に高い品質と信頼性を維持するための継続的な取り組みの一環です。

前提知識の解説

1. 暗号学的ハッシュ関数 (Cryptographic Hash Function)

暗号学的ハッシュ関数は、任意の長さのデータを入力として受け取り、固定長の短いビット列(ハッシュ値、メッセージダイジェスト、フィンガープリントなどと呼ばれる)を出力する一方向性の関数です。以下の重要な特性を持ちます。

  • 一方向性 (One-wayness): ハッシュ値から元のデータを効率的に復元することは計算上困難である。
  • 衝突耐性 (Collision Resistance): 異なる2つの入力データが同じハッシュ値を持つこと(衝突)を効率的に見つけることは計算上困難である。
  • 原像計算困難性 (Preimage Resistance): 特定のハッシュ値を持つ入力データを効率的に見つけることは計算上困難である。
  • 第2原像計算困難性 (Second Preimage Resistance): 特定の入力データと同じハッシュ値を持つ別の入力データを効率的に見つけることは計算上困難である。

これらの特性により、暗号学的ハッシュ関数は、データの完全性検証、デジタル署名、パスワードの保存など、様々なセキュリティ用途に利用されます。

2. SHA-512 (Secure Hash Algorithm 512)

SHA-512は、アメリカ国家安全保障局(NSA)によって設計され、NIST(アメリカ国立標準技術研究所)によってFIPS PUB 180-4として標準化されたSHA-2ファミリーに属する暗号学的ハッシュ関数です。SHA-512は、512ビット(64バイト)のハッシュ値を出力します。SHA-384はSHA-512の派生形であり、SHA-512と同じ内部構造を持ちますが、出力されるハッシュ値は384ビット(48バイト)に切り詰められます。

3. hash.Hash インターフェース (Go言語)

Go言語の crypto パッケージ群では、ハッシュ関数は hash.Hash インターフェースを実装することが一般的です。このインターフェースは、ハッシュ関数が持つべき共通のメソッドを定義しています。

package hash

type Hash interface {
    // Write (via the embedded io.Writer interface) adds more data to the running hash.
    // It never returns an error.
    io.Writer

    // Sum appends the current hash to b and returns the resulting slice.
    // It does not change the underlying hash state.
    Sum(b []byte) []byte

    // Reset resets the Hash to its initial state.
    Reset()

    // Size returns the number of bytes Sum will return.
    Size() int

    // BlockSize returns the hash's underlying block size.
    BlockSize() int
}

このインターフェースには、今回のコミットでテスト対象となっている Size()BlockSize() メソッドが含まれています。

  • Size() int: このメソッドは、ハッシュ関数が生成する最終的なハッシュ値のバイト数を返します。例えば、SHA-512であれば64バイト(512ビット)を返します。
  • BlockSize() int: このメソッドは、ハッシュ関数が内部的にデータを処理する際のブロックサイズ(バイト数)を返します。ハッシュ関数は通常、入力データを固定長のブロックに分割して処理を進めます。SHA-512の場合、ブロックサイズは128バイト(1024ビット)です。

技術的詳細

このコミットは、crypto/sha512 パッケージの sha512_test.go ファイルに、TestSize()TestBlockSize() という2つの新しいテスト関数を追加しています。これらのテストは、New() および New384() 関数によって生成されるSHA-512およびSHA-384ハッシュインスタンスが、それぞれ正しい Size() および BlockSize() を返すことを検証します。

Size() メソッドのテスト (TestSize)

TestSize() 関数は、以下の点を検証します。

  1. sha512.New() を呼び出してSHA-512ハッシュインスタンスを作成します。
  2. 作成されたインスタンスの Size() メソッドが返す値が、sha512.Size 定数(SHA-512のハッシュ値のバイト長、64バイト)と一致するかを確認します。
  3. sha512.New384() を呼び出してSHA-384ハッシュインスタンスを作成します。
  4. 作成されたインスタンスの Size() メソッドが返す値が、sha512.Size384 定数(SHA-384のハッシュ値のバイト長、48バイト)と一致するかを確認します。

これらのテストは、ハッシュ関数の出力サイズが仕様通りであることを保証します。

BlockSize() メソッドのテスト (TestBlockSize)

TestBlockSize() 関数は、以下の点を検証します。

  1. sha512.New() を呼び出してSHA-512ハッシュインスタンスを作成します。
  2. 作成されたインスタンスの BlockSize() メソッドが返す値が、sha512.BlockSize 定数(SHA-512の内部ブロックサイズ、128バイト)と一致するかを確認します。

SHA-384もSHA-512と同じ内部ブロックサイズを使用するため、New384() に対する BlockSize() のテストは明示的に追加されていませんが、New() のテストで十分と判断されたと考えられます。

これらのテストは、Go言語の標準的なテストフレームワークである testing パッケージを使用しており、t.Errorf() を用いて期待値と実際の値が異なる場合にエラーを報告します。これにより、開発者はハッシュ関数の基本的なプロパティが正しく実装されていることを自動的に確認できます。

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

--- a/src/pkg/crypto/sha512/sha512_test.go
+++ b/src/pkg/crypto/sha512/sha512_test.go
@@ -132,6 +132,24 @@ func TestGolden(t *testing.T) {
 	}
 }
 
+func TestSize(t *testing.T) {
+	c := New()
+	if got := c.Size(); got != Size {
+		t.Errorf("Size = %d; want %d", got, Size)
+	}
+	c = New384()
+	if got := c.Size(); got != Size384 {
+		t.Errorf("New384.Size = %d; want %d", got, Size384)
+	}
+}
+
+func TestBlockSize(t *testing.T) {
+	c := New()
+	if got := c.BlockSize(); got != BlockSize {
+		t.Errorf("BlockSize = %d; want %d", got, BlockSize)
+	}
+}
+
 var bench = New()
 var buf = make([]byte, 8192)

コアとなるコードの解説

func TestSize(t *testing.T)

この関数は、SHA-512およびSHA-384ハッシュ関数の出力サイズをテストします。

  • c := New(): SHA-512ハッシュアルゴリズムの新しいインスタンスを作成します。New() 関数は hash.Hash インターフェースを実装したオブジェクトを返します。
  • if got := c.Size(); got != Size: 作成したSHA-512インスタンスの Size() メソッドを呼び出し、その戻り値(got)が sha512.Size 定数(SHA-512のハッシュ値のバイト長、64)と等しいかを確認します。
  • t.Errorf("Size = %d; want %d", got, Size): もし gotSize が一致しない場合、テストは失敗し、エラーメッセージが出力されます。
  • c = New384(): 次に、SHA-384ハッシュアルゴリズムの新しいインスタンスを作成します。
  • if got := c.Size(); got != Size384: 作成したSHA-384インスタンスの Size() メソッドを呼び出し、その戻り値が sha512.Size384 定数(SHA-384のハッシュ値のバイト長、48)と等しいかを確認します。
  • t.Errorf("New384.Size = %d; want %d", got, Size384): 同様に、一致しない場合はエラーメッセージが出力されます。

func TestBlockSize(t *testing.T)

この関数は、SHA-512ハッシュ関数の内部ブロックサイズをテストします。

  • c := New(): SHA-512ハッシュアルゴリズムの新しいインスタンスを作成します。
  • if got := c.BlockSize(); got != BlockSize: 作成したSHA-512インスタンスの BlockSize() メソッドを呼び出し、その戻り値(got)が sha512.BlockSize 定数(SHA-512の内部ブロックサイズ、128)と等しいかを確認します。
  • t.Errorf("BlockSize = %d; want %d", got, BlockSize): もし gotBlockSize が一致しない場合、テストは失敗し、エラーメッセージが出力されます。

これらのテストは、Go言語の testing パッケージの慣例に従って記述されており、go test コマンドによって自動的に実行されます。

関連リンク

参考にした情報源リンク