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

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

このコミットは、Go言語の次期リリース(当時のnext.txtが指すバージョン)で導入される予定のAPI変更を記録するapi/next.txtファイルを更新するものです。具体的には、container/heapcontainer/listcrypto/ciphercrypto/md5crypto/rsaパッケージに新たな関数、メソッド、型、定数が追加され、さらにsyscallパッケージにはFreeBSD向けの新しい定数が追加されています。これらの変更は、Go標準ライブラリの機能強化と、よりセキュアで効率的なプログラミングを可能にすることを目的としています。

コミット

commit b1c453181358192a7cac91ae9a28534ea940faae
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Mon Aug 5 17:23:12 2013 -0700

    api: update next.txt
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/12490043

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

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

元コミット内容

api: update next.txt

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/12490043

変更の背景

このコミットは、Go言語の標準ライブラリに新しいAPI要素が追加されたことに伴い、その変更を公式に記録するためのものです。api/next.txtファイルは、Goの次期リリースで導入される予定のAPIの変更点を追跡するために使用されます。このファイルにエントリが追加されることで、開発者は将来のGoバージョンで利用可能になる新しい機能や変更を事前に把握できます。

具体的な背景としては、以下の機能強化が挙げられます。

  • container/heapの機能改善: ヒープ構造の要素を更新する際の効率的な操作を可能にするFix関数の追加。
  • container/listの機能改善: 双方向リストの要素を移動させるためのMoveAfterおよびMoveBeforeメソッドの追加。
  • crypto/cipherにおける認証付き暗号のサポート強化: GCM (Galois/Counter Mode) の導入と、認証付き暗号化データ (Authenticated Encryption with Associated Data, AEAD) を扱うための汎用インターフェースの定義。これにより、よりセキュアで堅牢な暗号化通信の実現が可能になります。
  • crypto/md5の利便性向上: MD5ハッシュを計算するための簡潔なSum関数の追加。
  • crypto/rsaにおけるPSS (Probabilistic Signature Scheme) の柔軟性向上: RSA-PSS署名におけるソルト長の自動設定とハッシュ長との一致を制御する定数の追加。
  • syscallにおけるFreeBSD固有の機能追加: ファイルディスクリプタの複製と同時にCLOEXECフラグを設定する機能の追加。これは、子プロセスへのファイルディスクリプタの意図しない継承を防ぎ、セキュリティとリソース管理を向上させるために重要です。

これらの変更は、Go言語が進化し、より多様なユースケースに対応できるよう、標準ライブラリの機能が継続的に拡張されていることを示しています。

前提知識の解説

このコミットの変更内容を理解するためには、以下の概念についての基本的な知識が必要です。

1. Go言語のAPIとapi/next.txt

Go言語では、標準ライブラリのAPIの安定性を非常に重視しています。新しいAPI要素が追加される際、それは通常、api/next.txtというファイルに記録されます。このファイルは、次のメジャーリリースで導入される予定のAPI変更のリストとして機能します。開発者はこのファイルを参照することで、将来のGoバージョンで利用可能になる新しい関数、型、メソッド、定数などを事前に確認できます。

2. データ構造 (container/heap, container/list)

  • ヒープ (Heap): 優先度キューを実装するためによく使われるツリーベースのデータ構造です。最小(または最大)要素を効率的に取得できます。Goのcontainer/heapパッケージは、任意の型をヒープとして扱うためのインターフェースを提供します。
  • 双方向リスト (Doubly Linked List): 各ノードが前後のノードへの参照を持つ線形データ構造です。要素の挿入や削除が効率的ですが、特定の位置へのアクセスは線形時間かかります。Goのcontainer/listパッケージは、汎用的な双方向リストの実装を提供します。

