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