in native/src/seal/evaluator.cpp [1434:1506]
void Evaluator::sub_plain_inplace(Ciphertext &encrypted, const Plaintext &plain) const
{
// Verify parameters.
if (!is_metadata_valid_for(encrypted, context_) || !is_buffer_valid(encrypted))
{
throw invalid_argument("encrypted is not valid for encryption parameters");
}
if (!is_metadata_valid_for(plain, context_) || !is_buffer_valid(plain))
{
throw invalid_argument("plain is not valid for encryption parameters");
}
auto &context_data = *context_.get_context_data(encrypted.parms_id());
auto &parms = context_data.parms();
if (parms.scheme() == scheme_type::bfv && encrypted.is_ntt_form())
{
throw invalid_argument("BFV encrypted cannot be in NTT form");
}
if (parms.scheme() == scheme_type::ckks && !encrypted.is_ntt_form())
{
throw invalid_argument("CKKS encrypted must be in NTT form");
}
if (plain.is_ntt_form() != encrypted.is_ntt_form())
{
throw invalid_argument("NTT form mismatch");
}
if (encrypted.is_ntt_form() && (encrypted.parms_id() != plain.parms_id()))
{
throw invalid_argument("encrypted and plain parameter mismatch");
}
if (!are_same_scale(encrypted, plain))
{
throw invalid_argument("scale mismatch");
}
// Extract encryption parameters.
auto &coeff_modulus = parms.coeff_modulus();
size_t coeff_count = parms.poly_modulus_degree();
size_t coeff_modulus_size = coeff_modulus.size();
// Size check
if (!product_fits_in(coeff_count, coeff_modulus_size))
{
throw logic_error("invalid parameters");
}
switch (parms.scheme())
{
case scheme_type::bfv:
{
multiply_sub_plain_with_scaling_variant(plain, context_data, *iter(encrypted));
break;
}
case scheme_type::ckks:
{
RNSIter encrypted_iter(encrypted.data(), coeff_count);
ConstRNSIter plain_iter(plain.data(), coeff_count);
sub_poly_coeffmod(encrypted_iter, plain_iter, coeff_modulus_size, coeff_modulus, encrypted_iter);
break;
}
default:
throw invalid_argument("unsupported scheme");
}
#ifdef SEAL_THROW_ON_TRANSPARENT_CIPHERTEXT
// Transparent ciphertext output is not allowed.
if (encrypted.is_transparent())
{
throw logic_error("result ciphertext is transparent");
}
#endif
}