3. Implementation Advice (実装上の助言)
3. Implementation Advice (実装上の助言)
ChaCha20 の各ブロックは, 状態のロードに 16 回の move 操作と 1 回の increment 操作, ラウンドに XOR, 加算, roll 操作をそれぞれ 80 回ずつ, 平文の保護にさらに加算 16 回と XOR 16 回を要する。第 2.3 節は ChaCha ブロック関数を "adding the original input words" (元の入力語を加える) と説明している。これは, ChaCha 状態でラウンドを始める前に状態を脇にコピーし, 後で加え戻すことを意味する。これは正しいが, 代わりに状態をコピーしてそのコピー上で処理すれば, いくらかの操作を省略できる。こうすると次のブロックでは状態を作り直す必要はなく, ブロックカウンタを増やすだけでよい。これによりサイクル数を約 5.5% 節約できる。
Poly1305 の算術演算に, OpenSSL にあるような汎用の多倍長整数ライブラリを使うことは推奨されない。そのようなライブラリは任意サイズの整数を扱うために動的割り当てを用いるが, その柔軟性は性能とサイドチャネル安全性の犠牲を伴う。定数時間で動作するより効率的な実装が利用可能であり, その一つが D. J. Bernstein 自身のライブラリ NaCl ([NaCl]) である。定数時間だが最適ではない方法として, 288 ビット整数の算術を素朴に実装する方法がある。素朴な実装でも (acc+block) と r の乗算で 2^288 を超えないからである。効率的な定数時間実装は, パブリックドメインのライブラリ poly1305-donna ([Poly1305_Donna]) にある。