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

     1  // Copyright 2022 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  // パッケージecdhはNIST曲線とCurve25519上での楕円曲線ディフィー・ヘルマンを実装します。
     6  package ecdh
     7  
     8  import (
     9  	"github.com/shogo82148/std/crypto"
    10  	"github.com/shogo82148/std/crypto/internal/boring"
    11  	"github.com/shogo82148/std/io"
    12  	"github.com/shogo82148/std/sync"
    13  )
    14  
    15  type Curve interface {
    16  	GenerateKey(rand io.Reader) (*PrivateKey, error)
    17  
    18  	NewPrivateKey(key []byte) (*PrivateKey, error)
    19  
    20  	NewPublicKey(key []byte) (*PublicKey, error)
    21  
    22  	ecdh(local *PrivateKey, remote *PublicKey) ([]byte, error)
    23  
    24  	privateKeyToPublicKey(*PrivateKey) *PublicKey
    25  }
    26  
    27  // PublicKeyは通常、ワイヤ経由で送信されるECDHの共有キーです。
    28  //
    29  // これらのキーは[crypto/x509.ParsePKIXPublicKey]で解析可能であり、
    30  // [crypto/x509.MarshalPKIXPublicKey]を使用してエンコードすることもできます。
    31  // NIST曲線の場合、解析後に[crypto/ecdsa.PublicKey.ECDH]で変換する必要があります。
    32  type PublicKey struct {
    33  	curve     Curve
    34  	publicKey []byte
    35  	boring    *boring.PublicKeyECDH
    36  }
    37  
    38  // Bytesは公開鍵のエンコードのコピーを返します。
    39  func (k *PublicKey) Bytes() []byte
    40  
    41  // Equalは、xがkと同じ公開鍵を表すかどうかを返します。
    42  //
    43  // 注意:異なるエンコーディングを持つ同等の公開鍵があり、このチェックではfalseを返しますが、ECDHの入力として同じ結果を示す可能性があります。
    44  //
    45  // キーのタイプとその曲線が一致している限り、このチェックは一定時間で実行されます。
    46  func (k *PublicKey) Equal(x crypto.PublicKey) bool
    47  
    48  func (k *PublicKey) Curve() Curve
    49  
    50  // PrivateKeyは通常秘密に保持されるECDHの秘密鍵です。
    51  //
    52  // これらの鍵は[crypto/x509.ParsePKCS8PrivateKey]でパースでき、[crypto/x509.MarshalPKCS8PrivateKey]
    53  // でエンコードすることができます。NIST曲線の場合、パース後に[crypto/ecdsa.PrivateKey.ECDH]で変換する必要があります。
    54  type PrivateKey struct {
    55  	curve      Curve
    56  	privateKey []byte
    57  	boring     *boring.PrivateKeyECDH
    58  
    59  	// publicKeyは、公開鍵を公開鍵の一度セットしています。これにより、スカラー乗算を行わずにNewPrivateKeyで秘密鍵を読み込むことができます。
    60  	publicKey     *PublicKey
    61  	publicKeyOnce sync.Once
    62  }
    63  
    64  // ECDH performs an ECDH exchange and returns the shared secret. The [PrivateKey]
    65  // and [PublicKey] must use the same curve.
    66  //
    67  // NIST曲線の場合、これはSEC 1バージョン2.0セクション3.3.1で指定されたようにECDHを実行し、SEC 1バージョン2.0セクション2.3.5に従ってエンコードされたx座標を返します。結果は決して無限遠点ではありません。
    68  //
    69  // [X25519] の場合、これはRFC 7748 Section 6.1 で指定されたようにECDHを実行します。結果が全て0値の場合、ECDHはエラーを返します。
    70  func (k *PrivateKey) ECDH(remote *PublicKey) ([]byte, error)
    71  
    72  // Bytesは、プライベートキーのエンコーディングのコピーを返します。
    73  func (k *PrivateKey) Bytes() []byte
    74  
    75  // Equalは、xがkと同じ秘密鍵を表しているかどうかを返します。
    76  //
    77  // ただし、異なるエンコーディングを持つ等価な秘密鍵が存在する場合があることに注意してください。
    78  // この場合、このチェックではfalseが返されますが、 [ECDH] の入力としては同じように機能します。
    79  //
    80  // このチェックは、キーのタイプと曲線が一致している限り、一定の時間で実行されます。
    81  func (k *PrivateKey) Equal(x crypto.PrivateKey) bool
    82  
    83  func (k *PrivateKey) Curve() Curve
    84  
    85  func (k *PrivateKey) PublicKey() *PublicKey
    86  
    87  // Publicは、すべての標準ライブラリの非公開キーの暗黙のインターフェースを実装します。 [crypto.PrivateKey] のドキュメントを参照してください。
    88  func (k *PrivateKey) Public() crypto.PublicKey