EcdaSignature.sign constructor

EcdaSignature.sign(
  1. String message,
  2. Uint8List privateKey
)

Implementation

factory EcdaSignature.sign(String message, Uint8List privateKey) {
  final messageHash = dynamicToUint8List(message);
  final digest = SHA256Digest();
  final signer = ECDSASigner(null, HMac(digest, 64));
  final key = ECPrivateKey(hexToBigInt(dynamicToHex(privateKey)), secp256k1);

  signer.init(true, PrivateKeyParameter(key));
  ECSignature sig = signer.generateSignature(messageHash) as ECSignature;

  if (sig.s.compareTo(_halfCurveOrder) > 0) {
    final canonicalisedS = secp256k1.n - sig.s;
    sig = ECSignature(sig.r, canonicalisedS);
  }
  String pubHex =
      dynamicToHex(privateKeyToPublicKey(privateKey, compress: false));
  int recId = getRecid(pubHex, message, sig);
  if (recId == -1) {
    throw Exception(
        'Could not construct a recoverable key. This should never happen');
  }
  return EcdaSignature(Uint8List.fromList(toBytesPadded(sig.r, 32)),
      Uint8List.fromList(toBytesPadded(sig.s, 32)), recId);
}