forked from Keysight/Jlsca
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmaxcolspost-tests.jl
130 lines (99 loc) · 3.69 KB
/
maxcolspost-tests.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using Jlsca.Sca
using Jlsca.Trs
using Test
function testVanilla()
rows = 100
cols = 100
maxCols = 21
trs = VirtuaTrace(rand(UInt8, 16,rows), rand(Float64, cols, rows))
attack = AesSboxAttack()
analysis = CPA()
params = DpaAttack(attack,analysis)
rankData1 = sca(trs, params, 1, length(trs))
params.maxColsPost = maxCols
rankData2 = sca(trs, params, 1, length(trs))
@test getPhases(rankData1) == getPhases(rankData2)
for phase in getPhases(rankData1)
@test getTargets(rankData1,phase) == getTargets(rankData2,phase)
for target in getTargets(rankData1, phase)
@test getScores(rankData1, phase, target) ≈ getScores(rankData2, phase, target)
@test getOffsets(rankData1, phase, target) == getOffsets(rankData2, phase, target)
end
end
end
function testCondAvg()
rows = 100
cols = 100
maxCols = 21
trs = VirtuaTrace(rand(UInt8, 16,rows), rand(Float64, cols, rows))
attack = AesSboxAttack()
analysis = CPA()
params = DpaAttack(attack,analysis)
rankData1 = sca(trs, params, 1, length(trs))
params.maxColsPost = maxCols
params.updateInterval = div(rows,3)
rankData2 = sca(trs, params, 1, length(trs))
@test getPhases(rankData1) == getPhases(rankData2)
for phase in getPhases(rankData1)
@test getTargets(rankData1,phase) == getTargets(rankData2,phase)
for target in getTargets(rankData1, phase)
@test getScores(rankData1, phase, target) ≈ getScores(rankData2, phase, target)
@test getOffsets(rankData1, phase, target) == getOffsets(rankData2, phase, target)
end
end
end
function testIncCpa()
rows = 100
cols = 100
maxCols = 21
trs = VirtuaTrace(rand(UInt8, 16,rows), rand(Float64, cols, rows))
attack = AesSboxAttack()
analysis = IncrementalCPA()
params = DpaAttack(attack,analysis)
rankData1 = sca(trs, params, 1, length(trs))
params.maxColsPost = maxCols
params.updateInterval = div(rows,3)
rankData2 = sca(trs, params, 1, length(trs))
@test getPhases(rankData1) == getPhases(rankData2)
for phase in getPhases(rankData1)
@test getTargets(rankData1,phase) == getTargets(rankData2,phase)
for target in getTargets(rankData1, phase)
@test getScores(rankData1, phase, target) ≈ getScores(rankData2, phase, target)
@test getOffsets(rankData1, phase, target) == getOffsets(rankData2, phase, target)
end
end
end
function testCondReduce()
rows = 100
cols = 100
maxCols = 21
trs = VirtuaTrace(rand(UInt8, 16,rows), rand(UInt8, cols, rows))
addSamplePass(trs, BitPass())
attack = AesSboxAttack()
analysis = CPA()
params = DpaAttack(attack,analysis)
params.analysis.postProcessor = CondReduce
rankData1 = sca(trs, params, 1, length(trs))
params.maxColsPost = maxCols
params.updateInterval = div(rows,3)
rankData2 = sca(trs, params, 1, length(trs))
# FIXME: think about why this (apparently) is not always true
# @test getPhases(rankData1) == getPhases(rankData2)
for phase in getPhases(rankData1)
if !(phase in getPhases(rankData2))
continue
end
targets1 = getTargets(rankData1,phase)
targets2 = getTargets(rankData2,phase)
# for cond reduce, targets1 != targets2 due to compression
# but, for all shared targets the scores must be equivalent
# offsets will not be matching due to the compression.
for target in ∩(targets1,targets2)
@test getScores(rankData1, phase, target) ≈ getScores(rankData2, phase, target)
end
end
end
testVanilla()
testCondAvg()
testIncCpa()
testCondReduce()