Structs
PrivateKey
struct
#
PrivateKey is an ECDH private key, usually kept secret.
These keys can be parsed with [crypto/x509.ParsePKCS8PrivateKey] and encoded
with [crypto/x509.MarshalPKCS8PrivateKey]. For NIST curves, they then need to
be converted with [crypto/ecdsa.PrivateKey.ECDH] after parsing.
type PrivateKey struct {
curve Curve
privateKey []byte
publicKey *PublicKey
boring *boring.PrivateKeyECDH
fips *ecdh.PrivateKey
}
PublicKey
struct
#
PublicKey is an ECDH public key, usually a peer's ECDH share sent over the wire.
These keys can be parsed with [crypto/x509.ParsePKIXPublicKey] and encoded
with [crypto/x509.MarshalPKIXPublicKey]. For NIST curves, they then need to
be converted with [crypto/ecdsa.PublicKey.ECDH] after parsing.
type PublicKey struct {
curve Curve
publicKey []byte
boring *boring.PublicKeyECDH
fips *ecdh.PublicKey
}
nistCurve
struct
#
type nistCurve struct {
name string
generate func(io.Reader) (*ecdh.PrivateKey, error)
newPrivateKey func([]byte) (*ecdh.PrivateKey, error)
newPublicKey func(publicKey []byte) (*ecdh.PublicKey, error)
sharedSecret func(*ecdh.PrivateKey, *ecdh.PublicKey) (sharedSecret []byte, err error)
}
x25519Curve
struct
#
type x25519Curve struct {
}
Functions
Bytes
method
#
Bytes returns a copy of the encoding of the public key.
func (k *PublicKey) Bytes() []byte
Bytes
method
#
Bytes returns a copy of the encoding of the private key.
func (k *PrivateKey) Bytes() []byte
Curve
method
#
func (k *PrivateKey) Curve() Curve
Curve
method
#
func (k *PublicKey) Curve() Curve
ECDH
method
#
ECDH performs an ECDH exchange and returns the shared secret. The [PrivateKey]
and [PublicKey] must use the same curve.
For NIST curves, this performs ECDH as specified in SEC 1, Version 2.0,
Section 3.3.1, and returns the x-coordinate encoded according to SEC 1,
Version 2.0, Section 2.3.5. The result is never the point at infinity.
This is also known as the Shared Secret Computation of the Ephemeral Unified
Model scheme specified in NIST SP 800-56A Rev. 3, Section 6.1.2.2.
For [X25519], this performs ECDH as specified in RFC 7748, Section 6.1. If
the result is the all-zero value, ECDH returns an error.
func (k *PrivateKey) ECDH(remote *PublicKey) ([]byte, error)
Equal
method
#
Equal returns whether x represents the same private key as k.
Note that there can be equivalent private keys with different encodings which
would return false from this check but behave the same way as inputs to [ECDH].
This check is performed in constant time as long as the key types and their
curve match.
func (k *PrivateKey) Equal(x crypto.PrivateKey) bool
Equal
method
#
Equal returns whether x represents the same public key as k.
Note that there can be equivalent public keys with different encodings which
would return false from this check but behave the same way as inputs to ECDH.
This check is performed in constant time as long as the key types and their
curve match.
func (k *PublicKey) Equal(x crypto.PublicKey) bool
GenerateKey
method
#
func (c *nistCurve) GenerateKey(rand io.Reader) (*PrivateKey, error)
GenerateKey
method
#
func (c *x25519Curve) GenerateKey(rand io.Reader) (*PrivateKey, error)
NewPrivateKey
method
#
func (c *x25519Curve) NewPrivateKey(key []byte) (*PrivateKey, error)
NewPrivateKey
method
#
func (c *nistCurve) NewPrivateKey(key []byte) (*PrivateKey, error)
NewPublicKey
method
#
func (c *nistCurve) NewPublicKey(key []byte) (*PublicKey, error)
NewPublicKey
method
#
func (c *x25519Curve) NewPublicKey(key []byte) (*PublicKey, error)
P256
function
#
P256 returns a [Curve] which implements NIST P-256 (FIPS 186-3, section D.2.3),
also known as secp256r1 or prime256v1.
Multiple invocations of this function will return the same value, which can
be used for equality checks and switch statements.
func P256() Curve
P384
function
#
P384 returns a [Curve] which implements NIST P-384 (FIPS 186-3, section D.2.4),
also known as secp384r1.
Multiple invocations of this function will return the same value, which can
be used for equality checks and switch statements.
func P384() Curve
P521
function
#
P521 returns a [Curve] which implements NIST P-521 (FIPS 186-3, section D.2.5),
also known as secp521r1.
Multiple invocations of this function will return the same value, which can
be used for equality checks and switch statements.
func P521() Curve
Public
method
#
Public implements the implicit interface of all standard library private
keys. See the docs of [crypto.PrivateKey].
func (k *PrivateKey) Public() crypto.PublicKey
PublicKey
method
#
func (k *PrivateKey) PublicKey() *PublicKey
String
method
#
func (c *x25519Curve) String() string
String
method
#
func (c *nistCurve) String() string
X25519
function
#
X25519 returns a [Curve] which implements the X25519 function over Curve25519
(RFC 7748, Section 5).
Multiple invocations of this function will return the same value, so it can
be used for equality checks and switch statements.
func X25519() Curve
ecdh
method
#
func (c *nistCurve) ecdh(local *PrivateKey, remote *PublicKey) ([]byte, error)
ecdh
method
#
func (c *x25519Curve) ecdh(local *PrivateKey, remote *PublicKey) ([]byte, error)
isZero
function
#
isZero reports whether x is all zeroes in constant time.
func isZero(x []byte) bool
x25519ScalarMult
function
#
func x25519ScalarMult(dst []byte, scalar []byte, point []byte)