Skip to content

Commit

Permalink
fix: Rename BootstrapKey -> BlindRotateKey
Browse files Browse the repository at this point in the history
  • Loading branch information
sp301415 committed Nov 21, 2024
1 parent 9dde7e9 commit 8a1f279
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 110 deletions.
32 changes: 16 additions & 16 deletions tfhe/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ func (e *Evaluator[T]) blindRotateExtendedAssign(ct LWECiphertext[T], lut LookUp
a2NSmall, a2NIdx := a2N/e.Parameters.polyExtendFactor, a2N%e.Parameters.polyExtendFactor

for k := 0; k < e.Parameters.polyExtendFactor; k++ {
e.GadgetProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[0].Value[0], e.buffer.ctAccFourierDecomposed[k][0], e.buffer.ctBlockFourierAcc[k])
e.GadgetProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[0].Value[0], e.buffer.ctAccFourierDecomposed[k][0], e.buffer.ctBlockFourierAcc[k])
}

if a2NIdx == 0 {
Expand All @@ -128,7 +128,7 @@ func (e *Evaluator[T]) blindRotateExtendedAssign(ct LWECiphertext[T], lut LookUp
a2NSmall, a2NIdx := a2N/e.Parameters.polyExtendFactor, a2N%e.Parameters.polyExtendFactor

for k := 0; k < e.Parameters.polyExtendFactor; k++ {
e.GadgetProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[j].Value[0], e.buffer.ctAccFourierDecomposed[k][0], e.buffer.ctBlockFourierAcc[k])
e.GadgetProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[j].Value[0], e.buffer.ctAccFourierDecomposed[k][0], e.buffer.ctBlockFourierAcc[k])
}

if a2NIdx == 0 {
Expand Down Expand Up @@ -170,7 +170,7 @@ func (e *Evaluator[T]) blindRotateExtendedAssign(ct LWECiphertext[T], lut LookUp
a2NSmall, a2NIdx := a2N/e.Parameters.polyExtendFactor, a2N%e.Parameters.polyExtendFactor

for k := 0; k < e.Parameters.polyExtendFactor; k++ {
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[i*e.Parameters.blockSize], e.buffer.ctAccFourierDecomposed[k], e.buffer.ctBlockFourierAcc[k])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[i*e.Parameters.blockSize], e.buffer.ctAccFourierDecomposed[k], e.buffer.ctBlockFourierAcc[k])
}

if a2NIdx == 0 {
Expand All @@ -196,7 +196,7 @@ func (e *Evaluator[T]) blindRotateExtendedAssign(ct LWECiphertext[T], lut LookUp
a2NSmall, a2NIdx := a2N/e.Parameters.polyExtendFactor, a2N%e.Parameters.polyExtendFactor

for k := 0; k < e.Parameters.polyExtendFactor; k++ {
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[j], e.buffer.ctAccFourierDecomposed[k], e.buffer.ctBlockFourierAcc[k])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[j], e.buffer.ctAccFourierDecomposed[k], e.buffer.ctBlockFourierAcc[k])
}

