Пакет ecdsa
Обзор
Пакет ecdsa реализует алгоритм Эллиптической кривой цифровой подписи, как определено в FIPS 186-4 и SEC 1, Версия 2.0.
Подписи, сгенерированные этим пакетом, не являются детерминированными, но энтропия смешивается с закрытым ключом и сообщением, достигая того же уровня безопасности в случае отказа источника случайности.
Операции, связанные с закрытыми ключами, реализованы с использованием алгоритмов постоянного времени, при условии, что используется elliptic.Curve, возвращаемый elliptic.P224, elliptic.P256, elliptic.P384 или elliptic.P521.
Пример
Код:
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
panic(err)
}
msg := "hello, world"
hash := sha256.Sum256([]byte(msg))
sig, err := ecdsa.SignASN1(rand.Reader, privateKey, hash[:])
if err != nil {
panic(err)
}
fmt.Printf("signature: %x\n", sig)
valid := ecdsa.VerifyASN1(&privateKey.PublicKey, hash[:], sig)
fmt.Println("signature verified:", valid)
Индекс
Примеры
Файлы пакета
ecdsa.go ecdsa_legacy.go ecdsa_noasm.go notboring.go
func Sign
func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error)
Sign подписывает хэш (который должен быть результатом хэширования большего сообщения) с помощью закрытого ключа, priv. Если хэш длиннее, чем длина в битах порядка кривой закрытого ключа, хэш будет усечен до этой длины. Возвращает подпись как пару целых чисел. Большинство приложений должны использовать SignASN1 вместо работы напрямую с r, s.
func SignASN1 1.15
func SignASN1(rand io.Reader, priv *PrivateKey, hash []byte) ([]byte, error)
SignASN1 подписывает хэш (который должен быть результатом хэширования большего сообщения) с помощью закрытого ключа, priv. Если хэш длиннее, чем длина в битах порядка кривой закрытого ключа, хэш будет усечен до этой длины. Возвращает подпись в формате ASN.1.
Подпись случайная. Большинство приложений должны использовать crypto/rand.Reader в качестве rand. Обратите внимание, что возвращаемая подпись не зависит детерминированно от байтов, считанных из rand, и может меняться между вызовами и/или между версиями.
func Verify
func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool
Verify проверяет подпись в r, s хэша с использованием открытого ключа, pub. Его возвращаемое значение записывает, является ли подпись действительной. Большинство приложений должны использовать VerifyASN1 вместо работы напрямую с r, s.
Вводные данные не считаются конфиденциальными и могут утечь через временные каналы, или если у злоумышленника есть контроль над частью входных данных.
func VerifyASN1 1.15
func VerifyASN1(pub *PublicKey, hash, sig []byte) bool
VerifyASN1 проверяет подпись в формате ASN.1, sig, хэша с использованием открытого ключа, pub. Его возвращаемое значение записывает, является ли подпись действительной.
Вводные данные не считаются конфиденциальными и могут утечь через временные каналы, или если у злоумышленника есть контроль над частью входных данных.
тип PrivateKey
PrivateKey представляет собой закрытый ключ ECDSA.
type PrivateKey struct {
PublicKey
D *big.Int
}
func GenerateKey
func GenerateKey(c elliptic.Curve, rand io.Reader) (*PrivateKey, error)
GenerateKey генерирует новый закрытый ключ ECDSA для указанной кривой.
Большинство приложений должны использовать crypto/rand.Reader в качестве rand. Обратите внимание, что возвращаемый ключ не зависит детерминированно от байтов, считанных из rand, и может меняться между вызовами и/или между версиями.
func (*PrivateKey) ECDH 1.20
func (k *PrivateKey) ECDH() (*ecdh.PrivateKey, error)
ECDH возвращает k в виде ecdh.PrivateKey. Возвращает ошибку, если ключ недействителен согласно определению ecdh.Curve.NewPrivateKey, или если кривая не поддерживается crypto/ecdh.
func (*PrivateKey) Equal 1.15
func (priv *PrivateKey) Equal(x crypto.PrivateKey) bool
Equal сообщает, имеют ли priv и x одинаковое значение.
См. PublicKey.Equal для получения подробностей о том, как сравнивается кривая.
func (*PrivateKey) Public 1.4
func (priv *PrivateKey) Public() crypto.PublicKey
Public возвращает открытый ключ, соответствующий priv.
func (*PrivateKey) Sign 1.4
func (priv *PrivateKey) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error)
Sign подписывает digest с помощью priv, читая случайность из rand. Аргумент opts в данный момент не используется, но, в соответствии с интерфейсом crypto.Signer, должен представлять функцию хеширования, используемую для хэширования сообщения.
Этот метод реализует crypto.Signer, который является интерфейсом для поддержки ключей, где частная часть хранится, например, в аппаратном модуле. Общие случаи использования могут напрямую использовать функцию SignASN1 в этом пакете.
тип PublicKey
PublicKey представляет собой открытый ключ ECDSA.
type PublicKey struct {
elliptic.Curve
X, Y *big.Int
}
func (*PublicKey) ECDH 1.20
func (k *PublicKey) ECDH() (*ecdh.PublicKey, error)
ECDH возвращает k как ecdh.PublicKey. Возвращает ошибку, если ключ недействителен согласно определению ecdh.Curve.NewPublicKey, или если кривая не поддерживается crypto/ecdh.
func (*PublicKey) Equal 1.15
func (pub *PublicKey) Equal(x crypto.PublicKey) bool
Equal сообщает, имеют ли pub и x одинаковое значение.
Два ключа считаются одинаковыми только в том случае, если у них одинаковое значение Curve. Обратите внимание, что, например, elliptic.P256 и elliptic.P256().Params() имеют разные значения, так как последнее является обобщенной, а не реализацией постоянного времени.
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/crypto/ecdsa/