Skip to content

Commit 99b939e

Browse files
committed
Make HeContext flexible
1 parent 7df31ad commit 99b939e

File tree

67 files changed

+507
-516
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+507
-516
lines changed

Benchmarks/RlweBenchmark/RlweBenchmark.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func getRandomPlaintextData<T: ScalarType>(count: Int, in range: Range<T>) -> [T
4343

4444
struct RlweBenchmarkContext<Scheme: HeScheme>: Sendable {
4545
var encryptionParameters: EncryptionParameters<Scheme.Scalar>
46-
var context: Context<Scheme.Scalar>
46+
var context: Scheme.Context
4747

4848
let data: [Scheme.Scalar]
4949
let signedData: [Scheme.SignedScalar]
@@ -69,7 +69,7 @@ struct RlweBenchmarkContext<Scheme: HeScheme>: Sendable {
6969
Scheme.Scalar.self),
7070
errorStdDev: ErrorStdDev.stdDev32,
7171
securityLevel: SecurityLevel.quantum128)
72-
self.context = try Context(encryptionParameters: encryptionParameters)
72+
self.context = try Scheme.Context(encryptionParameters: encryptionParameters)
7373
self.secretKey = try context.generateSecretKey()
7474
let columnElement = GaloisElement.swappingRows(degree: polyDegree)
7575
let rowElement = try GaloisElement.rotatingColumns(by: rotateColumnsStep, degree: polyDegree)
@@ -163,7 +163,7 @@ func contextInitBenchmark<Scheme: HeScheme>(_: Scheme.Type, config: EncryptionPa
163163
let encryptionParameters = try EncryptionParameters<Scheme.Scalar>(config: config)
164164
benchmark.startMeasurement()
165165
for _ in benchmark.scaledIterations {
166-
try blackHole(_ = Context<Scheme.Scalar>(encryptionParameters: encryptionParameters))
166+
try blackHole(_ = Scheme.Context(encryptionParameters: encryptionParameters))
167167
}
168168
}
169169
}

Snippets/HomomorphicEncryption/BasicsSnippet.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,14 @@ import HomomorphicEncryption
2424
let encryptParams =
2525
try EncryptionParameters<UInt64>(from: .insecure_n_8_logq_5x18_logt_5)
2626
// Perform pre-computation for HE computation with these parameters.
27-
let context = try Context<UInt64>(encryptionParameters: encryptParams)
27+
let context = try Bfv<UInt64>.Context(encryptionParameters: encryptParams)
2828

2929
// We encode N values using coefficient encoding.
3030
let values: [UInt64] = [8, 5, 12, 12, 15, 0, 8, 5]
31-
let plaintext: Bfv<UInt64>.CoeffPlaintext = try context.encode(
32-
values: values,
33-
format: .coefficient)
31+
let plaintext = try context.encode(values: values, format: .coefficient)
3432

3533
// We generate a secret key and use it to encrypt the plaintext.
36-
let secretKey: SecretKey<Bfv<UInt64>> = try context.generateSecretKey()
34+
let secretKey = try context.generateSecretKey()
3735
var ciphertext = try plaintext.encrypt(using: secretKey)
3836

3937
// Decrypting the plaintext yields the original values.

