From 4df318a5b44d22a67d7749b3ec371d0e84af395e Mon Sep 17 00:00:00 2001 From: Dmitriy Suponitskiy Date: Mon, 3 Aug 2026 21:41:42 -0400 Subject: [PATCH] Fix to the 128-bit CKKS complex encoding --- src/pke/lib/encoding/ckkspackedencoding.cpp | 10 ++++++++-- src/pke/lib/scheme/ckksrns/ckksrns-fhe.cpp | 8 +++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/pke/lib/encoding/ckkspackedencoding.cpp b/src/pke/lib/encoding/ckkspackedencoding.cpp index 6763c4f1b..5ba8c764f 100644 --- a/src/pke/lib/encoding/ckkspackedencoding.cpp +++ b/src/pke/lib/encoding/ckkspackedencoding.cpp @@ -164,7 +164,10 @@ bool CKKSPackedEncoding::Encode() { re = re64 >> (-pRemaining); } else { - int128_t pPowRemaining = ((int128_t)1) << pRemaining; + if (pRemaining > 126) + OPENFHE_THROW("Invalid CKKS scaling shift"); + + int128_t pPowRemaining = static_cast(1) << pRemaining; re = pPowRemaining * re64; } @@ -175,7 +178,10 @@ bool CKKSPackedEncoding::Encode() { im = im64 >> (-pRemaining); } else { - int128_t pPowRemaining = (static_cast(1)) << pRemaining; + if (pRemaining > 126) + OPENFHE_THROW("Invalid CKKS scaling shift"); + + int128_t pPowRemaining = static_cast(1) << pRemaining; im = pPowRemaining * im64; } diff --git a/src/pke/lib/scheme/ckksrns/ckksrns-fhe.cpp b/src/pke/lib/scheme/ckksrns/ckksrns-fhe.cpp index 8f2772da7..dd691679d 100644 --- a/src/pke/lib/scheme/ckksrns/ckksrns-fhe.cpp +++ b/src/pke/lib/scheme/ckksrns/ckksrns-fhe.cpp @@ -2665,7 +2665,10 @@ Plaintext FHECKKSRNS::MakeAuxPlaintext(const CryptoContextImpl& cc, co re = re64 >> (-pRemaining); } else { - int128_t pPowRemaining = ((int128_t)1) << pRemaining; + if (pRemaining > 126) + OPENFHE_THROW("Invalid CKKS scaling shift"); + + int128_t pPowRemaining = static_cast(1) << pRemaining; re = pPowRemaining * re64; } @@ -2676,6 +2679,9 @@ Plaintext FHECKKSRNS::MakeAuxPlaintext(const CryptoContextImpl& cc, co im = im64 >> (-pRemaining); } else { + if (pRemaining > 126) + OPENFHE_THROW("Invalid CKKS scaling shift"); + int128_t pPowRemaining = static_cast(1) << pRemaining; im = pPowRemaining * im64; }