github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/crypto/ecdsa/ecdsa.go (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // パッケージecdsaは、FIPS 186-4およびSEC 1、バージョン2.0で定義されている楕円曲線デジタル署名アルゴリズムを実装しています。
     6  //
     7  // このパッケージによって生成される署名は確定的ではありませんが、エントロピーは秘密鍵とメッセージと混合され、ランダム性源の故障の場合には同じレベルのセキュリティを実現します。
     8  package ecdsa
     9  
    10  import (
    11  	"github.com/shogo82148/std/crypto"
    12  	"github.com/shogo82148/std/crypto/ecdh"
    13  	"github.com/shogo82148/std/crypto/elliptic"
    14  	"github.com/shogo82148/std/io"
    15  	"github.com/shogo82148/std/math/big"
    16  )
    17  
    18  // PublicKeyはECDSA公開鍵を表します。
    19  type PublicKey struct {
    20  	elliptic.Curve
    21  	X, Y *big.Int
    22  }
    23  
    24  // ECDHはkを[ecdh.PublicKey]として返します。もしキーが[ecdh.Curve.NewPublicKey]の定義に従って無効であるか、暗号/crypto/ecdhでサポートされていないCurveであればエラーが返されます。
    25  func (k *PublicKey) ECDH() (*ecdh.PublicKey, error)
    26  
    27  // Equalは、pubとxが同じ値を持つかどうかを報告します。
    28  //
    29  // 2つのキーは、同じCurve値を持っている場合にのみ同じ値と見なされます。
    30  // [elliptic.P256] とelliptic.P256().Params()は異なる値です。
    31  // 後者は一般的な定数時間実装ではないためです。
    32  func (pub *PublicKey) Equal(x crypto.PublicKey) bool
    33  
    34  // PrivateKeyはECDSAの秘密鍵を表します。
    35  type PrivateKey struct {
    36  	PublicKey
    37  	D *big.Int
    38  }
    39  
    40  // ECDHは [ecdh.PrivateKey] としてkを返します。キーが [ecdh.Curve.NewPrivateKey] の定義に従って無効である場合や、Curveが [crypto/ecdh] でサポートされていない場合はエラーを返します。
    41  func (k *PrivateKey) ECDH() (*ecdh.PrivateKey, error)
    42  
    43  // Publicはprivに対応する公開鍵を返します。
    44  func (priv *PrivateKey) Public() crypto.PublicKey
    45  
    46  // Equalはprivとxが同じ値を持つかどうかを報告します。
    47  //
    48  // Curveが比較される方法の詳細については、 [PublicKey.Equal] を参照してください。
    49  func (priv *PrivateKey) Equal(x crypto.PrivateKey) bool
    50  
    51  // privを使用してダイジェストに署名し、randからランダム性を読み取ります。opts引数
    52  // は現在は使用されていませんが、crypto.Signerインターフェースに準拠するために、
    53  // メッセージのダイジェストに使用されるハッシュ関数であるべきです。
    54  //
    55  // このメソッドはcrypto.Signerを実装しており、たとえばハードウェアモジュールにプライベートパートが
    56  // 保持されているキーをサポートするインターフェースです。一般的にはこのパッケージの [SignASN1] 関数を直接使用できます。
    57  func (priv *PrivateKey) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error)
    58  
    59  // GenerateKeyは指定された曲線の新しいECDSA秘密鍵を生成します。
    60  //
    61  // ほとんどのアプリケーションではrandとして[crypto/rand.Reader]を使用する必要があります。注意点として、randから読み取ったバイトに決定的な依存関係を持たない返された鍵は、呼び出し間やバージョン間で変更される可能性があります。
    62  func GenerateKey(c elliptic.Curve, rand io.Reader) (*PrivateKey, error)
    63  
    64  // SignASN1は、大きなメッセージをハッシュ化した結果であるハッシュに対して、
    65  // 秘密鍵privを使用して署名します。ハッシュが秘密鍵の曲線順序のビット長よりも長い場合、
    66  // ハッシュはその長さに切り詰められます。ASN.1エンコードされた署名を返します。
    67  //
    68  // 署名はランダム化されています。ほとんどのアプリケーションでは、[crypto/rand.Reader]
    69  // を rand として使用する必要があります。なお、返される署名はrandから読み取られた
    70  // バイトに対して決定論的に依存しないことに注意してください。また、呼び出しやバージョン間で変更される可能性があります。
    71  func SignASN1(rand io.Reader, priv *PrivateKey, hash []byte) ([]byte, error)
    72  
    73  // VerifyASN1は公開鍵pubを使用してハッシュのASN.1エンコードされた署名sigを検証します。
    74  // 返り値は署名が有効かどうかを示します。
    75  func VerifyASN1(pub *PublicKey, hash, sig []byte) bool