-
Notifications
You must be signed in to change notification settings - Fork 7
Open
Description
原因
- signer.GenerateSignature(hash);出力結果のrまたはsが32バイト未満の長さになった場合に、BigIntegerのデータをバイト配列に変換した結果そのバイト配列が32バイト未満となり、rとsを結合したsignature配列の長さが64バイト未満となり続く署名検証に入力した際に検証エラーとなる
byte[] signature = sign1.Concat(sign2).ToArray();
対策
- 以下のように署名データ配列の先頭に長さが足りない時にゼロを詰めるようにする
static byte[] Sign(byte[] plain, string key)
{
// Read the key.
AsymmetricCipherKeyPair pair = null;
using (var stream = new StreamReader(key))
{
var reader = new PemReader(stream);
pair = reader.ReadObject() as AsymmetricCipherKeyPair;
}
// Generate signature instance and signature.
ECDsaSigner signer = new ECDsaSigner(new HMacDsaKCalculator(new Sha256Digest()));
signer.Init(true, pair.Private);
SHA256 sha256 = new SHA256CryptoServiceProvider();
var hash = sha256.ComputeHash(plain);
var sign = signer.GenerateSignature(hash);
// Convert signature value to byte [].
var sign1 = sign[0].ToByteArray().SkipWhile(b => b == 0x00);
var sign2 = sign[1].ToByteArray().SkipWhile(b => b == 0x00);
byte[] zero = new byte[1];
zero[0] = 0;
for (int i = sign[0].BitLength + 8; i <= 256; i += 8)
{
sign1 = zero.Concat(sign1);
}
for (int i = sign[1].BitLength + 8; i <= 256; i += 8)
{
sign2 = zero.Concat(sign2);
}
byte[] signature = sign1.Concat(sign2).ToArray();
return signature;
}詳細検証結果
Metadata
Metadata
Assignees
Labels
No labels