github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/p2p/peer/peer_test.go (about)

     1  package peer_test
     2  
     3  import (
     4  	"encoding/base64"
     5  	"fmt"
     6  	"strings"
     7  	"testing"
     8  
     9  	ic "github.com/ipfs/go-ipfs/p2p/crypto"
    10  	. "github.com/ipfs/go-ipfs/p2p/peer"
    11  	u "github.com/ipfs/go-ipfs/util"
    12  	tu "github.com/ipfs/go-ipfs/util/testutil"
    13  
    14  	b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58"
    15  )
    16  
    17  var gen1 keyset // generated
    18  var gen2 keyset // generated
    19  var man keyset  // manual
    20  
    21  func init() {
    22  	if err := gen1.generate(); err != nil {
    23  		panic(err)
    24  	}
    25  	if err := gen2.generate(); err != nil {
    26  		panic(err)
    27  	}
    28  
    29  	skManBytes = strings.Replace(skManBytes, "\n", "", -1)
    30  	if err := man.load(hpkpMan, skManBytes); err != nil {
    31  		panic(err)
    32  	}
    33  }
    34  
    35  type keyset struct {
    36  	sk   ic.PrivKey
    37  	pk   ic.PubKey
    38  	hpk  string
    39  	hpkp string
    40  }
    41  
    42  func (ks *keyset) generate() error {
    43  	var err error
    44  	ks.sk, ks.pk, err = tu.RandTestKeyPair(512)
    45  	if err != nil {
    46  		return err
    47  	}
    48  
    49  	bpk, err := ks.pk.Bytes()
    50  	if err != nil {
    51  		return err
    52  	}
    53  
    54  	ks.hpk = string(u.Hash(bpk))
    55  	ks.hpkp = b58.Encode([]byte(ks.hpk))
    56  	return nil
    57  }
    58  
    59  func (ks *keyset) load(hpkp, skBytesStr string) error {
    60  	skBytes, err := base64.StdEncoding.DecodeString(skBytesStr)
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	ks.sk, err = ic.UnmarshalPrivateKey(skBytes)
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	ks.pk = ks.sk.GetPublic()
    71  	bpk, err := ks.pk.Bytes()
    72  	if err != nil {
    73  		return err
    74  	}
    75  
    76  	ks.hpk = string(u.Hash(bpk))
    77  	ks.hpkp = b58.Encode([]byte(ks.hpk))
    78  	if ks.hpkp != hpkp {
    79  		return fmt.Errorf("hpkp doesn't match key. %s", hpkp)
    80  	}
    81  	return nil
    82  }
    83  
    84  func TestIDMatchesPublicKey(t *testing.T) {
    85  
    86  	test := func(ks keyset) {
    87  		p1, err := IDB58Decode(ks.hpkp)
    88  		if err != nil {
    89  			t.Fatal(err)
    90  		}
    91  
    92  		if ks.hpk != string(p1) {
    93  			t.Error("p1 and hpk differ")
    94  		}
    95  
    96  		if !p1.MatchesPublicKey(ks.pk) {
    97  			t.Fatal("p1 does not match pk")
    98  		}
    99  
   100  		p2, err := IDFromPublicKey(ks.pk)
   101  		if err != nil {
   102  			t.Fatal(err)
   103  		}
   104  
   105  		if p1 != p2 {
   106  			t.Error("p1 and p2 differ", p1.Pretty(), p2.Pretty())
   107  		}
   108  
   109  		if p2.Pretty() != ks.hpkp {
   110  			t.Error("hpkp and p2.Pretty differ", ks.hpkp, p2.Pretty())
   111  		}
   112  	}
   113  
   114  	test(gen1)
   115  	test(gen2)
   116  	test(man)
   117  }
   118  
   119  func TestIDMatchesPrivateKey(t *testing.T) {
   120  
   121  	test := func(ks keyset) {
   122  		p1, err := IDB58Decode(ks.hpkp)
   123  		if err != nil {
   124  			t.Fatal(err)
   125  		}
   126  
   127  		if ks.hpk != string(p1) {
   128  			t.Error("p1 and hpk differ")
   129  		}
   130  
   131  		if !p1.MatchesPrivateKey(ks.sk) {
   132  			t.Fatal("p1 does not match sk")
   133  		}
   134  
   135  		p2, err := IDFromPrivateKey(ks.sk)
   136  		if err != nil {
   137  			t.Fatal(err)
   138  		}
   139  
   140  		if p1 != p2 {
   141  			t.Error("p1 and p2 differ", p1.Pretty(), p2.Pretty())
   142  		}
   143  	}
   144  
   145  	test(gen1)
   146  	test(gen2)
   147  	test(man)
   148  }
   149  
   150  var hpkpMan = `QmRK3JgmVEGiewxWbhpXLJyjWuGuLeSTMTndA1coMHEy5o`
   151  var skManBytes = `
   152  CAAS4AQwggJcAgEAAoGBAL7w+Wc4VhZhCdM/+Hccg5Nrf4q9NXWwJylbSrXz/unFS24wyk6pEk0zi3W
   153  7li+vSNVO+NtJQw9qGNAMtQKjVTP+3Vt/jfQRnQM3s6awojtjueEWuLYVt62z7mofOhCtj+VwIdZNBo
   154  /EkLZ0ETfcvN5LVtLYa8JkXybnOPsLvK+PAgMBAAECgYBdk09HDM7zzL657uHfzfOVrdslrTCj6p5mo
   155  DzvCxLkkjIzYGnlPuqfNyGjozkpSWgSUc+X+EGLLl3WqEOVdWJtbM61fewEHlRTM5JzScvwrJ39t7o6
   156  CCAjKA0cBWBd6UWgbN/t53RoWvh9HrA2AW5YrT0ZiAgKe9y7EMUaENVJ8QJBAPhpdmb4ZL4Fkm4OKia
   157  NEcjzn6mGTlZtef7K/0oRC9+2JkQnCuf6HBpaRhJoCJYg7DW8ZY+AV6xClKrgjBOfERMCQQDExhnzu2
   158  dsQ9k8QChBlpHO0TRbZBiQfC70oU31kM1AeLseZRmrxv9Yxzdl8D693NNWS2JbKOXl0kMHHcuGQLMVA
   159  kBZ7WvkmPV3aPL6jnwp2pXepntdVnaTiSxJ1dkXShZ/VSSDNZMYKY306EtHrIu3NZHtXhdyHKcggDXr
   160  qkBrdgErAkAlpGPojUwemOggr4FD8sLX1ot2hDJyyV7OK2FXfajWEYJyMRL1Gm9Uk1+Un53RAkJneqp
   161  JGAzKpyttXBTIDO51AkEA98KTiROMnnU8Y6Mgcvr68/SMIsvCYMt9/mtwSBGgl80VaTQ5Hpaktl6Xbh
   162  VUt5Wv0tRxlXZiViCGCD1EtrrwTw==
   163  `