sign function Null safety

Uint8List sign(
  1. dynamic data,
  2. 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';
  }
}