[インデックス 19713] ファイルの概要
このコミットは、Go言語のcrypto/rc4
パッケージにおける、特定のアーキテクチャ(nacl/arm
)向けのアセンブリ実装を無効化する変更です。具体的には、Goのビルドタグを利用して、nacl/arm
環境ではRC4の最適化されたアセンブリコードではなく、参照実装(Goで書かれた純粋な実装)が使用されるように調整されています。
コミット
crypto/rc4
: nacl/arm
向けのアセンブリ実装を無効化。
これはサポートされていないアドレッシングモードを使用しています。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d1fee626f62cc3c5fa30b0f364bdebaf6249c2c9
元コミット内容
commit d1fee626f62cc3c5fa30b0f364bdebaf6249c2c9
Author: Shenghou Ma <minux@golang.org>
Date: Thu Jul 10 15:15:16 2014 -0400
crypto/rc4: disable assembly implementation for nacl/arm.
It uses an unsupported addressing mode.
LGTM=iant, rsc
R=rsc, iant
CC=golang-codereviews
https://golang.org/cl/106370043
変更の背景
この変更の背景には、Go言語のcrypto/rc4
パッケージが提供するRC4暗号アルゴリズムの実装が、特定の環境で問題を引き起こしていたという事実があります。RC4のような暗号アルゴリズムは、パフォーマンスが非常に重要であるため、多くの場合、アセンブリ言語で最適化された実装が提供されます。しかし、このアセンブリ実装がGoogle Native Client (NaCl) 上のARMアーキテクチャ(nacl/arm
)で、サポートされていないメモリアドレッシングモードを使用していることが判明しました。
サポートされていないアドレッシングモードを使用すると、プログラムがクラッシュしたり、予期せぬ動作を引き起こしたりする可能性があります。この問題を解決するため、nacl/arm
環境ではアセンブリによる最適化されたRC4実装の使用を避け、代わりにGo言語で書かれた安全な参照実装にフォールバックするように変更されました。これにより、nacl/arm
環境での安定性と互換性が確保されます。
前提知識の解説
RC4 (Rivest Cipher 4)
RC4は、ストリーム暗号の一種であり、非常にシンプルで高速な暗号アルゴリズムです。主にSSL/TLS(Secure Sockets Layer/Transport Layer Security)やWEP(Wired Equivalent Privacy)などのプロトコルで広く使用されていました。RC4は、鍵ストリームと呼ばれる擬似乱数のバイト列を生成し、これを平文とXOR演算することで暗号化を行います。復号も同じ鍵ストリームを生成し、暗号文とXOR演算することで行われます。 しかし、RC4にはいくつかの脆弱性(例:鍵スケジューリングアルゴリズムの欠陥、特定の鍵ストリームの偏り)が発見されており、現在ではTLS 1.3などの新しいプロトコルでは使用が推奨されていません。それでも、既存のシステムや特定のレガシーな用途ではまだ利用されている場合があります。
アセンブリ言語による最適化
アセンブリ言語は、CPUが直接実行できる機械語に非常に近い低レベルのプログラミング言語です。CやGoのような高水準言語で書かれたコードは、コンパイラによって機械語に変換されますが、特定の部分(特にパフォーマンスが要求される暗号処理やシステムコールなど)では、プログラマが直接アセンブリ言語でコードを書くことで、より効率的で高速な実行が可能になります。これは、CPUのレジスタを直接操作したり、特定のCPU命令を最大限に活用したりできるためです。 Go言語の標準ライブラリでも、パフォーマンスが重要な部分(例:暗号化、ハッシュ計算、ランタイムのコア部分)では、アセンブリ言語による最適化された実装が提供されることがあります。
Google Native Client (NaCl)
Google Native Client (NaCl) は、ウェブブラウザ内でネイティブコード(C/C++など)を安全に実行するための技術です。NaClは、サンドボックス環境を提供することで、悪意のあるコードがシステムにアクセスするのを防ぎつつ、ネイティブアプリケーションに近いパフォーマンスを実現することを目指していました。これにより、ウェブアプリケーションで高性能な処理(例:ゲーム、画像処理)を実行することが可能になります。 NaClは、特定のCPUアーキテクチャ(x86、ARMなど)向けにコンパイルされたコードを実行しますが、そのサンドボックスの制約により、通常のネイティブコードとは異なる実行環境や制約が存在します。
ARMアーキテクチャ
ARM(Advanced RISC Machine)は、モバイルデバイス(スマートフォン、タブレット)や組み込みシステムで広く使用されているCPUアーキテクチャです。低消費電力と高い性能効率が特徴で、RISC(Reduced Instruction Set Computer)設計に基づいています。ARMプロセッサは、様々な命令セット(例:ARMv7, ARMv8)とアドレッシングモード(メモリにアクセスする方法)を持っています。
アドレッシングモード
アドレッシングモードとは、CPUがメモリ上のデータにアクセスする際に、そのデータの物理アドレスをどのように計算するかを決定する方式のことです。例えば、ベースレジスタにオフセットを加算する「ベース+オフセットアドレッシング」や、レジスタの内容を直接アドレスとして使用する「レジスタ間接アドレッシング」など、様々な種類があります。 特定のCPUアーキテクチャや実行環境(この場合はNaClサンドボックス)では、セキュリティや設計上の理由から、一部のアドレッシングモードがサポートされていなかったり、制限されたりすることがあります。アセンブリコードがサポートされていないアドレッシングモードを使用しようとすると、実行時エラーやクラッシュの原因となります。
Goのビルドタグ (+build
ディレクティブ)
Go言語には、ソースコードのコンパイル時に特定のファイルを含めるか除外するかを制御するための「ビルドタグ」という仕組みがあります。これは、ファイルの先頭に// +build tag_name
のようなコメント行を記述することで実現されます。
複数のタグをスペースで区切って指定すると、それらのタグのいずれかが有効な場合にファイルがコンパイルされます(論理OR)。
カンマで区切ると、それらのタグがすべて有効な場合にファイルがコンパイルされます(論理AND)。
タグの前に!
を付けると、そのタグが無効な場合にファイルがコンパイルされます(論理NOT)。
例:
// +build linux darwin
: LinuxまたはmacOSでコンパイルされる。// +build go1.4,amd64
: Go 1.4以上かつAMD64アーキテクチャでコンパイルされる。// +build !windows
: Windows以外のOSでコンパイルされる。
このコミットでは、このビルドタグを巧みに利用して、nacl
環境かつarm
アーキテクチャの場合にのみ、アセンブリ実装を無効化し、参照実装を有効化しています。
技術的詳細
このコミットの技術的詳細は、Goのビルドシステムと、特定のプラットフォーム(nacl/arm
)におけるアセンブリコードの互換性の問題に集約されます。
-
問題の特定:
crypto/rc4
パッケージのアセンブリ実装(rc4_arm.s
)が、nacl/arm
環境でサポートされていないメモリアドレッシングモードを使用していることが判明しました。これは、NaClのサンドボックスが課す制約、またはARMアーキテクチャの特定の命令セットとNaClの組み合わせによるものです。アセンブリコードは非常に低レベルであり、特定のCPUの命令セットやアドレッシングモードに密接に依存するため、このような互換性の問題が発生しやすいです。 -
解決策: 問題のあるアセンブリコードを修正する代わりに、
nacl/arm
環境ではそのアセンブリコードをコンパイル対象から外し、代わりにGoで書かれた参照実装を使用するというアプローチが取られました。これは、アセンブリコードの修正が複雑であったり、NaClの制約を回避するのが困難であったりする場合に、現実的な解決策となります。パフォーマンスは若干低下する可能性がありますが、機能の正確性と安定性が優先されます。 -
Goビルドタグの活用: この解決策を実現するために、Goのビルドタグが使用されました。
rc4_arm.s
(ARMアセンブリ実装): ファイルの先頭に// +build !nacl
が追加されました。これにより、nacl
タグが有効な環境(つまりNaCl環境)では、このアセンブリファイルはコンパイルされなくなります。rc4_asm.go
(アセンブリ実装を有効にするためのGoファイル): ビルドタグが// +build amd64 amd64p32 arm 386
から// +build amd64 amd64p32 arm,!nacl 386
に変更されました。これは、「arm
アーキテクチャだが、nacl
環境ではない場合」にこのファイルがコンパイルされることを意味します。これにより、nacl/arm
環境ではこのファイルもコンパイル対象から外れ、アセンブリ実装がリンクされなくなります。rc4_ref.go
(参照実装): ビルドタグが// +build !amd64,!amd64p32,!arm,!386
から// +build !amd64,!amd64p32,!arm,!386 arm,nacl
に変更されました。これは、「amd64
,amd64p32
,arm
,386
のいずれでもない場合」に加えて、「arm
アーキテクチャかつnacl
環境の場合」にもこのファイルがコンパイルされることを意味します。これにより、nacl/arm
環境ではこの参照実装が選択的にコンパイルされ、使用されるようになります。
この変更により、Goコンパイラはビルドターゲットに応じて適切なRC4の実装を選択するようになり、nacl/arm
環境でのクラッシュが回避されます。
コアとなるコードの変更箇所
src/pkg/crypto/rc4/rc4_arm.s
--- a/src/pkg/crypto/rc4/rc4_arm.s
+++ b/src/pkg/crypto/rc4/rc4_arm.s
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build !nacl
+
#include "../../../cmd/ld/textflag.h"
// Registers
src/pkg/crypto/rc4/rc4_asm.go
--- a/src/pkg/crypto/rc4/rc4_asm.go
+++ b/src/pkg/crypto/rc4/rc4_asm.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build amd64 amd64p32 arm 386
+// +build amd64 amd64p32 arm,!nacl 386
package rc4
src/pkg/crypto/rc4/rc4_ref.go
--- a/src/pkg/crypto/rc4/rc4_ref.go
+++ b/src/pkg/crypto/rc4/rc4_ref.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build !amd64,!amd64p32,!arm,!386
+// +build !amd64,!amd64p32,!arm,!386 arm,nacl
package rc4
コアとなるコードの解説
このコミットの核心は、Goのビルドタグ(+build
ディレクティブ)を戦略的に変更することで、特定のビルドターゲット(nacl/arm
)に対して異なる実装を選択させる点にあります。
-
rc4_arm.s
(+build !nacl
):- このファイルはARMアーキテクチャ向けのアセンブリ言語によるRC4実装を含んでいます。
// +build !nacl
という行が追加されました。これは、「nacl
ビルドタグが設定されていない場合にのみ、このファイルをコンパイルに含める」という意味です。- 結果として、
nacl
環境でビルドされる際には、この最適化されたアセンブリ実装は無視され、コンパイル対象から外れます。
-
rc4_asm.go
(+build amd64 amd64p32 arm,!nacl 386
):- このファイルは、アセンブリ実装をGoコードから呼び出すためのラッパー関数や、アセンブリ実装が利用可能であることを示すためのGoコードを含んでいると推測されます。
- 元のタグ
// +build amd64 amd64p32 arm 386
は、これらのアーキテクチャでアセンブリ実装を有効にするためのものでした。 - 変更後のタグ
// +build amd64 amd64p32 arm,!nacl 386
は、arm
アーキテクチャの場合に「かつnacl
環境ではない場合」という条件が追加されています。 - これにより、
nacl/arm
環境ではこのファイルもコンパイル対象から外れ、アセンブリ実装への参照がなくなります。
-
rc4_ref.go
(+build !amd64,!amd64p32,!arm,!386 arm,nacl
):- このファイルは、Go言語で書かれたRC4の参照実装(純粋なGoコード)を含んでいます。これは、アセンブリ実装が利用できない場合のフォールバックとして機能します。
- 元のタグ
// +build !amd64,!amd64p32,!arm,!386
は、「上記のアセンブリ最適化が提供されているアーキテクチャ以外」でこの参照実装を使用するという意味でした。 - 変更後のタグ
// +build !amd64,!amd64p32,!arm,!386 arm,nacl
は、元の条件に加えて、「またはarm
アーキテクチャかつnacl
環境の場合」という条件が追加されています。 - この変更により、
nacl/arm
環境でビルドされる際には、この参照実装が明示的に選択され、コンパイルに含められるようになります。
これらのビルドタグの変更により、GoコンパイラはビルドターゲットのOS/アーキテクチャ情報に基づいて、RC4の適切な実装(最適化されたアセンブリ版か、安全な参照版か)を自動的に選択するようになります。特にnacl/arm
という特定の組み合わせに対して、互換性のないアセンブリコードの使用を回避し、安定した動作を保証しています。
関連リンク
- Go言語のビルドタグに関する公式ドキュメント(Go 1.4当時の情報に基づく):
- https://golang.org/cmd/go/#hdr-Build_constraints (現在のドキュメントですが、当時の概念も含まれます)
- Google Native Client (NaCl) の概要:
- https://developer.chrome.com/docs/native-client/ (現在は非推奨技術ですが、当時の背景理解に役立ちます)
- RC4暗号アルゴリズムに関する情報:
参考にした情報源リンク
- Go言語の公式ドキュメント
- Wikipedia (RC4, ARMアーキテクチャ, Google Native Client)
- Go言語のソースコードリポジトリ (コミット履歴と関連ファイル)
- Go言語のビルドタグに関する一般的な知識
I have generated the detailed explanation in Markdown format, following all the specified sections and requirements. I have also included explanations for prerequisite knowledge and technical details, and used the provided metadata. I did not find a specific public document detailing the "unsupported addressing mode" for nacl/arm
in the context of Go's RC4, but the general understanding of NaCl's sandboxing and ARM's addressing modes is sufficient to explain the problem.
I will now output this to standard output.# [インデックス 19713] ファイルの概要
このコミットは、Go言語のcrypto/rc4
パッケージにおける、特定のアーキテクチャ(nacl/arm
)向けのアセンブリ実装を無効化する変更です。具体的には、Goのビルドタグを利用して、nacl/arm
環境ではRC4の最適化されたアセンブリコードではなく、参照実装(Goで書かれた純粋な実装)が使用されるように調整されています。
コミット
crypto/rc4
: nacl/arm
向けのアセンブリ実装を無効化。
これはサポートされていないアドレッシングモードを使用しています。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d1fee626f62cc3c5fa30b0f364bdebaf6249c2c9
元コミット内容
commit d1fee626f62cc3c5fa30b0f364bdebaf6249c2c9
Author: Shenghou Ma <minux@golang.org>
Date: Thu Jul 10 15:15:16 2014 -0400
crypto/rc4: disable assembly implementation for nacl/arm.
It uses an unsupported addressing mode.
LGTM=iant, rsc
R=rsc, iant
CC=golang-codereviews
https://golang.org/cl/106370043
変更の背景
この変更の背景には、Go言語のcrypto/rc4
パッケージが提供するRC4暗号アルゴリズムの実装が、特定の環境で問題を引き起こしていたという事実があります。RC4のような暗号アルゴリズムは、パフォーマンスが非常に重要であるため、多くの場合、アセンブリ言語で最適化された実装が提供されます。しかし、このアセンブリ実装がGoogle Native Client (NaCl) 上のARMアーキテクチャ(nacl/arm
)で、サポートされていないメモリアドレッシングモードを使用していることが判明しました。
サポートされていないアドレッシングモードを使用すると、プログラムがクラッシュしたり、予期せぬ動作を引き起こしたりする可能性があります。この問題を解決するため、nacl/arm
環境ではアセンブリによる最適化されたRC4実装の使用を避け、代わりにGo言語で書かれた安全な参照実装にフォールバックするように変更されました。これにより、nacl/arm
環境での安定性と互換性が確保されます。
前提知識の解説
RC4 (Rivest Cipher 4)
RC4は、ストリーム暗号の一種であり、非常にシンプルで高速な暗号アルゴリズムです。主にSSL/TLS(Secure Sockets Layer/Transport Layer Security)やWEP(Wired Equivalent Privacy)などのプロトコルで広く使用されていました。RC4は、鍵ストリームと呼ばれる擬似乱数のバイト列を生成し、これを平文とXOR演算することで暗号化を行います。復号も同じ鍵ストリームを生成し、暗号文とXOR演算することで行われます。 しかし、RC4にはいくつかの脆弱性(例:鍵スケジューリングアルゴリズムの欠陥、特定の鍵ストリームの偏り)が発見されており、現在ではTLS 1.3などの新しいプロトコルでは使用が推奨されていません。それでも、既存のシステムや特定のレガシーな用途ではまだ利用されている場合があります。
アセンブリ言語による最適化
アセンブリ言語は、CPUが直接実行できる機械語に非常に近い低レベルのプログラミング言語です。CやGoのような高水準言語で書かれたコードは、コンパイラによって機械語に変換されますが、特定の部分(特にパフォーマンスが要求される暗号処理やシステムコールなど)では、プログラマが直接アセンブリ言語でコードを書くことで、より効率的で高速な実行が可能になります。これは、CPUのレジスタを直接操作したり、特定のCPU命令を最大限に活用したりできるためです。 Go言語の標準ライブラリでも、パフォーマンスが重要な部分(例:暗号化、ハッシュ計算、ランタイムのコア部分)では、アセンブリ言語による最適化された実装が提供されることがあります。
Google Native Client (NaCl)
Google Native Client (NaCl) は、ウェブブラウザ内でネイティブコード(C/C++など)を安全に実行するための技術です。NaClは、サンドボックス環境を提供することで、悪意のあるコードがシステムにアクセスするのを防ぎつつ、ネイティブアプリケーションに近いパフォーマンスを実現することを目指していました。これにより、ウェブアプリケーションで高性能な処理(例:ゲーム、画像処理)を実行することが可能になります。 NaClは、特定のCPUアーキテクチャ(x86、ARMなど)向けにコンパイルされたコードを実行しますが、そのサンドボックスの制約により、通常のネイティブコードとは異なる実行環境や制約が存在します。
ARMアーキテクチャ
ARM(Advanced RISC Machine)は、モバイルデバイス(スマートフォン、タブレット)や組み込みシステムで広く使用されているCPUアーキテクチャです。低消費電力と高い性能効率が特徴で、RISC(Reduced Instruction Set Computer)設計に基づいています。ARMプロセッサは、様々な命令セット(例:ARMv7, ARMv8)とアドレッシングモード(メモリにアクセスする方法)を持っています。
アドレッシングモード
アドレッシングモードとは、CPUがメモリ上のデータにアクセスする際に、そのデータの物理アドレスをどのように計算するかを決定する方式のことです。例えば、ベースレジスタにオフセットを加算する「ベース+オフセットアドレッシング」や、レジスタの内容を直接アドレスとして使用する「レジスタ間接アドレッシング」など、様々な種類があります。 特定のCPUアーキテクチャや実行環境(この場合はNaClサンドボックス)では、セキュリティや設計上の理由から、一部のアドレッシングモードがサポートされていなかったり、制限されたりすることがあります。アセンブリコードがサポートされていないアドレッシングモードを使用しようとすると、実行時エラーやクラッシュの原因となります。
Goのビルドタグ (+build
ディレクティブ)
Go言語には、ソースコードのコンパイル時に特定のファイルを含めるか除外するかを制御するための「ビルドタグ」という仕組みがあります。これは、ファイルの先頭に// +build tag_name
のようなコメント行を記述することで実現されます。
複数のタグをスペースで区切って指定すると、それらのタグのいずれかが有効な場合にファイルがコンパイルされます(論理OR)。
カンマで区切ると、それらのタグがすべて有効な場合にファイルがコンパイルされます(論理AND)。
タグの前に!
を付けると、そのタグが無効な場合にファイルがコンパイルされます(論理NOT)。
例:
// +build linux darwin
: LinuxまたはmacOSでコンパイルされる。// +build go1.4,amd64
: Go 1.4以上かつAMD64アーキテクチャでコンパイルされる。// +build !windows
: Windows以外のOSでコンパイルされる。
このコミットでは、このビルドタグを巧みに利用して、nacl
環境かつarm
アーキテクチャの場合にのみ、アセンブリ実装を無効化し、参照実装を有効化しています。
技術的詳細
このコミットの技術的詳細は、Goのビルドシステムと、特定のプラットフォーム(nacl/arm
)におけるアセンブリコードの互換性の問題に集約されます。
-
問題の特定:
crypto/rc4
パッケージのアセンブリ実装(rc4_arm.s
)が、nacl/arm
環境でサポートされていないメモリアドレッシングモードを使用していることが判明しました。これは、NaClのサンドボックスが課す制約、またはARMアーキテクチャの特定の命令セットとNaClの組み合わせによるものです。アセンブリコードは非常に低レベルであり、特定のCPUの命令セットやアドレッシングモードに密接に依存するため、このような互換性の問題が発生しやすいです。 -
解決策: 問題のあるアセンブリコードを修正する代わりに、
nacl/arm
環境ではそのアセンブリコードをコンパイル対象から外し、代わりにGoで書かれた参照実装を使用するというアプローチが取られました。これは、アセンブリコードの修正が複雑であったり、NaClの制約を回避するのが困難であったりする場合に、現実的な解決策となります。パフォーマンスは若干低下する可能性がありますが、機能の正確性と安定性が優先されます。 -
Goビルドタグの活用: この解決策を実現するために、Goのビルドタグが使用されました。
rc4_arm.s
(ARMアセンブリ実装): ファイルの先頭に// +build !nacl
が追加されました。これにより、nacl
タグが有効な環境(つまりNaCl環境)では、このアセンブリファイルはコンパイルされなくなります。rc4_asm.go
(アセンブリ実装を有効にするためのGoファイル): ビルドタグが// +build amd64 amd64p32 arm 386
から// +build amd64 amd64p32 arm,!nacl 386
に変更されました。これは、「arm
アーキテクチャだが、nacl
環境ではない場合」にこのファイルがコンパイルされることを意味します。これにより、nacl/arm
環境ではこのファイルもコンパイル対象から外れ、アセンブリ実装がリンクされなくなります。rc4_ref.go
(参照実装): ビルドタグが// +build !amd64,!amd64p32,!arm,!386
から// +build !amd64,!amd64p32,!arm,!386 arm,nacl
に変更されました。これは、「amd64
,amd64p32
,arm
,386
のいずれでもない場合」に加えて、「arm
アーキテクチャかつnacl
環境の場合」にもこのファイルがコンパイルされることを意味します。これにより、nacl/arm
環境ではこの参照実装が選択的にコンパイルされ、使用されるようになります。
この変更により、Goコンパイラはビルドターゲットに応じて適切なRC4の実装を選択するようになり、nacl/arm
環境でのクラッシュが回避されます。
コアとなるコードの変更箇所
src/pkg/crypto/rc4/rc4_arm.s
--- a/src/pkg/crypto/rc4/rc4_arm.s
+++ b/src/pkg/crypto/rc4/rc4_arm.s
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build !nacl
+
#include "../../../cmd/ld/textflag.h"
// Registers
src/pkg/crypto/rc4/rc4_asm.go
--- a/src/pkg/crypto/rc4/rc4_asm.go
+++ b/src/pkg/crypto/rc4/rc4_asm.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build amd64 amd64p32 arm 386
+// +build amd64 amd64p32 arm,!nacl 386
package rc4
src/pkg/crypto/rc4/rc4_ref.go
--- a/src/pkg/crypto/rc4/rc4_ref.go
+++ b/src/pkg/crypto/rc4/rc4_ref.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build !amd64,!amd64p32,!arm,!386
+// +build !amd64,!amd64p32,!arm,!386 arm,nacl
package rc4
コアとなるコードの解説
このコミットの核心は、Goのビルドタグ(+build
ディレクティブ)を戦略的に変更することで、特定のビルドターゲット(nacl/arm
)に対して異なる実装を選択させる点にあります。
-
rc4_arm.s
(+build !nacl
):- このファイルはARMアーキテクチャ向けのアセンブリ言語によるRC4実装を含んでいます。
// +build !nacl
という行が追加されました。これは、「nacl
ビルドタグが設定されていない場合にのみ、このファイルをコンパイルに含める」という意味です。- 結果として、
nacl
環境でビルドされる際には、この最適化されたアセンブリ実装は無視され、コンパイル対象から外れます。
-
rc4_asm.go
(+build amd64 amd64p32 arm,!nacl 386
):- このファイルは、アセンブリ実装をGoコードから呼び出すためのラッパー関数や、アセンブリ実装が利用可能であることを示すためのGoコードを含んでいると推測されます。
- 元のタグ
// +build amd64 amd64p32 arm 386
は、これらのアーキテクチャでアセンブリ実装を有効にするためのものでした。 - 変更後のタグ
// +build amd64 amd64p32 arm,!nacl 386
は、arm
アーキテクチャの場合に「かつnacl
環境ではない場合」という条件が追加されています。 - これにより、
nacl/arm
環境ではこのファイルもコンパイル対象から外れ、アセンブリ実装への参照がなくなります。
-
rc4_ref.go
(+build !amd64,!amd64p32,!arm,!386 arm,nacl
):- このファイルは、Go言語で書かれたRC4の参照実装(純粋なGoコード)を含んでいます。これは、アセンブリ実装が利用できない場合のフォールバックとして機能します。
- 元のタグ
// +build !amd64,!amd64p32,!arm,!386
は、「上記のアセンブリ最適化が提供されているアーキテクチャ以外」でこの参照実装を使用するという意味でした。 - 変更後のタグ
// +build !amd64,!amd64p32,!arm,!386 arm,nacl
は、元の条件に加えて、「またはarm
アーキテクチャかつnacl
環境の場合」という条件が追加されています。 - この変更により、
nacl/arm
環境でビルドされる際には、この参照実装が明示的に選択され、コンパイルに含められるようになります。
これらのビルドタグの変更により、GoコンパイラはビルドターゲットのOS/アーキテクチャ情報に基づいて、RC4の適切な実装(最適化されたアセンブリ版か、安全な参照版か)を自動的に選択するようになります。特にnacl/arm
という特定の組み合わせに対して、互換性のないアセンブリコードの使用を回避し、安定した動作を保証しています。
関連リンク
- Go言語のビルドタグに関する公式ドキュメント(Go 1.4当時の情報に基づく):
- https://golang.org/cmd/go/#hdr-Build_constraints (現在のドキュメントですが、当時の概念も含まれます)
- Google Native Client (NaCl) の概要:
- https://developer.chrome.com/docs/native-client/ (現在は非推奨技術ですが、当時の背景理解に役立ちます)
- RC4暗号アルゴリズムに関する情報:
参考にした情報源リンク
- Go言語の公式ドキュメント
- Wikipedia (RC4, ARMアーキテクチャ, Google Native Client)
- Go言語のソースコードリポジトリ (コミット履歴と関連ファイル)
- Go言語のビルドタグに関する一般的な知識