Skip to content

Commit 4596544

Browse files
authored
Make PIR & PNNS benchmarks more general (#225)
1 parent 807ee8b commit 4596544

File tree

6 files changed

+280
-228
lines changed

6 files changed

+280
-228
lines changed

Benchmarks/PrivateInformationRetrievalBenchmark/PrivateInformationRetrievalBenchmark.swift renamed to Benchmarks/PrivateInformationRetrievalBenchmark/PirBenchmark.swift

File renamed without changes.

Benchmarks/PrivateNearestNeighborSearchBenchmark/PrivateNearestNeighborSearchBenchmark.swift renamed to Benchmarks/PrivateNearestNeighborSearchBenchmark/PnnsBenchmark.swift

File renamed without changes.

Sources/PrivateInformationRetrieval/KeywordPirProtocol.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,24 @@ import HomomorphicEncryption
1818
/// Configuration for a ``KeywordDatabase``.
1919
public struct KeywordPirConfig: Hashable, Codable, Sendable {
2020
/// Number of dimensions in the database.
21-
@usableFromInline let dimensionCount: Int
21+
public let dimensionCount: Int
2222

2323
/// Configuration for the cuckoo table.
24-
@usableFromInline let cuckooTableConfig: CuckooTableConfig
24+
public let cuckooTableConfig: CuckooTableConfig
2525

2626
/// Whether to enable the `uneven dimensions` optimization.
27-
@usableFromInline let unevenDimensions: Bool
27+
public let unevenDimensions: Bool
2828

29-
/// Strategy for ``EvaluationKey`` compression.
30-
@usableFromInline let keyCompression: PirKeyCompressionStrategy
29+
/// Strategy for evaluation key compression.
30+
public let keyCompression: PirKeyCompressionStrategy
3131

3232
/// When set to true, entry size will be equal to ``CuckooTableConfig/maxSerializedBucketSize``.
3333
///
3434
/// Otherwise the largest serialized bucket size is used instead.
35-
@usableFromInline let useMaxSerializedBucketSize: Bool
35+
public let useMaxSerializedBucketSize: Bool
3636

3737
/// Sharding function configuration.
38-
@usableFromInline let shardingFunction: ShardingFunction
38+
public let shardingFunction: ShardingFunction
3939

4040
/// Keyword PIR parameters.
4141
public var parameter: KeywordPirParameter {

Sources/_BenchmarkUtilities/BenchmarkMetricExtensions.swift

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
import Benchmark
16+
import HomomorphicEncryption
1617

1718
let noiseBudgetScale = 10
1819

@@ -25,3 +26,64 @@ extension BenchmarkMetric {
2526
static var responseCiphertextCount: Self { .custom("Response ciphertext count") }
2627
static var noiseBudget: Self { .custom("Noise budget x \(noiseBudgetScale)") }
2728
}
29+
30+
/// Encryption parameters configuration for benchmarks.
31+
public struct EncryptionParametersConfig {
32+
/// Default configuration for PNNS benchmarks
33+
public nonisolated(unsafe) static let defaultPnns = EncryptionParametersConfig(
34+
polyDegree: 4096,
35+
// use plaintextModulusBits: [16, 17] for plaintext CRT
36+
plaintextModulusBits: [17],
37+
coefficientModulusBits: [27, 28, 28])
38+
39+
/// Default configuration for PIR benchmarks
40+
public nonisolated(unsafe) static let defaultPir = EncryptionParametersConfig(
41+
polyDegree: 4096,
42+
plaintextModulusBits: [5],
43+
coefficientModulusBits: [27, 28, 28])
44+
45+
/// Polynomial degree.
46+
public let polyDegree: Int
47+
/// Number of significant bits in each plaintext modulus.
48+
public let plaintextModulusBits: [Int]
49+
/// Number of significant bits in each ciphertext modulus.
50+
public let coefficientModulusBits: [Int]
51+
52+
/// Creates a new ``EncryptionParametersConfig``
53+
/// - Parameters:
54+
/// - polyDegree: Polynomial degree
55+
/// - plaintextModulusBits: Number of significant bits in each plaintext modulus.
56+
/// - coefficientModulusBits: Number of significant bits in each ciphertext modulus.
57+
public init(polyDegree: Int, plaintextModulusBits: [Int], coefficientModulusBits: [Int]) {
58+
self.polyDegree = polyDegree
59+
self.plaintextModulusBits = plaintextModulusBits
60+
self.coefficientModulusBits = coefficientModulusBits
61+
}
62+
}
63+
64+
extension EncryptionParametersConfig: CustomStringConvertible {
65+
public var description: String {
66+
"N=\(polyDegree)/logt=\(plaintextModulusBits)/logq=\(coefficientModulusBits.description)"
67+
}
68+
}
69+
70+
extension EncryptionParameters {
71+
/// Creates a new ``EncryptionParameters`` from the configuration.
72+
/// - Parameter config: Configuration.
73+
/// - Throws: Upon failure to initialize encryption parameters.
74+
public init(from config: EncryptionParametersConfig) throws {
75+
let plaintextModulus = try Scalar.generatePrimes(
76+
significantBitCounts: config.plaintextModulusBits,
77+
preferringSmall: true)[0]
78+
let coefficientModuli = try Scalar.generatePrimes(
79+
significantBitCounts: config.coefficientModulusBits,
80+
preferringSmall: false,
81+
nttDegree: config.polyDegree)
82+
try self.init(
83+
polyDegree: config.polyDegree,
84+
plaintextModulus: plaintextModulus,
85+
coefficientModuli: coefficientModuli,
86+
errorStdDev: ErrorStdDev.stdDev32,
87+
securityLevel: SecurityLevel.quantum128)
88+
}
89+
}

0 commit comments

Comments
 (0)