ecdsa

package
v1.23.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2024 License: MIT Imports: 5 Imported by: 0

Documentation

Overview

ecdsaパッケージは、FIPS 186-4およびSEC 1、バージョン2.0で定義されている楕円曲線デジタル署名アルゴリズムを実装しています。

このパッケージによって生成される署名は確定的ではありませんが、エントロピーは秘密鍵とメッセージと混合され、ランダム性源の故障の場合には同じレベルのセキュリティを実現します。

私有鍵を扱う操作は、elliptic.P224elliptic.P256elliptic.P384、または elliptic.P521 によって返される [elliptic.Curve]が使用される限り、定数時間アルゴリズムを使用して実装されています。

Example
package main

import (
	"github.com/shogo82148/std/crypto/ecdsa"
	"github.com/shogo82148/std/crypto/elliptic"
	"github.com/shogo82148/std/crypto/rand"
	"github.com/shogo82148/std/crypto/sha256"
	"github.com/shogo82148/std/fmt"
)

func main() {
	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)
}
Output:

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Sign

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

Sign は、ハッシュ(大きなメッセージのハッシュの結果である必要があります)をプライベートキー priv を使用して署名します。 もしハッシュがプライベートキーの曲線順序のビット長よりも長い場合、ハッシュはその長さに切り詰められます。 結果の署名は、2つの整数のペアとして返されます。ほとんどのアプリケーションでは、r, s と直接扱う代わりに SignASN1 を使用するべきです。

func SignASN1 added in v1.15.0

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は、公開鍵pubを使用してハッシュのr、sの署名を検証します。 戻り値は署名の有効性を記録します。ほとんどのアプリケーションでは、r、sと直接取り扱う代わりに、VerifyASN1を使用する必要があります。

入力は機密とはみなされず、タイミングのサイドチャネルを通じて、または攻撃者が入力の一部を制御している場合に漏洩する可能性があります。

func VerifyASN1 added in v1.15.0

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

VerifyASN1は公開鍵pubを使用してハッシュのASN.1エンコードされた署名sigを検証します。 返り値は署名が有効かどうかを示します。

入力は機密とはみなされず、タイミングのサイドチャネルを通じて、または攻撃者が入力の一部を制御している場合に漏洩する可能性があります。

Types

type PrivateKey

type PrivateKey struct {
	PublicKey
	D *big.Int
}

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

func GenerateKey

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

GenerateKeyは指定された曲線の新しいECDSA秘密鍵を生成します。

ほとんどのアプリケーションではrandとして[crypto/rand.Reader]を使用する必要があります。注意点として、randから読み取ったバイトに決定的な依存関係を持たない返された鍵は、呼び出し間やバージョン間で変更される可能性があります。

func (*PrivateKey) ECDH added in v1.20.0

func (k *PrivateKey) ECDH() (*ecdh.PrivateKey, error)

ECDHは ecdh.PrivateKey としてkを返します。キーが ecdh.Curve.NewPrivateKey の定義に従って無効である場合や、Curveが crypto/ecdh でサポートされていない場合はエラーを返します。

func (*PrivateKey) Equal added in v1.15.0

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

Equalはprivとxが同じ値を持つかどうかを報告します。

Curveが比較される方法の詳細については、 PublicKey.Equal を参照してください。

func (*PrivateKey) Public added in v1.4.0

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

Publicはprivに対応する公開鍵を返します。

func (*PrivateKey) Sign added in v1.4.0

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

privを使用してダイジェストに署名し、randからランダム性を読み取ります。opts引数 は現在は使用されていませんが、crypto.Signerインターフェースに準拠するために、 メッセージのダイジェストに使用されるハッシュ関数であるべきです。

このメソッドはcrypto.Signerを実装しており、たとえばハードウェアモジュールにプライベートパートが 保持されているキーをサポートするインターフェースです。一般的にはこのパッケージの SignASN1 関数を直接使用できます。

type PublicKey

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

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

func (*PublicKey) ECDH added in v1.20.0

func (k *PublicKey) ECDH() (*ecdh.PublicKey, error)

ECDHはkを[ecdh.PublicKey]として返します。もしキーが[ecdh.Curve.NewPublicKey]の定義に従って無効であるか、暗号/crypto/ecdhでサポートされていないCurveであればエラーが返されます。

func (*PublicKey) Equal added in v1.15.0

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

Equalは、pubとxが同じ値を持つかどうかを報告します。

2つのキーは、同じCurve値を持っている場合にのみ同じ値と見なされます。 elliptic.P256 とelliptic.P256().Params()は異なる値です。 後者は一般的な定数時間実装ではないためです。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL