<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>PROSECCO: Formally-Proven Secure Compiled Code</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Nicolas Belleville</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Damien Couroussé</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Emmanuelle Encrenaz</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Karine Heydemann</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Quentin Meunier</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Sorbonne Université</institution>
          ,
          <addr-line>CNRS, LIP6, F-75005, Paris</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Univ. Grenoble Alpes, CEA, List</institution>
          ,
          <addr-line>F-38000 Grenoble</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2021</year>
      </pub-date>
      <fpage>13</fpage>
      <lpage>25</lpage>
      <abstract>
        <p>The application and the verification of countermeasures against physical attacks still remain long, error-prone and expertise-demanding tasks. We propose a toolchain to help the expert in these tasks. Our toolchain is composed of two components: a compiler that automatically applies a set of countermeasures, and a formal verification tool that automatically verifies binary code for various leakage models and fault models. We describe diferent scenarios of usage of our toolchain, and then illustrate the flexibility of our toolchain in one of them.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;side-channel attack</kwd>
        <kwd>fault injection attack</kwd>
        <kwd>masking</kwd>
        <kwd>hiding</kwd>
        <kwd>fault tolerance</kwd>
        <kwd>control flow integrity</kwd>
        <kwd>formal verification</kwd>
        <kwd>compilation</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        Cybersecurity is a growing concern for embedded systems and connected objects. Such
objects can be used as part of large-scale attacks. Among the possible attacks against
such systems, side-channel attacks and fault injection attacks stand out from their ability
to recover secret information manipulated by the device (such as cryptographic keys) and
to modify the device behaviour [
        <xref ref-type="bibr" rid="ref1 ref2 ref3 ref4">1, 2, 3, 4</xref>
        ].
      </p>
      <p>
        Securing devices against these attacks at the software level is costly as it requires