3. 暗号技術 (crypto/cipher, crypto/md5, crypto/rsa)

  • 暗号スイート: 暗号化、復号、ハッシュ、署名などの機能を提供するGoの標準ライブラリパッケージ群です。
  • ブロック暗号 (Block Cipher): 固定長のブロック単位でデータを暗号化・復号するアルゴリズム(例: AES)。
  • ストリーム暗号 (Stream Cipher): データストリームをビット単位またはバイト単位で暗号化・復号するアルゴリズム。
  • 認証付き暗号 (Authenticated Encryption, AE): 暗号化と同時にデータの完全性と認証を提供する暗号化方式。これにより、データの機密性だけでなく、改ざんされていないこと、および送信元が正当であることも保証されます。
  • AEAD (Authenticated Encryption with Associated Data): 認証付き暗号の一種で、暗号化されないが認証される追加データ(Associated Data)を含めることができる方式。例えば、ネットワークパケットのヘッダ情報など、暗号化する必要はないが、改ざんを検出したいデータに利用されます。
  • GCM (Galois/Counter Mode): AESなどのブロック暗号と組み合わせて使用される認証付き暗号モードの一つ。高速で並列処理が可能であり、広く利用されています。
  • MD5 (Message-Digest Algorithm 5): 広く使われていたハッシュ関数の一つですが、衝突耐性がないため、セキュリティ目的での利用は推奨されません。ファイルの整合性チェックなど、非セキュリティ目的で使われることがあります。
  • RSA (Rivest–Shamir–Adleman): 公開鍵暗号方式の一つで、暗号化、デジタル署名、鍵交換などに広く用いられます。
  • PSS (Probabilistic Signature Scheme): RSA署名スキームの一つで、ランダムなソルト(salt)を使用することで、より高いセキュリティを提供します。

4. システムコール (syscall)

  • システムコール (System Call): オペレーティングシステムが提供するサービスをプログラムが利用するためのインターフェース。ファイル操作、プロセス管理、ネットワーク通信など、低レベルな操作を行います。
  • ファイルディスクリプタ (File Descriptor, FD): Unix系OSにおいて、ファイルやソケットなどのI/Oリソースを識別するためにカーネルが割り当てる非負の整数。
  • fcntl (File Control): ファイルディスクリプタのプロパティを操作するためのシステムコール。
  • F_DUPFD: 既存のファイルディスクリプタを複製するfcntlコマンド。
  • F_DUP2FD: 既存のファイルディスクリプタを、指定された新しいファイルディスクリプタ番号に複製するfcntlコマンド。
  • CLOEXEC (Close-on-exec): ファイルディスクリプタのフラグの一つ。このフラグが設定されているファイルディスクリプタは、exec系のシステムコール(新しいプログラムを実行する際に使われる)が呼び出されたときに自動的に閉じられます。これにより、子プロセスに不要なファイルディスクリプタが継承されるのを防ぎ、セキュリティリスクを低減し、リソースリークを防ぐことができます。

技術的詳細

このコミットで追加されたAPI要素は、Go言語の標準ライブラリの様々な側面を強化しています。

container/heapパッケージのFix関数

func Fix(h Interface, i int): この関数は、ヒープ内の指定されたインデックスiにある要素が変更された場合に、ヒープのプロパティ(ヒープ条件)を復元するために使用されます。要素の値が変更された場合、その要素はヒープの正しい位置に移動する必要があります。Fix関数は、up操作(要素が親より小さい場合に上に移動)とdown操作(要素が子より大きい場合に下に移動)を組み合わせて、効率的にヒープ条件を再確立します。これは、ヒープを基盤とする優先度キューで要素の優先度が変更された場合などに非常に有用です。

container/listパッケージのMoveAfterおよびMoveBeforeメソッド

  • func (l *List) MoveAfter(e, mark *Element): リストl内の要素eを、要素markの直後に移動させます。emarkは同じリストに属している必要があります。
  • func (l *List) MoveBefore(e, mark *Element): リストl内の要素eを、要素markの直前に移動させます。emarkは同じリストに属している必要があります。

これらのメソッドは、双方向リスト内の要素の順序を効率的に変更するためのものです。既存の要素を削除して再挿入するよりも、ポインタの付け替えだけで済むため、より高速な操作が可能です。

