Skip to content

Commit e1db187

Browse files
committed
Removed O(n^2) time and space overhead from Monte Carlo EQI at the cost of making each trial O(n) time
1 parent 74ae725 commit e1db187

File tree

2 files changed

+54
-26
lines changed

2 files changed

+54
-26
lines changed

lib/eqi/MonteCarloEqi.go

+38-26
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ import (
88
"strconv"
99
)
1010

11+
type gadgetIndexer struct {
12+
sequence types.GadgetId
13+
addressIndex int
14+
}
15+
1116
func MonteCarloEqi(f1 types.Fingerprint, f2 types.Fingerprint, form url.Values) (float64, error) {
1217
min, err := strconv.ParseInt(form.Get("min"), 0, 64)
1318
if err != nil {
@@ -22,31 +27,59 @@ func MonteCarloEqi(f1 types.Fingerprint, f2 types.Fingerprint, form url.Values)
2227
return 0, errors.New("Could not parse number of trials.")
2328
}
2429

25-
offsets := offsetSets(f1, f2)
30+
gis := gadgetIndexers(f1)
2631

2732
sum := 0
2833
for i := 0; i < int(trials); i++ {
29-
if monteCarloTrial(offsets, min, max) {
34+
if monteCarloTrial(f1, f2, gis, min, max) {
3035
sum++
3136
}
3237
}
3338
return float64(sum) / float64(trials), nil
3439
}
3540

36-
func monteCarloTrial(displacements []map[types.Offset]bool, minGadgets, maxGadgets int64) bool {
41+
func monteCarloTrial(f1, f2 types.Fingerprint, gadgetIndexers []gadgetIndexer, minGadgets, maxGadgets int64) bool {
3742
numGadgets := minGadgets
3843
if maxGadgets > minGadgets {
3944
numGadgets += rand.Int63n(maxGadgets - minGadgets)
4045
}
4146

42-
workingOffsetSet := offsetSetCopy(randomGadgetDisplacementSet(displacements))
47+
workingOffsetSet := offsetSetCopy(randomGadgetDisplacementSet(f1, f2, gadgetIndexers))
4348
for i := int64(1); i < numGadgets && len(workingOffsetSet) > 0; i++ {
44-
gadgetOffsetSet := randomGadgetDisplacementSet(displacements)
49+
gadgetOffsetSet := randomGadgetDisplacementSet(f1, f2, gadgetIndexers)
4550
offsetSetAndEqual(&workingOffsetSet, &gadgetOffsetSet)
4651
}
4752
return len(workingOffsetSet) > 0
4853
}
4954

55+
func randomGadgetDisplacementSet(f1, f2 types.Fingerprint, gadgetIndexers []gadgetIndexer) map[types.Offset]bool {
56+
index := rand.Intn(len(gadgetIndexers))
57+
return offsetSetByIndex(f1, f2, gadgetIndexers[index])
58+
}
59+
60+
func gadgetIndexers(f types.Fingerprint) []gadgetIndexer {
61+
var indexers []gadgetIndexer
62+
for sequence, addresses := range f {
63+
for i := range addresses {
64+
indexers = append(indexers, gadgetIndexer {
65+
sequence: sequence,
66+
addressIndex: i,
67+
})
68+
}
69+
}
70+
return indexers
71+
}
72+
73+
func offsetSetByIndex(f1, f2 types.Fingerprint, gi gadgetIndexer) map[types.Offset]bool {
74+
oldAddress := f1[gi.sequence][gi.addressIndex]
75+
newAddresses := f2[gi.sequence]
76+
offsets := make([]types.Offset, len(newAddresses), len(newAddresses))
77+
for i := 0; i < len(newAddresses); i++ {
78+
offsets[i] = types.Offset(newAddresses[i] - oldAddress)
79+
}
80+
return offsetSet(offsets)
81+
}
82+
5083
func offsetSet(values []types.Offset) map[types.Offset]bool {
5184
ret := map[types.Offset]bool{}
5285
for i := 0; i < len(values); i++ {
@@ -69,25 +102,4 @@ func offsetSetCopy(s map[types.Offset]bool) map[types.Offset]bool {
69102
ret[key] = value
70103
}
71104
return ret
72-
}
73-
74-
func offsetSets(f1, f2 types.Fingerprint) []map[types.Offset]bool {
75-
ret := make([]map[types.Offset]bool, 0)
76-
for gadget, addresses := range f1 {
77-
for i := 0; i < len(addresses); i++ {
78-
oldAddress := addresses[i]
79-
newAddresses := f2[gadget]
80-
offsets := make([]types.Offset, len(newAddresses), len(newAddresses))
81-
for i := 0; i < len(newAddresses); i++ {
82-
offsets[i] = types.Offset(newAddresses[i] - oldAddress)
83-
}
84-
ret = append(ret, offsetSet(offsets))
85-
}
86-
}
87-
return ret
88-
}
89-
90-
func randomGadgetDisplacementSet(displacements []map[types.Offset]bool) map[types.Offset]bool {
91-
index := rand.Intn(len(displacements))
92-
return displacements[index]
93105
}

lib/eqi/OffsetsIntersectionEqi.go

+16
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,20 @@ func successfulAttacks(chosenIndices []int, offsets []map[types.Offset]bool, len
4848
sum += successfulAttacks(append(chosenIndices, i), offsets, length)
4949
}
5050
return sum
51+
}
52+
53+
func offsetSets(f1, f2 types.Fingerprint) []map[types.Offset]bool {
54+
ret := make([]map[types.Offset]bool, 0)
55+
for gadget, addresses := range f1 {
56+
for i := 0; i < len(addresses); i++ {
57+
oldAddress := addresses[i]
58+
newAddresses := f2[gadget]
59+
offsets := make([]types.Offset, len(newAddresses), len(newAddresses))
60+
for i := 0; i < len(newAddresses); i++ {
61+
offsets[i] = types.Offset(newAddresses[i] - oldAddress)
62+
}
63+
ret = append(ret, offsetSet(offsets))
64+
}
65+
}
66+
return ret
5167
}

0 commit comments

Comments
 (0)