Commit 850e55b8 authored by Russ Cox's avatar Russ Cox

crypto/*: document use or non-use of constant-time algorithms

Fixes #16821.

Change-Id: I63d5f3d7cfba1c76259912d754025c5f3cbe4a56
Reviewed-on: https://go-review.googlesource.com/31573
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent bc075e61
...@@ -4,6 +4,13 @@ ...@@ -4,6 +4,13 @@
// Package aes implements AES encryption (formerly Rijndael), as defined in // Package aes implements AES encryption (formerly Rijndael), as defined in
// U.S. Federal Information Processing Standards Publication 197. // U.S. Federal Information Processing Standards Publication 197.
//
// The AES operations in this package are not implemented using constant-time algorithms.
// An exception is when running on systems with enabled hardware support for AES
// that makes these operations constant-time. Examples include amd64 systems using AES-NI
// extensions and s390x systems using Message-Security-Assist extensions.
// On such systems, when the result of NewCipher is passed to cipher.NewGCM,
// the GHASH operation used by GCM is also constant-time.
package aes package aes
// This file contains AES constants - 8720 bytes of initialized data. // This file contains AES constants - 8720 bytes of initialized data.
......
...@@ -74,6 +74,10 @@ type gcm struct { ...@@ -74,6 +74,10 @@ type gcm struct {
// NewGCM returns the given 128-bit, block cipher wrapped in Galois Counter Mode // NewGCM returns the given 128-bit, block cipher wrapped in Galois Counter Mode
// with the standard nonce length. // with the standard nonce length.
//
// In general, the GHASH operation performed by this implementation of GCM is not constant-time.
// An exception is when the underlying Block was created by aes.NewCipher
// on systems with hardware support for AES. See the crypto/aes package documentation for details.
func NewGCM(cipher Block) (AEAD, error) { func NewGCM(cipher Block) (AEAD, error) {
return NewGCMWithNonceSize(cipher, gcmStandardNonceSize) return NewGCMWithNonceSize(cipher, gcmStandardNonceSize)
} }
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// Package dsa implements the Digital Signature Algorithm, as defined in FIPS 186-3. // Package dsa implements the Digital Signature Algorithm, as defined in FIPS 186-3.
//
// The DSA operations in this package are not implemented using constant-time algorithms.
package dsa package dsa
import ( import (
......
...@@ -367,18 +367,24 @@ func initP521() { ...@@ -367,18 +367,24 @@ func initP521() {
} }
// P256 returns a Curve which implements P-256 (see FIPS 186-3, section D.2.3) // P256 returns a Curve which implements P-256 (see FIPS 186-3, section D.2.3)
//
// The cryptographic operations are implemented using constant-time algorithms.
func P256() Curve { func P256() Curve {
initonce.Do(initAll) initonce.Do(initAll)
return p256 return p256
} }
// P384 returns a Curve which implements P-384 (see FIPS 186-3, section D.2.4) // P384 returns a Curve which implements P-384 (see FIPS 186-3, section D.2.4)
//
// The cryptographic operations do not use constant-time algorithms.
func P384() Curve { func P384() Curve {
initonce.Do(initAll) initonce.Do(initAll)
return p384 return p384
} }
// P521 returns a Curve which implements P-521 (see FIPS 186-3, section D.2.5) // P521 returns a Curve which implements P-521 (see FIPS 186-3, section D.2.5)
//
// The cryptographic operations do not use constant-time algorithms.
func P521() Curve { func P521() Curve {
initonce.Do(initAll) initonce.Do(initAll)
return p521 return p521
......
...@@ -35,7 +35,9 @@ func initP224() { ...@@ -35,7 +35,9 @@ func initP224() {
p224FromBig(&p224.b, p224.B) p224FromBig(&p224.b, p224.B)
} }
// P224 returns a Curve which implements P-224 (see FIPS 186-3, section D.2.2) // P224 returns a Curve which implements P-224 (see FIPS 186-3, section D.2.2).
//
// The cryptographic operations are implemented using constant-time algorithms.
func P224() Curve { func P224() Curve {
initonce.Do(initAll) initonce.Do(initAll)
return p224 return p224
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
// with v1.5/OAEP and signing/verifying with v1.5/PSS. If one needs to abstract // with v1.5/OAEP and signing/verifying with v1.5/PSS. If one needs to abstract
// over the public-key primitive, the PrivateKey struct implements the // over the public-key primitive, the PrivateKey struct implements the
// Decrypter and Signer interfaces from the crypto package. // Decrypter and Signer interfaces from the crypto package.
//
// The RSA operations in this package are not implemented using constant-time algorithms.
package rsa package rsa
import ( import (
......
...@@ -404,8 +404,11 @@ func (x *Int) BitLen() int { ...@@ -404,8 +404,11 @@ func (x *Int) BitLen() int {
// Exp sets z = x**y mod |m| (i.e. the sign of m is ignored), and returns z. // Exp sets z = x**y mod |m| (i.e. the sign of m is ignored), and returns z.
// If y <= 0, the result is 1 mod |m|; if m == nil or m == 0, z = x**y. // If y <= 0, the result is 1 mod |m|; if m == nil or m == 0, z = x**y.
// See Knuth, volume 2, section 4.6.3. //
// Modular exponentation of inputs of a particular size is not a
// cryptographically constant-time operation.
func (z *Int) Exp(x, y, m *Int) *Int { func (z *Int) Exp(x, y, m *Int) *Int {
// See Knuth, volume 2, section 4.6.3.
var yWords nat var yWords nat
if !y.neg { if !y.neg {
yWords = y.abs yWords = y.abs
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment