compute method

Uint8List compute(
  1. List<int> data
)

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);
  });
}