Skip to content

Commit 12fc549

Browse files
committed
Make all non-test randomness user-provided
1 parent ea8f66b commit 12fc549

21 files changed

+265
-258
lines changed

include/minisketch.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,19 @@ MINISKETCH_API uint32_t minisketch_implementation_max(void);
6060
*/
6161
MINISKETCH_API int minisketch_implementation_supported(uint32_t bits, uint32_t implementation);
6262

63-
/** Construct a sketch for a given element size, implementation and capacity.
63+
/** Construct a sketch for a given element size, implementation, capacity, and RNG seed.
6464
*
6565
* If the combination of `bits` and `implementation` is unavailable, or when
6666
* OOM occurs, NULL is returned. If minisketch_implementation_supported
6767
* returns 1 for the specified bits and implementation, this will always succeed
6868
* (except when allocation fails).
6969
*
70+
* To protect against bad performance on maliciously-created sketches, it is
71+
* to use strong randomness for the provided seed value.
72+
*
7073
* If the result is not NULL, it must be destroyed using minisketch_destroy.
7174
*/
72-
MINISKETCH_API minisketch* minisketch_create(uint32_t bits, uint32_t implementation, size_t capacity);
75+
MINISKETCH_API minisketch* minisketch_create(uint32_t bits, uint32_t implementation, size_t capacity, uint64_t seed);
7376

7477
/** Get the element size of a sketch in bits. */
7578
MINISKETCH_API uint32_t minisketch_bits(const minisketch* sketch);
@@ -82,14 +85,11 @@ MINISKETCH_API uint32_t minisketch_implementation(const minisketch* sketch);
8285

8386
/** Set the seed for randomizing algorithm choices to a fixed value.
8487
*
85-
* By default, sketches are initialized with a random seed. This is important
86-
* to avoid scenarios where an attacker could force worst-case behavior.
87-
*
88-
* This function initializes the seed to a user-provided value (any 64-bit
89-
* integer is acceptable, regardless of field size).
88+
* This is equivalent to recreating the sketch with a different RNG seed.
9089
*
9190
* When seed is -1, a fixed internal value with predictable behavior is
92-
* used. It is only intended for testing.
91+
* used. It is only intended for testing. Note that minisketch_create does
92+
* assign special meaning to seed = -1.
9393
*/
9494
MINISKETCH_API void minisketch_set_seed(minisketch* sketch, uint64_t seed);
9595

@@ -263,16 +263,16 @@ class Minisketch
263263
* ImplementationSupported(), or OOM occurs internally, an invalid Minisketch
264264
* object will be constructed. Use operator bool() to check that this isn't the
265265
* case before performing any other operations. */
266-
Minisketch(uint32_t bits, uint32_t implementation, size_t capacity) noexcept
266+
Minisketch(uint32_t bits, uint32_t implementation, size_t capacity, uint64_t seed) noexcept
267267
{
268-
m_minisketch = std::unique_ptr<minisketch, Deleter>(minisketch_create(bits, implementation, capacity));
268+
m_minisketch = std::unique_ptr<minisketch, Deleter>(minisketch_create(bits, implementation, capacity, seed));
269269
}
270270

271271
/** Create a Minisketch object sufficiently large for the specified number of elements at given fpbits.
272272
* It may construct an invalid object, which you may need to check for. */
273-
static Minisketch CreateFP(uint32_t bits, uint32_t implementation, size_t max_elements, uint32_t fpbits) noexcept
273+
static Minisketch CreateFP(uint32_t bits, uint32_t implementation, size_t max_elements, uint32_t fpbits, uint64_t seed) noexcept
274274
{
275-
return Minisketch(bits, implementation, ComputeCapacity(bits, max_elements, fpbits));
275+
return Minisketch(bits, implementation, ComputeCapacity(bits, max_elements, fpbits), seed);
276276
}
277277

278278
/** Return the field size for a (valid) Minisketch object. */

src/fields/clmul_1byte.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,37 +82,37 @@ typedef Field<uint8_t, 8, 27, StatTable8, &SQR_TABLE_8, &SQR2_TABLE_8, &QRT_TABL
8282
#endif
8383
}
8484

