github.com/prysmaticlabs/prysm@v1.4.4/validator/keymanager/derived/eip_test.go (about) 1 package derived 2 3 import ( 4 "encoding/hex" 5 "fmt" 6 "testing" 7 8 "github.com/prysmaticlabs/prysm/shared/bls" 9 "github.com/prysmaticlabs/prysm/shared/testutil/assert" 10 "github.com/prysmaticlabs/prysm/shared/testutil/require" 11 util "github.com/wealdtech/go-eth2-util" 12 ) 13 14 func TestDerivationFromMnemonic(t *testing.T) { 15 mnemonic := "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" 16 passphrase := "TREZOR" 17 seed := "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04" 18 masterSK := "6083874454709270928345386274498605044986640685124978867557563392430687146096" 19 childIndex := 0 20 childSK := "20397789859736650942317412262472558107875392172444076792671091975210932703118" 21 seedBytes, err := hex.DecodeString(seed) 22 require.NoError(t, err) 23 derivedSeed, err := seedFromMnemonic(mnemonic, passphrase) 24 require.NoError(t, err) 25 assert.DeepEqual(t, seedBytes, derivedSeed) 26 27 // We derive keys, then check the master SK and the child SK. 28 withdrawalKey, err := util.PrivateKeyFromSeedAndPath(seedBytes, "m") 29 require.NoError(t, err) 30 validatingKey, err := util.PrivateKeyFromSeedAndPath(seedBytes, fmt.Sprintf("m/%d", childIndex)) 31 require.NoError(t, err) 32 33 expectedMasterSK, err := bls.SecretKeyFromBigNum(masterSK) 34 require.NoError(t, err) 35 expectedChildSK, err := bls.SecretKeyFromBigNum(childSK) 36 require.NoError(t, err) 37 assert.DeepEqual(t, expectedMasterSK.Marshal(), withdrawalKey.Marshal()) 38 assert.DeepEqual(t, expectedChildSK.Marshal(), validatingKey.Marshal()) 39 } 40 41 func TestDerivationFromSeed(t *testing.T) { 42 type fields struct { 43 seed string 44 childIndex int 45 } 46 type want struct { 47 masterSK string 48 childSK string 49 } 50 tests := []struct { 51 name string 52 fields fields 53 want want 54 }{ 55 { 56 name: "Case 1", 57 fields: fields{ 58 seed: "3141592653589793238462643383279502884197169399375105820974944592", 59 childIndex: 3141592653, 60 }, 61 want: want{ 62 masterSK: "29757020647961307431480504535336562678282505419141012933316116377660817309383", 63 childSK: "25457201688850691947727629385191704516744796114925897962676248250929345014287", 64 }, 65 }, 66 { 67 name: "Case 2", 68 fields: fields{ 69 seed: "0099FF991111002299DD7744EE3355BBDD8844115566CC55663355668888CC00", 70 childIndex: 4294967295, 71 }, 72 want: want{ 73 masterSK: "27580842291869792442942448775674722299803720648445448686099262467207037398656", 74 childSK: "29358610794459428860402234341874281240803786294062035874021252734817515685787", 75 }, 76 }, 77 { 78 name: "Case 3", 79 fields: fields{ 80 seed: "d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", 81 childIndex: 42, 82 }, 83 want: want{ 84 masterSK: "19022158461524446591288038168518313374041767046816487870552872741050760015818", 85 childSK: "31372231650479070279774297061823572166496564838472787488249775572789064611981", 86 }, 87 }, 88 } 89 for _, tt := range tests { 90 t.Run(tt.name, func(t *testing.T) { 91 seedBytes, err := hex.DecodeString(tt.fields.seed) 92 require.NoError(t, err) 93 94 // We derive keys, then check the master SK and the child SK. 95 masterSK, err := util.PrivateKeyFromSeedAndPath(seedBytes, "m") 96 require.NoError(t, err) 97 childSK, err := util.PrivateKeyFromSeedAndPath(seedBytes, fmt.Sprintf("m/%d", tt.fields.childIndex)) 98 require.NoError(t, err) 99 100 expectedMasterSK, err := bls.SecretKeyFromBigNum(tt.want.masterSK) 101 require.NoError(t, err) 102 expectedChildSK, err := bls.SecretKeyFromBigNum(tt.want.childSK) 103 require.NoError(t, err) 104 assert.DeepEqual(t, expectedMasterSK.Marshal(), masterSK.Marshal()) 105 assert.DeepEqual(t, expectedChildSK.Marshal(), childSK.Marshal()) 106 }) 107 } 108 }