sign static method
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);
});