2023-07-02 17:14:50 +02:00
# Constantine
# Copyright (c) 2018-2019 Status Research & Development GmbH
# Copyright (c) 2020-Present Mamy André-Ratsimbazafy
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at http://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at http://www.apache.org/licenses/LICENSE-2.0).
# at your option. This file may not be copied, modified, or distributed except according to those terms.
import
.. / constantine / ethereum_evm_precompiles ,
std / unittest
suite " EVM ModExp precompile (EIP-198) " :
test " Audit #5 - Fuzz failure with even modulus " :
let input = [
# Length of base (1)
uint8 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ,
# Length of exponent (1)
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ,
# Length of modulus (1)
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ,
# Base
0x06 ,
# Exponent
0x02 ,
# Modulus
0x04
]
var r = newSeq [ byte ] ( 1 )
let status = r . eth_evm_modexp ( input )
doAssert status = = cttEVM_Success
doAssert r [ 0 ] = = 0 , " . Result was " & $ r [ 0 ]
2023-07-11 09:06:46 +02:00
2023-09-06 20:01:35 +02:00
test " Audit #5-2 - Fuzz failure with even modulus strikes back " :
let input = [
# Length of base (1)
uint8 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ,
# Length of exponent (5)
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x05 ,
# Length of modulus (1)
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ,
# Base
0x3a ,
# Exponent
0x01 , 0x00 , 0x00 , 0x00 , 0x00 ,
# Modulus
0x08
]
var r = newSeq [ byte ] ( 1 )
let status = r . eth_evm_modexp ( input )
doAssert status = = cttEVM_Success
doAssert r [ 0 ] = = 0 , " . Result was " & $ r [ 0 ]
2023-10-10 05:57:03 +00:00
test " Audit #5-3 - temp buffer extra uninitialized word " :
2023-09-09 09:20:01 +02:00
let input = [
# Length of base (1)
uint8 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ,
# Length of exponent (2)
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02 ,
# Length of modulus (9)
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09 ,
# Base
0x02 ,
# Exponent
0x02 , 0x65 ,
# Modulus
0x05 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03 , 0x98
]
var r = newSeq [ byte ] ( 9 )
let status = r . eth_evm_modexp ( input )
doAssert status = = cttEVM_Success
doAssert r = = @ [ byte 0 , 0 , 1 , 45 , 106 , 227 , 225 , 162 , 136 ] , " . Result was " & $ r
2023-10-10 05:57:03 +00:00
test " Audit #5-4 - temp buffer extra uninitialized word (2) " :
var input = [
# Length of base
uint8 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0c ,
# Length of exponent
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x08 ,
# Length of modulus
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x2b ,
# Base
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
# Exponent
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xe0 ,
# Modulus
0x17 , 0xc6 , 0xab , 0xaa , 0x3f , 0x00 , 0xe5 , 0xc0 , 0x5b , 0x75 , 0x74 , 0xcb ,
0xcf , 0x2a , 0x44 , 0xd4 , 0x3a , 0xca , 0x4a , 0xc0 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
]
var r = newSeq [ byte ] ( 0x2b )
let status = eth_evm_modexp ( r , input )
doAssert status = = cttEVM_Success
doAssert r = = @ [ byte 10 , 141 , 74 , 46 , 2 , 18 , 2 , 37 , 247 , 220 , 246 , 65 , 109 , 246 , 7 , 144 , 85 , 202 , 194 , 191 , 255 , 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 32 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] , " . Result was " & $ r
2023-07-11 09:06:46 +02:00
test " Audit #8 - off-by-1 buffer overflow - ptr + length exclusive vs openArray(lo, hi) inclusive " :
let input = [
# Length of base (24)
uint8 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x18 ,
# Length of exponent (36)
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x24 ,
# Length of modulus (56)
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x38 ,
# Base
0x07 , 0x19 , 0x2b , 0x95 , 0xff , 0xc8 , 0xda , 0x78 , 0x63 , 0x10 , 0x11 , 0xed , 0x6b , 0x24 , 0xcd , 0xd5 ,
0x73 , 0xf9 , 0x77 , 0xa1 , 0x1e , 0x79 , 0x48 , 0x11 ,
# Exponent
0x03 , 0x67 , 0x68 , 0x54 , 0xfe , 0x24 , 0x14 , 0x1c , 0xb9 , 0x8f , 0xe6 , 0xd4 , 0xb2 , 0x0d , 0x02 , 0xb4 ,
0x51 , 0x6f , 0xf7 , 0x02 , 0x35 , 0x0e , 0xdd , 0xb0 , 0x82 , 0x67 , 0x79 , 0xc8 , 0x13 , 0xf0 , 0xdf , 0x45 ,
0xbe , 0x81 , 0x12 , 0xf4 ,
# Modulus
0x1a , 0xbf , 0x81 , 0x1f , 0x86 , 0xe1 , 0x02 , 0x78 , 0x66 , 0xe4 , 0x23 , 0x65 , 0x49 , 0x0f , 0x8d , 0x6e ,
0xc2 , 0x23 , 0x94 , 0x18 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
]
var r = newSeq [ byte ] ( 56 )
let status = r . eth_evm_modexp ( input )
2023-09-06 15:00:29 +02:00
doAssert status = = cttEVM_Success
test " Audit #18 - Handling of inputs infinitely right-padded with zeros (read past buffers or stack overflow for temporaries) " :
let input = [
# Base length
uint8 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x08 ,
# Exponent length
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xab , 0xa8 , 0xfd ,
# Modulus length
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ,
0xc1 , 0x00 , 0x00 , 0x00 , 0x51 , 0x00 , 0x9b , 0x9b ,
0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b ,
0x9b , 0x9b , 0x9b , 0x9b , 0x00 , 0x50 , 0x50 , 0x50 ,
0x50 , 0x50 , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b ,
0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b ,
0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b ,
0x9b , 0x9b , 0xbc , 0x9b , 0xa0 , 0x9b , 0x9b , 0x9b ,
0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b , 0x9b ,
0x9b , 0x9b , 0x9b , 0x9b , 0x00 , 0x50 , 0x50 , 0x50 ,
0x50 , 0x50 , 0x50 , 0x50 , 0x50 , 0x50 , 0x50 , 0x50 ,
0x50 , 0x50 , 0x50 , 0x50 , 0x50 , 0x50 , 0x50 , 0x50 ,
0x50 , 0x50 , 0x50 , 0x50 , 0x50 , 0x00 , 0x00 , 0x00 ,
0xa0 ]
var r = newSeq [ byte ] ( 1 )
let status = r . eth_evm_modexp ( input )
2023-07-11 09:06:46 +02:00
doAssert status = = cttEVM_Success