sign function
Sign the data @param {String | Uint8List} data Data to sign @param {String | Uint8List} privateKey Private key to use to sign the data
Implementation
Uint8List sign(data, privateKey) {
if (!(data is Uint8List) && !(data is String)) {
throw "'data' must be a string or Uint8List";
}
if (!(privateKey is Uint8List) && !(privateKey is String)) {
throw "'privateKey' must be a string or Uint8List";
}
if (data is String) {
if (isHex(data)) {
data = hexToUint8List(data);
} else {
data = Uint8List.fromList(utf8.encode(data));
}
}
if (privateKey is String) {
if (isHex(privateKey)) {
privateKey = hexToUint8List(privateKey);
} else {
privateKey = Uint8List.fromList(utf8.encode(privateKey));
}
}
final Uint8List curveBuf = privateKey.sublist(0, 1);
final Uint8List pvBuf = privateKey.sublist(2, privateKey.length);
switch (curveBuf[0]) {
case 0:
final ed25519.SigningKey signingKey = ed25519.SigningKey(seed: pvBuf);
final ed25519.SignatureBase sm = signingKey.sign(data).signature;
return Uint8List.fromList(sm);
case 1:
final Digest sha256 = Digest('SHA-256');
final Uint8List msgHash = sha256.process(data);
final elliptic.EllipticCurve ec = elliptic.getP256();
final elliptic.PrivateKey privateKey =
elliptic.PrivateKey.fromBytes(ec, pvBuf);
final ecdsa.Signature sig = ecdsa.deterministicSign(privateKey, msgHash);
return Uint8List.fromList(sig.toDER());
case 2:
final Digest sha256 = Digest('SHA-256');
final Uint8List msgHash = sha256.process(data);
final elliptic.Curve ec = elliptic.getSecp256k1();
final elliptic.PrivateKey privateKey =
elliptic.PrivateKey.fromBytes(ec, pvBuf);
final ecdsa.Signature sig = ecdsa.deterministicSign(privateKey, msgHash);
return Uint8List.fromList(sig.toDER());
default:
throw 'Curve not supported';
}
}