2121
2222#define MEMORY (1 << 21) /* 2 MiB */
2323#define ITER (1 << 20)
24+ #define MASK 0x1FFFF
25+
26+ #define LITE_MEMORY (1 << 20) /* 2 MiB */
27+ #define LITE_ITER (1 << 19)
28+ #define LITE_MASK 0xFFFF
29+
2430#define AES_BLOCK_SIZE 16
2531#define AES_KEY_SIZE 32 /*16*/
2632#define INIT_SIZE_BLK 8
@@ -84,8 +90,8 @@ static void (* const extra_hashes[4])(const void *, size_t, char *) = {
8490extern int aesb_single_round (const uint8_t * in , uint8_t * out , const uint8_t * expandedKey );
8591extern int aesb_pseudo_round (const uint8_t * in , uint8_t * out , const uint8_t * expandedKey );
8692
87- static inline size_t e2i (const uint8_t * a ) {
88- return (* ((uint64_t * ) a ) / AES_BLOCK_SIZE ) & ( MEMORY / AES_BLOCK_SIZE - 1 ) ;
93+ static inline size_t e2i (const uint8_t * a , size_t mask ) {
94+ return (* ((uint64_t * ) a ) / AES_BLOCK_SIZE ) & mask ;
8995}
9096
9197static void mul (const uint8_t * a , const uint8_t * b , uint8_t * res ) {
@@ -151,18 +157,21 @@ struct cryptonight_ctx {
151157 oaes_ctx * aes_ctx ;
152158};
153159
154- void cryptonight_hash (const char * input , char * output , uint32_t len , int variant ) {
160+ void cryptonight_hash (const char * input , char * output , uint32_t len , int variant , int lite ) {
155161 struct cryptonight_ctx * ctx = alloca (sizeof (struct cryptonight_ctx ));
156162 hash_process (& ctx -> state .hs , (const uint8_t * ) input , len );
157163 memcpy (ctx -> text , ctx -> state .init , INIT_SIZE_BYTE );
158164 memcpy (ctx -> aes_key , ctx -> state .hs .b , AES_KEY_SIZE );
159165 ctx -> aes_ctx = (oaes_ctx * ) oaes_alloc ();
160166 size_t i , j ;
167+ size_t memory = lite ? LITE_MEMORY : MEMORY ;
168+ size_t iterations = lite ? LITE_ITER : ITER ;
169+ size_t mask = lite ? LITE_MASK : MASK ;
161170
162171 VARIANT1_INIT ();
163172
164173 oaes_key_import_data (ctx -> aes_ctx , ctx -> aes_key , AES_KEY_SIZE );
165- for (i = 0 ; i < MEMORY / INIT_SIZE_BYTE ; i ++ ) {
174+ for (i = 0 ; i < memory / INIT_SIZE_BYTE ; i ++ ) {
166175 for (j = 0 ; j < INIT_SIZE_BLK ; j ++ ) {
167176 aesb_pseudo_round (& ctx -> text [AES_BLOCK_SIZE * j ],
168177 & ctx -> text [AES_BLOCK_SIZE * j ],
@@ -176,27 +185,27 @@ void cryptonight_hash(const char* input, char* output, uint32_t len, int variant
176185 ctx -> b [i ] = ctx -> state .k [16 + i ] ^ ctx -> state .k [48 + i ];
177186 }
178187
179- for (i = 0 ; i < ITER / 2 ; i ++ ) {
188+ for (i = 0 ; i < iterations / 2 ; i ++ ) {
180189 /* Dependency chain: address -> read value ------+
181190 * written value <-+ hard function (AES or MUL) <+
182191 * next address <-+
183192 */
184193 /* Iteration 1 */
185- j = e2i (ctx -> a );
194+ j = e2i (ctx -> a , mask );
186195 aesb_single_round (& ctx -> long_state [j * AES_BLOCK_SIZE ], ctx -> c , ctx -> a );
187196 xor_blocks_dst (ctx -> c , ctx -> b , & ctx -> long_state [j * AES_BLOCK_SIZE ]);
188197 VARIANT1_1 ((uint8_t * )& ctx -> long_state [j * AES_BLOCK_SIZE ]);
189198 /* Iteration 2 */
190199 mul_sum_xor_dst (ctx -> c , ctx -> a ,
191- & ctx -> long_state [e2i (ctx -> c ) * AES_BLOCK_SIZE ]);
200+ & ctx -> long_state [e2i (ctx -> c , mask ) * AES_BLOCK_SIZE ]);
192201 copy_block (ctx -> b , ctx -> c );
193202 VARIANT1_2 ((uint8_t * )
194- & ctx -> long_state [e2i (ctx -> c ) * AES_BLOCK_SIZE ]);
203+ & ctx -> long_state [e2i (ctx -> c , mask ) * AES_BLOCK_SIZE ]);
195204 }
196205
197206 memcpy (ctx -> text , ctx -> state .init , INIT_SIZE_BYTE );
198207 oaes_key_import_data (ctx -> aes_ctx , & ctx -> state .hs .b [32 ], AES_KEY_SIZE );
199- for (i = 0 ; i < MEMORY / INIT_SIZE_BYTE ; i ++ ) {
208+ for (i = 0 ; i < memory / INIT_SIZE_BYTE ; i ++ ) {
200209 for (j = 0 ; j < INIT_SIZE_BLK ; j ++ ) {
201210 xor_blocks (& ctx -> text [j * AES_BLOCK_SIZE ],
202211 & ctx -> long_state [i * INIT_SIZE_BYTE + j * AES_BLOCK_SIZE ]);
0 commit comments