seal method

SealedBox seal(
  1. List<int> nonce,
  2. List<int> plaintext, {
  3. List<int> aad = const [],
})

Encrypts and authenticates plaintext with nonce and optional aad.

Implementation

SealedBox seal(
  List<int> nonce,
  List<int> plaintext, {
  List<int> aad = const [],
}) {
  initNoConfig();
  return using((arena) {
    final ctx = _newCtx(arena, nonce, encrypt: true);
    try {
      final outl = arena<Int>();
      if (aad.isNotEmpty) {
        checkOne(
          ssl.EVP_EncryptUpdate(
            ctx,
            nullptr,
            outl,
            toNative(arena, aad),
            aad.length,
          ),
          'EVP_EncryptUpdate(aad)',
        );
      }
      final out = arena<UnsignedChar>(plaintext.length + 16);
      var produced = 0;
      if (plaintext.isNotEmpty) {
        checkOne(
          ssl.EVP_EncryptUpdate(
            ctx,
            out,
            outl,
            secretToNative(arena, plaintext),
            plaintext.length,
          ),
          'EVP_EncryptUpdate',
        );
        produced = outl.value;
      }
      checkOne(
        ssl.EVP_EncryptFinal_ex(ctx, out + produced, outl),
        'EVP_EncryptFinal_ex',
      );
      produced += outl.value;
      final tag = arena<UnsignedChar>(tagLength);
      checkOne(
        ssl.EVP_CIPHER_CTX_ctrl(
          ctx,
          ssl.EVP_CTRL_AEAD_GET_TAG,
          tagLength,
          tag.cast(),
        ),
        'EVP_CIPHER_CTX_ctrl(GET_TAG)',
      );
      return SealedBox(fromNative(out, produced), fromNative(tag, tagLength));
    } finally {
      ssl.EVP_CIPHER_CTX_free(ctx);
    }
  });
}