Uint8List
sign(- dynamic data,
- dynamic privateKey
)
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(1, privateKey.length);
switch (curveBuf[0]) {
case 0:
final Digest sha512 = Digest('SHA-512');
final Uint8List msgHash = sha512.process(data);
final ed25519.SigningKey signingKey = ed25519.SigningKey(seed: pvBuf);
final ed25519.SignatureBase sm = signingKey.sign(msgHash).signature;
return Uint8List.fromList(sm);
case 1:
final Digest sha256 = Digest('SHA-256');
final Uint8List msgHash = sha256.process(data);
final ECDomainParameters _params = ECCurve_prime256v1();
final SHA256Digest digest = SHA256Digest();
final ECDSASigner signer = ECDSASigner(null, HMac(digest, 64));
final ECPrivateKey key = ECPrivateKey(decodeBigInt(pvBuf), _params);
signer.init(true, PrivateKeyParameter(key));
final ECSignature sig = signer.generateSignature(msgHash) as ECSignature;
final asn1lib.ASN1Sequence topLevel = asn1lib.ASN1Sequence();
topLevel.add(asn1lib.ASN1Integer(sig.r));
topLevel.add(asn1lib.ASN1Integer(sig.s));
return topLevel.encodedBytes;
case 2:
final Digest sha256 = Digest('SHA-256');
final Uint8List msgHash = sha256.process(data);
final ECDomainParameters _params = ECCurve_secp256k1();
final SHA256Digest digest = SHA256Digest();
final ECDSASigner signer = ECDSASigner(null, HMac(digest, 64));
final ECPrivateKey key = ECPrivateKey(decodeBigInt(pvBuf), _params);
signer.init(true, PrivateKeyParameter(key));
final ECSignature sig = signer.generateSignature(msgHash) as ECSignature;
final asn1lib.ASN1Sequence topLevel = asn1lib.ASN1Sequence();
topLevel.add(asn1lib.ASN1Integer(sig.r));
topLevel.add(asn1lib.ASN1Integer(sig.s));
return topLevel.encodedBytes;
default:
throw 'Curve not supported';
}
}