if a2NIdx == 0 {
Expand Down Expand Up @@ -238,13 +238,13 @@ func (e *Evaluator[T]) blindRotateExtendedAssign(ct LWECiphertext[T], lut LookUp
a2NSmall, a2NIdx = a2N/e.Parameters.polyExtendFactor, a2N%e.Parameters.polyExtendFactor

if a2NIdx == 0 {
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[e.Parameters.lweDimension-e.Parameters.blockSize], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[e.Parameters.lweDimension-e.Parameters.blockSize], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.PolyEvaluator.MonomialSubOneToFourierPolyAssign(a2NSmall, e.buffer.fMono)
e.FourierPolyMulFourierGLWEAssign(e.buffer.ctBlockFourierAcc[0], e.buffer.fMono, e.buffer.ctFourierAcc[0])
} else {
kk := e.Parameters.polyExtendFactor - a2NIdx
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[e.Parameters.lweDimension-e.Parameters.blockSize], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[e.Parameters.lweDimension-e.Parameters.blockSize], e.buffer.ctAccFourierDecomposed[kk], e.buffer.ctBlockFourierAcc[kk])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[e.Parameters.lweDimension-e.Parameters.blockSize], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[e.Parameters.lweDimension-e.Parameters.blockSize], e.buffer.ctAccFourierDecomposed[kk], e.buffer.ctBlockFourierAcc[kk])
e.PolyEvaluator.MonomialToFourierPolyAssign(a2NSmall+1, e.buffer.fMono)
e.FourierPolyMulFourierGLWEAssign(e.buffer.ctBlockFourierAcc[kk], e.buffer.fMono, e.buffer.ctFourierAcc[0])
e.SubFourierGLWEAssign(e.buffer.ctFourierAcc[0], e.buffer.ctBlockFourierAcc[0], e.buffer.ctFourierAcc[0])
Expand All @@ -255,13 +255,13 @@ func (e *Evaluator[T]) blindRotateExtendedAssign(ct LWECiphertext[T], lut LookUp
a2NSmall, a2NIdx := a2N/e.Parameters.polyExtendFactor, a2N%e.Parameters.polyExtendFactor

if a2NIdx == 0 {
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[j], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[j], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.PolyEvaluator.MonomialSubOneToFourierPolyAssign(a2NSmall, e.buffer.fMono)
e.FourierPolyMulAddFourierGLWEAssign(e.buffer.ctBlockFourierAcc[0], e.buffer.fMono, e.buffer.ctFourierAcc[0])
} else {
kk := e.Parameters.polyExtendFactor - a2NIdx
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[j], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[j], e.buffer.ctAccFourierDecomposed[kk], e.buffer.ctBlockFourierAcc[kk])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[j], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[j], e.buffer.ctAccFourierDecomposed[kk], e.buffer.ctBlockFourierAcc[kk])
e.PolyEvaluator.MonomialToFourierPolyAssign(a2NSmall+1, e.buffer.fMono)
e.FourierPolyMulAddFourierGLWEAssign(e.buffer.ctBlockFourierAcc[kk], e.buffer.fMono, e.buffer.ctFourierAcc[0])
e.SubFourierGLWEAssign(e.buffer.ctFourierAcc[0], e.buffer.ctBlockFourierAcc[0], e.buffer.ctFourierAcc[0])
Expand Down Expand Up @@ -290,11 +290,11 @@ func (e *Evaluator[T]) blindRotateBlockAssign(ct LWECiphertext[T], lut LookUpTab
e.PolyEvaluator.ToFourierPolyAssign(polyDecomposed[k], e.buffer.ctAccFourierDecomposed[0][0][k])
}

e.GadgetProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[0].Value[0], e.buffer.ctAccFourierDecomposed[0][0], e.buffer.ctBlockFourierAcc[0])
e.GadgetProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[0].Value[0], e.buffer.ctAccFourierDecomposed[0][0], e.buffer.ctBlockFourierAcc[0])
e.PolyEvaluator.MonomialSubOneToFourierPolyAssign(-e.ModSwitch(ct.Value[1]), e.buffer.fMono)
e.FourierPolyMulFourierGLWEAssign(e.buffer.ctBlockFourierAcc[0], e.buffer.fMono, e.buffer.ctFourierAcc[0])
for j := 1; j < e.Parameters.blockSize; j++ {
e.GadgetProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[j].Value[0], e.buffer.ctAccFourierDecomposed[0][0], e.buffer.ctBlockFourierAcc[0])
e.GadgetProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[j].Value[0], e.buffer.ctAccFourierDecomposed[0][0], e.buffer.ctBlockFourierAcc[0])
e.PolyEvaluator.MonomialSubOneToFourierPolyAssign(-e.ModSwitch(ct.Value[j+1]), e.buffer.fMono)
e.FourierPolyMulAddFourierGLWEAssign(e.buffer.ctBlockFourierAcc[0], e.buffer.fMono, e.buffer.ctFourierAcc[0])
}
Expand All @@ -311,11 +311,11 @@ func (e *Evaluator[T]) blindRotateBlockAssign(ct LWECiphertext[T], lut LookUpTab
}
}

e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[i*e.Parameters.blockSize], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[i*e.Parameters.blockSize], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.PolyEvaluator.MonomialSubOneToFourierPolyAssign(-e.ModSwitch(ct.Value[i*e.Parameters.blockSize+1]), e.buffer.fMono)
e.FourierPolyMulFourierGLWEAssign(e.buffer.ctBlockFourierAcc[0], e.buffer.fMono, e.buffer.ctFourierAcc[0])
for j := i*e.Parameters.blockSize + 1; j < (i+1)*e.Parameters.blockSize; j++ {
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[j], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[j], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctBlockFourierAcc[0])
e.PolyEvaluator.MonomialSubOneToFourierPolyAssign(-e.ModSwitch(ct.Value[j+1]), e.buffer.fMono)
e.FourierPolyMulAddFourierGLWEAssign(e.buffer.ctBlockFourierAcc[0], e.buffer.fMono, e.buffer.ctFourierAcc[0])
}
Expand All @@ -342,7 +342,7 @@ func (e *Evaluator[T]) blindRotateOriginalAssign(ct LWECiphertext[T], lut LookUp
e.PolyEvaluator.ToFourierPolyAssign(polyDecomposed[k], e.buffer.ctAccFourierDecomposed[0][0][k])
}