85-
Sketch* ConstructClMul1Byte(int bits, int implementation) {
85+
Sketch* ConstructClMul1Byte(int bits, int implementation, uint64_t seed) {
8686
switch (bits) {
8787
#ifdef ENABLE_FIELD_INT_5
88-
case 5: return new SketchImpl<Field5>(implementation, 5);
88+
case 5: return new SketchImpl<Field5>(implementation, 5, seed);
8989
#endif
9090
#ifdef ENABLE_FIELD_INT_8
91-
case 8: return new SketchImpl<Field8>(implementation, 8);
91+
case 8: return new SketchImpl<Field8>(implementation, 8, seed);
9292
#endif
9393
}
9494
return nullptr;
9595
}
9696

97-
Sketch* ConstructClMulTri1Byte(int bits, int implementation) {
97+
Sketch* ConstructClMulTri1Byte(int bits, int implementation, uint64_t seed) {
9898
switch (bits) {
9999
#ifdef ENABLE_FIELD_INT_2
100-
case 2: return new SketchImpl<FieldTri2>(implementation, 2);
100+
case 2: return new SketchImpl<FieldTri2>(implementation, 2, seed);
101101
#endif
102102
#ifdef ENABLE_FIELD_INT_3
103-
case 3: return new SketchImpl<FieldTri3>(implementation, 3);
103+
case 3: return new SketchImpl<FieldTri3>(implementation, 3, seed);
104104
#endif
105105
#ifdef ENABLE_FIELD_INT_4
106-
case 4: return new SketchImpl<FieldTri4>(implementation, 4);
106+
case 4: return new SketchImpl<FieldTri4>(implementation, 4, seed);
107107
#endif
108108
#ifdef ENABLE_FIELD_INT_5
109-
case 5: return new SketchImpl<FieldTri5>(implementation, 5);
109+
case 5: return new SketchImpl<FieldTri5>(implementation, 5, seed);
110110
#endif
111111
#ifdef ENABLE_FIELD_INT_6
112-
case 6: return new SketchImpl<FieldTri6>(implementation, 6);
112+
case 6: return new SketchImpl<FieldTri6>(implementation, 6, seed);
113113
#endif
114114
#ifdef ENABLE_FIELD_INT_7
115-
case 7: return new SketchImpl<FieldTri7>(implementation, 7);
115+
case 7: return new SketchImpl<FieldTri7>(implementation, 7, seed);
116116
#endif
117117
}
118118
return nullptr;

src/fields/clmul_2bytes.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -105,49 +105,49 @@ typedef Field<uint16_t, 16, 43, StatTable16, &SQR_TABLE_16, &SQR2_TABLE_16, &SQR
105105
#endif
106106
}
107107

108-
Sketch* ConstructClMul2Bytes(int bits, int implementation) {
108+
Sketch* ConstructClMul2Bytes(int bits, int implementation, uint64_t seed) {
109109
switch (bits) {
110110
#ifdef ENABLE_FIELD_INT_10
111-
case 10: return new SketchImpl<Field10>(implementation, 10);
111+
case 10: return new SketchImpl<Field10>(implementation, 10, seed);
112112
#endif
113113
#ifdef ENABLE_FIELD_INT_11
114-
case 11: return new SketchImpl<Field11>(implementation, 11);
114+
case 11: return new SketchImpl<Field11>(implementation, 11, seed);
115115
#endif
116116
#ifdef ENABLE_FIELD_INT_12
117-
case 12: return new SketchImpl<Field12>(implementation, 12);
117+
case 12: return new SketchImpl<Field12>(implementation, 12, seed);
118118
#endif
119119
#ifdef ENABLE_FIELD_INT_13
120-
case 13: return new SketchImpl<Field13>(implementation, 13);
120+
case 13: return new SketchImpl<Field13>(implementation, 13, seed);
121121
#endif
122122
#ifdef ENABLE_FIELD_INT_14
123-
case 14: return new SketchImpl<Field14>(implementation, 14);
123+
case 14: return new SketchImpl<Field14>(implementation, 14, seed);
124124
#endif
125125
#ifdef ENABLE_FIELD_INT_16
126-
case 16: return new SketchImpl<Field16>(implementation, 16);
126+
case 16: return new SketchImpl<Field16>(implementation, 16, seed);
127127
#endif
128128
}
129129
return nullptr;
130130
}
131131

132-
Sketch* ConstructClMulTri2Bytes(int bits, int implementation) {
132+
Sketch* ConstructClMulTri2Bytes(int bits, int implementation, uint64_t seed) {
133133
switch (bits) {
134134
#ifdef ENABLE_FIELD_INT_9
135-
case 9: return new SketchImpl<FieldTri9>(implementation, 9);
135+
case 9: return new SketchImpl<FieldTri9>(implementation, 9, seed);
136136
#endif
137137
#ifdef ENABLE_FIELD_INT_10
138-
case 10: return new SketchImpl<FieldTri10>(implementation, 10);
138+
case 10: return new SketchImpl<FieldTri10>(implementation, 10, seed);
139139
#endif
140140
#ifdef ENABLE_FIELD_INT_11
141-
case 11: return new SketchImpl<FieldTri11>(implementation, 11);
141+
case 11: return new SketchImpl<FieldTri11>(implementation, 11, seed);
142142
#endif
143143
#ifdef ENABLE_FIELD_INT_12
144-
case 12: return new SketchImpl<FieldTri12>(implementation, 12);
144+
case 12: return new SketchImpl<FieldTri12>(implementation, 12, seed);
145145
#endif
146146
#ifdef ENABLE_FIELD_INT_14
147-
case 14: return new SketchImpl<FieldTri14>(implementation, 14);
147+
case 14: return new SketchImpl<FieldTri14>(implementation, 14, seed);
148148
#endif
149149
#ifdef ENABLE_FIELD_INT_15
150-
case 15: return new SketchImpl<FieldTri15>(implementation, 15);
150+
case 15: return new SketchImpl<FieldTri15>(implementation, 15, seed);
151151
#endif
152152
}
153153
return nullptr;

src/fields/clmul_3bytes.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -114,52 +114,52 @@ typedef Field<uint32_t, 24, 27, StatTable24, &SQR_TABLE_24, &SQR2_TABLE_24, &SQR
114114
#endif
115115
}
116116

117-
Sketch* ConstructClMul3Bytes(int bits, int implementation) {
117+
Sketch* ConstructClMul3Bytes(int bits, int implementation, uint64_t seed) {
118118
switch (bits) {
119119
#ifdef ENABLE_FIELD_INT_17
120-
case 17: return new SketchImpl<Field17>(implementation, 17);
120+
case 17: return new SketchImpl<Field17>(implementation, 17, seed);
121121
#endif
122122
#ifdef ENABLE_FIELD_INT_18
123-
case 18: return new SketchImpl<Field18>(implementation, 18);
123+
case 18: return new SketchImpl<Field18>(implementation, 18, seed);
124124
#endif
125125
#ifdef ENABLE_FIELD_INT_19
126-
case 19: return new SketchImpl<Field19>(implementation, 19);
126+
case 19: return new SketchImpl<Field19>(implementation, 19, seed);
127127
#endif
128128
#ifdef ENABLE_FIELD_INT_20
129-
case 20: return new SketchImpl<Field20>(implementation, 20);
129+
case 20: return new SketchImpl<Field20>(implementation, 20, seed);
130130
#endif
131131
#ifdef ENABLE_FIELD_INT_21
132-
case 21: return new SketchImpl<Field21>(implementation, 21);
132+
case 21: return new SketchImpl<Field21>(implementation, 21, seed);
133133
#endif
134134
#ifdef ENABLE_FIELD_INT_23
135-
case 23: return new SketchImpl<Field23>(implementation, 23);
135+
case 23: return new SketchImpl<Field23>(implementation, 23, seed);
136136
#endif
137137
#ifdef ENABLE_FIELD_INT_24
138-
case 24: return new SketchImpl<Field24>(implementation, 24);
138+
case 24: return new SketchImpl<Field24>(implementation, 24, seed);
139139
#endif
140140
}
141141
return nullptr;
142142
}
143143

144-
Sketch* ConstructClMulTri3Bytes(int bits, int implementation) {
144+
Sketch* ConstructClMulTri3Bytes(int bits, int implementation, uint64_t seed) {
145145
switch (bits) {
146146
#ifdef ENABLE_FIELD_INT_17
147-
case 17: return new SketchImpl<FieldTri17>(implementation, 17);
147+
case 17: return new SketchImpl<FieldTri17>(implementation, 17, seed);
148148
#endif
149149
#ifdef ENABLE_FIELD_INT_18
150-
case 18: return new SketchImpl<FieldTri18>(implementation, 18);
150+
case 18: return new SketchImpl<FieldTri18>(implementation, 18, seed);
151151
#endif
152152
#ifdef ENABLE_FIELD_INT_20
153-
case 20: return new SketchImpl<FieldTri20>(implementation, 20);
153+
case 20: return new SketchImpl<FieldTri20>(implementation, 20, seed);
154154
#endif
155155
#ifdef ENABLE_FIELD_INT_21
156-
case 21: return new SketchImpl<FieldTri21>(implementation, 21);
156+
case 21: return new SketchImpl<FieldTri21>(implementation, 21, seed);
157157
#endif
158158
#ifdef ENABLE_FIELD_INT_22
159-
case 22: return new SketchImpl<FieldTri22>(implementation, 22);
159+
case 22: return new SketchImpl<FieldTri22>(implementation, 22, seed);
160160
#endif
161161
#ifdef ENABLE_FIELD_INT_23
162-
case 23: return new SketchImpl<FieldTri23>(implementation, 23);
162+
case 23: return new SketchImpl<FieldTri23>(implementation, 23, seed);
163163
#endif
164164
}
165165
return nullptr;

src/fields/clmul_4bytes.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -112,46 +112,46 @@ typedef Field<uint32_t, 32, 141, StatTable32, &SQR_TABLE_32, &SQR2_TABLE_32, &SQ
112112
#endif
113113
}
114114

115-
Sketch* ConstructClMul4Bytes(int bits, int implementation) {
115+
Sketch* ConstructClMul4Bytes(int bits, int implementation, uint64_t seed) {
116116
switch (bits) {
117117
#ifdef ENABLE_FIELD_INT_25
118-
case 25: return new SketchImpl<Field25>(implementation, 25);
118+
case 25: return new SketchImpl<Field25>(implementation, 25, seed);
119119
#endif
120120
#ifdef ENABLE_FIELD_INT_26
121-
case 26: return new SketchImpl<Field26>(implementation, 26);
121+
case 26: return new SketchImpl<Field26>(implementation, 26, seed);
122122
#endif
123123
#ifdef ENABLE_FIELD_INT_27
124-
case 27: return new SketchImpl<Field27>(implementation, 27);
124+
case 27: return new SketchImpl<Field27>(implementation, 27, seed);
125125
#endif
126126
#ifdef ENABLE_FIELD_INT_29
127-
case 29: return new SketchImpl<Field29>(implementation, 29);
127+
case 29: return new SketchImpl<Field29>(implementation, 29, seed);
128128
#endif
129129
#ifdef ENABLE_FIELD_INT_31
130-
case 31: return new SketchImpl<Field31>(implementation, 31);
130+
case 31: return new SketchImpl<Field31>(implementation, 31, seed);
131131
#endif
132132
#ifdef ENABLE_FIELD_INT_32
133-
case 32: return new SketchImpl<Field32>(implementation, 32);
133+
case 32: return new SketchImpl<Field32>(implementation, 32, seed);
134134
#endif
135135
}
136136
return nullptr;
137137
}
138138

139-
Sketch* ConstructClMulTri4Bytes(int bits, int implementation) {
139+
Sketch* ConstructClMulTri4Bytes(int bits, int implementation, uint64_t seed) {
140140
switch (bits) {
141141
#ifdef ENABLE_FIELD_INT_25
142-
case 25: return new SketchImpl<FieldTri25>(implementation, 25);
142+
case 25: return new SketchImpl<FieldTri25>(implementation, 25, seed);
143143
#endif
144144
#ifdef ENABLE_FIELD_INT_28
145-
case 28: return new SketchImpl<FieldTri28>(implementation, 28);
145+
case 28: return new SketchImpl<FieldTri28>(implementation, 28, seed);
146146
#endif
147147
#ifdef ENABLE_FIELD_INT_29
148-
case 29: return new SketchImpl<FieldTri29>(implementation, 29);
148+
case 29: return new SketchImpl<FieldTri29>(implementation, 29, seed);
149149
#endif
150150
#ifdef ENABLE_FIELD_INT_30
151-
case 30: return new SketchImpl<FieldTri30>(implementation, 30);
151+
case 30: return new SketchImpl<FieldTri30>(implementation, 30, seed);
152152
#endif
153153
#ifdef ENABLE_FIELD_INT_31
154-
case 31: return new SketchImpl<FieldTri31>(implementation, 31);
154+
case 31: return new SketchImpl<FieldTri31>(implementation, 31, seed);
155155
#endif
156156
}
157157
return nullptr;

src/fields/clmul_5bytes.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -122,52 +122,52 @@ typedef Field<uint64_t, 40, 57, StatTable40, &SQR_TABLE_40, &SQR2_TABLE_40, &SQR
122122
#endif
123123
}
124124

125-
Sketch* ConstructClMul5Bytes(int bits, int implementation) {
125+
Sketch* ConstructClMul5Bytes(int bits, int implementation, uint64_t seed) {
126126
switch (bits) {
127127
#ifdef ENABLE_FIELD_INT_33
128-
case 33: return new SketchImpl<Field33>(implementation, 33);
128+
case 33: return new SketchImpl<Field33>(implementation, 33, seed);
129129
#endif
130130
#ifdef ENABLE_FIELD_INT_34
131-
case 34: return new SketchImpl<Field34>(implementation, 34);
131+
case 34: return new SketchImpl<Field34>(implementation, 34, seed);
132132
#endif
133133
#ifdef ENABLE_FIELD_INT_35
134-
case 35: return new SketchImpl<Field35>(implementation, 35);
134+
case 35: return new SketchImpl<Field35>(implementation, 35, seed);
135135
#endif
136136
#ifdef ENABLE_FIELD_INT_36
137-
case 36: return new SketchImpl<Field36>(implementation, 36);
137+
case 36: return new SketchImpl<Field36>(implementation, 36, seed);
138138
#endif
139139
#ifdef ENABLE_FIELD_INT_37
140-
case 37: return new SketchImpl<Field37>(implementation, 37);
140+
case 37: return new SketchImpl<Field37>(implementation, 37, seed);
141141
#endif
142142
#ifdef ENABLE_FIELD_INT_38
143-
case 38: return new SketchImpl<Field38>(implementation, 38);
143+
case 38: return new SketchImpl<Field38>(implementation, 38, seed);
144144
#endif
145145
#ifdef ENABLE_FIELD_INT_39
146-
case 39: return new SketchImpl<Field39>(implementation, 39);
146+
case 39: return new SketchImpl<Field39>(implementation, 39, seed);
147147
#endif
148148
#ifdef ENABLE_FIELD_INT_40
149-
case 40: return new SketchImpl<Field40>(implementation, 40);
149+
case 40: return new SketchImpl<Field40>(implementation, 40, seed);
150150
#endif
151151
}
152152
return nullptr;
153153
}
154154

155-
Sketch* ConstructClMulTri5Bytes(int bits, int implementation) {
155+
Sketch* ConstructClMulTri5Bytes(int bits, int implementation, uint64_t seed) {
156156
switch (bits) {
157157
#ifdef ENABLE_FIELD_INT_33
158-
case 33: return new SketchImpl<FieldTri33>(implementation, 33);
158+
case 33: return new SketchImpl<FieldTri33>(implementation, 33, seed);
159159
#endif
160160
#ifdef ENABLE_FIELD_INT_34
161-
case 34: return new SketchImpl<FieldTri34>(implementation, 34);
161+
case 34: return new SketchImpl<FieldTri34>(implementation, 34, seed);
162162
#endif
163163
#ifdef ENABLE_FIELD_INT_35
164-
case 35: return new SketchImpl<FieldTri35>(implementation, 35);
164+
case 35: return new SketchImpl<FieldTri35>(implementation, 35, seed);
165165
#endif
166166
#ifdef ENABLE_FIELD_INT_36
167-
case 36: return new SketchImpl<FieldTri36>(implementation, 36);
167+
case 36: return new SketchImpl<FieldTri36>(implementation, 36, seed);
168168
#endif
169169
#ifdef ENABLE_FIELD_INT_39
170-
case 39: return new SketchImpl<FieldTri39>(implementation, 39);
170+
case 39: return new SketchImpl<FieldTri39>(implementation, 39, seed);
171171
#endif
172172
}
173173
return nullptr;

0 commit comments

Comments
 (0)