crypto/cipherパッケージの認証付き暗号 (AEAD) サポート

  • func NewGCM(cipher.Block) (AEAD, error): AESなどのブロック暗号のインスタンスを受け取り、GCMモードで動作するAEADインターフェースの実装を返します。GCMは認証付き暗号モードであり、データの機密性、完全性、認証を提供します。
  • type AEAD interface { NonceSize() int; Open([]byte, []byte, []byte, []byte) ([]byte, error); Overhead() int; Seal([]byte, []byte, []byte, []byte) []byte }: このインターフェースは、認証付き暗号の一般的な操作を抽象化します。
    • NonceSize() int: ノンス(Nonce: Number used once)の推奨サイズを返します。ノンスは、各暗号化操作で一意である必要があり、再利用されるとセキュリティ上の脆弱性につながります。
    • Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error): 暗号文ciphertextを復号し、認証タグを検証します。additionalDataは認証のみされるデータです。復号された平文を返します。
    • Overhead() int: Seal操作によって追加される認証タグの最大サイズを返します。
    • Seal(dst, nonce, plaintext, additionalData []byte) []byte: 平文plaintextを暗号化し、認証タグを生成します。additionalDataは認証のみされるデータです。暗号文と認証タグを連結したものを返します。

これらの追加により、Go言語でGCMモードを用いたセキュアな認証付き暗号を簡単に実装できるようになります。これは、TLS/SSL、IPsec、SSHなどのプロトコルで広く利用されており、ネットワーク通信のセキュリティを確保する上で不可欠な機能です。

crypto/md5パッケージのSum関数

func Sum(data []byte) [Size]byte: 入力データdataのMD5ハッシュを計算し、[Size]byteSizeはMD5ハッシュのバイト長、16バイト)の配列として返します。これは、MD5ハッシュを計算するための簡潔なユーティリティ関数であり、ファイルの整合性チェックなど、セキュリティ以外の目的でMD5を使用する場合に便利です。

crypto/rsaパッケージのPSSソルト長定数

  • const PSSSaltLengthAuto ideal-int: RSA-PSS署名生成時に、ソルト長を自動的に決定することを示す定数。通常、ハッシュ関数の出力長と同じになります。
  • const PSSSaltLengthEqualsHash ideal-int: RSA-PSS署名生成時に、ソルト長をハッシュ関数の出力長と等しくすることを示す定数。

これらの定数は、RSA-PSS署名の柔軟性を高め、開発者がソルト長の選択をより細かく制御できるようにします。PSSは、RSA署名のセキュリティを向上させるための重要なメカニズムです。

syscallパッケージのFreeBSD向けCLOEXEC定数

  • const F_DUP2FD_CLOEXEC ideal-int
  • const F_DUPFD_CLOEXEC ideal-int

これらの定数は、FreeBSDシステムにおいて、fcntlシステムコールで使用される新しいコマンドフラグです。

  • F_DUPFD_CLOEXEC: F_DUPFDと同様にファイルディスクリプタを複製しますが、複製されたファイルディスクリプタに自動的にCLOEXECフラグを設定します。
  • F_DUP2FD_CLOEXEC: F_DUP2FDと同様にファイルディスクリプタを複製しますが、複製されたファイルディスクリプタに自動的にCLOEXECフラグを設定します。

これらの定数の導入により、GoプログラムはFreeBSD上で、ファイルディスクリプタの複製と同時にCLOEXECフラグを設定する、より安全で効率的な方法を利用できるようになります。これは、特にマルチプロセス環境において、子プロセスが親プロセスのファイルディスクリプタを意図せず継承してしまうことによるセキュリティリスク(例: 秘密のファイルディスクリプタが子プロセスに漏洩する)やリソースリークを防ぐ上で非常に重要です。

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

このコミットにおけるコアとなるコードの変更は、api/next.txtファイルへの追加です。このファイルは、Go言語の次期リリースで公開されるAPIの変更点をリストアップする役割を担っています。

