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(
dynamic data,
dynamic privateKey, {
bool isDataHexa = true,
bool isPrivateKeyHexa = true,
}) {
if (data is! Uint8List && data is! String) {
throw "'data' must be a string or Uint8List";
}
if (privateKey is! List<int> && privateKey is! String) {
throw "'privateKey' must be a string or Uint8List";
}
if (data is String) {
if (isDataHexa && !isHex(data)) {
throw const FormatException("'data' must be an hexadecimal string");
}
if (isDataHexa) {
data = Uint8List.fromList(hexToUint8List(data));
} else {
data = Uint8List.fromList(utf8.encode(data));
}
}
if (privateKey is String) {
if (isPrivateKeyHexa && !isHex(privateKey)) {
throw const FormatException("'privateKey' must be an hexadecimal string");
}
if (isPrivateKeyHexa) {
privateKey = Uint8List.fromList(hexToUint8List(privateKey));
} else {
privateKey = Uint8List.fromList(utf8.encode(privateKey));
}
}
final curveBuf = Uint8List.fromList(
privateKey.sublist(0, 1),
);
final pvBuf = Uint8List.fromList(privateKey.sublist(2, privateKey.length));
switch (curveBuf[0]) {
case 0:
final signingKey = ed25519.SigningKey(seed: pvBuf);
final sm = signingKey.sign(data).signature;
return Uint8List.fromList(sm);
case 1:
final sha256 = Digest('SHA-256');
final msgHash = sha256.process(data);
final ec = elliptic.getP256();
final privateKey = elliptic.PrivateKey.fromBytes(ec, pvBuf);
final sig = ecdsa.deterministicSign(privateKey, msgHash);
return Uint8List.fromList(sig.toDER());
case 2:
final sha256 = Digest('SHA-256');
final msgHash = sha256.process(data);
final ec = elliptic.getSecp256k1();
final privateKey = elliptic.PrivateKey.fromBytes(ec, pvBuf);
final sig = ecdsa.deterministicSign(privateKey, msgHash);
return Uint8List.fromList(sig.toDER());
default:
throw 'Curve not supported';
}
}