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