github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/crypto/dsa/dsa.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 // パッケージdsaは、FIPS 186-3で定義されたデジタル署名アルゴリズムを実装します。 6 // 7 // このパッケージのDSA操作は、定数時間アルゴリズムを使用して実装されていません。 8 // 9 // 廃止予定:DSAはレガシーアルゴリズムであり、パッケージcrypto/ed25519で実装されたEd25519などのモダンな代替方法を代わりに使用する必要があります。1024ビットのモジュラス(L1024N160パラメーター)を持つキーは、暗号学的に弱く、より大きなキーは一般的にサポートされていません。FIPS 186-5では、DSAが署名生成については承認されなくなっています。 10 package dsa 11 12 import ( 13 "github.com/shogo82148/std/errors" 14 "github.com/shogo82148/std/io" 15 "github.com/shogo82148/std/math/big" 16 ) 17 18 // Parametersはキーのドメインパラメータを表します。これらのパラメータは多くのキーで共有することができます。Qのビット長は8の倍数でなければなりません。 19 type Parameters struct { 20 P, Q, G *big.Int 21 } 22 23 // PublicKeyはDSA公開鍵を表します。 24 type PublicKey struct { 25 Parameters 26 Y *big.Int 27 } 28 29 // PrivateKeyはDSAの秘密鍵を表します。 30 type PrivateKey struct { 31 PublicKey 32 X *big.Int 33 } 34 35 // ErrInvalidPublicKey は、このコードで使用できない公開鍵の場合に発生します。 36 // FIPSはDSAキーの形式に対して非常に厳格ですが、他のコードではそうでない場合もあります。 37 // したがって、他のコードで生成された可能性がある鍵を使用する場合は、このエラーを処理する必要があります。 38 var ErrInvalidPublicKey = errors.New("crypto/dsa: invalid public key") 39 40 // ParameterSizesは、DSAパラメータの受け入れ可能な素数のビット長の列挙です。 FIPS 186-3、セクション4.2を参照してください。 41 type ParameterSizes int 42 43 const ( 44 L1024N160 ParameterSizes = iota 45 L2048N224 46 L2048N256 47 L3072N256 48 ) 49 50 // GenerateParameters はランダムで有効なDSAパラメータをparamsに生成します。 51 // この関数は高速なマシンでも数秒かかる場合があります。 52 func GenerateParameters(params *Parameters, rand io.Reader, sizes ParameterSizes) error 53 54 // GenerateKey は公開鍵と秘密鍵のペアを生成します。PrivateKeyのパラメータはすでに有効である必要があります( [GenerateParameters] を参照してください)。 55 func GenerateKey(priv *PrivateKey, rand io.Reader) error 56 57 // Signは、ハッシュ関数を使って(より大きなメッセージのハッシュ結果である必要があります)、秘密鍵privを使って任意の長さのハッシュに署名します。署名は2つの整数のペアとして返されます。秘密鍵のセキュリティはrandのエントロピーに依存します。 58 // 59 // なお、FIPS 186-3のセクション4.6では、ハッシュは部分群のバイト長に切り詰める必要があると指定されています。この関数自体ではその切り詰めを実行しません。 60 // 61 // 注意してください。攻撃者の制御下にある [PrivateKey] を使用してSignを呼び出すことは、任意の量のCPUを必要とする場合があります。 62 func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error) 63 64 // Verifyは、公開鍵pubを使用してハッシュのr、sの署名を検証します。署名が有効かどうかを報告します。 65 // 66 // FIPS 186-3のセクション4.6では、ハッシュは部分群のバイト長に切り詰める必要があると指定されています。この関数自体ではその切り詰めを行いません。 67 func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool