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  }