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

[インデックス 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)におけるアセンブリコードの互換性の問題に集約されます。

  1. 問題の特定: crypto/rc4パッケージのアセンブリ実装(rc4_arm.s)が、nacl/arm環境でサポートされていないメモリアドレッシングモードを使用していることが判明しました。これは、NaClのサンドボックスが課す制約、またはARMアーキテクチャの特定の命令セットとNaClの組み合わせによるものです。アセンブリコードは非常に低レベルであり、特定のCPUの命令セットやアドレッシングモードに密接に依存するため、このような互換性の問題が発生しやすいです。

  2. 解決策: 問題のあるアセンブリコードを修正する代わりに、nacl/arm環境ではそのアセンブリコードをコンパイル対象から外し、代わりにGoで書かれた参照実装を使用するというアプローチが取られました。これは、アセンブリコードの修正が複雑であったり、NaClの制約を回避するのが困難であったりする場合に、現実的な解決策となります。パフォーマンスは若干低下する可能性がありますが、機能の正確性と安定性が優先されます。

  3. 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)に対して異なる実装を選択させる点にあります。

  1. rc4_arm.s (+build !nacl):

    • このファイルはARMアーキテクチャ向けのアセンブリ言語によるRC4実装を含んでいます。
    • // +build !naclという行が追加されました。これは、「naclビルドタグが設定されていない場合にのみ、このファイルをコンパイルに含める」という意味です。
    • 結果として、nacl環境でビルドされる際には、この最適化されたアセンブリ実装は無視され、コンパイル対象から外れます。
  2. 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環境ではこのファイルもコンパイル対象から外れ、アセンブリ実装への参照がなくなります。
  3. 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言語の公式ドキュメント
  • 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)におけるアセンブリコードの互換性の問題に集約されます。

  1. 問題の特定: crypto/rc4パッケージのアセンブリ実装(rc4_arm.s)が、nacl/arm環境でサポートされていないメモリアドレッシングモードを使用していることが判明しました。これは、NaClのサンドボックスが課す制約、またはARMアーキテクチャの特定の命令セットとNaClの組み合わせによるものです。アセンブリコードは非常に低レベルであり、特定のCPUの命令セットやアドレッシングモードに密接に依存するため、このような互換性の問題が発生しやすいです。

  2. 解決策: 問題のあるアセンブリコードを修正する代わりに、nacl/arm環境ではそのアセンブリコードをコンパイル対象から外し、代わりにGoで書かれた参照実装を使用するというアプローチが取られました。これは、アセンブリコードの修正が複雑であったり、NaClの制約を回避するのが困難であったりする場合に、現実的な解決策となります。パフォーマンスは若干低下する可能性がありますが、機能の正確性と安定性が優先されます。

  3. 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)に対して異なる実装を選択させる点にあります。

  1. rc4_arm.s (+build !nacl):

    • このファイルはARMアーキテクチャ向けのアセンブリ言語によるRC4実装を含んでいます。
    • // +build !naclという行が追加されました。これは、「naclビルドタグが設定されていない場合にのみ、このファイルをコンパイルに含める」という意味です。
    • 結果として、nacl環境でビルドされる際には、この最適化されたアセンブリ実装は無視され、コンパイル対象から外れます。
  2. 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環境ではこのファイルもコンパイル対象から外れ、アセンブリ実装への参照がなくなります。
  3. 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言語の公式ドキュメント
  • Wikipedia (RC4, ARMアーキテクチャ, Google Native Client)
  • Go言語のソースコードリポジトリ (コミット履歴と関連ファイル)
  • Go言語のビルドタグに関する一般的な知識