...

パッケージ ecdsa

import "crypto/ecdsa"
概要
目次

概要 ▾

ecdsa パッケージは,FIPS 186-3 で定義された楕円曲線デジタル署名アルゴリズム (Elliptic Curve Digital Signature Algorithm) を実装します。

この実装は ChopMD(256, SHA2-512(priv.D || エントロピー || ハッシュ)) をキーとする AES-CTR CSPRNG からノンスを導出します。 CSPRNG キーは, Coron の成果による IRO です。 AES-CTR ストリームは標準的な前提の下では IRO です。

コード:

privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
    panic(err)
}

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

r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:])
if err != nil {
    panic(err)
}
fmt.Printf("signature: (0x%x, 0x%x)\n", r, s)

valid := ecdsa.Verify(&privateKey.PublicKey, hash[:], r, s)
fmt.Println("signature verified:", valid)

func Sign

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

Sign は,秘密鍵 priv を使用してハッシュ (より大きなメッセージをハッシュした結果であるはずです) に署名します。 ハッシュが秘密鍵の曲線順序のビット長より長い場合,ハッシュはその長さに切り捨てられます。 署名を整数のペアとして返します。 秘密鍵の安全性は rand のエントロピーに依存します。

func Verify

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

Verify は,公開鍵 pub を使用してハッシュの r, s 内の署名を検証します。 その戻り値は署名が有効かどうかを記録します。

type PrivateKey

PrivateKey は ECDSA の秘密鍵を表します。

type PrivateKey struct {
    PublicKey
    D *big.Int
}

func GenerateKey

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

GenerateKey は公開鍵と秘密鍵のペアを生成します。

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 は, rand からランダム性を読み取って priv でダイジェストを署名します。 opts 引数は現在使用されていませんが, crypto.Signer インターフェースに合わせて,メッセージをダイジェストするために使用されるハッシュ関数であるべきです。

このメソッドは crypto.Signer を実装します。 これは,秘密の部分が,例えばハードウェアモジュールなどに保存されている場合にキーをサポートするためのインターフェースです。 一般的な用途では,このパッケージの Sign 関数を直接使用してください。

type PublicKey

PublicKey は ECDSA 公開鍵を表します。

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