github.com/fozzysec/SiaPrime@v0.0.0-20190612043147-66c8e8d11fe3/compatibility/siag_1.0_test.go (about) 1 package compatibility 2 3 // siag.go checks that any changes made to the code retain compatibility with 4 // old versions of siag. 5 6 import ( 7 "errors" 8 "path/filepath" 9 "strconv" 10 "testing" 11 12 "SiaPrime/crypto" 13 "SiaPrime/encoding" 14 "SiaPrime/types" 15 ) 16 17 // KeyPairSiag_1_0 matches the KeyPair struct of the siag 1.0 code. 18 type KeyPairSiag_1_0 struct { 19 Header string 20 Version string 21 Index int 22 SecretKey crypto.SecretKey 23 UnlockConditions types.UnlockConditions 24 } 25 26 // verifyKeysSiag_1_0 is a copy-pasted version of the verifyKeys method 27 // from siag 1.0. 28 func verifyKeysSiag_1_0(uc types.UnlockConditions, folder string, keyname string) error { 29 keysRequired := uc.SignaturesRequired 30 totalKeys := uint64(len(uc.PublicKeys)) 31 loadedKeys := make([]KeyPairSiag_1_0, totalKeys) 32 for i := 0; i < len(loadedKeys); i++ { 33 err := encoding.ReadFile(filepath.Join(folder, keyname+"_Key"+strconv.Itoa(i)+".siakey"), &loadedKeys[i]) 34 if err != nil { 35 return err 36 } 37 } 38 for _, loadedKey := range loadedKeys { 39 if loadedKey.UnlockConditions.UnlockHash() != uc.UnlockHash() { 40 return errors.New("ErrCorruptedKey") 41 } 42 } 43 txn := types.Transaction{ 44 SiafundInputs: []types.SiafundInput{ 45 { 46 UnlockConditions: loadedKeys[0].UnlockConditions, 47 }, 48 }, 49 } 50 var i uint64 51 for i != totalKeys { 52 if i+keysRequired > totalKeys { 53 i = totalKeys - keysRequired 54 } 55 var j uint64 56 for j < keysRequired { 57 txn.TransactionSignatures = append(txn.TransactionSignatures, types.TransactionSignature{ 58 PublicKeyIndex: i, 59 CoveredFields: types.CoveredFields{WholeTransaction: true}, 60 }) 61 sigHash := txn.SigHash(int(j), 0) 62 sig := crypto.SignHash(sigHash, loadedKeys[i].SecretKey) 63 txn.TransactionSignatures[j].Signature = sig[:] 64 i++ 65 j++ 66 } 67 err := txn.StandaloneValid(0) 68 if err != nil { 69 return err 70 } 71 txn.TransactionSignatures = nil 72 } 73 return nil 74 } 75 76 // TestVerifyKeysSiag_1_0 loads some keys generated by siag1.0. 77 // Verification must still work. 78 func TestVerifyKeysSiag_1_0(t *testing.T) { 79 if testing.Short() { 80 t.SkipNow() 81 } 82 var kp KeyPairSiag_1_0 83 84 // 1 of 1 85 err := encoding.ReadFile("siag_1.0_1of1_Key0.siakey", &kp) 86 if err != nil { 87 t.Fatal(err) 88 } 89 err = verifyKeysSiag_1_0(kp.UnlockConditions, "", "siag_1.0_1of1") 90 if err != nil { 91 t.Fatal(err) 92 } 93 94 // 1 of 2 95 err = encoding.ReadFile("siag_1.0_1of2_Key0.siakey", &kp) 96 if err != nil { 97 t.Fatal(err) 98 } 99 err = verifyKeysSiag_1_0(kp.UnlockConditions, "", "siag_1.0_1of2") 100 if err != nil { 101 t.Fatal(err) 102 } 103 104 // 2 of 3 105 err = encoding.ReadFile("siag_1.0_2of3_Key0.siakey", &kp) 106 if err != nil { 107 t.Fatal(err) 108 } 109 err = verifyKeysSiag_1_0(kp.UnlockConditions, "", "siag_1.0_2of3") 110 if err != nil { 111 t.Fatal(err) 112 } 113 114 // 3 of 3 115 err = encoding.ReadFile("siag_1.0_3of3_Key0.siakey", &kp) 116 if err != nil { 117 t.Fatal(err) 118 } 119 err = verifyKeysSiag_1_0(kp.UnlockConditions, "", "siag_1.0_3of3") 120 if err != nil { 121 t.Fatal(err) 122 } 123 124 // 4 of 9 125 err = encoding.ReadFile("siag_1.0_4of9_Key0.siakey", &kp) 126 if err != nil { 127 t.Fatal(err) 128 } 129 err = verifyKeysSiag_1_0(kp.UnlockConditions, "", "siag_1.0_4of9") 130 if err != nil { 131 t.Fatal(err) 132 } 133 }