1717package vm
1818
1919import (
20+ "bytes"
2021 "fmt"
2122 "math/big"
2223 "reflect"
@@ -409,6 +410,11 @@ func testPrecompiled(addr string, test precompiledTest, t *testing.T) {
409410 } else if common .Bytes2Hex (res ) != test .expected {
410411 t .Errorf ("Expected %v, got %v" , test .expected , common .Bytes2Hex (res ))
411412 }
413+ // Verify that the precompile did not touch the input buffer
414+ exp := common .Hex2Bytes (test .input )
415+ if ! bytes .Equal (in , exp ) {
416+ t .Errorf ("Precompiled %v modified input data" , addr )
417+ }
412418 })
413419}
414420
@@ -423,6 +429,11 @@ func testPrecompiledFailure(addr string, test precompiledFailureTest, t *testing
423429 if ! reflect .DeepEqual (err , test .expectedError ) {
424430 t .Errorf ("Expected error [%v], got [%v]" , test .expectedError , err )
425431 }
432+ // Verify that the precompile did not touch the input buffer
433+ exp := common .Hex2Bytes (test .input )
434+ if ! bytes .Equal (in , exp ) {
435+ t .Errorf ("Precompiled %v modified input data" , addr )
436+ }
426437 })
427438}
428439
@@ -574,3 +585,55 @@ func TestPrecompileBlake2FMalformedInput(t *testing.T) {
574585 testPrecompiledFailure ("09" , test , t )
575586 }
576587}
588+
589+ // EcRecover test vectors
590+ var ecRecoverTests = []precompiledTest {
591+ {
592+ input : "a8b53bdf3306a35a7103ab5504a0c9b492295564b6202b1942a84ef300107281" +
593+ "000000000000000000000000000000000000000000000000000000000000001b" +
594+ "3078356531653033663533636531386237373263636230303933666637316633" +
595+ "6635336635633735623734646362333161383561613862383839326234653862" +
596+ "1122334455667788991011121314151617181920212223242526272829303132" ,
597+ expected : "" ,
598+ name : "CallEcrecoverUnrecoverableKey" ,
599+ },
600+ {
601+ input : "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c" +
602+ "000000000000000000000000000000000000000000000000000000000000001c" +
603+ "73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f" +
604+ "eeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549" ,
605+ expected : "000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b" ,
606+ name : "ValidKey" ,
607+ },
608+ {
609+ input : "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c" +
610+ "100000000000000000000000000000000000000000000000000000000000001c" +
611+ "73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f" +
612+ "eeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549" ,
613+ expected : "" ,
614+ name : "InvalidHighV-bits-1" ,
615+ },
616+ {
617+ input : "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c" +
618+ "000000000000000000000000000000000000001000000000000000000000001c" +
619+ "73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f" +
620+ "eeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549" ,
621+ expected : "" ,
622+ name : "InvalidHighV-bits-2" ,
623+ },
624+ {
625+ input : "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c" +
626+ "000000000000000000000000000000000000001000000000000000000000011c" +
627+ "73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f" +
628+ "eeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549" ,
629+ expected : "" ,
630+ name : "InvalidHighV-bits-3" ,
631+ },
632+ }
633+
634+ func TestPrecompiledEcrecover (t * testing.T ) {
635+ for _ , test := range ecRecoverTests {
636+ testPrecompiled ("01" , test , t )
637+ }
638+
639+ }
0 commit comments