[インデックス 17045] ファイルの概要
このコミットは、Go言語の次期リリース(当時のnext.txt
が指すバージョン)で導入される予定のAPI変更を記録するapi/next.txt
ファイルを更新するものです。具体的には、container/heap
、container/list
、crypto/cipher
、crypto/md5
、crypto/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
の直後に移動させます。e
とmark
は同じリストに属している必要があります。func (l *List) MoveBefore(e, mark *Element)
: リストl
内の要素e
を、要素mark
の直前に移動させます。e
とmark
は同じリストに属している必要があります。
これらのメソッドは、双方向リスト内の要素の順序を効率的に変更するためのものです。既存の要素を削除して再挿入するよりも、ポインタの付け替えだけで済むため、より高速な操作が可能です。
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]byte
(Size
は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_CLOEXEC
とF_DUPFD_CLOEXEC
定数が追加されました。これらの定数は、ファイルディスクリプタを複製する際に、同時にCLOEXEC
フラグを設定することを可能にします。CLOEXEC
フラグは、exec
系のシステムコールが呼び出されたときにファイルディスクリプタが自動的に閉じられるようにすることで、子プロセスへのファイルディスクリプタの意図しない継承を防ぎ、セキュリティとリソース管理を向上させます。これらの定数は、特定のOSとアーキテクチャ(FreeBSDの32ビットおよび64ビット、CGOを使用する場合としない場合)に特化して追加されています。
これらの変更は、Go言語の標準ライブラリが継続的に機能強化され、より多様なプログラミングニーズに対応できるよう進化していることを示しています。
関連リンク
- Go言語の公式ドキュメント: https://golang.org/doc/
- Go言語の
container/heap
パッケージ: https://pkg.go.dev/container/heap - Go言語の
container/list
パッケージ: https://pkg.go.dev/container/list - Go言語の
crypto/cipher
パッケージ: https://pkg.go.dev/crypto/cipher - Go言語の
crypto/md5
パッケージ: https://pkg.go.dev/crypto/md5 - Go言語の
crypto/rsa
パッケージ: https://pkg.go.dev/crypto/rsa - Go言語の
syscall
パッケージ: https://pkg.go.dev/syscall - Go CL 12490043: https://golang.org/cl/12490043 (このコミットに対応するGoの変更リスト)
参考にした情報源リンク
- Authenticated Encryption with Associated Data (AEAD): https://en.wikipedia.org/wiki/Authenticated_encryption
- Galois/Counter Mode (GCM): https://en.wikipedia.org/wiki/Galois/Counter_Mode
- MD5: https://en.wikipedia.org/wiki/MD5
- RSA-PSS: https://en.wikipedia.org/wiki/Probabilistic_Signature_Scheme
fcntl
システムコールとCLOEXEC
フラグ: https://man7.org/linux/man-pages/man2/fcntl.2.html (Linuxのmanページですが、概念はFreeBSDにも共通します)- FreeBSD
fcntl
manページ: https://www.freebsd.org/cgi/man.cgi?query=fcntl&sektion=2 (FreeBSD固有の詳細情報) - Go言語の
api/next.txt
の役割に関する議論 (Goコミュニティのメーリングリストなど) - Go言語のソースコード (特に
container
,crypto
,syscall
パッケージの関連ファイル) - Go言語のリリースノート (当時のGo 1.2またはそれ以降のリリースに関連する情報)
- Go言語の設計ドキュメント (特定のAPI設計に関する背景情報)