e.GadgetProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[0].Value[0], e.buffer.ctAccFourierDecomposed[0][0], e.buffer.ctFourierAcc[0])
e.GadgetProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[0].Value[0], e.buffer.ctAccFourierDecomposed[0][0], e.buffer.ctFourierAcc[0])
e.PolyEvaluator.MonomialSubOneToFourierPolyAssign(-e.ModSwitch(ct.Value[1]), e.buffer.fMono)
e.FourierPolyMulFourierGLWEAssign(e.buffer.ctFourierAcc[0], e.buffer.fMono, e.buffer.ctFourierAcc[0])
for j := 0; j < e.Parameters.glweRank+1; j++ {
Expand All @@ -357,7 +357,7 @@ func (e *Evaluator[T]) blindRotateOriginalAssign(ct LWECiphertext[T], lut LookUp
}
}

e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BootstrapKey.Value[i], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctFourierAcc[0])
e.ExternalProductFourierDecomposedFourierGLWEAssign(e.EvaluationKey.BlindRotateKey.Value[i], e.buffer.ctAccFourierDecomposed[0], e.buffer.ctFourierAcc[0])
e.PolyEvaluator.MonomialSubOneToFourierPolyAssign(-e.ModSwitch(ct.Value[i+1]), e.buffer.fMono)
e.FourierPolyMulFourierGLWEAssign(e.buffer.ctFourierAcc[0], e.buffer.fMono, e.buffer.ctFourierAcc[0])

Expand Down
70 changes: 35 additions & 35 deletions tfhe/bootstrap_key.go
Original file line number Diff line number Diff line change
@@ -1,100 +1,100 @@
package tfhe

// EvaluationKey is a public key for Evaluator,
// which consists of Bootstrapping Key and KeySwitching Key.
// which consists of BlindRotation Key and KeySwitching Key.
// All keys should be treated as read-only.
// Changing them mid-operation will usually result in wrong results.
type EvaluationKey[T TorusInt] struct {
// BootstrapKey is a bootstrap key.
BootstrapKey BootstrapKey[T]
// BlindRotateKey is a blindrotate key.
BlindRotateKey BlindRotateKey[T]
// KeySwitchKey is a keyswitch key switching LWELargeKey -> LWEKey.
KeySwitchKey LWEKeySwitchKey[T]
}

// NewEvaluationKey allocates an empty EvaluationKey.
func NewEvaluationKey[T TorusInt](params Parameters[T]) EvaluationKey[T] {
return EvaluationKey[T]{
BootstrapKey: NewBootstrapKey(params),
KeySwitchKey: NewKeySwitchKeyForBootstrap(params),
BlindRotateKey: NewBlindRotateKey(params),
KeySwitchKey: NewKeySwitchKeyForBootstrap(params),
}
}

// NewEvaluationKeyCustom allocates an empty EvaluationKey with custom parameters.
func NewEvaluationKeyCustom[T TorusInt](lweDimension, glweRank, polyDegree int, bootstrapParams, keyswitchParams GadgetParameters[T]) EvaluationKey[T] {
return EvaluationKey[T]{
BootstrapKey: NewBootstrapKeyCustom(lweDimension, glweRank, polyDegree, bootstrapParams),
KeySwitchKey: NewKeySwitchKeyForBootstrapCustom(lweDimension, glweRank, polyDegree, keyswitchParams),
BlindRotateKey: NewBlindRotateKeyCustom(lweDimension, glweRank, polyDegree, bootstrapParams),
KeySwitchKey: NewKeySwitchKeyForBootstrapCustom(lweDimension, glweRank, polyDegree, keyswitchParams),
}
}

// Copy returns a copy of the key.
func (evk EvaluationKey[T]) Copy() EvaluationKey[T] {
return EvaluationKey[T]{
BootstrapKey: evk.BootstrapKey.Copy(),
KeySwitchKey: evk.KeySwitchKey.Copy(),
BlindRotateKey: evk.BlindRotateKey.Copy(),
KeySwitchKey: evk.KeySwitchKey.Copy(),
}
}

// CopyFrom copies values from key.
func (evk *EvaluationKey[T]) CopyFrom(evkIn EvaluationKey[T]) {
evk.BootstrapKey.CopyFrom(evkIn.BootstrapKey)
evk.BlindRotateKey.CopyFrom(evkIn.BlindRotateKey)
evk.KeySwitchKey.CopyFrom(evkIn.KeySwitchKey)
}

