1313// limitations under the License.
1414
1515import Benchmark
16+ import HomomorphicEncryption
1617
1718let 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