highly technical and time-consuming tasks. In particular, some bottlenecks are due to
the compilation flow and the fact that countermeasures applied on the source code can
be optimised out or degraded by compilers [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
      <p>A first bottleneck is related to the countermeasure deployment. In order to avoid
any nefarious code transformations carried out by the compiler, the security expert may
choose to apply countermeasures downstream to the compiler, i.e., at the assembly level
or at the binary level. At the source level, an option is to use code tricks (such as volatile
variables or specific code structures that the compiler is a priori not able to optimise
out) to circumvent code optimisations. However, in all cases, such practices are fragile,
error-prone, and require a significant amount of manpower.</p>
      <p>A second bottleneck is related to security assessment. Traditionally, security evaluation
is carried out experimentally, by replaying state-of-the art attacks or by measuring
security-related metrics. However, a separate but complementary process can help reduce
the complexity and time required for the security evaluation: formally verifying security
properties against a security model. Formal methods are a powerful mean to build strong
confidence of the security correctness of a component against a security model. Such a
verification of security properties must take place at the binary level due to the compiler
potential negative efects and to the necessity of using low-level models that better reflect
the physical efects of the attacks than higher-level ones.</p>
      <p>In workflows for the production of secured software, leveraging automation is a way
to lower the overall production costs, and time to market. Hence, there is a need to
automate the application of countermeasures, and a need to automate the verification
of security properties at the binary level, while keeping the flexibility required for the
expert.</p>
      <p>In this context, we propose a toolchain for the compilation of several software
countermeasures against physical attacks, and for the verification, at the binary level, of
the associated security properties. The countermeasures supported by our compiler are
configurable, can be selectively applied on program parts, and can be combined with
other countermeasures manually applied by an expert. The expert can choose the model
to use for the verification steps, as the verification tools support several leakage models
and several fault models.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Background</title>
      <sec id="sec-2-1">
        <title>2.1. Physical attacks</title>
        <p>There are two classes of physical attacks: side-channel attacks and fault injection attacks.</p>
        <p>
          Side-channel attacks consist in exploiting measurements of a physical quantity, such
as power [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ], electromagnetic emission [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ], acoustic noise [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ], etc., in order to infer
information about the computations done in the hardware. Such measurements can
be used to reverse-engineer a program [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ], or to find secret data such as cryptographic
keys [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ].
        </p>
        <p>
          Fault injection attacks consist in altering the behaviour of the chip by means of
physical perturbations. For instance, an attacker can perform voltage glitches [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ], clock
glitches [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ], electromagnetic disturbance [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ], or laser fault injection [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ]. The fault aims
at modifying the program’s execution. The attacker can obtain various efects from a
fault injection attack, like authentication with a false password, or getting knowledge
about some secret data through the program’s output.
        </p>
      </sec>
      <sec id="sec-2-2">
        <title>2.2. Countermeasures</title>
        <p>
          Countermeasures against side-channel attacks are mainly divided between hiding and
masking principles. Hiding consists in lowering the signal-to-noise ratio to make the
attacker’s measurements harder to exploit. Typical examples of hiding countermeasures
include loop shufling [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ], random delays [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ], code morphing [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ] and code
polymorphism [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]. Masking consists in breaking the correlation between the measurements and
the sensitive data by splitting the sensitive variables into several variables called shares,
each share being statistically independent of the sensitive data [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ]. Splitting the variable
into shares can be achieved using various operators, such as the exclusive or [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ], finite
ifeld multiplication [
          <xref ref-type="bibr" rid="ref18">18</xref>
          ], arithmetic addition [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ], etc.
        </p>
        <p>
          Countermeasures against fault injection are of three types: fault tolerance, fault
detection, and infection. They usually imply some form of spatial or temporal redundancy.
Fault tolerance consists in modifying the code or data so that a fault has no efect on the
ifnal result of the program [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ]. Fault detection consists in modifying the code or data so
that a fault is detected, which enables to take appropriate actions afterwards like halting
the system or self destruction [
          <xref ref-type="bibr" rid="ref21 ref22">21, 22</xref>
          ]. Last, infective countermeasures consist in difusing
the efect of the fault to prevent the attacker from exploiting the fault efect [
          <xref ref-type="bibr" rid="ref23">23</xref>
          ].
        </p>
      </sec>
      <sec id="sec-2-3">
        <title>2.3. Security evaluation</title>
        <p>In order to assess the security of a program on a device, an evaluator can use several
methods.</p>
        <p>
          First, they can try to attack the device [
          <xref ref-type="bibr" rid="ref24 ref25">24, 25</xref>
          ]. This method has the advantage of
giving an estimate of the time and processing power necessary for the attack. However, it
is tied to a particular attack and experimental setup.
        </p>
        <p>
          In the case of side-channel attacks, an evaluator can also use empirical measures related
to the attack dificulty. For instance, in the case of side-channel analysis, they can compute
a SNR, or a t-test [
          <xref ref-type="bibr" rid="ref26 ref27">26, 27</xref>
          ]. This method has the advantage of being very sensitive and in
the case of t-test, it can be independent of a leakage model. Though, it may not fully
represent the dificulty of an attack, as attackers can perform preprocessing on traces,
higher-order attacks, or more evolved attacks such as template attacks or machine-learning
attacks. It is also dependent on the measurement setup.
        </p>
        <p>
          Finally, an evaluator can use formal methods to analyse the binary [
          <xref ref-type="bibr" rid="ref28 ref29 ref30">28, 29, 30</xref>
          ]. The
formal analysis tool relies either on a leakage model in the case of side-channel attacks, or
on a fault model in the case of fault analysis. A leakage model defines how the values
leak, for instance if there are value-based leakages or transition based leakages. It can
also be more precise, defining a leakage as a function of the values, like its Hamming
weight. A fault model defines what efects a fault can have on a program. For instance,
instruction-skip, data modification, or instruction modification are some frequently used
fault models. The use of formal methods for evaluation has the advantage of not being
dependent on the experimental setup. The use of a model can lead to limitations though,
as the result may not represent the full possibilities of the attacker depending on the
model accuracy.
        </p>
        <p>Ideally, the evaluator can combine several techniques to evaluate the security of the
device.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. Approach</title>
      <sec id="sec-3-1">
        <title>3.1. Overview</title>
        <p>security
annotations</p>
        <p>+
Source
Code</p>
        <p>Security features (~ threat model + security properties)</p>
        <p>Parameters of the
countermeasures</p>
        <p>Compiler
FE</p>
        <p>ME</p>
        <p>BE
Security add-ons
secu
annot.</p>
        <p>+
Binary
prog.</p>
        <p>Formal security
features</p>
        <p>Formal
verification tool
Symbolic execution</p>
        <p>SMT solver</p>
        <p>On-chip security evaluation and characterisation</p>
        <p>We present a methodology supported by tools to automatically secure components
against physical attacks and/or verify secured binaries. Figure 1 shows an overview of
this methodology. Our approach is constructed around two components: a compiler,
and a formal verification tool. The compiler is in charge of applying various software
countermeasures on a program annotated by the programmer, or driven by specific compiler
options. The programmer specifies the parts of the program to secure, the countermeasures
to use, and their parameters. After the compilation, the formal verification tool checks
that security properties are correctly implemented at the binary level.</p>
        <p>The following sections will detail the diferent possibilities ofered by our compiler
(section 3.2) and by our verifier (section 3.3).</p>
      </sec>
      <sec id="sec-3-2">
        <title>3.2. Automated application of countermeasures during compilation</title>
        <p>
          Our compiler, named Cogito, is based on the LLVM compiler infrastructure. It supports
several countermeasures: masking and code polymorphism against side-channel attacks;
fault tolerance and execution integrity against fault injection attacks. In all cases, the
user annotates the code or uses specific compiler options to specify the target functions
to secure, as well as the configuration parameters of the countermeasures.
Masking countermeasure against side-channel attacks The compiler can apply a
firstorder Boolean masking countermeasure [
          <xref ref-type="bibr" rid="ref31">31</xref>
          ]. The user handles the initial separation of
the secret into shares. Then, the original instructions that manipulate the secret data are
replaced by sequences of instructions that manipulate the shares. For this purpose, the
compiler uses well-known transformations such as the secMult algorithm [
          <xref ref-type="bibr" rid="ref32">32</xref>
          ] to secure
and operations and to secure finite field multiplications.
        </p>
        <p>
          Two key elements stand out in our application of a masking countermeasure. First,
the usual approach for the masking of table lookups (e.g., accesses to S-Boxes) consists
in regularly re-computing masked tables [
          <xref ref-type="bibr" rid="ref33">33</xref>
          ]. Ideally, the whole masked table should
be re-computed after each access, leading to important performance overheads. Still,
some side-channel attacks can exploit observations of the table re-computation [
          <xref ref-type="bibr" rid="ref34">34</xref>
          ]. In
our approach, table lookups are transformed into masked evaluations of an interpolating
polynomial [
          <xref ref-type="bibr" rid="ref35">35</xref>
          ], and the compiler applies several optimisations to reduce the performance
overhead of the countermeasure [
          <xref ref-type="bibr" rid="ref31">31</xref>
          ]. Second, other state-of-the-art masking tools require
the control-flow of the input program to be flattened (e.g., with loops unrolled) before
the application of the countermeasure. Our compiler applies the countermeasure without
modifying the control-flow structure of the secured program, which increases the range
of applications of the masking countermeasure and helps reducing the code size of the
secured binary.
        </p>
        <p>
          Code polymorphism countermeasure against side-channel attacks The compiler can
also apply code polymorphism, a hiding countermeasure [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]. The core idea is to regularly
generate new versions of the secure code, called polymorphic instances, by means of
runtime code generation driven by random data. All of these polymorphic instances
are functionally equivalent, but difer in their implementation, such that each execution
leads to a diferent (side-channel) observation, thus raising the bar for an attacker. Our
implementation of code polymorphism leverages the use of specialised runtime code
generators (SGPC): each program function targeted by the countermeasure is associated
with a dedicated SGPC, automatically generated by the compiler. At runtime, SGPCs
leverage one or several of the following code transformations driven by random data:
• instruction shufling: independent instructions are emitted in a random order;
• register permutation: a random permutation is done for the general-purpose
registers;
• instruction substitution: an instruction is replaced by a sequence of instructions
that give the same result;
• insertion of noise instructions: a random number of randomly selected noise
instructions is inserted. Noise instructions are of the same nature as the normal
instructions of the program, but use dead registers, and are randomly interleaved
with the other instructions of the program;
• insertion of dynamic noise sequences: a jump instruction is inserted, followed by
a sequence of noise instructions. The jump ofset is randomly computed such as
the jump target falls anywhere within the sequence of noise instructions. This
mechanism enables to have part of the execution behaviour that is independent
from the paths taken during the generation.
        </p>
        <p>
          Instruction replication against fault injection attacks The compiler can apply a fault
tolerance countermeasure that protects against faults resulting in instruction skips [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ].
The working principle of the countermeasure consists in producing idempotent instructions
and then replicating each idempotent instruction [
          <xref ref-type="bibr" rid="ref36">36</xref>
          ]. The compiler ofers two main
securing parameters: the number of instruction copies introduced during replication,
each copy providing tolerance against one fault injection; the distance between each
instruction copy, which protects against the case where a fault injection can skip several
consecutive instructions. Interestingly, the compiler, leveraging many optimisations, can
reduce execution time and code size overheads of the countermeasure as compared to an
application of the countermeasure at the assembly level by an expert [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ].
Execution integrity against fault injection attacks The compiler can apply an
execution integrity countermeasure that aims at detecting all faults that modify the program
counter (PC) register, or that modify branch conditions [
          <xref ref-type="bibr" rid="ref37">37</xref>
          ]. As such, this
countermeasure can be considered as a fine-grained Control-Flow Integrity countermeasure: the
countermeasure is able to detect integrity violations of the control flow of the protected
section of the program, protecting jumps, direct conditional and unconditional branches,
and direct function calls. In addition, the countermeasure can detect modifications of
the PC or alterations of the machine instructions inside basic blocks, e.g., caused by
instruction skips.
        </p>
      </sec>
      <sec id="sec-3-3">
        <title>3.3. Automated verification of countermeasures at binary level</title>
        <p>Our verification tool integrates two components dedicated to the robustness analysis
in presence of fault attacks or side channel attacks. The inputs consist in the binary
program, as well as information about the region to analyse and the threat model. A
common front-end based on symbolic execution is able to build the necessary information
for each component.</p>
        <p>
          Masked software implementation verification The verification is made by the
component named ARISTI. It implements a symbolic approach to analyse the distribution
of the value of some symbolic expressions with respect to some user-specified secret
variables [
          <xref ref-type="bibr" rid="ref28">28</xref>
          ].
        </p>
        <p>To verify a masked implementation, the masks and secret variables manipulated by
the implementation must be provided with the binary program. From an execution trace
generated by the symbolic engine, ARISTI computes, for each instruction in the trace,
the symbolic expression of its result, corresponding either to a value written into a general
purpose register of the processor or in the memory.</p>
        <p>The analysis of the distribution of a symbolic expression relies on distribution type
inference using specifically designed rules. The distribution types are either constant,
either uniform, either statistically (in-)dependent from the secrets or unknown. The
symbolic variables appearing in the expression as well as the root operation impact the
distribution type inference rules that can be applied. The goal of the analysis is to infer,
a distribution type as precise as possible. By decreasing order of precision, this can be:
1. a constant value (CST), a leaky expression (SNM), a uniform distribution (RUD);
2. a secret independent distribution (SID);
3. an unknow distribution type (UKD), meaning that the verification can not conclude.
Moreover, when the resulting distribution type is UKD, ARISTI can perform an
enumerative analysis to check for the absence of leakage. ARISTI supports two leakage models:
the value-based and the transition leakage models. In the former, the result of each
instruction is analysed. In the latter, the analysed expressions are obtained by xoring the
result of two expressions, e.g. the one representing the value written in a register with
the one representing the value previously contained in the register.</p>
        <p>
          Fault robustness verification The dedicated component named RobustB combines
some static analyses and symbolic execution to build an SMT formulation of the possible
execution paths of the region to analyse and of the possible execution paths in presence
of a fault injection [
          <xref ref-type="bibr" rid="ref29">29</xref>
          ]. The threat model specifies the fault models that an attacker
may induce among instruction skip, register corruption, bitset or bit reset on instruction
encoding. Faults are transient.
        </p>
        <p>The robustness analysis consists in verifying, using an SMT formulation, that no fault
can induce a vulnerability. If the user-provided security property is the integrity of some
registers and memory contents at the end of the region execution (e.g., the output of an
authentication function), the verification is performed by equivalence-checking between
each original execution path and their faulty counterparts. When the security property is
a predicate (assert-like, e.g., the output must be the Boolean value false when the entered
password is not the expected one), the verification is performed by checking that this
property holds at the end of all possible faulty paths.</p>
        <p>In case of vulnerabilities detection, RobustB outputs some security metrics, which
help the user pinpoint the vulnerable instructions or compare diferent countermeasures.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Application of the code securing toolchain</title>
      <p>We consider the following scenarios:
SC1. Application of a countermeasure with the compiler and formal and/or empirical
security evaluation;
SC2.</p>
      <p>Manual application of a countermeasure and verification with the formal verification
tool;
SC3. Combination of several countermeasures applied at diferent levels, either manually
or using the compiler, and verification of the countermeasures with the formal
verification tool.</p>
      <p>
        Several examples of the use of our toolchain with scenarios SC1 and SC2 have already
been published. The automated application of code polymorphism has been demonstrated
on a wide range of programs in [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ]. The automated application of first order boolean
masking has been applied and verified on a full AES in [
        <xref ref-type="bibr" rid="ref31">31</xref>
        ]. The automated application
of instruction duplication was presented and demonstrated on the AES in [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ], and
verified for various VerifyPin implementations in [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ] (scenario SC1). In [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ], the
masking countermeasure has also been verified on programs where the countermeasure
was manually applied (scenario SC2).
      </p>
      <p>Here, we propose to focus on the use of our toolchain with the scenario SC3, to
illustrate the flexibility of the toolchain: a programmer wants to secure a program with
two countermeasures: a masking countermeasure, applied by an expert at the source level,
and a tolerance countermeasure against instruction-skip attacks automatically applied by
the compiler. The expert also wants to check that the masking countermeasure is correctly
applied at the binary level: i.e., that neither the performance optimisations nor the addition
of the fault tolerance countermeasures did break the side-channel countermeasure, and
that the resulting binary is resistant to instruction-skip attacks.</p>
      <p>To illustrate our scenario, we consider the application of the instruction replication
countermeasure on a SecMult function. We implement the function in C. In order to
add the instruction replication countermeasure, we declare the function as to be secured
and we set the countermeasure parameters (number of replications, distance between
replicas) through the command-line arguments of Cogito. We then generate three
diferent binaries:
1. one compiled with GCC (called SecMult-gcc later on);
2. one compiled with Cogito, transforming the code so that it uses only
idempotent instructions (called SecMult-idem later on) but without replication of the
instructions;
3. one compiled with Cogito, with the complete application of the instruction
duplication countermeasure (called SecMult-dup later on).</p>
      <p>Secmult-idem Secmult-dup
Cogito (LLVM-based) Cogito (LLVM-based)
no yes</p>
      <p>We analyse all the three binaries with ARISTI, in the value-based leakage model and
in the transition-based leakage model. To run the analysis, we declare the targetted
function as well as the input secret variables. The analysis results are shown in Table 1.
Leakages (indicated as LEAK in the table) can be found either from SNM, or from an
enumerative analysis after a variable is marked as UKD. The analyses do not find any
value-based leakage in these implementations. Though, transition-based leakages are
found in all of them. The diferences in terms of UKD and leakage between SecMult-gcc
and SecMult-idem may be due to the diference between instruction selection and register
allocation between GCC and LLVM. SecMult-idem and SecMult-dup have the same
number of leakages, which means the application of the instruction duplication
countermeasure did not introduce new leakages. The security expert could then try fixing
the leakages found, either at the source code level, or by modifying directly the binary
produced by our compiler.</p>
      <p>We also run an analysis with RobustB to check that the instruction replication
countermeasure is correctly applied: no successful attack is found using an
instructionskip fault model.</p>
      <p>This example shows how our toolchain could be used in a flexible way by an expert:
• countermeasures can be applied manually, automatically by the compiler, or both,
• formal verification tool can be used on the resulting binaries even if the compiler
used is not the one from our toolchain.</p>
    </sec>
    <sec id="sec-5">
      <title>5. Discussion</title>
      <p>We illustrated the interest of our toolchain along with its countermeasures applied at
compilation and security properties verified on the binaries. Many research questions still
remain to be investigated for reaching better performance, ease-of-use, and security, both
for the compilation of countermeasures and the verification of security properties.</p>
      <p>
        First, the propagation of security information in the toolchain represents a crucial
challenge. Promising results have been shown recently on this matter [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. A correct
propagation of information and handling of this information by the toolchain would:
• facilitate the review of assembly code containing countermeasures, whether the
countermeasures were added at source code level or by the compiler;
• help preserving the security properties throughout the compilation, avoiding the
degradation of countermeasure by optimisation passes;
• enable linking issues reported by the binary-level formal analysis tool with the
source code.
      </p>
      <p>Then, keeping up with state-of-the-art attacks, countermeasures and security properties
forms another fundamental challenge. The adaptation of the tools requires an engineering
efort, and also frequently requires some research as the automated application of
countermeasures or verification of new models raise new challenges. For example, adding a new
countermeasure in a compiler requires careful considerations about where in the compiler
the transformation should be done to benefit from the compiler optimisations, ease the
support of several architectures, and have a suitable representation of the program for
the countermeasure. Adding a new security property in a formal verification tool may
require to redesign some algorithms, find new heuristics to make the formal verification
fast enough for targeted programs. In addition, the verification of the security properties
should be low-level enough to avoid issues with link-time optimisation which could also
alter some countermeasures, which constrains the representation that formal verification
tools have to work with.</p>
      <p>The combination of countermeasure also raises interesting questions to investigate.
While some countermeasures are independent, interaction between others remain poorly
understood. For instance, combination of masking and polymorphism requires special care:
polymorphism transformations make use of dead registers but dead registers containing
shares of a secret must not be combined to avoid unmasking. Keeping CFI protection
while adding noise instructions is also challenging. Instruction duplication on a masked
implementation would also raise issues if user requires duplicate instructions to be far
from each other: the scheduling of the duplicate instruction may introduce transition
leakage.</p>
      <p>
        Finally, the information that the compiler is able to recover may be incomplete in
comparison to the knowledge of an expert. As a consequence, in the context of automated
code securing as in the context of code optimization for performance, the resulting
generated code may not be highly optimized. As an example, masking scheme can
sometimes be eficiently implemented using the knowledge about the algebraic structure
of an operation. However, the compiler does not have this information, and it has to
decompose any unknown non linear operation into a set of operations that it knows
how to mask, which can result in a suboptimal implementation. Nevertheless, in some
cases, the compiler can take advantages of code optimisation, and generate secured code
which is faster than code where the countermeasure was applied by hand as shown for
fault tolerance by [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ]. In addition, apart from automating and accelerating the securing
process especially for large code basis, having an automated tool enables the user to
choose between a larger set of countermeasures and countermeasures parameters, as the
compiler can hide complexity to the user. For instance, application of a low level CFI
scheme or of polynomial interpolation of SBoxes by hand would not be easy.
      </p>
      <p>To conclude, we argue that having flexible automated tools that support some
countermeasures and some verification models is already an asset to ease securing a large number
of potential targets currently left unsecure, against a wide range of attacks.</p>
    </sec>
    <sec id="sec-6">
      <title>6. Conclusion</title>
      <p>In this paper, we present an approach supported by tools to help an expert to secure a
device against side-channel attacks and fault injection attacks. The toolchain can be used
as part of various workflows and for various security requirements; it supports several
countermeasures and verification models, and the compiler and verification tool are kept
separated to ease their integration in the expert workflow.</p>
    </sec>
    <sec id="sec-7">
      <title>Acknowledgments</title>
      <p>This work was partially funded by the French National Research Agency (ANR) as part
of the project PROSECCO, unded by the program AAP-2015 under grant agreement
ANR-15-CE39.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>P.</given-names>
            <surname>Kocher</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Jafe</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Jun</surname>
          </string-name>
          ,
          <article-title>Diferential power analysis</article-title>
          ,
          <source>in: CRYPTO</source>
          ,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>S.</given-names>
            <surname>Mangard</surname>
          </string-name>
          , E. Oswald, T. Popp,
          <article-title>Power analysis attacks: Revealing the secrets of smart cards</article-title>
          , Springer,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>D.</given-names>
            <surname>Boneh</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R. A. DeMillo</given-names>
            , R. J.
            <surname>Lipton</surname>
          </string-name>
          ,
          <article-title>On the Importance of Checking Cryptographic Protocols for Faults</article-title>
          , in: EUROCRYPT,
          <year>1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>J.-M. Dutertre</surname>
          </string-name>
          ,
          <string-name>
            <surname>C. De</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Sarafianos</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          <string-name>
            <surname>Boher</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Rouzeyre</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Lisart</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Damiens</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          <string-name>
            <surname>Candelier</surname>
          </string-name>
          ,
          <string-name>
            <surname>M.-L. Flottes</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          <string-name>
            <surname>Di</surname>
            <given-names>Natale</given-names>
          </string-name>
          ,
          <article-title>Laser attacks on integrated circuits: From CMOS to FD-SOI</article-title>
          , in: DTIS,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>S. T.</given-names>
            <surname>Vu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Heydemann</surname>
          </string-name>
          , A. de Grandmaison, A. Cohen,
          <article-title>Secure delivery of program properties through optimizing compilation</article-title>
          , in: CC,
          <year>2020</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>K.</given-names>
            <surname>Gandolfi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Mourtel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Olivier</surname>
          </string-name>
          ,
          <article-title>Electromagnetic analysis: Concrete results</article-title>
          , in: CHES, Springer,
          <fpage>251</fpage>
          -
          <lpage>261</lpage>
          ,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>D.</given-names>
            <surname>Genkin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Shamir</surname>
          </string-name>
          , E. Tromer, Acoustic Cryptanalysis,
          <source>Journal of Cryptology</source>
          <volume>30</volume>
          (
          <issue>2</issue>
          ) (
          <year>2017</year>
          )
          <fpage>392</fpage>
          -
          <lpage>443</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>V.</given-names>
            <surname>Cristiani</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Lecomte</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Hiscock</surname>
          </string-name>
          ,
          <article-title>A bit-level approach to side channel based disassembling</article-title>
          ,
          <source>in: CARDIS</source>
          ,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>E.</given-names>
            <surname>Brier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Clavier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Olivier</surname>
          </string-name>
          ,
          <article-title>Correlation power analysis with a leakage model</article-title>
          ,
          <source>LNCS</source>
          <volume>3156</volume>
          (
          <year>2004</year>
          )
          <fpage>16</fpage>
          -
          <lpage>29</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>R. B. Carpi</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Picek</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Batina</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          <string-name>
            <surname>Menarini</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Jakobovic</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Golub</surname>
          </string-name>
          , Glitch It If You Can:
          <article-title>Parameter Search Strategies for Successful Fault Injection</article-title>
          , in: Smart Card Research and Advanced Applications, LNCS, Springer,
          <fpage>236</fpage>
          -
          <lpage>252</lpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>M.</given-names>
            <surname>Agoyan</surname>
          </string-name>
          ,
          <string-name>
            <surname>J.-M. Dutertre</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Naccache</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Robisson</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Tria</surname>
          </string-name>
          ,
          <article-title>When clocks fail: On critical paths and clock faults</article-title>
          ,
          <source>LNCS</source>
          <volume>6035</volume>
          (
          <year>2010</year>
          )
          <fpage>182</fpage>
          -
          <lpage>193</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <surname>J.-J. Quisquater</surname>
          </string-name>
          , D. Samyde,
          <article-title>ElectroMagnetic Analysis (EMA): Measures and Counter-measures for Smart Cards, in: Smart Card Programming and Security</article-title>
          , LNCS, Springer,
          <fpage>200</fpage>
          -
          <lpage>210</lpage>
          ,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>M.</given-names>
            <surname>Rivain</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            <surname>Prouf</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Doget</surname>
          </string-name>
          ,
          <article-title>Higher-Order Masking and Shufling for Software Implementations of Block Ciphers</article-title>
          , in: CHES,
          <string-name>
            <surname>LNCS</surname>
          </string-name>
          , Springer,
          <fpage>171</fpage>
          -
          <lpage>188</lpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>J.-S.</given-names>
            <surname>Coron</surname>
          </string-name>
          ,
          <string-name>
            <surname>I. Kizhvatov</surname>
          </string-name>
          , LNCS
          <volume>6225</volume>
          (
          <year>2010</year>
          )
          <fpage>95</fpage>
          -
          <lpage>109</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>G.</given-names>
            <surname>Agosta</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Barenghi</surname>
          </string-name>
          , G. Pelosi, in: DAC,
          <fpage>77</fpage>
          -
          <lpage>82</lpage>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>N.</given-names>
            <surname>Belleville</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Couroussé</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Heydemann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.-P.</given-names>
            <surname>Charles</surname>
          </string-name>
          ,
          <article-title>Automated software protection for the masses against side-channel attacks</article-title>
          , in: TACO, ACM,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>L.</given-names>
            <surname>Goubin</surname>
          </string-name>
          ,
          <string-name>
            <surname>J. Patarin,</surname>
          </string-name>
          <article-title>DES and Diferential Power Analysis The "Duplication" Method</article-title>
          , in: CHES, Springer,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>L.</given-names>
            <surname>Genelle</surname>
          </string-name>
          , E. Prouf,
          <string-name>
            <given-names>M.</given-names>
            <surname>Quisquater</surname>
          </string-name>
          , Secure Multiplicative Masking of Power Functions,
          <source>in: Applied Cryptography and Network Security</source>
          , vol.
          <volume>6123</volume>
          , Springer,
          <fpage>200</fpage>
          -
          <lpage>217</lpage>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>L.</given-names>
            <surname>Goubin</surname>
          </string-name>
          ,
          <article-title>A sound method for switching between boolean and arithmetic masking</article-title>
          ,
          <source>in: International Workshop on Cryptographic Hardware and Embedded Systems</source>
          , Springer,
          <fpage>3</fpage>
          -
          <lpage>15</lpage>
          ,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>T.</given-names>
            <surname>Barry</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Couroussé</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Robisson</surname>
          </string-name>
          ,
          <article-title>Compilation of a Countermeasure Against Instruction-Skip Fault Attacks</article-title>
          ,
          <source>in: CS2</source>
          ,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>A.</given-names>
            <surname>Barenghi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Breveglieri</surname>
          </string-name>
          , I. Koren,
          <string-name>
            <given-names>G.</given-names>
            <surname>Pelosi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Regazzoni</surname>
          </string-name>
          ,
          <article-title>Countermeasures against fault attacks on software implemented AES: efectiveness and cost</article-title>
          , in: WESS,
          <fpage>1</fpage>
          -
          <lpage>10</lpage>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>J.</given-names>
            <surname>Bringer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Carlet</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Chabanne</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Guilley</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Maghrebi</surname>
          </string-name>
          ,
          <article-title>Orthogonal Direct Sum Masking: A Smartcard Friendly Computation Paradigm in a Code, with Builtin Protection against Side-Channel and Fault Attacks</article-title>
          ,
          <source>in: Information Security Theory and Practice. Securing the Internet of Things</source>
          , vol.
          <volume>8501</volume>
          , Springer,
          <fpage>40</fpage>
          -
          <lpage>56</lpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>P.</given-names>
            <surname>Rauzy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Guilley</surname>
          </string-name>
          ,
          <article-title>Countermeasures against high-order fault-injection attacks on CRT-RSA</article-title>
          , in: FDTC, IEEE,
          <fpage>68</fpage>
          -
          <lpage>82</lpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>B.</given-names>
            <surname>Colombier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Menu</surname>
          </string-name>
          ,
          <string-name>
            <surname>J.-M. Dutertre</surname>
            ,
            <given-names>P.-A.</given-names>
          </string-name>
          <string-name>
            <surname>Moëllic</surname>
          </string-name>
          ,
          <string-name>
            <surname>J.-B. Rigaud</surname>
            ,
            <given-names>J.-L.</given-names>
          </string-name>
          <string-name>
            <surname>Danger</surname>
          </string-name>
          ,
          <article-title>Laser-induced single-bit faults in flash memory: Instructions corruption on a 32-bit microcontroller</article-title>
          ,
          <source>in: HOST</source>
          ,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>L.</given-names>
            <surname>Masure</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Belleville</surname>
          </string-name>
          , E. Cagli, M.
          <article-title>-</article-title>
          <string-name>
            <surname>A. Cornélie</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Couroussé</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Dumas</surname>
          </string-name>
          , L. Maingault,
          <article-title>Deep Learning Side-Channel Analysis on Large-Scale Traces</article-title>
          , in: ESORICS,
          <year>2020</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <given-names>T.</given-names>
            <surname>Schneider</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Moradi</surname>
          </string-name>
          ,
          <article-title>Leakage assessment methodology</article-title>
          ,
          <source>in: CHES</source>
          , Springer,
          <fpage>495</fpage>
          -
          <lpage>513</lpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <string-name>
            <given-names>F.-X.</given-names>
            <surname>Standaert</surname>
          </string-name>
          ,
          <article-title>How (not) to Use Welch's T-test in Side-Channel Security Evaluations</article-title>
          , in: CARDIS,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <given-names>I. B.</given-names>
            <surname>El Ouahma</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Q. L.</given-names>
            <surname>Meunier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Heydemann</surname>
          </string-name>
          , E. Encrenaz,
          <article-title>Side-channel robustness analysis of masked assembly codes using a symbolic approach</article-title>
          , JCEN .
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          [29]
          <string-name>
            <surname>J.-B. Bréjon</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          <string-name>
            <surname>Heydemann</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          <string-name>
            <surname>Encrenaz</surname>
            ,
            <given-names>Q. L.</given-names>
          </string-name>
          <string-name>
            <surname>Meunier</surname>
            ,
            <given-names>S. T.</given-names>
          </string-name>
          <string-name>
            <surname>Vu</surname>
          </string-name>
          ,
          <article-title>Fault attack vulnerability assessment of binary code</article-title>
          ,
          <source>in: CS2</source>
          ,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          [30]
          <string-name>
            <given-names>G.</given-names>
            <surname>Barthe</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Belaïd</surname>
          </string-name>
          , G. Cassiers,
          <string-name>
            <given-names>P.-A.</given-names>
            <surname>Fouque</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Grégoire</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.-X.</given-names>
            <surname>Standaert</surname>
          </string-name>
          ,
          <article-title>Maskverif: Automated verification of higher-order masking in presence of physical defaults</article-title>
          ,
          <source>in: ESORICS</source>
          ,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>
          [31]
          <string-name>
            <given-names>N.</given-names>
            <surname>Belleville</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Couroussé</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Heydemann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Q.</given-names>
            <surname>Meunier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>I. B.</given-names>
            <surname>El Ouahma</surname>
          </string-name>
          ,
          <article-title>Maskara: Compilation of a Masking Countermeasure With Optimized Polynomial Interpolation</article-title>
          , in: TCAD, IEEE,
          <year>2020</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>
          [32]
          <string-name>
            <given-names>M.</given-names>
            <surname>Rivain</surname>
          </string-name>
          , E. Prouf,
          <article-title>Provably secure higher-order masking of AES</article-title>
          , in: CHES, Springer,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>
          [33]
          <string-name>
            <given-names>M.</given-names>
            <surname>Rivain</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            <surname>Dottax</surname>
          </string-name>
          , E. Prouf,
          <string-name>
            <surname>Block Ciphers Implementations Provably Secure Against Second Order Side Channel Analysis</surname>
            , in: FSE,
            <given-names>LNCS</given-names>
          </string-name>
          , Springer,
          <fpage>127</fpage>
          -
          <lpage>143</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref34">
        <mixed-citation>
          [34]
          <string-name>
            <given-names>M.</given-names>
            <surname>Tunstall</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Whitnall</surname>
          </string-name>
          , E. Oswald,
          <article-title>Masking Tables-An Underestimated Security Risk</article-title>
          , in: FSE,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref35">
        <mixed-citation>
          [35]
          <string-name>
            <given-names>J.-S.</given-names>
            <surname>Coron</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Roy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Vivek</surname>
          </string-name>
          ,
          <article-title>Fast evaluation of polynomials over binary finite fields and application to side-channel countermeasures</article-title>
          ,
          <source>in: CHES</source>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref36">
        <mixed-citation>
          [36]
          <string-name>
            <given-names>N.</given-names>
            <surname>Moro</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Heydemann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            <surname>Encrenaz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Robisson</surname>
          </string-name>
          ,
          <article-title>Formal Verification of a Software Countermeasure Against Instruction Skip Attacks</article-title>
          , JCEN .
        </mixed-citation>
      </ref>
      <ref id="ref37">
        <mixed-citation>
          [37]
          <string-name>
            <given-names>T.</given-names>
            <surname>Barry</surname>
          </string-name>
          , Outillage de conception et de compilation de
          <article-title>protections logicielles pour la sécurité dans les systèmes embarqués</article-title>
          .,
          <string-name>
            <surname>These</surname>
          </string-name>
          , École nationale supérieure des mines de Saint-Etienne,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>