--- a/api/next.txt
+++ b/api/next.txt
@@ -1,6 +1,13 @@
+pkg container/heap, func Fix(Interface, int)
 pkg container/list, method (*List) MoveAfter(*Element, *Element)
 pkg container/list, method (*List) MoveBefore(*Element, *Element)
 pkg crypto, type PublicKey interface {}
+pkg crypto/cipher, func NewGCM(Block) (AEAD, error)
+pkg crypto/cipher, type AEAD interface { NonceSize, Open, Overhead, Seal }
+pkg crypto/cipher, type AEAD interface, NonceSize() int
+pkg crypto/cipher, type AEAD interface, Open([]uint8, []uint8, []uint8, []uint8) ([]uint8, error)
+pkg crypto/cipher, type AEAD interface, Overhead() int
+pkg crypto/cipher, type AEAD interface, Seal([]uint8, []uint8, []uint8, []uint8) []uint8
 pkg crypto/md5, func Sum([]uint8) [Size]uint8
 pkg crypto/rsa, const PSSSaltLengthAuto ideal-int
 pkg crypto/rsa, const PSSSaltLengthEqualsHash ideal-int
@@ -760,6 +767,8 @@ pkg syscall (darwin-amd64-cgo), type ICMPv6Filter struct, Filt [8]uint32
 pkg syscall (darwin-amd64-cgo), type IPv6MTUInfo struct
 pkg syscall (darwin-amd64-cgo), type IPv6MTUInfo struct, Addr RawSockaddrInet6
 pkg syscall (darwin-amd64-cgo), type IPv6MTUInfo struct, Mtu uint32
+pkg syscall (freebsd-386), const F_DUP2FD_CLOEXEC ideal-int
+pkg syscall (freebsd-386), const F_DUPFD_CLOEXEC ideal-int
 pkg syscall (freebsd-386), const ICMP6_FILTER ideal-int
 pkg syscall (freebsd-386), const PRIO_PGRP ideal-int
 pkg syscall (freebsd-386), const PRIO_PROCESS ideal-int
@@ -1219,7 +1228,9 @@ pkg syscall (freebsd-386-cgo), const FD_SETSIZE ideal-int
 pkg syscall (freebsd-386-cgo), const FLUSHO ideal-int
 pkg syscall (freebsd-386-cgo), const F_CANCEL ideal-int
 pkg syscall (freebsd-386-cgo), const F_DUP2FD ideal-int
+pkg syscall (freebsd-386-cgo), const F_DUP2FD_CLOEXEC ideal-int
 pkg syscall (freebsd-386-cgo), const F_DUPFD ideal-int
+pkg syscall (freebsd-386-cgo), const F_DUPFD_CLOEXEC ideal-int
 pkg syscall (freebsd-386-cgo), const F_GETFD ideal-int
 pkg syscall (freebsd-386-cgo), const F_GETFL ideal-int
 pkg syscall (freebsd-386-cgo), const F_GETLK ideal-int
@@ -2967,6 +2978,8 @@ pkg syscall (freebsd-386-cgo), type WaitStatus uint32
 pkg syscall (freebsd-386-cgo), var Stderr int
 pkg syscall (freebsd-386-cgo), var Stdin int
 pkg syscall (freebsd-386-cgo), var Stdout int
+pkg syscall (freebsd-amd64), const F_DUP2FD_CLOEXEC ideal-int
+pkg syscall (freebsd-amd64), const F_DUPFD_CLOEXEC ideal-int
 pkg syscall (freebsd-amd64), const ICMP6_FILTER ideal-int
 pkg syscall (freebsd-amd64), const PRIO_PGRP ideal-int
 pkg syscall (freebsd-amd64), const PRIO_PROCESS ideal-int
@@ -3426,7 +3439,9 @@ pkg syscall (freebsd-amd64-cgo), const FD_SETSIZE ideal-int
 pkg syscall (freebsd-amd64-cgo), const FLUSHO ideal-int
 pkg syscall (freebsd-amd64-cgo), const F_CANCEL ideal-int
 pkg syscall (freebsd-amd64-cgo), const F_DUP2FD ideal-int
