sign method

Future<Uint8List> sign(
  1. Uint8List message,
  2. Uint8List privateKey
)

Implementation

Future<Uint8List> sign(Uint8List message, Uint8List privateKey) async {
  if (privateKey.length != PrivateKeySize)
    throw ("incorrect privatekey length");
  var h = Sha512().newHashSink();

  h.add(privateKey.sublist(0, 32));

  Uint8List digest1 = new Uint8List(64);
  Uint8List messageDigest = new Uint8List(64);
  Uint8List hramDigest = new Uint8List(64);

  var expandedSecretKeyBuilder = BytesBuilder();
  Uint8List expandedSecretKey = new Uint8List(32);

  h.close();
  var hash = await h.hash();
  digest1 = Uint8List.fromList(hash.bytes);

  expandedSecretKeyBuilder.add(digest1);
  expandedSecretKey = expandedSecretKeyBuilder.toBytes();
  expandedSecretKey[0] &= 248;
  expandedSecretKey[31] &= 63;
  expandedSecretKey[31] |= 64;

  h = Sha512().newHashSink();
  h.add(digest1.sublist(32));
  h.add(message);
  h.close();

  hash = await h.hash();

  messageDigest = Uint8List.fromList(hash.bytes);

  Uint8List messageDigestReduced = new Uint8List(32);

  ScReduce(messageDigestReduced, messageDigest);

  ExtendedGroupElement R = new ExtendedGroupElement();
  GeScalarMultBase(R, messageDigestReduced);

  Uint8List encodedR = new Uint8List(32);

  R.ToBytes(encodedR);

  h = Sha512().newHashSink();
  h.add(encodedR);
  h.add(message);
  h.close();
  hash = await h.hash();

  hramDigest = Uint8List.fromList(hash.bytes);

  Uint8List hramDigestReduced = new Uint8List(32);

  ScReduce(hramDigestReduced, hramDigest);

  Uint8List s = new Uint8List(32);

  ScMulAdd(s, hramDigestReduced, expandedSecretKey, messageDigestReduced);

  var sigBuilder = BytesBuilder();
  Uint8List sig = new Uint8List(SignatureSize);
  sigBuilder.add(encodedR);
  sigBuilder.add(s);
  sig = sigBuilder.toBytes();
  return sig;
}