Documentation
¶
Overview ¶
ecdsaパッケージは、FIPS 186-5で定義されている楕円曲線デジタル署名アルゴリズムを実装します。
このパッケージによって生成される署名は確定的ではありませんが、エントロピーは秘密鍵とメッセージと混合され、ランダム性源の故障の場合には同じレベルのセキュリティを実現します。
秘密鍵を扱う操作は、elliptic.P224、elliptic.P256、elliptic.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 ¶
- func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error)
- func SignASN1(r io.Reader, priv *PrivateKey, hash []byte) ([]byte, error)
- func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool
- func VerifyASN1(pub *PublicKey, hash, sig []byte) bool
- type PrivateKey
- func (priv *PrivateKey) Bytes() ([]byte, error)
- func (priv *PrivateKey) ECDH() (*ecdh.PrivateKey, error)
- func (priv *PrivateKey) Equal(x crypto.PrivateKey) bool
- func (priv *PrivateKey) Public() crypto.PublicKey
- func (priv *PrivateKey) Sign(random io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error)
- type PublicKey
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Sign ¶
Signは、秘密鍵privを使用してハッシュ(より大きなメッセージをハッシュした結果である必要があります)に署名します。 ハッシュが秘密鍵の曲線位数のビット長より長い場合、ハッシュはその長さに切り詰められます。 署名は整数のペアとして返されます。ほとんどのアプリケーションでは、r、sと直接取り扱う代わりに SignASN1 を使用する必要があります。
署名はランダム化されます。Go 1.26以降、安全なランダムバイトソースが常に使用され、 GODEBUG=cryptocustomrand=1が設定されない限りReaderは無視されます。 この設定は将来のGoリリースで削除されます。代わりに testing/cryptotest.SetGlobalRandom を使用してください。
func SignASN1 ¶ added in v1.15.0
SignASN1は、大きなメッセージをハッシュ化した結果であるハッシュに対して、 秘密鍵privを使用して署名します。ハッシュが秘密鍵の曲線順序のビット長よりも長い場合、 ハッシュはその長さに切り詰められます。ASN.1エンコードされた署名を返します。
署名はランダム化されます。Go 1.26以降、安全なランダムバイトソースが常に使用され、 Readerは無視されます。GODEBUG=cryptocustomrand=1が設定されている場合を除きます。 この設定は将来のGoリリースで削除されます。代わりに testing/cryptotest.SetGlobalRandom を使用してください。
func Verify ¶
Verifyは、公開鍵pubを使用してハッシュのr、sの署名を検証します。 戻り値は署名の有効性を記録します。ほとんどのアプリケーションでは、r、sと直接取り扱う代わりに、VerifyASN1を使用する必要があります。
入力は機密とはみなされず、タイミングのサイドチャネルを通じて、または攻撃者が入力の一部を制御している場合に漏洩する可能性があります。
func VerifyASN1 ¶ added in v1.15.0
VerifyASN1は公開鍵pubを使用してハッシュのASN.1エンコードされた署名sigを検証します。 返り値は署名が有効かどうかを示します。
入力は機密とはみなされず、タイミングのサイドチャネルを通じて、または攻撃者が入力の一部を制御している場合に漏洩する可能性があります。
Types ¶
type PrivateKey ¶
type PrivateKey struct {
PublicKey
// Dは秘密スカラー値です。
//
// 生の値を変更すると無効なキーが生成される可能性があり、内部最適化が
// 無効になる可能性があります。さらに、[big.Int] メソッドは暗号値の操作には
// 適していません。PrivateKey値をエンコード・デコードするには、[PrivateKey.Bytes] と
// [ParseRawPrivateKey]、または [crypto/x509.MarshalPKCS8PrivateKey] と
// [crypto/x509.ParsePKCS8PrivateKey] を使用してください。ECDHには [crypto/ecdh] を使用してください。
//
// このフィールドはGo 1.26で非推奨になります。
D *big.Int
}
PrivateKeyはECDSA秘密鍵を表します。
func GenerateKey ¶
GenerateKeyは指定された曲線の新しいECDSA秘密鍵を生成します。
Go 1.26以降、安全なランダムバイトソースが常に使用され、GODEBUG=cryptocustomrand=1が 設定されない限りReaderは無視されます。この設定は将来のGoリリースで削除されます。 代わりに testing/cryptotest.SetGlobalRandom を使用してください。
func ParseRawPrivateKey ¶ added in v1.25.0
func ParseRawPrivateKey(curve elliptic.Curve, data []byte) (*PrivateKey, error)
ParseRawPrivateKeyは、SEC 1, Version 2.0, Section 2.3.6に従って、 固定長のビッグエンディアン整数としてエンコードされた秘密鍵を解析します(raw形式と呼ばれることもあります)。 値が曲線の位数を法として縮約されていない場合、またはゼロの場合はエラーを返します。
curveは[elliptic.P224]、elliptic.P256、elliptic.P384、または elliptic.P521 のいずれかである必要があり、そうでなければParseRawPrivateKeyはエラーを返します。
ParseRawPrivateKeyは、NIST曲線に対して ecdh.Curve.NewPrivateKey と同じ形式を受け入れますが、 ecdh.PrivateKey の代わりに PrivateKey を返します。
秘密鍵は通常ASN.1またはPKCS#8形式でエンコードされており、 crypto/x509.ParseECPrivateKey または crypto/x509.ParsePKCS8PrivateKey(および encoding/pem)で解析できることに注意してください。
func (*PrivateKey) Bytes ¶ added in v1.25.0
func (priv *PrivateKey) Bytes() ([]byte, error)
BytesはSEC 1, Version 2.0, Section 2.3.6に従って、秘密鍵を固定長のビッグエンディアン整数として エンコードします(raw形式と呼ばれることもあります)。秘密鍵が無効な場合はエラーを返します。
PrivateKey.Curveは[elliptic.P224]、elliptic.P256、 elliptic.P384、または elliptic.P521 のいずれかである必要があり、そうでなければBytesはエラーを返します。
BytesはNIST曲線に対して ecdh.PrivateKey.Bytes と同じ形式を返します。
秘密鍵は通常ASN.1またはPKCS#8形式でエンコードされており、 crypto/x509.MarshalECPrivateKey または crypto/x509.MarshalPKCS8PrivateKey(および encoding/pem)で生成できることに注意してください。
func (*PrivateKey) ECDH ¶ added in v1.20.0
func (priv *PrivateKey) ECDH() (*ecdh.PrivateKey, error)
ECDHは、kを ecdh.PrivateKey として返します。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(random io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error)
Signは秘密鍵privを使用してハッシュ(opts.HashFunc()で大きなメッセージをハッシュ化した結果であるべき)に署名します。 ハッシュが秘密鍵の曲線位数のビット長よりも長い場合、ハッシュはその長さに切り詰められます。 SignASN1 と同様に、ASN.1エンコードされた署名を返します。
randomがnilでない場合、署名はランダム化されます。ほとんどのアプリケーションでは randomとして[crypto/rand.Reader]を使用する必要がありますが、GODEBUG=cryptocustomrand=1が 設定されない限り、安全なランダムバイトソースが常に使用され、実際のReaderは無視されます。 GODEBUG設定は将来のGoリリースで削除されます。代わりに[testing/cryptotest.SetGlobalRandom]を 使用してください。
randomがnilの場合、SignはRFC 6979に従って決定論的署名を生成します。 決定論的署名を生成する場合、opts.HashFunc()はdigestの生成に使用された関数である必要があり、 priv.Curveは elliptic.P224、elliptic.P256、elliptic.P384、または elliptic.P521 の いずれかである必要があります。
type PublicKey ¶
type PublicKey struct {
elliptic.Curve
// X, Yは公開鍵の点の座標です。
//
// 生の座標を変更すると無効なキーが生成される可能性があり、内部最適化が
// 無効になる可能性があります。さらに、[big.Int] メソッドは暗号値の操作には
// 適していません。PublicKey値をエンコード・デコードするには、[PublicKey.Bytes] と
// [ParseUncompressedPublicKey]、または [crypto/x509.MarshalPKIXPublicKey] と
// [crypto/x509.ParsePKIXPublicKey] を使用してください。ECDHには [crypto/ecdh] を使用し、
// 低レベルの楕円曲線操作には filippo.io/nistec のようなサードパーティモジュールを使用してください。
//
// これらのフィールドはGo 1.26で非推奨になります。
X, Y *big.Int
}
PublicKeyはECDSA公開鍵を表します。
func ParseUncompressedPublicKey ¶ added in v1.25.0
ParseUncompressedPublicKeyは、SEC 1, Version 2.0, Section 2.3.3に従って 非圧縮ポイントとしてエンコードされた公開鍵を解析します(X9.62非圧縮形式とも呼ばれます)。 ポイントが非圧縮形式でない場合、曲線上にない場合、または無限遠点の場合はエラーを返します。
curveは elliptic.P224、elliptic.P256、elliptic.P384、または elliptic.P521 のいずれかである必要があり、そうでなければParseUncompressedPublicKeyはエラーを返します。
ParseUncompressedPublicKeyは、NIST曲線に対して ecdh.Curve.NewPublicKey と同じ形式を受け入れますが、 ecdh.PublicKey の代わりに PublicKey を返します。
公開鍵は通常DER(またはPEM)形式でエンコードされており、 crypto/x509.ParsePKIXPublicKey(および encoding/pem)で解析できることに注意してください。
func (*PublicKey) Bytes ¶ added in v1.25.0
BytesはSEC 1, Version 2.0, Section 2.3.3に従って、公開鍵を非圧縮ポイントとして エンコードします(X9.62非圧縮形式とも呼ばれます)。 公開鍵が無効な場合はエラーを返します。
PublicKey.Curveは elliptic.P224、elliptic.P256、 elliptic.P384、または elliptic.P521 のいずれかである必要があり、そうでなければBytesはエラーを返します。
BytesはNIST曲線に対して ecdh.PublicKey.Bytes と同じ形式を返します。
公開鍵は通常DER(またはPEM)形式でエンコードされており、 crypto/x509.MarshalPKIXPublicKey(および encoding/pem)で生成できることに注意してください。
func (*PublicKey) ECDH ¶ added in v1.20.0
ECDHは、kを ecdh.PublicKey として返します。ecdh.Curve.NewPublicKey の定義に従って キーが無効な場合、またはCurveがcrypto/ecdhでサポートされていない場合はエラーを返します。