sign static method

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

Signs message (pure ML-DSA, empty context string) with privateKey, which may be the 4032-byte expanded key or the 32-byte seed. Signatures are randomised ("hedged") as FIPS 204 recommends.

Implementation

static Uint8List sign(List<int> privateKey, List<int> message) =>
    using((arena) {
      final pkey = privateKey.length == seedLength
          ? keyFromOctetParam(arena, algorithm, 'seed', privateKey)
          : rawPrivateKey(arena, algorithm, privateKey);
      final md = checkNotNull(ssl.EVP_MD_CTX_new(), 'EVP_MD_CTX_new');
      arena.using(md, ssl.EVP_MD_CTX_free);
      checkOne(
        ssl.EVP_DigestSignInit(md, nullptr, nullptr, nullptr, pkey),
        'EVP_DigestSignInit',
      );
      final msg = toNative(arena, message);
      final sigLen = arena<Size>();
      checkOne(
        ssl.EVP_DigestSign(md, nullptr, sigLen, msg, message.length),
        'EVP_DigestSign(len)',
      );
      final sig = arena<UnsignedChar>(sigLen.value);
      checkOne(
        ssl.EVP_DigestSign(md, sig, sigLen, msg, message.length),
        'EVP_DigestSign',
      );
      return fromNative(sig, sigLen.value);
    });