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

     1  // Copyright 2016 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  // Package ed25519はEd25519署名アルゴリズムを実装しています。詳しくは、https://ed25519.cr.yp.to/を参照してください。
     6  //
     7  // これらの関数はRFC 8032で定義されている「Ed25519」関数とも互換性があります。ただし、RFC 8032の定義とは異なり、このパッケージの秘密鍵表現には公開鍵の接尾辞が含まれており、同じ鍵での複数の署名操作を効率的に行うことができます。このパッケージでは、RFC 8032の秘密鍵を「seed」と呼んでいます。
     8  package ed25519
     9  
    10  import (
    11  	"github.com/shogo82148/std/crypto"
    12  
    13  	"github.com/shogo82148/std/io"
    14  )
    15  
    16  const (
    17  	// PublicKeySizeは、このパッケージで使用される公開鍵のバイト単位のサイズです。
    18  	PublicKeySize = 32
    19  	// PrivateKeySizeは、このパッケージで使用される秘密鍵のサイズ(バイト単位)です。
    20  	PrivateKeySize = 64
    21  	// SignatureSizeは、このパッケージで生成および検証される署名のサイズ(バイト単位)です。
    22  	SignatureSize = 64
    23  	// SeedSizeは、RFC 8032で使用されるプライベートキーのシードのサイズ(バイト単位)です。
    24  	SeedSize = 32
    25  )
    26  
    27  // PublicKeyはEd25519公開鍵の型です。
    28  type PublicKey []byte
    29  
    30  // Equalはpubとxが同じ値を持っているかどうかを報告します。
    31  func (pub PublicKey) Equal(x crypto.PublicKey) bool
    32  
    33  // PrivateKeyはEd25519の秘密鍵の型です。[crypto.Signer]を実装しています。
    34  type PrivateKey []byte
    35  
    36  // Publicはprivに対応する[PublicKey]を返します。
    37  func (priv PrivateKey) Public() crypto.PublicKey
    38  
    39  // Equal は priv と x が同じ値を持っているかどうかを報告します。
    40  func (priv PrivateKey) Equal(x crypto.PrivateKey) bool
    41  
    42  // Seedはprivに対応するプライベートキーシードを返します。RFC 8032との互換性のために提供されています。RFC 8032のプライベートキーはこのパッケージのシードに対応します。
    43  func (priv PrivateKey) Seed() []byte
    44  
    45  // Signは与えられたメッセージをprivで署名します。randは無視され、nilであってもかまいません。
    46  //
    47  // もしopts.HashFunc()が[crypto.SHA512]の場合、事前ハッシュバリアントのEd25519phが使用され、
    48  // メッセージはSHA-512ハッシュであることが期待されます。それ以外の場合、opts.HashFunc()は[crypto.Hash](0)である必要があり、
    49  // メッセージはハッシュされていない状態である必要があります。なぜなら、Ed25519は署名されるメッセージに対して二回のパスを行うからです。
    50  //
    51  // [Options]型の値、またはcrypto.Hash(0)またはcrypto.SHA512を直接使用して、
    52  // 純粋なEd25519またはEd25519phを選択することができます。
    53  func (priv PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOpts) (signature []byte, err error)
    54  
    55  // Optionsは[PrivateKey.Sign]または[VerifyWithOptions]と一緒に使われ、Ed25519のバリアントを選択するために使用できます。
    56  type Options struct {
    57  	// Ed25519 の場合、ハッシュはゼロまたは Ed25519ph の場合は crypto.SHA512 になることがあります。
    58  	Hash crypto.Hash
    59  
    60  	// Contextが空でない場合、Ed25519ctxを選択するかEd25519phのコンテキスト文字列を提供します。長さは最大255バイトです。
    61  	Context string
    62  }
    63  
    64  // HashFuncはo.Hashを返します。
    65  func (o *Options) HashFunc() crypto.Hash
    66  
    67  // GenerateKeyはrandからのエントロピーを使用して公開鍵/秘密鍵のペアを生成します。
    68  // randがnilの場合、[crypto/rand.Reader]が使用されます。
    69  //
    70  // この関数の出力は決定論的であり、randから[SeedSize]バイトを読み取り、[NewKeyFromSeed]に渡すことと等価です。
    71  func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error)
    72  
    73  // NewKeyFromSeedはシードから秘密鍵を計算します。もしseedの長さが[SeedSize]でない場合、パニックを発生させます。この関数はRFC 8032との互換性のために提供されています。RFC 8032の秘密鍵はこのパッケージのシードに対応します。
    74  func NewKeyFromSeed(seed []byte) PrivateKey
    75  
    76  // SignはメッセージにprivateKeyで署名し、署名を返します。もしprivateKeyの長さが[PrivateKeySize]でない場合はパニックを起こします。
    77  func Sign(privateKey PrivateKey, message []byte) []byte
    78  
    79  // Verifyは、publicKeyによってメッセージのsigが有効な署名かどうかを検証します。
    80  // もしlen(publicKey)が[PublicKeySize]でない場合、パニックを引き起こします。
    81  func Verify(publicKey PublicKey, message, sig []byte) bool
    82  
    83  // VerifyWithOptionsは、publicKeyによってメッセージのsigが有効な署名であるかどうかを報告します。有効な署名は、nilのエラーを返すことで示されます。len(publicKey)が[PublicKeySize]でない場合、パニックが発生します。
    84  // もしopts.Hashが[crypto.SHA512]である場合、Ed25519phとして事前にハッシュされたバリアントが使用され、messageはSHA-512ハッシュであることが想定されます。それ以外の場合、opts.Hashは[crypto.Hash](0)でなければならず、メッセージはハッシュされていない状態である必要があります。なぜなら、Ed25519は署名されるメッセージを2回処理するからです。
    85  func VerifyWithOptions(publicKey PublicKey, message, sig []byte, opts *Options) error