Snippets/HomomorphicEncryption/EncryptionParametersSnippet.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,9 @@ func summarize<Scheme: HeScheme>(
8585
parameters: EncryptionParameters<Scheme.Scalar>, _: Scheme.Type) throws
8686
{
8787
let values = (0..<8).map { Scheme.Scalar($0) }
88-
let context = try Context<Scheme.Scalar>(encryptionParameters: parameters)
89-
let plaintext: Scheme.CoeffPlaintext = try context.encode(
90-
values: values,
91-
format: .coefficient)
92-
let secretKey: SecretKey<Scheme> = try context.generateSecretKey()
88+
let context = try Scheme.Context(encryptionParameters: parameters)
89+
let plaintext = try context.encode(values: values, format: .coefficient)
90+
let secretKey = try context.generateSecretKey()
9391
let ciphertext = try plaintext.encrypt(using: secretKey)
9492
let noiseBudget = try ciphertext.noiseBudget(
9593
using: secretKey,

Snippets/HomomorphicEncryption/EvaluationKeySnippet.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,15 @@ let encryptionParameters =
4646
try EncryptionParameters<UInt32>(from: .insecure_n_8_logq_5x18_logt_5)
4747
precondition(encryptionParameters.plaintextModulus == 17)
4848
// Perform pre-computation for HE computation with these parameters.
49-
let context = try Context<UInt32>(encryptionParameters: encryptionParameters)
49+
let context = try Bfv<UInt32>.Context(encryptionParameters: encryptionParameters)
5050

5151
// We encode N values using SIMD encoding.
5252
// Each value is a Bfv<UInt32>.Scalar, which is UInt32.
5353
let values = (0..<8).map { Bfv<UInt32>.Scalar($0) }
54-
let plaintext: Bfv<UInt32>.CoeffPlaintext = try context.encode(
55-
values: values,
56-
format: .simd)
54+
let plaintext = try context.encode(values: values, format: .simd)
5755

5856
// We generate a secret key and encrypt the plaintext.
59-
let secretKey: SecretKey<Bfv<UInt32>> = try context.generateSecretKey()
57+
let secretKey = try context.generateSecretKey()
6058
var ciphertext = try plaintext.encrypt(using: secretKey)
6159

6260
// We generate an evaluation key. This is a key used in some HE operations.

Snippets/HomomorphicEncryption/MultiplicationSnippet.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,17 @@ let encryptParams =
3434
try EncryptionParameters<UInt32>(from: .insecure_n_8_logq_5x18_logt_5)
3535
precondition(encryptParams.plaintextModulus == 17)
3636
// Perform pre-computation for HE computation with these parameters.
37-
let context = try Context<UInt32>(encryptionParameters: encryptParams)
37+
let context = try Bfv<UInt32>.Context(encryptionParameters: encryptParams)
3838

3939
// We don't need to use all the slots in the encoding.
4040
// However, performing HE operations on ciphertexts with fewer slots doesn't give
4141
// any runtime savings.
4242
let valueCount = encryptParams.polyDegree / 2
4343
let values = (0..<valueCount).map { UInt32($0) }
44-
let plaintext: Bfv<UInt32>.CoeffPlaintext = try context.encode(
45-
values: values,
46-
format: .simd)
44+
let plaintext = try context.encode(values: values, format: .simd)
4745

4846
// We generate a secret key and encrypt the plaintext.
49-
let secretKey: SecretKey<Bfv<UInt32>> = try context.generateSecretKey()
47+
let secretKey = try context.generateSecretKey()
5048
let ciphertext = try plaintext.encrypt(using: secretKey)
5149

5250
// Multiplication requires the ciphertext and plaintext to be in Evaluation

Snippets/HomomorphicEncryption/NoiseBudgetSnippet.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,14 @@ func checkDecryptsDecodes<Scheme: HeScheme>(
4545
let encryptionParameters =
4646
try EncryptionParameters<UInt32>(from: .insecure_n_8_logq_5x18_logt_5)
4747
// Perform pre-computation for HE computation with these parameters.
48-
let context = try Context<UInt32>(encryptionParameters: encryptionParameters)
48+
let context = try Bfv<UInt32>.Context(encryptionParameters: encryptionParameters)
4949

5050
// We encode N values in coefficient format and SIMD encoding.
5151
let values = (0..<8).map { UInt32($0) }
52-
let plaintext: Bfv<UInt32>.CoeffPlaintext = try context.encode(
53-
values: values,
54-
format: .simd)
52+
let plaintext = try context.encode(values: values, format: .simd)
5553

5654
// We generate a secret key and encrypt the plaintext.
57-
let secretKey: SecretKey<Bfv<UInt32>> = try context.generateSecretKey()
55+
let secretKey = try context.generateSecretKey()
5856
var ciphertext = try plaintext.encrypt(using: secretKey)
5957

6058
// The noiseBudget of a ciphertext is a measure of how many encrypted operations

Snippets/HomomorphicEncryption/SerializationSnippet.swift

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,15 @@ extension SerializedCiphertext {
3636
let encryptionParameters =
3737
try EncryptionParameters<UInt32>(from: .n_4096_logq_27_28_28_logt_5)
3838
// Perform pre-computation for HE computation with these parameters.
39-
let context = try Context<UInt32>(encryptionParameters: encryptionParameters)
39+
let context = try Bfv<UInt32>.Context(encryptionParameters: encryptionParameters)
4040

4141
// We encode some values in coefficient format and coefficient encoding.
4242
let values = (0..<8).map { UInt32($0) }
43-
let plaintext: Bfv<UInt32>.CoeffPlaintext = try context.encode(
44-
values: values,
45-
format: .coefficient)
43+
let plaintext = try context.encode(values: values, format: .coefficient)
4644

4745
// We generate a secret key and encrypt the plaintext.
48-
let secretKey: SecretKey<Bfv<UInt32>> = try context.generateSecretKey()
49-
var ciphertext: Bfv<UInt32>.CanonicalCiphertext = try plaintext
50-
.encrypt(using: secretKey)
46+
let secretKey = try context.generateSecretKey()
47+
var ciphertext = try plaintext.encrypt(using: secretKey)
5148

5249
// A freshly-encrypted ciphertext has one of its 2 polynomials sampled uniformly
5350
// randomly from a seeded random number generator (RNG). We compress such

Sources/BenchmarkUtilities/PirBenchmarkUtilities.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ extension PrivateInformationRetrieval.Response {
8383

8484
struct ProcessBenchmarkContext<Server: IndexPirServer> {
8585
let database: [[UInt8]]
86-
let context: Context<Server.Scheme.Scalar>
86+
let context: Server.Scheme.Context
8787
let parameter: IndexPirParameter
8888
init(server _: Server.Type, pirConfig: IndexPirConfig,
8989
parameterConfig: PirEncryptionParametersConfig) throws
@@ -93,7 +93,7 @@ struct ProcessBenchmarkContext<Server: IndexPirServer> {
9393
self.database = getDatabaseForTesting(
9494
numberOfEntries: pirConfig.entryCount,
9595
entrySizeInBytes: pirConfig.entrySizeInBytes)
96-
self.context = try Context(encryptionParameters: encryptParameter)
96+
self.context = try Server.Scheme.Context(encryptionParameters: encryptParameter)
9797
self.parameter = Server.generateParameter(config: pirConfig, with: context)
9898
}
9999
}
@@ -171,7 +171,7 @@ struct IndexPirBenchmarkContext<Server: IndexPirServer, Client: IndexPirClient>
171171
{
172172
let encryptParameter: EncryptionParameters<Server.Scheme.Scalar> =
173173
try EncryptionParameters(from: parameterConfig)
174-
let context = try Context<Server.Scheme.Scalar>(encryptionParameters: encryptParameter)
174+
let context = try Server.Scheme.Context(encryptionParameters: encryptParameter)
175175
let indexPirParameters = Server.generateParameter(config: pirConfig, with: context)
176176
let database = getDatabaseForTesting(
177177
numberOfEntries: pirConfig.entryCount,
@@ -286,7 +286,7 @@ struct KeywordPirBenchmarkContext<IndexServer: IndexPirServer, IndexClient: Inde
286286
{
287287
let encryptParameter: EncryptionParameters<Server.Scheme.Scalar> =
288288
try EncryptionParameters(from: parameterConfig)
289-
let context = try Context<Server.Scheme.Scalar>(encryptionParameters: encryptParameter)
289+
let context = try Server.Scheme.Context(encryptionParameters: encryptParameter)
290290
let rows = (0..<databaseCount).map { index in KeywordValuePair(
291291
keyword: [UInt8](String(index).utf8),
292292
value: (0..<payloadSize).map { _ in UInt8.random(in: 0..<UInt8.max) })

Sources/BenchmarkUtilities/PnnsBenchmarkUtilities.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ extension PrivateNearestNeighborSearch.Response {
188188

189189
struct PnnsProcessBenchmarkContext<Scheme: HeScheme> {
190190
let database: Database
191-
let contexts: [Context<Scheme.Scalar>]
191+
let contexts: [Scheme.Context]
192192
let serverConfig: ServerConfig<Scheme>
193193

194194
init(databaseConfig: DatabaseConfig,
@@ -238,7 +238,7 @@ struct PnnsProcessBenchmarkContext<Scheme: HeScheme> {
238238

239239
self.database = getDatabaseForTesting(config: databaseConfig)
240240
self.contexts = try serverConfig.encryptionParameters.map { encryptionParameters in
241-
try Context(encryptionParameters: encryptionParameters)
241+
try Scheme.Context(encryptionParameters: encryptionParameters)
242242
}
243243
}
244244
}
@@ -305,7 +305,7 @@ struct PnnsBenchmarkContext<Scheme: HeScheme> {
305305

306306
let database = getDatabaseForTesting(config: databaseConfig)
307307
let contexts = try clientConfig.encryptionParameters
308-
.map { encryptionParameters in try Context<Scheme.Scalar>(encryptionParameters: encryptionParameters) }
308+
.map { encryptionParameters in try Scheme.Context(encryptionParameters: encryptionParameters) }
309309
self.processedDatabase = try database.process(config: serverConfig, contexts: contexts)
310310
self.client = try Client(config: clientConfig, contexts: contexts)
311311
self.server = try Server(database: processedDatabase)

Sources/HomomorphicEncryption/Bfv/Bfv+Decrypt.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ extension Bfv {
2626

2727
@inlinable
2828
// swiftlint:disable:next missing_docs attributes
29-
public static func decryptEval(_ ciphertext: EvalCiphertext,
30-
using secretKey: SecretKey<Bfv<T>>) throws -> CoeffPlaintext
29+
public static func decryptEval(_ ciphertext: EvalCiphertext, using secretKey: SecretKey<Self>) throws ->
30+
CoeffPlaintext
3131
{
3232
let t = ciphertext.context.plaintextModulus
3333
let dotProduct = try Self.dotProduct(ciphertext: ciphertext, with: secretKey)

0 commit comments

Comments
 (0)