• import "crypto/ecdsa"
  • Visión general
  • Índice
  • Ejemplos de

Visión general

El paquete ecdsa implementa el algoritmo de firma digital de curva elíptica, como se define en FIPS 186-3.

Esta implementación deriva el nonce de un AES-CTR CSPRNG codificado por:

SHA2-512 (priv.D || entropía || hash)[:32]

El CSPRNG key es indiferenciable de un oráculo aleatorio como se muestra en [Coron], el flujo AES-CTR es indiferenciable de un oráculo aleatorio bajo supuestos criptográficos estándar (ver [Larsson] por ejemplo).

Referencias:

[Coron]
  https://cs.nyu.edu/~dodis/ps/merkle.pdf
[Larsson]
  https://www.nada.kth.se/kurser/kth/2D1441/semteo03/lecturenotes/assump.pdf

Ejemplo

package main

import("crypto/ecdsa""crypto/elliptic""crypto/rand""crypto/sha256""fmt")funcmain()
	privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)if err !=nilpanic(err)

	msg :="hello, world"
	hash := sha256.Sum256([]byte(msg))

	sig, err := ecdsa.SignASN1(rand.Reader, privateKey, hash[:])if err !=nilpanic(err)
	fmt.Printf("signature: %xn", sig)

	valid := ecdsa.VerifyASN1(&privateKey.PublicKey, hash[:], sig)
	fmt.Println("signature verified:", valid)

Índice

  • func Sign (rand io.Reader, priv * PrivateKey, hash []byte) (r, s * big.Int, err error)
  • func SignASN1 (rand io.Reader, priv * PrivateKey, hash []byte) ([]byte, error)
  • func Verify (pub * PublicKey, hash []byte, r, s * grande. bool
  • func VerifyASN1 (pub * PublicKey, hash, sig []byte) bool
  • tipo PrivateKey
  • func GenerateKey (c elliptic.Curve, rand io.Reader) (* PrivateKey, error)
  • func (priv * PrivateKey) Igual (x crypto.PrivateKey) bool
  • func (priv * PrivateKey) Public () crypto.PublicKey
  • func (priv * PrivateKey) Signo (rand io.Reader, digest []byte, opta por crypto.SignerOpts) ([]byte, error)
  • tipo PublicKey
  • func (pub * PublicKey) Igual (x crypto.PublicKey) bool

Ejemplos de

Paquete

Archivos de paquete

ecdsa.goecdsa_noasm.go

func signoFuente

funcSign(rand io.Reader, priv *PrivateKey, hash []byte)(r, s *big.Int, err error)

Sign firma un hash (que debería ser el resultado de aplicar un hash a un mensaje más grande) usando el key, priv. Si el hash es más largo que la longitud de bits del privado keyEn el orden de la curva, el hash se truncará a esa longitud. Devuelve la firma como un par de números enteros. La seguridad de lo privado key depende de la entropía de rand.

func SignASN1Fuente1,15

funcSignASN1(rand io.Reader, priv *PrivateKey, hash []byte)([]byte,error)

SignASN1 firma un hash (que debería ser el resultado de aplicar un hash a un mensaje más grande) usando el key, priv. Si el hash es más largo que la longitud de bits del privado keyEn el orden de la curva, el hash se truncará a esa longitud. Devuelve la firma codificada ASN.1. La seguridad de lo privado key depende de la entropía de rand.

func VerificarFuente

funcVerify(pub *PublicKey, hash []byte, r, s *big.Int)bool

Verify verifica la firma en r, s de hash usando el público key, pub. Su valor de retorno registra si la firma es válida.

func VerifyASN1Fuente1,15

funcVerifyASN1(pub *PublicKey, hash, sig []byte)bool

VerifyASN1 verifica la firma codificada de ASN.1, sig, de hash utilizando el público key, pub. Su valor de retorno registra si la firma es válida.

tipo PrivateKeyFuente

PrivateKey representa un ECDSA privado key.

type PrivateKey struct
    PublicKey
    D *big.Int

func GenerateKeyFuente

funcGenerateKey(c elliptic.Curve, rand io.Reader)(*PrivateKey,error)

GenerateKey genera un público y un privado key par.

func (* PrivateKey) IgualFuente1,15

func(priv *PrivateKey)Equal(x crypto.PrivateKey)bool

Igual informa si priv y x tienen el mismo valor.

Consulte PublicKey.Equal para obtener detalles sobre cómo se compara Curve.

func (* PrivateKey) PúblicoFuente1.4

func(priv *PrivateKey)Public() crypto.PublicKey

Público devuelve el público key correspondiente a priv.

Func (* PrivateKey) FirmarFuente1.4

func(priv *PrivateKey)Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts)([]byte,error)

Los signos de los signos se digieren con priv, leyendo aleatoriedad de rand. El argumento opts no se usa actualmente pero, de acuerdo con la interfaz crypto.Signer, debería ser la función hash utilizada para digerir el mensaje.

Este método implementa crypto.Signer, que es una interfaz para admitir keys donde la parte privada se guarda, por ejemplo, en un módulo de hardware. Los usos comunes deben usar la función Firmar en este paquete directamente.

tipo PublicKeyFuente

PublicKey representa un público ECDSA key.

type PublicKey struct
    elliptic.Curve
    X, Y *big.Int

func (* PublicKey) IgualFuente1,15

func(pub *PublicKey)Equal(x crypto.PublicKey)bool

Igual informa si pub y x tienen el mismo valor.

Dos keys solo se considera que tienen el mismo valor si tienen el mismo valor de Curva. Tenga en cuenta que, por ejemplo, elliptic.P256 () y elliptic.P256 (). Params () son valores diferentes, ya que este último es una implementación de tiempo genérico no constante.