package eqaf
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=59b55d797599657e21f8f9e71f6cbfe2669c39d14d958eabf4aecd6ef9c9ff20
sha512=42aed53726195c90bc52d085e6a8ba25c839d4be6a88efe8572ae510713643fafaeba0e743b14ab09bf1bfb8a0749ff74b93dac1bce65e03087a3a2cccfd6839
Description
This package provides an equal function on string in constant-time to avoid timing-attack with crypto stuff.
Published: 13 May 2019
README
Eqaf - Constant time equal function on string
From some crypto libraries like digestif or Callipyge, it needed to have a constant time equal function to avoid timing attacks. To avoid replication of code and ensure maintainability of this kind of function, we decide to provide a little package which implements equal
function on string
.
This library provides a benchmark to see if the equal function really has a constant-time execution. We compare it with C implemention, Stdlib implementation and some others impl. (like with nativeint
or int64
).
Benchmarks provides this kind of result:
- ########## Random ##########
- ---------- eqst ----------
- min: 0.002770.
- max: 0.150592.
- mean: 0.143873.
- median: 0.147260.
- deviation: 0.143137.
- deviation: 0.000206%.
- ---------- eqml ----------
- min: 0.000148.
- max: 0.000156.
- mean: 0.000153.
- median: 0.000153.
- deviation: 0.001563.
- deviation: 0.000000%.
- ########## Equal ##########
- ---------- eqst ----------
- min: 0.002805.
- max: 0.003014.
- mean: 0.002951.
- median: 0.002960.
- deviation: 0.006217.
- deviation: 0.000000%.
- ---------- eqml ----------
- min: 0.000152.
- max: 0.000158.
- mean: 0.000155.
- median: 0.000155.
- deviation: 0.001233.
- deviation: 0.000000%.
- ########## Total ##########
- ---------- eqst ----------
- min: -0.000158.
- max: 0.147771.
- mean: 0.140922.
- median: 0.144310.
- deviation: 0.143125.
- deviation: 0.000202%.
- ---------- eqml ----------
- min: -0.000009.
- max: 0.000003.
- mean: -0.000003.
- median: -0.000002.
- deviation: 0.001747.
- deviation: -0.000000%.
We run 2 benchmarks. Firsty, we see time needed to test equal
on 2 random string
. In only one case, we will compare 2 equivalent string
(by value, not physically). This case highlights the difference on eqst
on time executation.
Indeed, eqst
(from Stdlib) is fast when it compare 2 differents string
and leaves up at the first byte which differ. So, when 2 string
are equal, it will take the biggest time:
- ---------- eqst ----------
- min: 0.002770.
- max: 0.150592.
You can see the minimum time on benchmarks and maximum times on eqst
on random inputs. But the most important result is the standard deviation:
- ---------- eqst ----------
- deviation: 0.000206%.
Which shows than some values on this benchmark are spread out compared on common behavior (see mean
value). This is exactly this context where we can do a timing attack.
Then, we do the same benchmark on eqml
and see the deviation:
- ---------- eqml ----------
- deviation: 0.000000%.
We launch then an other benchmark but on equal string
and see, again, results. In any case, we should have a standard deviation close to 0 %. Finally, compare different string
or equivalent string
should take the same time. So a diff betweem the first benchmark (different string
) and the second (equivalent string
) should get a serie of 0 (or something close). We get same results and see again standard deviation.
At the final step, we expect than standard deviation of eqml
must be close to 0 %. If it's true, that means eqml
takes the same time to compare any string
(if it's equal or not). Otherwise, we return an error.
Obviously, the final goal is to provide this kind of equal
function so, of course, tests works.
Happy hacking!
Dev Dependencies
None
Used by (7)
-
callipyge
>= "0.2"
-
digestif
>= "0.7"
- hacl_x25519
- mec
- noise
- octez-libs
- octez-mec
Conflicts
None