// Clear clears the key.
func (evk *EvaluationKey[T]) Clear() {
evk.BootstrapKey.Clear()
evk.BlindRotateKey.Clear()
evk.KeySwitchKey.Clear()
}

// BootstrapKey is a key for bootstrapping.
// BlindRotateKey is a key for blind rotation.
// Essentially, this is a GGSW encryption of LWEKey with GLWEKey.
// However, FFT is already applied for fast external product.
type BootstrapKey[T TorusInt] struct {
type BlindRotateKey[T TorusInt] struct {
GadgetParameters GadgetParameters[T]

// Value has length LWEDimension.
Value []FourierGGSWCiphertext[T]
}

// NewBootstrapKey allocates an empty BootstrappingKey.
func NewBootstrapKey[T TorusInt](params Parameters[T]) BootstrapKey[T] {
bsk := make([]FourierGGSWCiphertext[T], params.lweDimension)
// NewBlindRotateKey allocates an empty BlindRotateKey.
func NewBlindRotateKey[T TorusInt](params Parameters[T]) BlindRotateKey[T] {
brk := make([]FourierGGSWCiphertext[T], params.lweDimension)
for i := 0; i < params.lweDimension; i++ {
bsk[i] = NewFourierGGSWCiphertext(params, params.bootstrapParameters)
brk[i] = NewFourierGGSWCiphertext(params, params.bootstrapParameters)
}
return BootstrapKey[T]{Value: bsk, GadgetParameters: params.bootstrapParameters}
return BlindRotateKey[T]{Value: brk, GadgetParameters: params.bootstrapParameters}
}

// NewBootstrapKeyCustom allocates an empty BootstrappingKey with custom parameters.
func NewBootstrapKeyCustom[T TorusInt](lweDimension, glweRank, polyDegree int, gadgetParams GadgetParameters[T]) BootstrapKey[T] {
bsk := make([]FourierGGSWCiphertext[T], lweDimension)
// NewBlindRotateKeyCustom allocates an empty BlindRotateKey with custom parameters.
func NewBlindRotateKeyCustom[T TorusInt](lweDimension, glweRank, polyDegree int, gadgetParams GadgetParameters[T]) BlindRotateKey[T] {
brk := make([]FourierGGSWCiphertext[T], lweDimension)
for i := 0; i < lweDimension; i++ {
bsk[i] = NewFourierGGSWCiphertextCustom(glweRank, polyDegree, gadgetParams)
brk[i] = NewFourierGGSWCiphertextCustom(glweRank, polyDegree, gadgetParams)
}
return BootstrapKey[T]{Value: bsk, GadgetParameters: gadgetParams}
return BlindRotateKey[T]{Value: brk, GadgetParameters: gadgetParams}
}

// Copy returns a copy of the key.
func (bsk BootstrapKey[T]) Copy() BootstrapKey[T] {
bskCopy := make([]FourierGGSWCiphertext[T], len(bsk.Value))
for i := range bsk.Value {
bskCopy[i] = bsk.Value[i].Copy()
func (brk BlindRotateKey[T]) Copy() BlindRotateKey[T] {
brkCopy := make([]FourierGGSWCiphertext[T], len(brk.Value))
for i := range brk.Value {
brkCopy[i] = brk.Value[i].Copy()
}
return BootstrapKey[T]{Value: bskCopy, GadgetParameters: bsk.GadgetParameters}
return BlindRotateKey[T]{Value: brkCopy, GadgetParameters: brk.GadgetParameters}
}

// CopyFrom copies values from key.
func (bsk *BootstrapKey[T]) CopyFrom(bskIn BootstrapKey[T]) {
for i := range bsk.Value {
bsk.Value[i].CopyFrom(bskIn.Value[i])
func (brk *BlindRotateKey[T]) CopyFrom(brkIn BlindRotateKey[T]) {
for i := range brk.Value {
brk.Value[i].CopyFrom(brkIn.Value[i])
}
bsk.GadgetParameters = bskIn.GadgetParameters
brk.GadgetParameters = brkIn.GadgetParameters
}

// Clear clears the key.
func (bsk *BootstrapKey[T]) Clear() {
for i := range bsk.Value {
bsk.Value[i].Clear()
func (brk *BlindRotateKey[T]) Clear() {
for i := range brk.Value {
brk.Value[i].Clear()
}
}
Loading

0 comments on commit 8a1f279

Please sign in to comment.