ECDSASignature.sign constructor
ECDSASignature.sign(
- ECPrivateKey privkey,
- Uint8List hash, {
- bool forceLowR = true,
Creates a signature using a private key (privkey
) for a given 32-byte
hash
. The signature will be generated deterministically and shall be the
same for a given hash and key.
If forceLowR
is true (default), then signatures with high r-values will
be skipped until a signature with a low r-value is found.
Implementation
factory ECDSASignature.sign(
ECPrivateKey privkey,
Uint8List hash,
{ bool forceLowR = true, }
) {
checkBytes(hash, 32);
Uint8List compact;
if (forceLowR) {
// Loop through incrementing entropy until a low r-value is found
Uint8List extraEntropy = Uint8List(32);
do {
compact = secp256k1.ecdsaSign(hash, privkey.data, extraEntropy);
for (int i = 0; extraEntropy[i]++ == 255; i++) {}
} while (compact[0] >= 0x80);
} else {
compact = secp256k1.ecdsaSign(hash, privkey.data);
}
final sig = ECDSASignature.fromCompact(compact);
// Verify signature to protect against computation errors. Cosmic rays etc.
if (!sig.verify(privkey.pubkey, hash)) throw InvalidECDSASignature();
return sig;
}