compute method
The tag over data.
Implementation
Uint8List compute(List<int> data) {
initNoConfig();
return using((arena) {
final mac = checkNotNull(
ssl.EVP_MAC_fetch(nullptr, cString(arena, 'HMAC'), nullptr),
'EVP_MAC_fetch(HMAC)',
);
_ArenaFree.add(arena, () => ssl.EVP_MAC_free(mac));
final ctx = checkNotNull(ssl.EVP_MAC_CTX_new(mac), 'EVP_MAC_CTX_new');
_ArenaFree.add(arena, () => ssl.EVP_MAC_CTX_free(ctx));
final bld = checkNotNull(ssl.OSSL_PARAM_BLD_new(), 'OSSL_PARAM_BLD_new');
_ArenaFree.add(arena, () => ssl.OSSL_PARAM_BLD_free(bld));
checkOne(
ssl.OSSL_PARAM_BLD_push_utf8_string(
bld,
cString(arena, 'digest'),
cString(arena, digest),
0,
),
'OSSL_PARAM_BLD_push_utf8_string(digest)',
);
final params = checkNotNull(
ssl.OSSL_PARAM_BLD_to_param(bld),
'OSSL_PARAM_BLD_to_param',
);
_ArenaFree.add(arena, () => ssl.OSSL_PARAM_free(params));
checkOne(
ssl.EVP_MAC_init(ctx, secretToNative(arena, _key), _key.length, params),
'EVP_MAC_init',
);
checkOne(
ssl.EVP_MAC_update(ctx, toNative(arena, data), data.length),
'EVP_MAC_update',
);
final out = arena<UnsignedChar>(ssl.EVP_MAX_MD_SIZE);
final outl = arena<Size>();
checkOne(
ssl.EVP_MAC_final(ctx, out, outl, ssl.EVP_MAX_MD_SIZE),
'EVP_MAC_final',
);
return fromNative(out, outl.value);
});
}