blob: 64c7fd901bb79036e3337166481aec722406d8a6 [file] [log] [blame] [edit]
#pragma once
// These options (up to long /////////////// line) should be enabled because the security risk of not using them is too high
// or because the time cost is very low so you may as well have them.
// They can be set to 0 for analysis or testing purposes.
#ifndef GEN_RAND_SHA
#define GEN_RAND_SHA 1 // use SHA256 hardware to generate some random numbers
#endif
// Some RNG calls are hard coded to LFSR RNG, others to SHA RNG
// Setting GEN_RAND_SHA to 0 has the effect of redirecting the latter to LFSR RNG
#ifndef ST_SHAREC
#define ST_SHAREC 1 // This creates a partial extra share at almost no extra cost
#endif
#ifndef ST_VPERM
#define ST_VPERM 1 // insert random vertical permutations in state during de/encryption?
#endif
#ifndef CT_BPERM
#define CT_BPERM 1 // process blocks in a random order in counter mode?
#endif
#ifndef RK_ROR
#define RK_ROR 1 // store round key shares with random rotations within each word
#endif
#ifndef WIPE_MEMORY
#define WIPE_MEMORY 1 // Wipe memory after decryption
#endif
// The following options should be enabled to increase resistance to glitching attacks.
#ifndef RC_CANARY
#define RC_CANARY 1 // use rcp_canary feature
#endif
#ifndef RC_COUNT
#define RC_COUNT 1 // use rcp_count feature
#endif
// Although jitter/timing-variation may be circumventable in theory, in practice
// randomising the timing of operations can make side-channel attacks very much more
// effort to carry out. These can be disabled for analysis or testing purposes.
// It is advisable to use a least one form of jitter.
// RC_JITTER is quite slow, and is probably the most predictable of the three, so it is disabled by default.
// (Leaving it as an option because it's just possible that the large delays it produces are advantageous in defeating certain side-channel attacks.)
#ifndef RC_JITTER
#define RC_JITTER 0 // 0-7. Higher = more jitter. Governs use of random-delay versions of RCP instructions.
#endif
#ifndef SH_JITTER
#define SH_JITTER 1 // Insert random delays, tagged onto SHA RNG
#endif
#ifndef CK_JITTER
#define CK_JITTER 1 // Use the ROSC clock to make ARM timings unpredictable
#endif
#ifndef INLINE_REF_ROUNDKEY_SHARES_S
#define INLINE_REF_ROUNDKEY_SHARES_S 0
#endif
#ifndef INLINE_REF_ROUNDKEY_HVPERMS_S
#define INLINE_REF_ROUNDKEY_HVPERMS_S 0
#endif
#ifndef INLINE_SHIFT_ROWS_S
#define INLINE_SHIFT_ROWS_S 0
#endif
#ifndef INLINE_MAP_SBOX_S
#define INLINE_MAP_SBOX_S 0
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// The following options can be adjusted, affecting the performance/security tradeoff
// Period = X means that the operation in question occurs every X blocks, so higher = more performance and lower security.
// No point in making them more than 16 or so, since the time taken by the subroutines would be negligible.
// These must be a power of 2. Timings as of commit 82d31652
//
// Baseline time per 16-byte block = 14109 (with no jitter) cycles
#ifndef REFCHAFF_PERIOD
#define REFCHAFF_PERIOD 1 // Extra cost per 16-byte block = 474/REFCHAFF_PERIOD cycles
#endif
#ifndef REMAP_PERIOD
#define REMAP_PERIOD 4 // Extra cost per 16-byte block = 4148/REMAP_PERIOD cycles
#endif
#ifndef REFROUNDKEYSHARES_PERIOD
#define REFROUNDKEYSHARES_PERIOD 1 // Extra cost per 16-byte block = 1304/REFROUNDKEYSHARES_PERIOD cycles
#endif
#ifndef REFROUNDKEYHVPERMS_PERIOD
#define REFROUNDKEYHVPERMS_PERIOD 1 // Extra cost per 16-byte block = 1486/REFROUNDKEYVPERM_PERIOD cycles
#endif
// Setting NUMREFSTATEVPERM to X means that state vperm refreshing happens on the first X AES rounds only,
// so lower = more performance and lower security.
// The rationale for doing it this way is that later rounds should be protected by CT_BPERM.
// NUMREFSTATEVPERM can be from 0 to 14.
#ifndef NUMREFSTATEVPERM
#define NUMREFSTATEVPERM 7 // Extra cost per 16-byte block = 61*NUMREFSTATEVPERM cycles
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define MAX_NUM_BLOCKS 32768
#if SH_JITTER && !GEN_RAND_SHA
#error GEN_RAND_SHA must be set if you want to use SH_JITTER
#endif