diff options
| author | Kévin Le Gouguec <kevin.legouguec@airbus.com> | 2019-03-15 09:49:20 +0100 |
|---|---|---|
| committer | Kévin Le Gouguec <kevin.legouguec@airbus.com> | 2019-03-15 09:55:51 +0100 |
| commit | d9a168d5c3dad38a24b5d4535784739b7a2c1510 (patch) | |
| tree | 1af57f3618be037f9a6eb3427f3336730879d127 | |
| parent | a05b9773b100a53ee54c0fb09426b2ccbdef80a0 (diff) | |
| download | lilliput-ae-implem-d9a168d5c3dad38a24b5d4535784739b7a2c1510.tar.xz | |
[implem-threshold] Ajout du calcul de la S-box sans tables
Fournie par @aadomn.
| -rw-r--r-- | implementations/threshold/sbox_hard.c | 433 |
1 files changed, 433 insertions, 0 deletions
diff --git a/implementations/threshold/sbox_hard.c b/implementations/threshold/sbox_hard.c new file mode 100644 index 0000000..477b032 --- /dev/null +++ b/implementations/threshold/sbox_hard.c @@ -0,0 +1,433 @@ +void SboxHardwareTI(uint8_t Ax, uint8_t Bx, uint8_t Cx, uint8_t* Ay, uint8_t* By, uint8_t* Cy){ + // Variables 5th register + uint8_t At0, At1, At2, At3, At4, At5, At6, At7 ; + uint8_t Bt0, Bt1, Bt2, Bt3, Bt4, Bt5, Bt6, Bt7 ; + uint8_t Ct0, Ct1, Ct2, Ct3, Ct4, Ct5, Ct6, Ct7 ; + // Variables used in F G and Q + uint8_t Ax0, Ax1, Ax2, Ax3, Ax4, Ax5, Ax6, Ax7, Axt ; + uint8_t Bx0, Bx1, Bx2, Bx3, Bx4, Bx5, Bx6, Bx7, Bxt ; + uint8_t Cx0, Cx1, Cx2, Cx3, Cx4, Cx5, Cx6, Cx7, Cxt ; + // Variables of the feistel scheme + uint8_t c_Ax0, c_Ax1, c_Ax2, c_Ax3, c_Ax4, c_Ax5, c_Ax6, c_Ax7, c_Axt ; + uint8_t c_Bx0, c_Bx1, c_Bx2, c_Bx3, c_Bx4, c_Bx5, c_Bx6, c_Bx7, c_Bxt ; + uint8_t c_Cx0, c_Cx1, c_Cx2, c_Cx3, c_Cx4, c_Cx5, c_Cx6, c_Cx7, c_Cxt ; + // Intermediate variables (should be registers) + // For Xor of feistel, maybe only the xor with ys should be registers + uint8_t Ay0, Ay1, Ay2, Ay3, Ay4, Ay5, Ay6, Ay7, Ayt ; + uint8_t By0, By1, By2, By3, By4, By5, By6, By7, Byt ; + uint8_t Cy0, Cy1, Cy2, Cy3, Cy4, Cy5, Cy6, Cy7, Cyt ; + + c_Ax0 = Ax & 0x1 ; + c_Ax1 = (Ax & 0x2) >> 1 ; + c_Ax2 = (Ax & 0x4) >> 2 ; + c_Ax3 = (Ax & 0x8) >> 3 ; + c_Ax4 = (Ax & 0x10) >> 4 ; + c_Ax5 = (Ax & 0x20) >> 5 ; + c_Ax6 = (Ax & 0x40) >> 6 ; + c_Ax7 = (Ax & 0x80) >> 7 ; + + c_Bx0 = Bx & 0x1 ; + c_Bx1 = (Bx & 0x2) >> 1 ; + c_Bx2 = (Bx & 0x4) >> 2 ; + c_Bx3 = (Bx & 0x8) >> 3 ; + c_Bx4 = (Bx & 0x10) >> 4 ; + c_Bx5 = (Bx & 0x20) >> 5 ; + c_Bx6 = (Bx & 0x40) >> 6 ; + c_Bx7 = (Bx & 0x80) >> 7 ; + + c_Cx0 = Cx & 0x1 ; + c_Cx1 = (Cx & 0x2) >> 1 ; + c_Cx2 = (Cx & 0x4) >> 2 ; + c_Cx3 = (Cx & 0x8) >> 3 ; + c_Cx4 = (Cx & 0x10) >> 4 ; + c_Cx5 = (Cx & 0x20) >> 5 ; + c_Cx6 = (Cx & 0x40) >> 6 ; + c_Cx7 = (Cx & 0x80) >> 7 ; + + // FoG + // G // --- + Ax0 = c_Ax0 ; // | + Bx0 = c_Bx0 ; // | + Cx0 = c_Cx0 ; // | + Ax1 = c_Ax1 ; // | + Bx1 = c_Bx1 ; // | + Cx1 = c_Cx1 ; // | From Feistel, get main wires : + Ax2 = c_Ax2 ; // | --> Free in harware, just wiring + Bx2 = c_Bx2 ; // | + Cx2 = c_Cx2 ; // | + Ax3 = c_Ax3 ; // | + Bx3 = c_Bx3 ; // | + Cx3 = c_Cx3 ; // | + // --- + // --- + At0 = (Bx1 & Bx2) ^ (Bx1 & Cx2) ^ (Cx1 & Bx2) ; // | + Bt0 = (Cx1 & Cx2) ^ (Cx1 & Ax2) ^ (Ax1 & Cx2) ; // | + Ct0 = (Ax1 & Ax2) ^ (Ax1 & Bx2) ^ (Bx1 & Ax2) ; // | + // | G gates + Ax0 = Ax0 ^ At0 ; // | + Bx0 = Bx0 ^ Bt0 ; // | + Cx0 = Cx0 ^ Ct0 ; // | + // --- + // --- + Ay0 = Ax0 ; // | + By0 = Bx0 ; // | + Cy0 = Cx0 ; // | + Ay1 = Ax1 ; // | + By1 = Bx1 ; // | + Cy1 = Cx1 ; // | Registers + Ay2 = Ax2 ; // | + By2 = Bx2 ; // | + Cy2 = Cx2 ; // | + Ay3 = Ax3 ; // | + By3 = Bx3 ; // | + Cy3 = Cx3 ; // | + // --- + + // F // --- + Ax0 = Ay0 ; // | + Bx0 = By0 ; // | + Cx0 = Cy0 ; // | + Ax1 = Ay1 ; // | + Bx1 = By1 ; // | Wiring from registers + Cx1 = Cy1 ; // | --> Free + Ax2 = Ay2 ; // | + Bx2 = By2 ; // | + Cx2 = Cy2 ; // | + Ax3 = Ay3 ; // | + Bx3 = By3 ; // | + Cx3 = Cy3 ; // | + // --- + // --- + Ax1 = Ax1 ^ Ax3 ; // | + Bx1 = Bx1 ^ Bx3 ; // | + Cx1 = Cx1 ^ Cx3 ; // | + // | + Axt = Ax0 ^ Ax2 ; // | + Bxt = Bx0 ^ Bx2 ; // | + Cxt = Cx0 ^ Cx2 ; // | + // | + Ax2 = Ax1 ^ Ax2 ; // | + Bx2 = Bx1 ^ Bx2 ; // | + Cx2 = Cx1 ^ Cx2 ; // | + // | + At0 = (Bx0 & Bx3) ^ (Bx0 & Cx3) ^ (Cx0 & Bx3) ; // | + Bt0 = (Cx0 & Cx3) ^ (Cx0 & Ax3) ^ (Ax0 & Cx3) ; // | + Ct0 = (Ax0 & Ax3) ^ (Ax0 & Bx3) ^ (Bx0 & Ax3) ; // | + Ax0 = At0 ; // | F gates + Bx0 = Bt0 ; // | + Cx0 = Ct0 ; // | + // | + Ax3 = Ax3 ^ Axt ; // | + Bx3 = Bx3 ^ Bxt ; // | + Cx3 = Cx3 ^ Cxt ; // | + // | + At3 = (Bx3 & Bx2) ^ (Bx3 & Cx2) ^ (Cx3 & Bx2) ; // | + Bt3 = (Cx3 & Cx2) ^ (Cx3 & Ax2) ^ (Ax3 & Cx2) ; // | + Ct3 = (Ax3 & Ax2) ^ (Ax3 & Bx2) ^ (Bx3 & Ax2) ; // | + Ax3 = At3 ; // | + Bx3 = Bt3 ; // | + Cx3 = Ct3 ; // | + // | + At1 = (Bx1 & Bxt) ^ (Bx1 & Cxt) ^ (Cx1 & Bxt) ; // | + Bt1 = (Cx1 & Cxt) ^ (Cx1 & Axt) ^ (Ax1 & Cxt) ; // | + Ct1 = (Ax1 & Axt) ^ (Ax1 & Bxt) ^ (Bx1 & Axt) ; // | + // --- + // --- + Ay0 = Ax3 ; // | + By0 = Bx3 ; // | + Cy0 = Cx3 ; // | + Ay1 = Axt ; // | + By1 = Bxt ; // | Registers + Cy1 = Cxt ; // | + Ay2 = Ax0 ; // | + By2 = Bx0 ; // | + Cy2 = Cx0 ; // | + Ay3 = At1 ; // | + By3 = Bt1 ; // | + Cy3 = Ct1 ; // | + // --- + + // Xor --- + c_Ax4 = c_Ax4 ^Ay0 ; // | + c_Bx4 = c_Bx4 ^By0 ; // | + c_Cx4 = c_Cx4 ^Cy0 ; // | + c_Ax5 = c_Ax5 ^Ay1 ; // | + c_Bx5 = c_Bx5 ^By1 ; // | + c_Cx5 = c_Cx5 ^Cy1 ; // | First xor of the Feistel + c_Ax6 = c_Ax6 ^Ay2 ; // | + c_Bx6 = c_Bx6 ^By2 ; // | + c_Cx6 = c_Cx6 ^Cy2 ; // | + c_Ax7 = c_Ax7 ^Ay3 ; // | + c_Bx7 = c_Bx7 ^By3 ; // | + c_Cx7 = c_Cx7 ^Cy3 ; // | + // --- + + // QoQ + // Q // --- + Ax4 = c_Ax4 ; // | + Bx4 = c_Bx4 ; // | + Cx4 = c_Cx4 ; // | + Ax5 = c_Ax5 ; // | + Bx5 = c_Bx5 ; // | From Feistel, get main wires : + Cx5 = c_Cx5 ; // | --> Free in harware, just wiring + Ax6 = c_Ax6 ; // | + Bx6 = c_Bx6 ; // | + Cx6 = c_Cx6 ; // | + Ax7 = c_Ax7 ; // | + Bx7 = c_Bx7 ; // | + Cx7 = c_Cx7 ; // | + // --- + // --- + Axt = (Bx4 & Bx7) ^ (Bx4 & Cx7) ^ (Cx4 & Bx7) ; // | + Bxt = (Cx4 & Cx7) ^ (Cx4 & Ax7) ^ (Ax4 & Cx7) ; // | + Cxt = (Ax4 & Ax7) ^ (Ax4 & Bx7) ^ (Bx4 & Ax7) ; // | + // | + Axt = Axt ^ Ax5 ; // | + Bxt = Bxt ^ Bx5 ; // | + Cxt = Cxt ^ Cx5 ; // | + // | + At5 = (Bx4 & Bx5) ^ (Bx4 & Cx5) ^ (Cx4 & Bx5) ; // | Q Gates + Bt5 = (Cx4 & Cx5) ^ (Cx4 & Ax5) ^ (Ax4 & Cx5) ; // | + Ct5 = (Ax4 & Ax5) ^ (Ax4 & Bx5) ^ (Bx4 & Ax5) ; // | + Ax5 = At5 ; // | + Bx5 = Bt5 ; // | + Cx5 = Ct5 ; // | + // | + Ax6 = Ax6 ^ Ax5 ; // | + Bx6 = Bx6 ^ Bx5 ; // | + Cx6 = Cx6 ^ Cx5 ; // | + // --- + // --- + Ay4 = Ax7 ; // | + By4 = Bx7 ; // | + Cy4 = Cx7 ; // | + Ay5 = Axt ; // | + By5 = Bxt ; // | Registers + Cy5 = Cxt ; // | + Ay6 = Ax4 ; // | + By6 = Bx4 ; // | + Cy6 = Cx4 ; // | + Ay7 = Ax6 ; // | + By7 = Bx6 ; // | + Cy7 = Cx6 ; // | + // --- + + // Wire Permutation + // --- + Ax4 = Ay7 ; // | + Bx4 = By7 ; // | + Cx4 = Cy7 ; // | + Ax5 = Ay4 ; // | + Bx5 = By4 ; // | + Cx5 = Cy4 ; // | Wire permutation from registers + Ax6 = Ay6 ; // | in order to reuse identical Q + Bx6 = By6 ; // | --> Free in hardware, just wiring + Cx6 = Cy6 ; // | + Ax7 = Ay5 ; // | + Bx7 = By5 ; // | + Cx7 = Cy5 ; // | + // --- + + // Q + // --- + Axt = (Bx4 & Bx7) ^ (Bx4 & Cx7) ^ (Cx4 & Bx7) ; // | + Bxt = (Cx4 & Cx7) ^ (Cx4 & Ax7) ^ (Ax4 & Cx7) ; // | + Cxt = (Ax4 & Ax7) ^ (Ax4 & Bx7) ^ (Bx4 & Ax7) ; // | + // | + Axt = Axt ^ Ax5 ; // | + Bxt = Bxt ^ Bx5 ; // | + Cxt = Cxt ^ Cx5 ; // | + // | + At5 = (Bx4 & Bx5) ^ (Bx4 & Cx5) ^ (Cx4 & Bx5) ; // | Q Gates + Bt5 = (Cx4 & Cx5) ^ (Cx4 & Ax5) ^ (Ax4 & Cx5) ; // | + Ct5 = (Ax4 & Ax5) ^ (Ax4 & Bx5) ^ (Bx4 & Ax5) ; // | + Ax5 = At5 ; // | + Bx5 = Bt5 ; // | + Cx5 = Ct5 ; // | + // | + Ax6 = Ax6 ^ Ax5 ; // | + Bx6 = Bx6 ^ Bx5 ; // | + Cx6 = Cx6 ^ Cx5 ; // | + // --- + // --- + Ay4 = Ax7 ; // | + By4 = Bx7 ; // | + Cy4 = Cx7 ; // | + Ay5 = Axt ; // | + By5 = Bxt ; // | Registers + Cy5 = Cxt ; // | + Ay6 = Ax4 ; // | + By6 = Bx4 ; // | + Cy6 = Cx4 ; // | + Ay7 = Ax6 ; // | + By7 = Bx6 ; // | + Cy7 = Cx6 ; // | + // --- + + + // Xor // --- + c_Ax0 = c_Ax0 ^ Ay4 ; // | + c_Bx0 = c_Bx0 ^ By4 ; // | + c_Cx0 = c_Cx0 ^ Cy4 ; // | + c_Ax1 = c_Ax1 ^ Ay5 ; // | + c_Bx1 = c_Bx1 ^ By5 ; // | Second xor of the Feistel + c_Cx1 = c_Cx1 ^ Cy5 ; // | + c_Ax2 = c_Ax2 ^ Ay6 ; // | + c_Bx2 = c_Bx2 ^ By6 ; // | + c_Cx2 = c_Cx2 ^ Cy6 ; // | + c_Ax3 = c_Ax3 ^ Ay7 ; // | + c_Bx3 = c_Bx3 ^ By7 ; // | + c_Cx3 = c_Cx3 ^ Cy7 ; // | + // --- + + // F^1oG + // G // --- + Ax0 = c_Ax0 ; // | + Bx0 = c_Bx0 ; // | + Cx0 = c_Cx0 ; // | + Ax1 = c_Ax1 ; // | + Bx1 = c_Bx1 ; // | From Feistel, get main wires : + Cx1 = c_Cx1 ; // | --> Free in harware, just wiring + Ax2 = c_Ax2 ; // | + Bx2 = c_Bx2 ; // | + Cx2 = c_Cx2 ; // | + Ax3 = c_Ax3 ; // | + Bx3 = c_Bx3 ; // | + Cx3 = c_Cx3 ; // | + // --- + + // --- + At0 = (Bx1 & Bx2) ^ (Bx1 & Cx2) ^ (Cx1 & Bx2) ; // | + Bt0 = (Cx1 & Cx2) ^ (Cx1 & Ax2) ^ (Ax1 & Cx2) ; // | + Ct0 = (Ax1 & Ax2) ^ (Ax1 & Bx2) ^ (Bx1 & Ax2) ; // | G gates + // | + Ax0 = Ax0 ^ At0 ^ 1 ; // | <-- Not gate, only needed in 1 share + Bx0 = Bx0 ^ Bt0 ; // | + Cx0 = Cx0 ^ Ct0 ; // | + // --- + // --- + Ay0 = Ax0 ; // | + By0 = Bx0 ; // | + Cy0 = Cx0 ; // | + Ay1 = Ax1 ; // | + By1 = Bx1 ; // | + Cy1 = Cx1 ; // | Registers + Ay2 = Ax2 ; // | + By2 = Bx2 ; // | + Cy2 = Cx2 ; // | + Ay3 = Ax3 ; // | + By3 = Bx3 ; // | + Cy3 = Cx3 ; // | + // --- + + // F + Ax0 = Ay0 ; // | + Bx0 = By0 ; // | + Cx0 = Cy0 ; // | + Ax1 = Ay1 ; // | + Bx1 = By1 ; // | Wiring from registers + Cx1 = Cy1 ; // | --> Free + Ax2 = Ay2 ; // | + Bx2 = By2 ; // | + Cx2 = Cy2 ; // | + Ax3 = Ay3 ; // | + Bx3 = By3 ; // | + Cx3 = Cy3 ; // | + // --- + + // --- +Ax1 = Ax1 ^ Ax3 ; // | +Bx1 = Bx1 ^ Bx3 ; // | +Cx1 = Cx1 ^ Cx3 ; // | + // | +Axt = Ax0 ^ Ax2 ; // | +Bxt = Bx0 ^ Bx2 ; // | +Cxt = Cx0 ^ Cx2 ; // | + // | +Ax2 = Ax1 ^ Ax2 ; // | +Bx2 = Bx1 ^ Bx2 ; // | +Cx2 = Cx1 ^ Cx2 ; // | + // | +At0 = (Bx0 & Bx3) ^ (Bx0 & Cx3) ^ (Cx0 & Bx3) ; // | +Bt0 = (Cx0 & Cx3) ^ (Cx0 & Ax3) ^ (Ax0 & Cx3) ; // | +Ct0 = (Ax0 & Ax3) ^ (Ax0 & Bx3) ^ (Bx0 & Ax3) ; // | +Ax0 = At0 ; // | F gates +Bx0 = Bt0 ; // | +Cx0 = Ct0 ; // | + // | +Ax3 = Ax3 ^ Axt ; // | +Bx3 = Bx3 ^ Bxt ; // | +Cx3 = Cx3 ^ Cxt ; // | + // | +At3 = (Bx3 & Bx2) ^ (Bx3 & Cx2) ^ (Cx3 & Bx2) ; // | +Bt3 = (Cx3 & Cx2) ^ (Cx3 & Ax2) ^ (Ax3 & Cx2) ; // | +Ct3 = (Ax3 & Ax2) ^ (Ax3 & Bx2) ^ (Bx3 & Ax2) ; // | +Ax3 = At3 ; // | +Bx3 = Bt3 ; // | +Cx3 = Ct3 ; // | + // | +At1 = (Bx1 & Bxt) ^ (Bx1 & Cxt) ^ (Cx1 & Bxt) ; // | +Bt1 = (Cx1 & Cxt) ^ (Cx1 & Axt) ^ (Ax1 & Cxt) ; // | +Ct1 = (Ax1 & Axt) ^ (Ax1 & Bxt) ^ (Bx1 & Axt) ; // | + // --- + // --- +Ay0 = Ax3 ; // | +By0 = Bx3 ; // | +Cy0 = Cx3 ; // | +Ay1 = Axt ; // | +By1 = Bxt ; // | Registers +Cy1 = Cxt ; // | +Ay2 = Ax0 ; // | +By2 = Bx0 ; // | +Cy2 = Cx0 ; // | +Ay3 = At1 ; // | +By3 = Bt1 ; // | +Cy3 = Ct1 ; // | + // --- + + // Xor // --- + c_Ax4 = c_Ax4 ^ Ay0 ; // | + c_Bx4 = c_Bx4 ^ By0 ; // | + c_Cx4 = c_Cx4 ^ Cy0 ; // | + c_Ax5 = c_Ax5 ^ Ay1 ; // | + c_Bx5 = c_Bx5 ^ By1 ; // | + c_Cx5 = c_Cx5 ^ Cy1 ; // | Third xor of the Feistel + c_Ax6 = c_Ax6 ^ Ay2 ; // | + c_Bx6 = c_Bx6 ^ By2 ; // | + c_Cx6 = c_Cx6 ^ Cy2 ; // | + c_Ax7 = c_Ax7 ^ Ay3 ; // | + c_Bx7 = c_Bx7 ^ By3 ; // | + c_Cx7 = c_Cx7 ^ Cy3 ; // | + // --- + // --- + Ay0 = c_Ax0 ; // | + By0 = c_Bx0 ; // | + Cy0 = c_Cx0 ; // | + Ay1 = c_Ax1 ; // | + By1 = c_Bx1 ; // | + Cy1 = c_Cx1 ; // | + Ay2 = c_Ax2 ; // | + By2 = c_Bx2 ; // | + Cy2 = c_Cx2 ; // | + Ay3 = c_Ax3 ; // | + By3 = c_Bx3 ; // | + Cy3 = c_Cx3 ; // | + Ay4 = c_Ax4 ; // | Last registers of end of Sbox + By4 = c_Bx4 ; // | + Cy4 = c_Cx4 ; // | + Ay5 = c_Ax5 ; // | + By5 = c_Bx5 ; // | + Cy5 = c_Cx5 ; // | + Ay6 = c_Ax6 ; // | + By6 = c_Bx6 ; // | + Cy6 = c_Cx6 ; // | + Ay7 = c_Ax7 ; // | + By7 = c_Bx7 ; // | + Cy7 = c_Cx7 ; // | + // --- + + (*Ay) = Ay0 ^ (Ay1 << 1) ^ (Ay2 << 2) ^ (Ay3 << 3) ^ (Ay4 << 4) ^ (Ay5 << 5) ^ (Ay6 << 6) ^ (Ay7 << 7) ; + (*By) = By0 ^ (By1 << 1) ^ (By2 << 2) ^ (By3 << 3) ^ (By4 << 4) ^ (By5 << 5) ^ (By6 << 6) ^ (By7 << 7) ; + (*Cy) = Cy0 ^ (Cy1 << 1) ^ (Cy2 << 2) ^ (Cy3 << 3) ^ (Cy4 << 4) ^ (Cy5 << 5) ^ (Cy6 << 6) ^ (Cy7 << 7) ; + +} |
