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