+pkg syscall (freebsd-amd64-cgo), const F_DUP2FD_CLOEXEC ideal-int
 pkg syscall (freebsd-amd64-cgo), const F_DUPFD ideal-int
+pkg syscall (freebsd-amd64-cgo), const F_DUPFD_CLOEXEC ideal-int
 pkg syscall (freebsd-amd64-cgo), const F_GETFD ideal-int
 pkg syscall (freebsd-amd64-cgo), const F_GETFL ideal-int
 pkg syscall (freebsd-amd64-cgo), const F_GETLK ideal-int

コアとなるコードの解説

上記の差分は、api/next.txtファイルに以下の新しいAPI要素が追加されたことを示しています。各行は、pkg <パッケージ名>, <要素の種類> <要素名> <型/シグネチャ>の形式で記述されています。

  • pkg container/heap, func Fix(Interface, int): container/heapパッケージにFix関数が追加されました。これは、ヒープ内の特定の要素が変更された後に、ヒープのプロパティを再確立するために使用されます。

  • pkg container/list, method (*List) MoveAfter(*Element, *Element) および pkg container/list, method (*List) MoveBefore(*Element, *Element): container/listパッケージのList型に、既存の要素をリスト内の別の要素の前または後に移動させるためのメソッドが追加されました。これにより、リストの要素の並べ替えがより効率的に行えるようになります。

  • pkg crypto/cipher, func NewGCM(Block) (AEAD, error) および pkg crypto/cipher, type AEAD interface { NonceSize, Open, Overhead, Seal }: crypto/cipherパッケージに、GCMモードの認証付き暗号を生成するNewGCM関数と、認証付き暗号の操作を抽象化するAEADインターフェースが追加されました。AEADインターフェースは、ノンスサイズの取得、暗号文の復号と認証、認証タグのオーバーヘッドサイズの取得、平文の暗号化と認証タグの生成のためのメソッドを定義しています。これにより、Go言語でセキュアな認証付き暗号をより簡単に利用できるようになります。

  • pkg crypto/md5, func Sum([]uint8) [Size]uint8: crypto/md5パッケージに、バイトスライスからMD5ハッシュを計算するSum関数が追加されました。これは、MD5ハッシュの計算を簡潔に行うためのユーティリティ関数です。

  • pkg crypto/rsa, const PSSSaltLengthAuto ideal-int および pkg crypto/rsa, const PSSSaltLengthEqualsHash ideal-int: crypto/rsaパッケージに、RSA-PSS署名におけるソルト長の自動設定と、ハッシュ長と等しいソルト長を指定するための定数が追加されました。これにより、RSA-PSS署名の柔軟性とセキュリティ設定の制御が向上します。

  • pkg syscall (freebsd-386), const F_DUP2FD_CLOEXEC ideal-int, pkg syscall (freebsd-386), const F_DUPFD_CLOEXEC ideal-int, および同様のfreebsd-386-cgo, freebsd-amd64, freebsd-amd64-cgo向けの定数: syscallパッケージに、FreeBSDシステムコールで使用されるF_DUP2FD_CLOEXECF_DUPFD_CLOEXEC定数が追加されました。これらの定数は、ファイルディスクリプタを複製する際に、同時にCLOEXECフラグを設定することを可能にします。CLOEXECフラグは、exec系のシステムコールが呼び出されたときにファイルディスクリプタが自動的に閉じられるようにすることで、子プロセスへのファイルディスクリプタの意図しない継承を防ぎ、セキュリティとリソース管理を向上させます。これらの定数は、特定のOSとアーキテクチャ(FreeBSDの32ビットおよび64ビット、CGOを使用する場合としない場合)に特化して追加されています。

これらの変更は、Go言語の標準ライブラリが継続的に機能強化され、より多様なプログラミングニーズに対応できるよう進化していることを示しています。

関連リンク

参考にした情報源リンク